Files
erika/app/admin/upload/actions.ts
T

40 lines
1.2 KiB
TypeScript

"use server";
import { requireAdmin } from "@/lib/auth/auth";
import { db } from "@/db";
import { videoUploadJobs, videoUploads } from "@/db/schema";
import { eq } from "drizzle-orm";
import { sse } from "@/lib/realtime/sse";
import { revalidatePath } from "next/cache";
export async function createVideoUpload(formData: FormData) {
const discordId = await requireAdmin();
const { saveVideoUpload } = await import("@/lib/video/video-upload-storage");
const id = await saveVideoUpload(formData, discordId);
revalidatePath("/admin/upload/history");
return { id };
}
export async function retryVideoJob(jobId: string) {
await requireAdmin();
const job = await db.query.videoUploadJobs.findFirst({
where: (table, { eq }) => eq(table.id, jobId),
});
if (!job) return;
await db
.update(videoUploadJobs)
.set({ status: "pending", error: null })
.where(eq(videoUploadJobs.id, job.id));
await db
.update(videoUploads)
.set({ status: "partial", updatedAt: new Date() })
.where(eq(videoUploads.id, job.uploadId));
await sse.uploads.pub("update", {
uploadId: job.uploadId,
jobId: job.id,
platform: job.platform,
status: "pending",
});
revalidatePath("/admin/upload/history");
}