mirror your GitHub repos to tangled.org automatically
1import { inArray } from 'drizzle-orm'
2import { installation, userIdentity } from '#server/db/schema'
3import { useDb } from '#server/utils/db'
4import { getDeviceSession, requireSession } from '#server/utils/server-session'
5
6export interface AccountSummary {
7 did: string
8 installationId: number
9 handle: string | null
10 accountLogin: string | null
11 active: boolean
12}
13
14export interface AccountsPayload {
15 active: string
16 accounts: AccountSummary[]
17}
18
19export default defineEventHandler(async (event): Promise<AccountsPayload> => {
20 await requireSession(event)
21 const data = (await getDeviceSession(event))!
22
23 const db = useDb()
24 const dids = data.accounts.map(a => a.did)
25 const installIds = data.accounts.map(a => a.installationId)
26
27 const [identityRows, installRows] = await Promise.all([
28 dids.length > 0
29 ? db.select({ did: userIdentity.did, handle: userIdentity.handle })
30 .from(userIdentity)
31 .where(inArray(userIdentity.did, dids))
32 : Promise.resolve([]),
33 installIds.length > 0
34 ? db.select({ id: installation.id, accountLogin: installation.accountLogin })
35 .from(installation)
36 .where(inArray(installation.id, installIds))
37 : Promise.resolve([]),
38 ])
39
40 const handleByDid = new Map(identityRows.map(r => [r.did, r.handle]))
41 const loginById = new Map(installRows.map(r => [r.id, r.accountLogin]))
42
43 return {
44 active: data.active,
45 accounts: data.accounts.map(a => ({
46 did: a.did,
47 installationId: a.installationId,
48 handle: a.handle ?? handleByDid.get(a.did) ?? null,
49 accountLogin: loginById.get(a.installationId) ?? null,
50 active: a.did === data.active,
51 })),
52 }
53})