mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-06-24 05:36:39 -05:00
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import type { ActionFunctionArgs } from "react-router";
|
|
import { clearCombinedStreamsCache } from "~/features/core/streams/streams.server";
|
|
import { parseFormDataWithImages } from "~/form/parse.server";
|
|
import { requireRole } from "~/modules/permissions/guards.server";
|
|
import { dateToDatabaseTimestamp } from "~/utils/dates";
|
|
import { assertUnreachable } from "~/utils/types";
|
|
import { externalStreamActionSchema } from "../admin-schemas";
|
|
import * as ExternalStreamRepository from "../ExternalStreamRepository.server";
|
|
|
|
export const action = async ({ request }: ActionFunctionArgs) => {
|
|
requireRole("ADMIN");
|
|
|
|
const result = await parseFormDataWithImages({
|
|
request,
|
|
schema: externalStreamActionSchema,
|
|
});
|
|
|
|
if (!result.success) {
|
|
return { fieldErrors: result.fieldErrors };
|
|
}
|
|
|
|
const data = result.data;
|
|
|
|
switch (data._action) {
|
|
case "CREATE": {
|
|
await ExternalStreamRepository.insert({
|
|
name: data.name,
|
|
url: data.url,
|
|
avatarImgId: data.avatar,
|
|
startTime: dateToDatabaseTimestamp(data.startTime),
|
|
});
|
|
break;
|
|
}
|
|
case "DELETE": {
|
|
await ExternalStreamRepository.deleteById(data.id);
|
|
break;
|
|
}
|
|
default: {
|
|
assertUnreachable(data);
|
|
}
|
|
}
|
|
|
|
clearCombinedStreamsCache();
|
|
|
|
return null;
|
|
};
|