import { DatetimeString } from '@atproto/syntax' import { Server, UpstreamFailureError } from '@atproto/xrpc-server' import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' import { ActorInfo } from '../../../../proto/bsky_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.ageassurance.getState, { auth: ctx.authVerifier.standard, handler: async ({ auth, }): Promise => { const viewer = auth.credentials.iss const actor = await getActorInfo(ctx, viewer) const lastInitiatedAt = actor.ageAssuranceStatus?.lastInitiatedAt return { encoding: 'application/json', body: { state: { lastInitiatedAt: lastInitiatedAt ? (lastInitiatedAt.toDate().toISOString() as DatetimeString) : undefined, status: actor.ageAssuranceStatus?.status || 'unknown', access: actor.ageAssuranceStatus?.access || 'unknown', }, metadata: { accountCreatedAt: actor.createdAt ? (actor.createdAt.toDate().toISOString() as DatetimeString) : undefined, }, }, } }, }) } const getActorInfo = async ( ctx: AppContext, actorDid: string, ): Promise => { try { const res = await ctx.dataplane.getActors({ dids: [actorDid], returnAgeAssuranceForDids: [actorDid], skipCacheForDids: [actorDid], }) return res.actors[0] } catch (err) { throw new UpstreamFailureError( 'Cannot get current age assurance state', 'GetAgeAssuranceStateFailed', { cause: err }, ) } }