improve error handling

This commit is contained in:
tdurieux
2021-08-12 09:50:20 +02:00
parent 290578967d
commit 38a189e980
6 changed files with 153 additions and 102 deletions

View File

@@ -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();
}

View File

@@ -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,
});

View File

@@ -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;

View File

@@ -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);
}
}
);

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) => {
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);
}
}
);

View File

@@ -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(