fixed controller res and tests

This commit is contained in:
rafaelsideguide 2024-09-04 11:29:32 -03:00
parent 57aa6d1852
commit ad950a6c9d
2 changed files with 27 additions and 23 deletions

View File

@ -29,14 +29,10 @@ describe("E2E Tests for v1 API Routes", () => {
describe("POST /v1/scrape", () => { describe("POST /v1/scrape", () => {
it.concurrent("should require authorization", async () => { it.concurrent("should require authorization", async () => {
const response: ScrapeResponseRequestTest = await request(TEST_URL).post( const response: ScrapeResponseRequestTest = await request(TEST_URL)
"/v1/scrape" .post("/v1/scrape")
); .send({ url: "https://firecrawl.dev"})
console.log({
response: response.body,
details: response.body.success == false ? response.body.details : null,
statusCode: response.statusCode,
})
expect(response.statusCode).toBe(401); expect(response.statusCode).toBe(401);
}); });
@ -456,9 +452,9 @@ describe("E2E Tests for v1 API Routes", () => {
describe("POST /v1/map", () => { describe("POST /v1/map", () => {
it.concurrent("should require authorization", async () => { it.concurrent("should require authorization", async () => {
const response: ScrapeResponseRequestTest = await request(TEST_URL).post( const response: ScrapeResponseRequestTest = await request(TEST_URL)
"/v1/map" .post("/v1/map")
); .send({ url: "https://firecrawl.dev" });
expect(response.statusCode).toBe(401); expect(response.statusCode).toBe(401);
}); });
@ -614,9 +610,9 @@ describe("POST /v1/map", () => {
describe("POST /v1/crawl", () => { describe("POST /v1/crawl", () => {
it.concurrent("should require authorization", async () => { it.concurrent("should require authorization", async () => {
const response: ScrapeResponseRequestTest = await request(TEST_URL).post( const response: ScrapeResponseRequestTest = await request(TEST_URL)
"/v1/crawl" .post("/v1/crawl")
); .send({ url: "https://firecrawl.dev" });
expect(response.statusCode).toBe(401); expect(response.statusCode).toBe(401);
}); });
@ -868,7 +864,7 @@ describe("GET /v1/crawl/:jobId", () => {
.post("/v1/crawl") .post("/v1/crawl")
.set("Authorization", `Bearer ${process.env.TEST_API_KEY}`) .set("Authorization", `Bearer ${process.env.TEST_API_KEY}`)
.set("Content-Type", "application/json") .set("Content-Type", "application/json")
.send({ url: "https://docs.mendable.ai" }); .send({ url: "https://docs.firecrawl.dev" });
expect(crawlResponse.statusCode).toBe(200); expect(crawlResponse.statusCode).toBe(200);
let isCompleted = false; let isCompleted = false;

View File

@ -33,7 +33,9 @@ function checkCreditsMiddleware(minimum?: number): (req: RequestWithAuth, res: R
const { success, message, remainingCredits } = await checkTeamCredits(req.auth.team_id, minimum); const { success, message, remainingCredits } = await checkTeamCredits(req.auth.team_id, minimum);
if (!success) { if (!success) {
Logger.error(`Insufficient credits: ${JSON.stringify({ team_id: req.auth.team_id, minimum, remainingCredits })}`); Logger.error(`Insufficient credits: ${JSON.stringify({ team_id: req.auth.team_id, minimum, remainingCredits })}`);
return res.status(402).json({ success: false, error: "Insufficient credits" }); if (!res.headersSent) {
return res.status(402).json({ success: false, error: "Insufficient credits" });
}
} }
req.account = { remainingCredits } req.account = { remainingCredits }
next(); next();
@ -52,7 +54,9 @@ export function authMiddleware(rateLimiterMode: RateLimiterMode): (req: RequestW
); );
if (!success) { if (!success) {
return res.status(status).json({ success: false, error }); if (!res.headersSent) {
return res.status(status).json({ success: false, error });
}
} }
req.auth = { team_id, plan }; req.auth = { team_id, plan };
@ -67,7 +71,9 @@ function idempotencyMiddleware(req: Request, res: Response, next: NextFunction)
if (req.headers["x-idempotency-key"]) { if (req.headers["x-idempotency-key"]) {
const isIdempotencyValid = await validateIdempotencyKey(req); const isIdempotencyValid = await validateIdempotencyKey(req);
if (!isIdempotencyValid) { if (!isIdempotencyValid) {
return res.status(409).json({ success: false, error: "Idempotency key already used" }); if (!res.headersSent) {
return res.status(409).json({ success: false, error: "Idempotency key already used" });
}
} }
createIdempotencyKey(req); createIdempotencyKey(req);
} }
@ -78,7 +84,9 @@ function idempotencyMiddleware(req: Request, res: Response, next: NextFunction)
function blocklistMiddleware(req: Request, res: Response, next: NextFunction) { function blocklistMiddleware(req: Request, res: Response, next: NextFunction) {
if (req.body.url && isUrlBlocked(req.body.url)) { if (req.body.url && isUrlBlocked(req.body.url)) {
return res.status(403).json({ success: false, error: "URL is blocked. Firecrawl currently does not support social media scraping due to policy restrictions." }); if (!res.headersSent) {
return res.status(403).json({ success: false, error: "URL is blocked. Firecrawl currently does not support social media scraping due to policy restrictions." });
}
} }
next(); next();
} }
@ -96,26 +104,26 @@ export const v1Router = express.Router();
v1Router.post( v1Router.post(
"/scrape", "/scrape",
blocklistMiddleware,
authMiddleware(RateLimiterMode.Scrape), authMiddleware(RateLimiterMode.Scrape),
checkCreditsMiddleware(1), checkCreditsMiddleware(1),
blocklistMiddleware,
wrap(scrapeController) wrap(scrapeController)
); );
v1Router.post( v1Router.post(
"/crawl", "/crawl",
blocklistMiddleware,
authMiddleware(RateLimiterMode.Crawl), authMiddleware(RateLimiterMode.Crawl),
idempotencyMiddleware,
checkCreditsMiddleware(), checkCreditsMiddleware(),
blocklistMiddleware,
idempotencyMiddleware,
wrap(crawlController) wrap(crawlController)
); );
v1Router.post( v1Router.post(
"/map", "/map",
blocklistMiddleware,
authMiddleware(RateLimiterMode.Map), authMiddleware(RateLimiterMode.Map),
checkCreditsMiddleware(1), checkCreditsMiddleware(1),
blocklistMiddleware,
wrap(mapController) wrap(mapController)
); );