From 38a189e9805f9454eb78a596725228e002af6717 Mon Sep 17 00:00:00 2001 From: tdurieux Date: Thu, 12 Aug 2021 09:50:20 +0200 Subject: [PATCH] improve error handling --- src/User.ts | 6 +- src/routes/file.ts | 4 +- src/routes/repository-private.ts | 154 +++++++++++++++++-------------- src/routes/repository-public.ts | 31 +++++-- src/routes/user.ts | 54 ++++++----- src/routes/webview.ts | 6 +- 6 files changed, 153 insertions(+), 102 deletions(-) diff --git a/src/User.ts b/src/User.ts index 50ee82e..b8be17f 100644 --- a/src/User.ts +++ b/src/User.ts @@ -98,12 +98,16 @@ export default class User { repo.options.expirationDate != null && repo.options.expirationDate < new Date() ) { - await repo.expire() + await repo.expire(); } } return repositories; } + get model() { + return this._model; + } + toJSON() { return this._model.toJSON(); } diff --git a/src/routes/file.ts b/src/routes/file.ts index 2e40276..aa36c8c 100644 --- a/src/routes/file.ts +++ b/src/routes/file.ts @@ -16,9 +16,9 @@ router.get( const repo = await getRepo(req, res); if (!repo) return; - await repo.countView(); - try { + await repo.countView(); + const f = new AnonymizedFile(repo, { anonymizedPath, }); diff --git a/src/routes/repository-private.ts b/src/routes/repository-private.ts index aa2912f..efb6133 100644 --- a/src/routes/repository-private.ts +++ b/src/routes/repository-private.ts @@ -55,8 +55,7 @@ router.post("/claim", async (req: express.Request, res: express.Response) => { ); return res.send("Ok"); } catch (error) { - console.error(req.path, error); - return res.status(500).json({ error }); + handleError(error, res); } }); @@ -66,12 +65,17 @@ router.post( async (req: express.Request, res: express.Response) => { const repo = await getRepo(req, res, { nocheck: true }); if (!repo) return; - const user = await getUser(req); - if (repo.owner.username != user.username) { - return res.status(401).json({ error: "not_authorized" }); + + try { + const user = await getUser(req); + if (repo.owner.username != user.username) { + return res.status(401).json({ error: "not_authorized" }); + } + await repo.anonymize(); + res.end("ok"); + } catch (error) { + handleError(error, res); } - await repo.anonymize(); - res.end("ok"); } ); @@ -81,13 +85,17 @@ router.delete( async (req: express.Request, res: express.Response) => { const repo = await getRepo(req, res, { nocheck: false }); if (!repo) return; - const user = await getUser(req); - if (repo.owner.username != user.username) { - return res.status(401).json({ error: "not_authorized" }); + try { + const user = await getUser(req); + if (repo.owner.username != user.username) { + return res.status(401).json({ error: "not_authorized" }); + } + await repo.remove(); + console.log(`${req.params.repoId} is removed`); + return res.json("ok"); + } catch (error) { + handleError(error, res); } - await repo.remove(); - console.log(`${req.params.repoId} is removed`); - return res.json("ok"); } ); @@ -133,19 +141,25 @@ router.get( router.get( "/:owner/:repo/readme", async (req: express.Request, res: express.Response) => { - const user = await getUser(req); - const repo = await RepositoryModel.findOne({ - name: `${req.params.owner}/${req.params.repo}`, - }); - if (!repo) return res.status(404).send({ error: "repo_not_found" }); - const repository = new GitHubRepository(repo); - return res.send( - await repository.readme({ + try { + const user = await getUser(req); + + const repo = await getRepositoryFromGitHub({ + owner: req.params.owner, + repo: req.params.repo, accessToken: user.accessToken, - force: req.query.force == "1", - branch: req.query.branch as string, - }) - ); + }); + if (!repo) return res.status(404).send({ error: "repo_not_found" }); + return res.send( + await repo.readme({ + accessToken: user.accessToken, + force: req.query.force == "1", + branch: req.query.branch as string, + }) + ); + } catch (error) { + handleError(error, res); + } } ); @@ -206,23 +220,23 @@ router.post( try { validateNewRepo(repoUpdate); + + if (repoUpdate.commit != repo.model.source.commit) { + repo.model.anonymizeDate = new Date(); + repo.model.source.commit = repoUpdate.commit; + await repo.remove(); + } + + updateRepoModel(repo.model, repoUpdate); + + await repo.updateStatus("preparing"); + + await repo.model.save(); + res.send("ok"); + new Repository(repo.model).anonymize(); } catch (error) { return handleError(error, res); } - - if (repoUpdate.commit != repo.model.source.commit) { - repo.model.anonymizeDate = new Date(); - repo.model.source.commit = repoUpdate.commit; - await repo.remove(); - } - - updateRepoModel(repo.model, repoUpdate); - - await repo.updateStatus("preparing"); - - await repo.model.save(); - res.send("ok"); - new Repository(repo.model).anonymize(); } ); @@ -233,39 +247,41 @@ router.post("/", async (req: express.Request, res: express.Response) => { try { validateNewRepo(repoUpdate); + + const r = gh(repoUpdate.fullName); + const repository = await getRepositoryFromGitHub({ + accessToken: user.accessToken, + owner: r.owner, + repo: r.name, + }); + + const repo = new AnonymizedRepositoryModel(); + repo.repoId = repoUpdate.repoId; + repo.anonymizeDate = new Date(); + repo.owner = user.username; + repo.source = { + type: + repoUpdate.options.mode == "download" ? "GitHubDownload" : "GitHubStream", + accessToken: user.accessToken, + repositoryId: repository.model.id, + repositoryName: repoUpdate.fullName, + }; + + if (repo.source.type == "GitHubDownload") { + // details.size is in kilobytes + if (repository.size > config.MAX_REPO_SIZE) { + return res.status(500).send({ error: "invalid_mode" }); + } + } + + updateRepoModel(repo, repoUpdate); + + await repo.save(); + res.send("ok"); + new Repository(repo).anonymize(); } catch (error) { return handleError(error, res); } - const r = gh(repoUpdate.fullName); - const repository = await getRepositoryFromGitHub({ - accessToken: user.accessToken, - owner: r.owner, - repo: r.name, - }); - const repo = new AnonymizedRepositoryModel(); - repo.repoId = repoUpdate.repoId; - repo.anonymizeDate = new Date(); - repo.owner = user.username; - repo.source = { - type: - repoUpdate.options.mode == "download" ? "GitHubDownload" : "GitHubStream", - accessToken: user.accessToken, - repositoryId: repository.model.id, - repositoryName: repoUpdate.fullName, - }; - - if (repo.source.type == "GitHubDownload") { - // details.size is in kilobytes - if (repository.size > config.MAX_REPO_SIZE) { - return res.status(500).send({ error: "invalid_mode" }); - } - } - - updateRepoModel(repo, repoUpdate); - - await repo.save(); - res.send("ok"); - new Repository(repo).anonymize(); }); export default router; diff --git a/src/routes/repository-public.ts b/src/routes/repository-public.ts index 701b4a8..adba5c5 100644 --- a/src/routes/repository-public.ts +++ b/src/routes/repository-public.ts @@ -8,7 +8,12 @@ const router = express.Router(); router.get("/:repoId/", async (req: express.Request, res: express.Response) => { const repo = await getRepo(req, res, { nocheck: true }); if (!repo) return; - res.json((await db.getRepository(req.params.repoId)).toJSON()); + + try { + res.json((await db.getRepository(req.params.repoId)).toJSON()); + } catch (error) { + handleError(error, res); + } }); router.get( @@ -16,8 +21,13 @@ router.get( async (req: express.Request, res: express.Response) => { const repo = await getRepo(req, res); if (!repo) return; - res.attachment(`${repo.repoId}.zip`); - repo.zip().pipe(res); + + try { + res.attachment(`${repo.repoId}.zip`); + repo.zip().pipe(res); + } catch (error) { + handleError(error, res); + } } ); @@ -26,7 +36,11 @@ router.get( async (req: express.Request, res: express.Response) => { const repo = await getRepo(req, res); if (!repo) return; - res.json(await repo.anonymizedFiles({ force: true })); + try { + res.json(await repo.anonymizedFiles({ force: true })); + } catch (error) { + handleError(error, res); + } } ); @@ -35,8 +49,13 @@ router.get( async (req: express.Request, res: express.Response) => { const repo = await getRepo(req, res); if (!repo) return; - await repo.updateIfNeeded(); - res.json(repo.options); + + try { + await repo.updateIfNeeded(); + res.json(repo.options); + } catch (error) { + handleError(error, res); + } } ); diff --git a/src/routes/user.ts b/src/routes/user.ts index 54163a0..43ad669 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -44,8 +44,9 @@ router.get("/quota", async (req: express.Request, res: express.Response) => { }); router.get("/default", async (req: express.Request, res: express.Response) => { - const user = await getUser(req); try { + const user = await getUser(req); + res.json(user.default); } catch (error) { handleError(error, res); @@ -53,10 +54,13 @@ router.get("/default", async (req: express.Request, res: express.Response) => { }); router.post("/default", async (req: express.Request, res: express.Response) => { - const user = await getUser(req); try { + const user = await getUser(req); + const d = req.body; - user.default = d; + user.model.default = d; + + await user.model.save(); res.send("ok"); } catch (error) { handleError(error, res); @@ -66,30 +70,38 @@ router.post("/default", async (req: express.Request, res: express.Response) => { router.get( "/anonymized_repositories", async (req: express.Request, res: express.Response) => { - const user = await getUser(req); - res.json( - (await user.getRepositories()).map((x) => { - return x.toJSON(); - }) - ); + try { + const user = await getUser(req); + res.json( + (await user.getRepositories()).map((x) => { + return x.toJSON(); + }) + ); + } catch (error) { + handleError(error, res); + } } ); router.get( "/all_repositories", async (req: express.Request, res: express.Response) => { - const user = await getUser(req); - const repos = await user.getGitHubRepositories({ - force: req.query.force == "1", - }); - res.json( - repos.map((x) => { - return { - fullName: x.fullName, - id: x.id, - }; - }) - ); + try { + const user = await getUser(req); + const repos = await user.getGitHubRepositories({ + force: req.query.force == "1", + }); + res.json( + repos.map((x) => { + return { + fullName: x.fullName, + id: x.id, + }; + }) + ); + } catch (error) { + handleError(error, res); + } } ); diff --git a/src/routes/webview.ts b/src/routes/webview.ts index a58190c..b508597 100644 --- a/src/routes/webview.ts +++ b/src/routes/webview.ts @@ -11,17 +11,17 @@ async function webView(req: express.Request, res: express.Response) { if (!repo) return; try { if (!repo.options.page) { - throw "page_not_activated"; + throw new Error("page_not_activated"); } if (!repo.options.pageSource) { - throw "page_not_activated"; + throw new Error("page_not_activated"); } if ( repo.options.pageSource?.branch != (repo.source as GitHubDownload).branch.name ) { - throw "page_not_supported_on_different_branch"; + throw new Error("page_not_supported_on_different_branch"); } let requestPath = path.join(