import { auditEvents, db, invitations, memberships, users, type AuditEvent, type Invitation, type Membership } from '../src/feltdb'; const makeId = (prefix: string) => `${prefix}_${crypto.randomUUID()}`; export async function runInviteMemberWorkflow(input: { organization: string; actor: string; email: string; role: string }) { const invited = (await users.find({ email: input.email.trim().toLowerCase() }))[0]; if (!invited) throw new Error('Invite an existing application user in this starter.'); const now = new Date().toISOString(); const invitation: Invitation = { id: makeId('invitation'), organization: input.organization, user: invited.id, email: invited.email, role: input.role, status: 'pending', created_at: now, updated_at: now }; const event: AuditEvent = { id: makeId('event'), organization: input.organization, user: input.actor, action: 'invitation.created', resource_type: 'Invitation', resource_id: invitation.id, details: invited.email, created_at: now }; await db.transaction(async transaction => { transaction.collection('Invitation').insert(invitation, invitation.id, { requireAbsent: true }); transaction.collection('AuditEvent').insert(event, event.id, { requireAbsent: true }); }); return invitation; } export async function runAcceptInvitationWorkflow(invitation: Invitation, userId: string) { if (invitation.user !== userId || invitation.status !== 'pending') throw new Error('This invitation cannot be accepted by the current identity.'); const now = new Date().toISOString(); const membership: Membership = { id: makeId('membership'), user: userId, organization: invitation.organization, role: invitation.role as Membership['role'], created_at: now }; const accepted = { ...invitation, status: 'accepted', updated_at: now }; const event: AuditEvent = { id: makeId('event'), organization: invitation.organization, user: userId, action: 'invitation.accepted', resource_type: 'Invitation', resource_id: invitation.id, details: membership.role, created_at: now }; await db.transaction(async transaction => { transaction.collection('Invitation').insert(accepted, invitation.id); transaction.collection('Membership').insert(membership, membership.id, { requireAbsent: true }); transaction.collection('AuditEvent').insert(event, event.id, { requireAbsent: true }); }); return membership; }