Something went wrong. Try again.
Monorepo for Tangled tangled.org
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091import type { OAuthUserAgent } from "@atcute/oauth-browser-client";import { createCob, eraseCob, updateCob, type CobRecord, type CobRef } from "$lib/api/cob";import { datetimeOf, nsidOf, type AtUri, type Did, type KnotOrigin, type LabelKey} from "$lib/api/syntax";import type { TicketRecord, TicketState } from "$lib/api/records";
// a pull is a ticket with a target branchexport const TICKET_COLLECTION = nsidOf("org.tangled.track.ticket");
export interface TicketProse { title: string; body: string; targetBranch?: string; tangledLabels?: readonly LabelKey[];}
const titleOf = (text: string): TicketRecord["title"] => ({ $type: "org.tangled.markup.markdown#inline", text});
// the knot refuses an empty markdown body, so leave a blank one outconst bodyOf = (text: string, current?: TicketRecord["body"]): TicketRecord["body"] => text.trim() ? { ...current, $type: "org.tangled.markup.markdown", text } : undefined;
const labelsOf = (keys: readonly LabelKey[]) => keys.length ? keys.map((key) => ({ $type: "org.tangled.label.defs#labelToken" as const, key })) : undefined;
export const createTicket = async ( agent: OAuthUserAgent, knot: KnotOrigin, repo: Did, { title, body, targetBranch, tangledLabels }: TicketProse): Promise<CobRecord<TicketRecord>> => { const record: TicketRecord = { $type: "org.tangled.track.ticket", title: titleOf(title), body: bodyOf(body), state: "open", targetBranch, ...(tangledLabels ? { tangledLabels: labelsOf(tangledLabels) } : {}), createdAt: datetimeOf(new Date().toISOString()) }; return { ...(await createCob(agent, knot, repo, TICKET_COLLECTION, record)), value: record };};
// a put replaces everything, so start from the stored recordexport const editTicket = ( agent: OAuthUserAgent, knot: KnotOrigin, uri: AtUri, { title, body, targetBranch, tangledLabels }: TicketProse): Promise<CobRecord<TicketRecord>> => updateCob<TicketRecord>(agent, knot, uri, (current) => ({ ...current, title: titleOf(title), body: bodyOf(body, current.body), targetBranch: targetBranch ?? current.targetBranch, ...(tangledLabels ? { tangledLabels: labelsOf(tangledLabels) } : {}) }));
export const setTicketState = ( agent: OAuthUserAgent, knot: KnotOrigin, uri: AtUri, state: Exclude<TicketState, "completed">): Promise<CobRecord<TicketRecord>> => updateCob<TicketRecord>(agent, knot, uri, (current) => ({ ...current, state }));
export const setTicketLabels = ( agent: OAuthUserAgent, knot: KnotOrigin, uri: AtUri, keys: readonly LabelKey[]): Promise<CobRecord<TicketRecord>> => updateCob<TicketRecord>(agent, knot, uri, (current) => ({ ...current, tangledLabels: labelsOf(keys) }));
export const eraseTicket = (agent: OAuthUserAgent, knot: KnotOrigin, from: CobRef): Promise<void> => eraseCob(agent, knot, from);