import { jsonError } from "../../common.js"; export async function onRequestPost(context: RequestContext) { const { id } = context.data.body; if (!id) return jsonError("No ID provided", 400); const user = await context.env.DATA.get(`reportprocessing_${id}`); if ( !user || (context.data.current_user ? user !== context.data.current_user.id : user !== context.request.headers.get("CF-Connecting-IP")) ) return jsonError("No report with that ID is processing", 404); await context.env.DATA.delete(`reportprocessing_${id}`); const value = await context.env.DATA.get(`report_${id}`); if (!value) return jsonError("Report is missing", 500); const coconutData = (await context.env.DATA.get(`coconutdata_${id}`, { type: "json", })) as { attachments: string[]; } | null; if (coconutData) { const responsePromises = []; for (const attachment of coconutData.attachments) { const token = crypto.randomUUID(); responsePromises.push( fetch("https://api.coconut.co/v2/jobs", { body: JSON.stringify({ input: { bucket: "car-crushers", credentials: { access_key_id: context.env.R2_ACCESS_KEY, secret_access_key: context.env.R2_SECRET_KEY, }, endpoint: `https://${context.env.R2_ZONE}.r2.cloudflarestorage.com`, key: `/t/${attachment}`, region: "us-east-1", service: "s3other", }, notification: { params: { attachment, token, }, type: "http", url: `https://${context.request.headers.get("host")}/api/coconut`, }, outputs: { mp4: { format: { level: 20, metadata: 0, quality: 4, vprofile: "high", }, path: `/${attachment}.mp4`, }, }, storage: { bucket: "car-crushers", credentials: { access_key_id: context.env.R2_ACCESS_KEY, secret_access_key: context.env.R2_SECRET_KEY, }, endpoint: `https://${context.env.R2_ZONE}.r2.cloudflarestorage.com`, region: "us-east-1", service: "s3other", }, }), headers: { authorization: `Basic ${btoa(`${context.env.COCONUT_API_KEY}:`)}`, "content-type": "application/json", }, method: "POST", }), await context.env.DATA.put(`coconutjob_${attachment}`, token, { expirationTtl: 600, }), ); } const resolvedPromises = await Promise.allSettled(responsePromises); for (const p of resolvedPromises) { if (p.status === "rejected") console.log(`Request to coconut failed: ${p}`); else { if (p.value && !p.value.ok) console.log(`Request rejected by coconut: ${await p.value.text()}`); } } await context.env.DATA.delete(`coconutdata_${id}`); } if (context.env.REPORTS_WEBHOOK) { await fetch(context.env.REPORTS_WEBHOOK, { body: JSON.stringify({ embeds: [ { title: "Report Submitted", color: 3756250, description: `View this report at https://carcrushers.cc/mod-queue?id=${id}&type=report`, }, ], }), headers: { "content-type": "application/json", }, method: "POST", }); } return new Response(null, { status: 204, }); }