import { inArray } from 'drizzle-orm' import { installation, userIdentity } from '#server/db/schema' import { useDb } from '#server/utils/db' import { getDeviceSession, requireSession } from '#server/utils/server-session' export interface AccountSummary { did: string installationId: number handle: string | null accountLogin: string | null active: boolean } export interface AccountsPayload { active: string accounts: AccountSummary[] } export default defineEventHandler(async (event): Promise => { await requireSession(event) const data = (await getDeviceSession(event))! const db = useDb() const dids = data.accounts.map(a => a.did) const installIds = data.accounts.map(a => a.installationId) const [identityRows, installRows] = await Promise.all([ dids.length > 0 ? db.select({ did: userIdentity.did, handle: userIdentity.handle }) .from(userIdentity) .where(inArray(userIdentity.did, dids)) : Promise.resolve([]), installIds.length > 0 ? db.select({ id: installation.id, accountLogin: installation.accountLogin }) .from(installation) .where(inArray(installation.id, installIds)) : Promise.resolve([]), ]) const handleByDid = new Map(identityRows.map(r => [r.did, r.handle])) const loginById = new Map(installRows.map(r => [r.id, r.accountLogin])) return { active: data.active, accounts: data.accounts.map(a => ({ did: a.did, installationId: a.installationId, handle: a.handle ?? handleByDid.get(a.did) ?? null, accountLogin: loginById.get(a.installationId) ?? null, active: a.did === data.active, })), } })