Improve error handling

This commit is contained in:
tdurieux
2026-05-06 18:43:36 +03:00
parent aae6eae6eb
commit da78708b7b
16 changed files with 360 additions and 49 deletions
+10 -7
View File
@@ -39,17 +39,20 @@ router.post("/", async (req, res) => {
const plaintext = generateToken();
const tokenHash = hashToken(plaintext);
const model = await UserModel.findById(user.model.id);
if (!model) return res.status(404).json({ error: "user_not_found" });
if (!model.apiTokens) model.apiTokens = [];
model.apiTokens.push({
const entry = {
tokenHash,
name,
createdAt: new Date(),
});
await model.save();
};
const updated = await UserModel.findByIdAndUpdate(
user.model.id,
{ $push: { apiTokens: entry } },
{ new: true }
);
if (!updated) return res.status(404).json({ error: "user_not_found" });
const created = model.apiTokens[model.apiTokens.length - 1];
const tokens = updated.apiTokens || [];
const created = tokens[tokens.length - 1];
res.json({
id: created._id,
name: created.name,
+8 -2
View File
@@ -662,7 +662,10 @@ router.post(
addedAt: new Date(),
});
repo.model.coauthors = list;
await repo.model.save();
await AnonymizedRepositoryModel.updateOne(
{ _id: repo.model._id },
{ $set: { coauthors: list } }
).exec();
res.json(repo.model.coauthors);
} catch (error) {
handleError(error, res, req);
@@ -690,7 +693,10 @@ router.delete(
repo.model.coauthors = (repo.model.coauthors || []).filter(
(c) => c.username.toLowerCase() !== target.toLowerCase()
);
await repo.model.save();
await AnonymizedRepositoryModel.updateOne(
{ _id: repo.model._id },
{ $set: { coauthors: repo.model.coauthors } }
).exec();
res.json(repo.model.coauthors);
} catch (error) {
handleError(error, res, req);
+42 -3
View File
@@ -9,8 +9,11 @@ import { downloadQueue } from "../../queue";
import { RepositoryStatus } from "../../core/types";
import User from "../../core/User";
import { streamAnonymizedZip } from "../../core/zipStream";
import { createLogger, serializeError } from "../../core/logger";
import gh = require("parse-github-url");
const logger = createLogger("repository-public");
const router = express.Router();
router.get(
@@ -69,11 +72,47 @@ router.get(
},
},
})
.on("error", () => {
.on("error", (err: Error & { response?: { statusCode?: number; body?: unknown } }) => {
const upstreamStatus = err?.response?.statusCode;
let upstreamBody: string | undefined;
let errCode = "zip_not_available";
let httpStatus = 502;
if (err?.response?.body != null) {
try {
upstreamBody =
typeof err.response.body === "string"
? err.response.body
: Buffer.isBuffer(err.response.body)
? err.response.body.toString("utf8")
: JSON.stringify(err.response.body);
} catch {
/* ignore */
}
if (upstreamBody) {
try {
const parsed = JSON.parse(upstreamBody);
if (parsed && typeof parsed.error === "string") {
errCode = parsed.error;
}
} catch {
/* not JSON */
}
}
}
if (typeof upstreamStatus === "number") {
httpStatus = upstreamStatus >= 500 ? 502 : upstreamStatus;
}
logger.warn("streamer zip fetch failed", {
repoId: repo.repoId,
upstreamStatus,
upstreamBody: upstreamBody?.slice(0, 500),
err: serializeError(err),
});
handleError(
new AnonymousError("file_not_found", {
new AnonymousError(errCode, {
url: req.originalUrl,
httpStatus: 404,
httpStatus,
cause: err,
}),
res
);
+11 -2
View File
@@ -3,6 +3,7 @@ import config from "../../config";
import { ensureAuthenticated } from "./connection";
import { handleError, getUser, isOwnerOrAdmin } from "./route-utils";
import UserModel from "../../core/model/users/users.model";
import AnonymizedRepositoryModel from "../../core/model/anonymizedRepositories/anonymizedRepositories.model";
import User from "../../core/User";
import FileModel from "../../core/model/files/files.model";
import { isConnected } from "../database";
@@ -90,7 +91,12 @@ router.get("/quota", async (req: express.Request, res: express.Response) => {
await Promise.all(
ready
.filter((r) => uncachedSet.has(r.repoId))
.map((r) => r.model.save())
.map((r) =>
AnonymizedRepositoryModel.updateOne(
{ _id: r.model._id },
{ $set: { size: r.model.size } }
).exec()
)
);
}
}
@@ -131,7 +137,10 @@ router.post("/default", async (req: express.Request, res: express.Response) => {
const d = req.body;
user.model.default = d;
await user.model.save();
await UserModel.updateOne(
{ _id: user.model._id },
{ $set: { default: d } }
).exec();
res.send("ok");
} catch (error) {
handleError(error, res, req);