import { AwsClient } from "aws4fetch"; import { jsonError } from "../common.js"; export async function onRequestPost(context: RequestContext) { const { searchParams } = new URL(context.request.url); const attachment = searchParams.get("attachment"); const token = searchParams.get("token"); if (!attachment || !token) return jsonError("Invalid report id or token", 400); const id = attachment.replace(/\.mp4$/, ""); const coconutToken: string | null = await context.env.DATA.get( `coconutjob_${id}`, ); if (!coconutToken) return jsonError("Request is stale or otherwise invalid", 400); if (coconutToken !== token) return jsonError("Forbidden", 403); await context.env.DATA.delete(`coconutjob_${id}`); const aws = new AwsClient({ accessKeyId: context.env.R2_ACCESS_KEY, secretAccessKey: context.env.R2_SECRET_KEY, }); const { event } = await context.request.json(); if (event === "job.failed") { await fetch(context.env.REPORTS_WEBHOOK, { body: JSON.stringify({ embeds: [ { title: "Transcoding Failed", color: 16711680, description: `Attachment ${id} could not be transcoded, please log in to Coconut to see what went wrong.`, }, ], }), headers: { "content-type": "application/json", }, method: "POST", }); } else { const R2_URL = `https://car-crushers.${context.env.R2_ZONE}.r2.cloudflarestorage.com`; await aws.fetch(`${R2_URL}/${id}`, { headers: { "x-amz-copy-source": `/car-crushers/${attachment}`, "x-amz-metadata-directive": "COPY", }, method: "PUT", }); await aws.fetch(`${R2_URL}/${attachment}`, { method: "DELETE", }); } return new Response(null, { status: 204, }); }