From ad950a6c9d641aaeb0550b702a64825c7c11838e Mon Sep 17 00:00:00 2001 From: rafaelsideguide <150964962+rafaelsideguide@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:29:32 -0300 Subject: [PATCH] fixed controller res and tests --- .../__tests__/e2e_v1_withAuth/index.test.ts | 26 ++++++++----------- apps/api/src/routes/v1.ts | 24 +++++++++++------ 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/apps/api/src/__tests__/e2e_v1_withAuth/index.test.ts b/apps/api/src/__tests__/e2e_v1_withAuth/index.test.ts index 9d504f1f..2d27462f 100644 --- a/apps/api/src/__tests__/e2e_v1_withAuth/index.test.ts +++ b/apps/api/src/__tests__/e2e_v1_withAuth/index.test.ts @@ -29,14 +29,10 @@ describe("E2E Tests for v1 API Routes", () => { describe("POST /v1/scrape", () => { it.concurrent("should require authorization", async () => { - const response: ScrapeResponseRequestTest = await request(TEST_URL).post( - "/v1/scrape" - ); - console.log({ - response: response.body, - details: response.body.success == false ? response.body.details : null, - statusCode: response.statusCode, - }) + const response: ScrapeResponseRequestTest = await request(TEST_URL) + .post("/v1/scrape") + .send({ url: "https://firecrawl.dev"}) + expect(response.statusCode).toBe(401); }); @@ -456,9 +452,9 @@ describe("E2E Tests for v1 API Routes", () => { describe("POST /v1/map", () => { it.concurrent("should require authorization", async () => { - const response: ScrapeResponseRequestTest = await request(TEST_URL).post( - "/v1/map" - ); + const response: ScrapeResponseRequestTest = await request(TEST_URL) + .post("/v1/map") + .send({ url: "https://firecrawl.dev" }); expect(response.statusCode).toBe(401); }); @@ -614,9 +610,9 @@ describe("POST /v1/map", () => { describe("POST /v1/crawl", () => { it.concurrent("should require authorization", async () => { - const response: ScrapeResponseRequestTest = await request(TEST_URL).post( - "/v1/crawl" - ); + const response: ScrapeResponseRequestTest = await request(TEST_URL) + .post("/v1/crawl") + .send({ url: "https://firecrawl.dev" }); expect(response.statusCode).toBe(401); }); @@ -868,7 +864,7 @@ describe("GET /v1/crawl/:jobId", () => { .post("/v1/crawl") .set("Authorization", `Bearer ${process.env.TEST_API_KEY}`) .set("Content-Type", "application/json") - .send({ url: "https://docs.mendable.ai" }); + .send({ url: "https://docs.firecrawl.dev" }); expect(crawlResponse.statusCode).toBe(200); let isCompleted = false; diff --git a/apps/api/src/routes/v1.ts b/apps/api/src/routes/v1.ts index 9dcbf111..daa9bf43 100644 --- a/apps/api/src/routes/v1.ts +++ b/apps/api/src/routes/v1.ts @@ -33,7 +33,9 @@ function checkCreditsMiddleware(minimum?: number): (req: RequestWithAuth, res: R const { success, message, remainingCredits } = await checkTeamCredits(req.auth.team_id, minimum); if (!success) { 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 } next(); @@ -52,7 +54,9 @@ export function authMiddleware(rateLimiterMode: RateLimiterMode): (req: RequestW ); 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 }; @@ -67,7 +71,9 @@ function idempotencyMiddleware(req: Request, res: Response, next: NextFunction) if (req.headers["x-idempotency-key"]) { const isIdempotencyValid = await validateIdempotencyKey(req); 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); } @@ -78,7 +84,9 @@ function idempotencyMiddleware(req: Request, res: Response, next: NextFunction) function blocklistMiddleware(req: Request, res: Response, next: NextFunction) { 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(); } @@ -96,26 +104,26 @@ export const v1Router = express.Router(); v1Router.post( "/scrape", - blocklistMiddleware, authMiddleware(RateLimiterMode.Scrape), checkCreditsMiddleware(1), + blocklistMiddleware, wrap(scrapeController) ); v1Router.post( "/crawl", - blocklistMiddleware, authMiddleware(RateLimiterMode.Crawl), - idempotencyMiddleware, checkCreditsMiddleware(), + blocklistMiddleware, + idempotencyMiddleware, wrap(crawlController) ); v1Router.post( "/map", - blocklistMiddleware, authMiddleware(RateLimiterMode.Map), checkCreditsMiddleware(1), + blocklistMiddleware, wrap(mapController) );