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>( `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( `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( `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( `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>( `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) } })