40 lines
1.2 KiB
TypeScript
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");
|
|
}
|