mirror of
https://github.com/tdurieux/anonymous_github.git
synced 2026-09-15 07:05:26 +02:00
98 lines
2.6 KiB
TypeScript
98 lines
2.6 KiB
TypeScript
import * as express from "express";
|
|
|
|
import { getGist, getUser, handleError } from "./route-utils";
|
|
import AnonymousError from "../../core/AnonymousError";
|
|
import User from "../../core/User";
|
|
|
|
const router = express.Router();
|
|
|
|
router.get(
|
|
"/:gistId/options",
|
|
async (req: express.Request, res: express.Response) => {
|
|
try {
|
|
res.header("Cache-Control", "no-cache");
|
|
const gist = await getGist(req, res, { nocheck: true });
|
|
if (!gist) return;
|
|
|
|
let user: User | undefined = undefined;
|
|
try {
|
|
user = await getUser(req);
|
|
} catch { /* not logged in */ }
|
|
const canEdit =
|
|
!!user && (user.isAdmin || user.id == gist.model.owner);
|
|
|
|
let redirectURL = null;
|
|
if (
|
|
!canEdit &&
|
|
gist.status == "expired" &&
|
|
gist.options.expirationMode == "redirect"
|
|
) {
|
|
redirectURL = `https://gist.github.com/${gist.source.gistId}`;
|
|
} else if (!canEdit) {
|
|
if (
|
|
gist.status == "expired" ||
|
|
gist.status == "expiring" ||
|
|
gist.status == "removing" ||
|
|
gist.status == "removed"
|
|
) {
|
|
throw new AnonymousError("gist_expired", {
|
|
object: gist,
|
|
httpStatus: 410,
|
|
});
|
|
}
|
|
|
|
const fiveMinuteAgo = new Date();
|
|
fiveMinuteAgo.setMinutes(fiveMinuteAgo.getMinutes() - 5);
|
|
if (gist.status != "ready") {
|
|
if (gist.model.statusDate < fiveMinuteAgo) {
|
|
await gist.updateIfNeeded({ force: true });
|
|
}
|
|
if (gist.status == "error") {
|
|
throw new AnonymousError(
|
|
gist.model.statusMessage
|
|
? gist.model.statusMessage
|
|
: "gist_not_available",
|
|
{
|
|
object: gist,
|
|
httpStatus: 500,
|
|
}
|
|
);
|
|
}
|
|
throw new AnonymousError("gist_not_ready", {
|
|
httpStatus: 425,
|
|
object: gist,
|
|
});
|
|
}
|
|
|
|
await gist.updateIfNeeded();
|
|
}
|
|
|
|
res.json({
|
|
url: redirectURL,
|
|
lastUpdateDate: gist.model.statusDate,
|
|
isAdmin: user?.isAdmin === true,
|
|
isOwner: user?.id == gist.model.owner,
|
|
});
|
|
} catch (error) {
|
|
handleError(error, res, req);
|
|
}
|
|
}
|
|
);
|
|
|
|
router.get(
|
|
"/:gistId/content",
|
|
async (req: express.Request, res: express.Response) => {
|
|
const gist = await getGist(req, res);
|
|
if (!gist) return;
|
|
try {
|
|
await gist.countView();
|
|
res.header("Cache-Control", "no-cache");
|
|
res.json(gist.content());
|
|
} catch (error) {
|
|
handleError(error, res, req);
|
|
}
|
|
}
|
|
);
|
|
|
|
export default router;
|