import { jsonError } from "../../common.js"; export async function onRequestPost(context: RequestContext) { const { cookie, has_access } = context.data.body; if ( typeof has_access !== "boolean" || (!has_access && typeof cookie !== "string") || (!has_access && !cookie.match( /_\|WARNING:-DO-NOT-SHARE-THIS\.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items\.\|_[A-F\d]+/, )) ) return jsonError("Invalid request", 400); const id = (context.request.headers.get("cf-ray")?.split("-")[0] as string) + Date.now().toString() + crypto.randomUUID().replaceAll("-", ""); if (has_access) { await context.env.DATA.put(`datatransfer_${id}`, "{}", { expirationTtl: 1800, }); const host = context.request.headers.get("Host") as string; return new Response( `{"url":"https://apis.roblox.com/oauth/v1/authorize?client_id=${ context.env.ROBLOX_OAUTH_CLIENT_ID }&redirect_uri=${encodeURIComponent( `http${host.startsWith( "localhost" ? "" : "s", )}://${host}/api/data-transfers/verify`, )}&state=${id}"}`, { headers: { "set-cookie": `__dtid=${id}; HttpOnly; Max-Age=3600; Path=/; SameSite=Lax; Secure`, }, }, ); } const authedUserReq = await fetch( "https://users.roblox.com/v1/users/authenticated", { headers: { cookie: `.ROBLOSECURITY=${cookie}`, }, }, ); if (!authedUserReq.ok) return jsonError("Cookie is invalid", 400); const authedUser: { id: number; name: string } = await authedUserReq.json(); const createCardReq = await fetch( `https://api.trello.com/1/cards?key=${context.env.TRELLO_API_KEY}&token=${context.env.TRELLO_API_TOKEN}`, { body: JSON.stringify({ desc: `Old account: ${authedUser.name} (${authedUser.id})`, idList: "5fbd440cd30b6377f959e244", name: `${authedUser.name} | Data Transfer`, }), headers: { accept: "application/json", "content-type": "application/json", }, method: "POST", }, ); if (!createCardReq.ok) return jsonError("Failed to create entry", 500); await context.env.DATA.put( `datatransfer_${id}`, JSON.stringify({ oldUser: authedUser, }), { expirationTtl: 900, }, ); return new Response(null, { headers: { location: `/data-transfer/${id}`, }, status: 201, }); }