sendou.ink/app/features/img-upload/actions/upload.admin.server.ts
2026-03-04 16:33:51 +01:00

48 lines
1.2 KiB
TypeScript

import type { ActionFunction } from "react-router";
import { clearTournamentDataCache } from "~/features/tournament-bracket/core/Tournament.server";
import { requireRole } from "~/modules/permissions/guards.server";
import {
badRequestIfFalsy,
parseRequestPayload,
successToast,
} from "~/utils/remix.server";
import { assertUnreachable } from "~/utils/types";
import * as ImageRepository from "../ImageRepository.server";
import { validateImageSchema } from "../upload-schemas.server";
export const action: ActionFunction = async ({ request }) => {
requireRole("STAFF");
const data = await parseRequestPayload({
schema: validateImageSchema,
request,
});
switch (data._action) {
case "VALIDATE": {
for (const imageId of data.imageIds) {
const image = badRequestIfFalsy(
await ImageRepository.findById(imageId),
);
await ImageRepository.validateImage(imageId);
if (image.tournamentId) {
clearTournamentDataCache(imageId);
}
}
break;
}
case "REJECT": {
await ImageRepository.deleteImageById(data.imageId);
return successToast("The image was deleted");
}
default: {
assertUnreachable(data);
}
}
return null;
};