Graphical PDS migrator for AT Protocol
1import { isValidHandle } from "npm:@atproto/syntax";
2import { oauthClient } from "../../../lib/oauth/client.ts";
3import { define } from "../../../utils.ts";
4
5function isValidUrl(url: string): boolean {
6 try {
7 const urlp = new URL(url);
8 // http or https
9 return urlp.protocol === "http:" || urlp.protocol === "https:";
10 } catch {
11 return false;
12 }
13}
14
15export const handler = define.handlers({
16 async POST(ctx) {
17 const data = await ctx.req.json();
18 const handle = data.handle;
19 if (
20 typeof handle !== "string" ||
21 !(isValidHandle(handle) || isValidUrl(handle))
22 ) {
23 return new Response("Invalid Handle", { status: 400 });
24 }
25
26 // Initiate the OAuth flow
27 try {
28 const url = await oauthClient.authorize(handle, {
29 scope: "atproto transition:generic transition:chat.bsky",
30 });
31 return Response.json({ redirectUrl: url.toString() });
32 } catch (err) {
33 console.error({ err }, "oauth authorize failed");
34 return new Response("Couldn't initiate login", { status: 500 });
35 }
36 },
37});