Files
webapp/server/middleware/me.ts
2026-01-07 09:10:35 +07:00

75 lines
2.1 KiB
TypeScript

import type LogtoClient from '@logto/node'
import { print } from 'graphql'
type SelectedLocation = {
type: string
uuid: string
name: string
latitude: number
longitude: number
} | null
type MePayload = {
id?: string | null
firstName?: string | null
lastName?: string | null
phone?: string | null
avatarId?: string | null
activeTeamId?: string | null
activeTeam?: {
name?: string | null
teamType?: string | null
logtoOrgId?: string | null
selectedLocation?: SelectedLocation
} | null
teams?: Array<{ id?: string | null; name?: string | null; logtoOrgId?: string | null; teamType?: string | null } | null> | null
} | null
export default defineEventHandler(async (event) => {
if (event.context.meLoaded) return
event.context.meLoaded = true
const client = event.context.logtoClient as LogtoClient | undefined
if (!client) return
let idToken: string | null = null
try {
idToken = await client.getIdToken()
} catch {
return
}
if (!idToken) return
try {
const { GetMeDocument, GetMeProfileDocument } = await import('~/composables/graphql/user/teams-generated')
const endpoint = process.env.NUXT_PUBLIC_TEAMS_GRAPHQL_USER || 'https://teams.optovia.ru/graphql/user/'
const [meResponse, profileResponse] = await Promise.all([
$fetch<{ data?: { me?: MePayload } }>(endpoint, {
method: 'POST',
headers: { Authorization: `Bearer ${idToken}` },
body: { query: print(GetMeDocument) }
}),
$fetch<{ data?: { me?: MePayload } }>(endpoint, {
method: 'POST',
headers: { Authorization: `Bearer ${idToken}` },
body: { query: print(GetMeProfileDocument) }
})
])
const baseMe = meResponse?.data?.me ?? null
const profileMe = profileResponse?.data?.me ?? null
if (baseMe || profileMe) {
event.context.me = {
...(baseMe || {}),
...(profileMe || {}),
activeTeam: baseMe?.activeTeam || profileMe?.activeTeam || null,
teams: baseMe?.teams || null
}
}
} catch {
// Ignore if user context can't be fetched
}
})