diff --git a/src/database/database.ts b/src/database/database.ts index 1e31ee6..99eb02c 100644 --- a/src/database/database.ts +++ b/src/database/database.ts @@ -17,11 +17,17 @@ export async function connect() { } export async function getRepository(repoId: string) { + if (!repoId) { + throw new AnonymousError("repo_not_found", { + object: repoId, + httpStatus: 404, + }); + } const data = await AnonymizedRepositoryModel.findOne({ repoId }); if (!data) throw new AnonymousError("repo_not_found", { object: repoId, - httpStatus: 400, + httpStatus: 404, }); return new Repository(data); } diff --git a/src/routes/admin.ts b/src/routes/admin.ts index 98b9d76..1b052ec 100644 --- a/src/routes/admin.ts +++ b/src/routes/admin.ts @@ -24,7 +24,7 @@ router.use( isOwnerOrAdmin([], user); next(); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); diff --git a/src/routes/conference.ts b/src/routes/conference.ts index c179775..69d5c1c 100644 --- a/src/routes/conference.ts +++ b/src/routes/conference.ts @@ -62,7 +62,7 @@ router.get("/", async (req: express.Request, res: express.Response) => { ); res.json(conferences.map((conf) => conf.toJSON())); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -206,7 +206,7 @@ router.post( res ); } - handleError(error, res); + handleError(error, res, req); } } ); @@ -241,7 +241,7 @@ router.get( }) } } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -264,7 +264,7 @@ router.delete( await conference.remove(); res.send("ok"); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); diff --git a/src/routes/file.ts b/src/routes/file.ts index 002484d..739ed97 100644 --- a/src/routes/file.ts +++ b/src/routes/file.ts @@ -37,7 +37,7 @@ router.get( res.header('Cache-Control', 'max-age=300'); await f.send(res); } catch (error) { - return handleError(error, res); + return handleError(error, res, req); } } ); diff --git a/src/routes/repository-private.ts b/src/routes/repository-private.ts index 83ed336..45b6255 100644 --- a/src/routes/repository-private.ts +++ b/src/routes/repository-private.ts @@ -78,7 +78,7 @@ router.post("/claim", async (req: express.Request, res: express.Response) => { ); return res.send("Ok"); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -102,7 +102,7 @@ router.post( await repo.updateIfNeeded({ force: true }); res.json({ status: repo.status }); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -126,7 +126,7 @@ router.delete( await removeQueue.add(repo.repoId, repo, { jobId: repo.repoId }); return res.json({ status: repo.status }); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -143,7 +143,7 @@ router.get( }); res.json(repo.toJSON()); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -165,7 +165,7 @@ router.get( }) ); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -195,7 +195,7 @@ router.get( }) ); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -210,7 +210,7 @@ router.get("/:repoId/", async (req: express.Request, res: express.Response) => { isOwnerOrAdmin([repo.owner.id], user); res.json((await db.getRepository(req.params.repoId)).toJSON()); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -364,7 +364,7 @@ router.post( res.json({ status: repo.status }); await downloadQueue.add(repo.repoId, repo, { jobId: repo.repoId }); } catch (error) { - return handleError(error, res); + return handleError(error, res, req); } } ); @@ -444,10 +444,11 @@ router.post("/", async (req: express.Request, res: express.Response) => { cause: error, object: repoUpdate, }), - res + res, + req ); } - return handleError(error, res); + return handleError(error, res, req); } }); diff --git a/src/routes/repository-public.ts b/src/routes/repository-public.ts index d4a2833..2ae41c4 100644 --- a/src/routes/repository-public.ts +++ b/src/routes/repository-public.ts @@ -37,7 +37,7 @@ router.get( res.header("Cache-Control", "max-age=21600"); await pipeline(repo.zip(), res); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -52,7 +52,7 @@ router.get( res.json(await repo.anonymizedFiles({ includeSha: false })); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -131,7 +131,7 @@ router.get( download, }); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); diff --git a/src/routes/route-utils.ts b/src/routes/route-utils.ts index d10d629..f3c4361 100644 --- a/src/routes/route-utils.ts +++ b/src/routes/route-utils.ts @@ -28,7 +28,7 @@ export async function getRepo( } return repo; } catch (error) { - handleError(error, res); + handleError(error, res, req); return null; } } @@ -41,15 +41,16 @@ export function isOwnerOrAdmin(authorizedUsers: string[], user: User) { } } -function printError(error: any) { +function printError(error: any, req?: express.Request) { io.notifyError(error, error.value); if (error instanceof AnonymousError) { - console.log(error); - console.error( - "[ERROR]", - error.toString(), - error.stack.split("\n")[1].trim() - ); + let message = `[ERROR] ${error.toString()} ${error.stack + .split("\n")[1] + .trim()}`; + if (req) { + message += ` ${req.originalUrl}`; + } + console.error(message); } else if (error instanceof Error) { console.error(error); } else { @@ -57,8 +58,12 @@ function printError(error: any) { } } -export function handleError(error: any, res: express.Response) { - printError(error); +export function handleError( + error: any, + res: express.Response, + req?: express.Request +) { + printError(error, req); let message = error; if (error instanceof Error) { message = error.message; diff --git a/src/routes/user.ts b/src/routes/user.ts index 98afb9d..73af85a 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -13,7 +13,7 @@ router.get("/logout", async (req: express.Request, res: express.Response) => { req.logout((error) => console.error(error)); res.redirect("/"); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -26,7 +26,7 @@ router.get("/", async (req: express.Request, res: express.Response) => { isAdmin: user.isAdmin, }); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -54,7 +54,7 @@ router.get("/quota", async (req: express.Request, res: express.Response) => { }, }); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -64,7 +64,7 @@ router.get("/default", async (req: express.Request, res: express.Response) => { res.json(user.default); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -78,7 +78,7 @@ router.post("/default", async (req: express.Request, res: express.Response) => { await user.model.save(); res.send("ok"); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }); @@ -93,7 +93,7 @@ router.get( }) ); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); @@ -115,7 +115,7 @@ router.get( }) ); } catch (error) { - handleError(error, res); + handleError(error, res, req); } } ); diff --git a/src/routes/webview.ts b/src/routes/webview.ts index a0b94aa..c66c7ba 100644 --- a/src/routes/webview.ts +++ b/src/routes/webview.ts @@ -50,7 +50,7 @@ async function webView(req: express.Request, res: express.Response) { } f.send(res); } catch (error) { - handleError(error, res); + handleError(error, res, req); } }