diff --git a/functions/api/short-links/new.ts b/functions/api/short-links/new.ts new file mode 100644 index 0000000..3c434f6 --- /dev/null +++ b/functions/api/short-links/new.ts @@ -0,0 +1,35 @@ +import { jsonError } from "../../common.js"; + +export async function onRequestPost(context: RequestContext) { + const { destination, path } = context.data.body; + + if (typeof path !== "string" || path.length > 256) + return jsonError("Invalid path", 400); + + const result = await context.env.D1.prepare( + "SELECT path FROM short_links WHERE path = ?;", + ) + .bind(path) + .first(); + + if (result) + return jsonError( + "Short link with that path already exists, please choose a different one.", + 400, + ); + + const url = new URL(destination); + + if (!["http:", "https:"].includes(url.protocol)) + return jsonError("Invalid URL", 400); + + await context.env.D1.prepare( + "INSERT INTO short_links (created_at, destination, path, user) VALUES (?, ?, ?, ?);", + ) + .bind(Date.now(), destination, path, context.data.current_user.id) + .run(); + + return new Response(null, { + status: 204, + }); +}