improve error handling

This commit is contained in:
tdurieux
2021-08-13 08:26:27 +02:00
parent 290578967d
commit 38a189e980
6 changed files with 153 additions and 102 deletions
+5 -1
View File
@@ -98,12 +98,16 @@ export default class User {
repo.options.expirationDate != null && repo.options.expirationDate != null &&
repo.options.expirationDate < new Date() repo.options.expirationDate < new Date()
) { ) {
await repo.expire() await repo.expire();
} }
} }
return repositories; return repositories;
} }
get model() {
return this._model;
}
toJSON() { toJSON() {
return this._model.toJSON(); return this._model.toJSON();
} }
+2 -2
View File
@@ -16,9 +16,9 @@ router.get(
const repo = await getRepo(req, res); const repo = await getRepo(req, res);
if (!repo) return; if (!repo) return;
await repo.countView();
try { try {
await repo.countView();
const f = new AnonymizedFile(repo, { const f = new AnonymizedFile(repo, {
anonymizedPath, anonymizedPath,
}); });
+85 -69
View File
@@ -55,8 +55,7 @@ router.post("/claim", async (req: express.Request, res: express.Response) => {
); );
return res.send("Ok"); return res.send("Ok");
} catch (error) { } catch (error) {
console.error(req.path, error); handleError(error, res);
return res.status(500).json({ error });
} }
}); });
@@ -66,12 +65,17 @@ router.post(
async (req: express.Request, res: express.Response) => { async (req: express.Request, res: express.Response) => {
const repo = await getRepo(req, res, { nocheck: true }); const repo = await getRepo(req, res, { nocheck: true });
if (!repo) return; if (!repo) return;
const user = await getUser(req);
if (repo.owner.username != user.username) { try {
return res.status(401).json({ error: "not_authorized" }); 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) => { async (req: express.Request, res: express.Response) => {
const repo = await getRepo(req, res, { nocheck: false }); const repo = await getRepo(req, res, { nocheck: false });
if (!repo) return; if (!repo) return;
const user = await getUser(req); try {
if (repo.owner.username != user.username) { const user = await getUser(req);
return res.status(401).json({ error: "not_authorized" }); 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( router.get(
"/:owner/:repo/readme", "/:owner/:repo/readme",
async (req: express.Request, res: express.Response) => { async (req: express.Request, res: express.Response) => {
const user = await getUser(req); try {
const repo = await RepositoryModel.findOne({ const user = await getUser(req);
name: `${req.params.owner}/${req.params.repo}`,
}); const repo = await getRepositoryFromGitHub({
if (!repo) return res.status(404).send({ error: "repo_not_found" }); owner: req.params.owner,
const repository = new GitHubRepository(repo); repo: req.params.repo,
return res.send(
await repository.readme({
accessToken: user.accessToken, 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 { try {
validateNewRepo(repoUpdate); 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) { } catch (error) {
return handleError(error, res); 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 { try {
validateNewRepo(repoUpdate); 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) { } catch (error) {
return handleError(error, res); 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; export default router;
+25 -6
View File
@@ -8,7 +8,12 @@ const router = express.Router();
router.get("/:repoId/", async (req: express.Request, res: express.Response) => { router.get("/:repoId/", async (req: express.Request, res: express.Response) => {
const repo = await getRepo(req, res, { nocheck: true }); const repo = await getRepo(req, res, { nocheck: true });
if (!repo) return; 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( router.get(
@@ -16,8 +21,13 @@ router.get(
async (req: express.Request, res: express.Response) => { async (req: express.Request, res: express.Response) => {
const repo = await getRepo(req, res); const repo = await getRepo(req, res);
if (!repo) return; 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) => { async (req: express.Request, res: express.Response) => {
const repo = await getRepo(req, res); const repo = await getRepo(req, res);
if (!repo) return; 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) => { async (req: express.Request, res: express.Response) => {
const repo = await getRepo(req, res); const repo = await getRepo(req, res);
if (!repo) return; if (!repo) return;
await repo.updateIfNeeded();
res.json(repo.options); try {
await repo.updateIfNeeded();
res.json(repo.options);
} catch (error) {
handleError(error, res);
}
} }
); );
+33 -21
View File
@@ -44,8 +44,9 @@ router.get("/quota", async (req: express.Request, res: express.Response) => {
}); });
router.get("/default", async (req: express.Request, res: express.Response) => { router.get("/default", async (req: express.Request, res: express.Response) => {
const user = await getUser(req);
try { try {
const user = await getUser(req);
res.json(user.default); res.json(user.default);
} catch (error) { } catch (error) {
handleError(error, res); 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) => { router.post("/default", async (req: express.Request, res: express.Response) => {
const user = await getUser(req);
try { try {
const user = await getUser(req);
const d = req.body; const d = req.body;
user.default = d; user.model.default = d;
await user.model.save();
res.send("ok"); res.send("ok");
} catch (error) { } catch (error) {
handleError(error, res); handleError(error, res);
@@ -66,30 +70,38 @@ router.post("/default", async (req: express.Request, res: express.Response) => {
router.get( router.get(
"/anonymized_repositories", "/anonymized_repositories",
async (req: express.Request, res: express.Response) => { async (req: express.Request, res: express.Response) => {
const user = await getUser(req); try {
res.json( const user = await getUser(req);
(await user.getRepositories()).map((x) => { res.json(
return x.toJSON(); (await user.getRepositories()).map((x) => {
}) return x.toJSON();
); })
);
} catch (error) {
handleError(error, res);
}
} }
); );
router.get( router.get(
"/all_repositories", "/all_repositories",
async (req: express.Request, res: express.Response) => { async (req: express.Request, res: express.Response) => {
const user = await getUser(req); try {
const repos = await user.getGitHubRepositories({ const user = await getUser(req);
force: req.query.force == "1", const repos = await user.getGitHubRepositories({
}); force: req.query.force == "1",
res.json( });
repos.map((x) => { res.json(
return { repos.map((x) => {
fullName: x.fullName, return {
id: x.id, fullName: x.fullName,
}; id: x.id,
}) };
); })
);
} catch (error) {
handleError(error, res);
}
} }
); );
+3 -3
View File
@@ -11,17 +11,17 @@ async function webView(req: express.Request, res: express.Response) {
if (!repo) return; if (!repo) return;
try { try {
if (!repo.options.page) { if (!repo.options.page) {
throw "page_not_activated"; throw new Error("page_not_activated");
} }
if (!repo.options.pageSource) { if (!repo.options.pageSource) {
throw "page_not_activated"; throw new Error("page_not_activated");
} }
if ( if (
repo.options.pageSource?.branch != repo.options.pageSource?.branch !=
(repo.source as GitHubDownload).branch.name (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( let requestPath = path.join(