1import { Client, simpleFetchHandler } from "@atcute/client";
2import type { ShTangledRepo } from "@atcute/tangled";
3import { query } from "@solidjs/router";
4import { getUserPDS } from "./get_pds";
5import type { DID } from "./types";
6
7export const getUserRepos = query(
8 async (
9 did: DID,
10 ): Promise<Record<string, ShTangledRepo.Main & { rkey: string }>> => {
11 const pds = await getUserPDS(did);
12 if (!pds) return {};
13 const handler = simpleFetchHandler({ service: pds });
14 const rpc = new Client({ handler });
15
16 const repos: Record<string, ShTangledRepo.Main & { rkey: string }> = {};
17 let cursor: string | undefined;
18
19 while (true) {
20 const { ok, data } = await rpc.get("com.atproto.repo.listRecords", {
21 params: {
22 repo: did,
23 collection: "sh.tangled.repo",
24 limit: 100,
25 cursor,
26 },
27 });
28 if (!ok) break;
29 const length = data.records.length;
30 const moreRepos = data.records.reduce(
31 (acc, r) => {
32 const record = Object.assign(
33 { rkey: r.uri.slice(r.uri.lastIndexOf("/") + 1) },
34 r.value as ShTangledRepo.Main,
35 );
36 acc[record.name] = record;
37 return acc;
38 },
39 new Object() as typeof repos,
40 );
41 Object.assign(repos, moreRepos);
42 cursor = data.cursor;
43 if (length < 100) break;
44 }
45
46 return repos;
47 },
48 "user_repos",
49);
50
51export const getUserRepoByRkey = query(
52 async (did: DID, rkey: string): Promise<ShTangledRepo.Main | undefined> => {
53 const pds = await getUserPDS(did);
54 if (!pds) return;
55 const handler = simpleFetchHandler({ service: pds });
56 const rpc = new Client({ handler });
57
58 const { ok, data } = await rpc.get("com.atproto.repo.getRecord", {
59 params: {
60 repo: did,
61 collection: "sh.tangled.repo",
62 rkey,
63 },
64 });
65
66 if (!ok) return;
67
68 return data.value as ShTangledRepo.Main;
69 },
70 "user_repos",
71);
72
73export async function getUserRepo(
74 did: DID,
75 repo: string,
76): Promise<ShTangledRepo.Main & { rkey: string }> {
77 const repos = await getUserRepos(did);
78 return repos[repo];
79}
80
81export const getRepoKnot = async (did: DID, repo: string) => {
82 const repos = await getUserRepos(did);
83 return `https://${repos[repo].knot}`;
84};