Remove deprecated routes

This commit is contained in:
Jordan Eldredge 2025-06-04 20:51:48 -07:00
parent fa9d55b9af
commit 71f754f9f9

View file

@ -1,28 +1,14 @@
import { Router } from "express";
import asyncHandler from "express-async-handler";
import SkinModel from "../data/SkinModel";
import * as Skins from "../data/skins";
import {
DISCORD_CLIENT_ID,
DISCORD_REDIRECT_URL,
LOGIN_REDIRECT_URL,
} from "../config";
import S3 from "../s3";
import LRU from "lru-cache";
import { MuseumPage } from "../data/skins";
import { processUserUploads } from "./processUserUploads";
import { auth } from "./auth";
import * as Parallel from "async-parallel";
const router = Router();
const options = {
max: 100,
maxAge: 1000 * 60 * 60,
};
let skinCount: number | null = null;
const cache = new LRU<string, MuseumPage>(options);
// Purposefully REST
router.get(
"/auth/",
@ -37,15 +23,6 @@ router.get(
);
})
);
// @deprecated Use GraphQL
router.get(
"/authed/",
asyncHandler(async (req, res) => {
res.json({ username: req.ctx.username });
})
);
// Purposefully REST
router.get(
"/auth/discord",
@ -68,265 +45,4 @@ router.get(
})
);
// @deprecated Use GraphQL
router.get(
"/skins/",
asyncHandler(async (req, res) => {
if (skinCount == null) {
skinCount = await Skins.getClassicSkinCount();
}
const { offset = 0, first = 100 } = req.query;
const key = req.originalUrl;
const cached = cache.get(key);
if (cached != null) {
req.log(`Cache hit for ${key}`);
res.json({ skinCount, skins: cached });
return;
}
req.log(`Getting offset: ${offset}, first: ${first}`);
const start = Date.now();
const skins = await Skins.getMuseumPage({
offset: Number(offset),
first: Number(first),
});
req.log(`Query took ${(Date.now() - start) / 1000}`);
req.log(`Cache set for ${key}`);
cache.set(key, skins);
res.json({ skinCount, skins });
})
);
// @deprecated Use GraphQL
router.post(
"/skins/get_upload_urls",
asyncHandler(async (req, res) => {
const payload = req.body.skins as { [md5: string]: string };
const missing = {};
await Parallel.each(
Object.entries(payload),
async ([md5, filename]) => {
if (!(await SkinModel.exists(req.ctx, md5))) {
const id = await Skins.recordUserUploadRequest(md5, filename);
const url = S3.getSkinUploadUrl(md5, id);
missing[md5] = { id, url };
}
},
5
);
res.json(missing);
})
);
// @deprecated Use GraphQL
router.post(
"/feedback",
asyncHandler(async (req, res) => {
const payload = req.body as {
email?: string;
message: string;
url?: string;
};
req.notify({
type: "GOT_FEEDBACK",
url: payload.url,
message: payload.message,
email: payload.email,
});
res.json({ message: "sent" });
})
);
// @deprecate Use GraphQL
router.post(
"/skins/status",
asyncHandler(async (req, res) => {
const statuses = await Skins.getUploadStatuses(req.body.hashes);
res.json(statuses);
})
);
// @deprecated Use GraphQL
router.get(
"/skins/:md5",
asyncHandler(async (req, res) => {
const { md5 } = req.params;
const skin = await SkinModel.fromMd5(req.ctx, md5);
if (skin == null) {
req.log(`Details for hash "${md5}" NOT FOUND`);
res.status(404).json();
return;
}
res.json({
md5: skin.getMd5(),
nsfw: await skin.getIsNsfw(),
fileName: await skin.getFileName(),
});
})
);
// @deprecated Use GraphQL
router.get(
"/skins/:md5/metadata",
asyncHandler(async (req, res) => {
const { md5 } = req.params;
const skin = await SkinModel.fromMd5(req.ctx, md5);
if (skin == null) {
req.log(`Details for hash "${md5}" NOT FOUND`);
res.status(404).json();
return;
}
const [nsfw, fileName, readme] = await Promise.all([
skin.getIsNsfw(),
skin.getFileName(),
skin.getReadme(),
]);
res.json({
md5: skin.getMd5(),
nsfw,
fileName,
readme,
});
})
);
// @deprecated Use GraphQL
router.get(
"/skins/:md5/debug",
asyncHandler(async (req, res) => {
const { md5 } = req.params;
const skin = await SkinModel.fromMd5(req.ctx, md5);
if (skin == null) {
req.log(`Details for hash "${md5}" NOT FOUND`);
res.status(404).json();
return;
}
res.json(await skin.debug());
})
);
function requireAuthed(req, res, next) {
if (!req.ctx.authed()) {
res.status(403);
res.send({ message: "You must be logged in" });
} else {
next();
}
}
// @deprecated Use GraphQL
router.get(
"/to_review",
requireAuthed,
asyncHandler(async (req, res) => {
const { filename, md5 } = await Skins.getSkinToReview();
res.json({ filename, md5 });
})
);
// @deprecated Use GraphQL
router.post(
"/skins/:md5/reject",
requireAuthed,
asyncHandler(async (req, res) => {
const { md5 } = req.params;
req.log(`Rejecting skin with hash "${md5}"`);
const skin = await SkinModel.fromMd5(req.ctx, md5);
if (skin == null) {
res.status(404).send("Skin not found");
return;
}
await Skins.reject(req.ctx, md5);
req.notify({ type: "REJECTED_SKIN", md5 });
res.send({ message: "The skin has been rejected." });
})
);
// @deprecated Use GraphQL
router.post(
"/skins/:md5/approve",
requireAuthed,
asyncHandler(async (req, res) => {
const { md5 } = req.params;
req.log(`Approving skin with hash "${md5}"`);
const skin = await SkinModel.fromMd5(req.ctx, md5);
if (skin == null) {
res.status(404).send("Skin not found");
return;
}
await Skins.approve(req.ctx, md5);
req.notify({ type: "APPROVED_SKIN", md5 });
res.send({ message: "The skin has been approved." });
})
);
// @deprecated Use GraphQL
// Unlike /report, this marks the skin NSFW right away without sending to
// Discord. Because of this, it requires auth.
router.post(
"/skins/:md5/nsfw",
requireAuthed,
asyncHandler(async (req, res) => {
const { md5 } = req.params;
req.log(`Approving skin with hash "${md5}"`);
const skin = await SkinModel.fromMd5(req.ctx, md5);
if (skin == null) {
res.status(404).send("Skin not found");
return;
}
await Skins.markAsNSFW(req.ctx, md5);
req.notify({ type: "MARKED_SKIN_NSFW", md5 });
res.send({ message: "The skin has been marked as NSFW." });
})
);
// @deprecated Use GraphQL
router.post(
"/skins/:md5/report",
asyncHandler(async (req, res) => {
const { md5 } = req.params;
req.log(`Reporting skin with hash "${md5}"`);
// Blow up if there is no skin with this hash
await SkinModel.fromMd5Assert(req.ctx, md5);
req.notify({ type: "REVIEW_REQUESTED", md5 });
res.send("The skin has been reported and will be reviewed shortly.");
})
);
// @deprecated Use GraphQL
// User reports that they uploaded a skin
router.post(
"/skins/:md5/uploaded",
asyncHandler(async (req, res) => {
const { md5 } = req.params;
const id = req.query.id as string;
if (id == null) {
throw new Error("Missing upload id");
}
// TODO: Validate md5 and id;
await Skins.recordUserUploadComplete(md5, id);
// Don't await, just kick off the task.
processUserUploads(req.notify);
res.json({ done: true });
})
);
// @deprecated Use GraphQL
router.get(
"/approved",
asyncHandler(async (req, res) => {
const approved = await Skins.getAllApproved();
res.json(approved);
})
);
// @deprecated Special purpose URL
router.get(
"/stylegan.json",
asyncHandler(async (req, res) => {
const images = await Skins.getAllClassicScreenshotUrls();
res.json(images);
})
);
export default router;