frontend client for gemstone. decentralised workplace app

feat: get full commit helper

serenity 3c9346a7 84f0b4d8

Changed files
+67 -1
src
lib
utils
atproto
+67 -1
src/lib/utils/atproto/index.ts
···
atUriAuthoritySchema,
nsidSchema,
} from "@/lib/types/atproto";
-
import { comAtprotoRepoGetRecordResponseSchema } from "@/lib/types/lexicon/com.atproto.repo.getRecord";
import type { Result } from "@/lib/utils/result";
import type { DidDocumentResolver } from "@atcute/identity-resolver";
import {
···
return { ok: false, error: responseParseError };
}
return { ok: true, data: record.value };
};
export const didDocResolver: DidDocumentResolver =
···
atUriAuthoritySchema,
nsidSchema,
} from "@/lib/types/atproto";
+
import type {
+
ComAtprotoRepoGetRecordResponse} from "@/lib/types/lexicon/com.atproto.repo.getRecord";
+
import {
+
comAtprotoRepoGetRecordResponseSchema,
+
} from "@/lib/types/lexicon/com.atproto.repo.getRecord";
import type { Result } from "@/lib/utils/result";
import type { DidDocumentResolver } from "@atcute/identity-resolver";
import {
···
return { ok: false, error: responseParseError };
}
return { ok: true, data: record.value };
+
};
+
+
export const getCommitFromFullAtUri = async ({
+
authority,
+
collection,
+
rKey,
+
}: AtUri): Promise<Result<ComAtprotoRepoGetRecordResponse, unknown>> => {
+
const didDocResult = await resolveDidDoc(authority);
+
if (!didDocResult.ok) return { ok: false, error: didDocResult.error };
+
+
if (!collection || !rKey)
+
return {
+
ok: false,
+
error: "No rkey or collection found in provided AtUri object",
+
};
+
+
const { service: services } = didDocResult.data;
+
if (!services)
+
return {
+
ok: false,
+
error: { message: "Resolved DID document has no service field." },
+
};
+
+
const pdsService = services.find(
+
(service) =>
+
service.id === "#atproto_pds" &&
+
service.type === "AtprotoPersonalDataServer",
+
);
+
+
if (!pdsService)
+
return {
+
ok: false,
+
error: {
+
message:
+
"Resolved DID document has no PDS service listed in the document.",
+
},
+
};
+
+
const pdsEndpointRecord = pdsService.serviceEndpoint;
+
let pdsEndpointUrl;
+
try {
+
// @ts-expect-error yes, we are coercing something that is explicitly not a string into a string, but in this case we want to be specific. only serviceEndpoints with valid atproto pds URLs should be allowed.
+
pdsEndpointUrl = new URL(pdsEndpointRecord).origin;
+
} catch (err) {
+
return { ok: false, error: err };
+
}
+
const req = new Request(
+
`${pdsEndpointUrl}/xrpc/com.atproto.repo.getRecord?repo=${didDocResult.data.id}&collection=${collection}&rkey=${rKey}`,
+
);
+
+
const res = await fetch(req);
+
const data: unknown = await res.json();
+
+
const {
+
success: responseParseSuccess,
+
error: responseParseError,
+
data: record,
+
} = comAtprotoRepoGetRecordResponseSchema.safeParse(data);
+
if (!responseParseSuccess) {
+
return { ok: false, error: responseParseError };
+
}
+
return { ok: true, data: record };
};
export const didDocResolver: DidDocumentResolver =