66 lines
2.6 KiB
TypeScript
66 lines
2.6 KiB
TypeScript
import { requireStageTwoUser, stageTwoApiError, stageTwoDatabase, stageTwoUuid } from '~/server/utils/stage-two-supabase'
|
|
import { visibleProfile, type ProfileRecord } from '~/server/utils/profile'
|
|
|
|
interface MembershipRow {
|
|
campaign_id: string
|
|
role: string
|
|
joined_at: string
|
|
}
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const user = await requireStageTwoUser(event)
|
|
const profileId = stageTwoUuid(getRouterParam(event, 'id'), 'profile id')
|
|
const viewerMemberships = await stageTwoDatabase<Array<{ campaign_id: string }>>(
|
|
`campaign_members?select=campaign_id&user_id=eq.${user.id}&active=eq.true`,
|
|
)
|
|
const viewerCampaignIds = [...new Set(viewerMemberships.map(member => member.campaign_id))]
|
|
|
|
let sharedMemberships: MembershipRow[]
|
|
if (profileId === user.id) {
|
|
sharedMemberships = await stageTwoDatabase<MembershipRow[]>(
|
|
`campaign_members?select=campaign_id,role,joined_at&user_id=eq.${profileId}&active=eq.true&order=joined_at.desc`,
|
|
)
|
|
} else if (viewerCampaignIds.length) {
|
|
sharedMemberships = await stageTwoDatabase<MembershipRow[]>(
|
|
`campaign_members?select=campaign_id,role,joined_at&user_id=eq.${profileId}&active=eq.true&campaign_id=in.(${viewerCampaignIds.join(',')})&order=joined_at.desc`,
|
|
)
|
|
} else {
|
|
sharedMemberships = []
|
|
}
|
|
if (profileId !== user.id && !sharedMemberships.length) {
|
|
throw createError({ statusCode: 404, statusMessage: 'Profile not found in your campaigns.' })
|
|
}
|
|
|
|
const profiles = await stageTwoDatabase<ProfileRecord[]>(
|
|
`profiles?select=id,display_name,description,avatar_path,created_at,updated_at&id=eq.${profileId}&limit=1`,
|
|
)
|
|
if (!profiles[0]) throw createError({ statusCode: 404, statusMessage: 'Profile not found.' })
|
|
|
|
const campaignIds = sharedMemberships.map(member => member.campaign_id)
|
|
const campaigns = campaignIds.length
|
|
? await stageTwoDatabase<Array<{ id: string; title: string; status: string }>>(
|
|
`campaigns?select=id,title,status&id=in.(${campaignIds.join(',')})`,
|
|
)
|
|
: []
|
|
const campaignById = new Map(campaigns.map(campaign => [campaign.id, campaign]))
|
|
const sharedCampaigns = sharedMemberships.flatMap((membership) => {
|
|
const campaign = campaignById.get(membership.campaign_id)
|
|
return campaign ? [{
|
|
id: campaign.id,
|
|
title: campaign.title,
|
|
status: campaign.status,
|
|
role: membership.role,
|
|
joined_at: membership.joined_at,
|
|
}] : []
|
|
})
|
|
|
|
return {
|
|
profile: visibleProfile(profiles[0], useRuntimeConfig().supabaseUrl),
|
|
sharedCampaigns,
|
|
}
|
|
} catch (error) {
|
|
stageTwoApiError(error)
|
|
}
|
|
})
|