mirror of
https://git.mirrors.martin98.com/https://github.com/mendableai/firecrawl
synced 2025-08-10 21:59:01 +08:00
fixed controller res and tests
This commit is contained in:
parent
57aa6d1852
commit
ad950a6c9d
@ -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;
|
||||||
|
@ -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)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user