// packages/api-client/src/meetings.ts // meetings / meeting_memos / meeting_documents / transcripts 도메인 함수. import type { D3roSupabaseClient } from './client' import type { Meeting, MeetingMemo, MeetingDocument, Transcript, DocumentTemplateType } from './types' // ── meetings ───────────────────────────────────────────────── export async function listMeetings( client: D3roSupabaseClient, options?: { limit?: number; teamId?: string | null } ): Promise { let query = client .from('meetings') .select('*') .order('started_at', { ascending: false }) if (options?.limit) { query = query.limit(options.limit) } if (options?.teamId !== undefined) { query = options.teamId === null ? query.is('team_id', null) : query.eq('team_id', options.teamId) } const { data, error } = await query if (error) throw new Error(`listMeetings failed: ${error.message}`) return data ?? [] } export async function getMeeting( client: D3roSupabaseClient, meetingId: string ): Promise { const { data, error } = await client .from('meetings') .select('*') .eq('id', meetingId) .maybeSingle() if (error) throw new Error(`getMeeting failed: ${error.message}`) return data } export async function createMeeting( client: D3roSupabaseClient, input: { userId: string title?: string | null teamId?: string | null } ): Promise { const { data, error } = await client .from('meetings') .insert({ user_id: input.userId, title: input.title ?? null, team_id: input.teamId ?? null, status: 'recording' }) .select('*') .single() if (error) throw new Error(`createMeeting failed: ${error.message}`) return data } export async function updateMeeting( client: D3roSupabaseClient, meetingId: string, patch: Partial ): Promise { const { data, error } = await client .from('meetings') .update(patch) .eq('id', meetingId) .select('*') .single() if (error) throw new Error(`updateMeeting failed: ${error.message}`) return data } export async function deleteMeeting( client: D3roSupabaseClient, meetingId: string ): Promise { const { error } = await client.from('meetings').delete().eq('id', meetingId) if (error) throw new Error(`deleteMeeting failed: ${error.message}`) } // ── meeting_memos ──────────────────────────────────────────── export async function listMemos( client: D3roSupabaseClient, meetingId: string ): Promise { const { data, error } = await client .from('meeting_memos') .select('*') .eq('meeting_id', meetingId) .order('timestamp_ms', { ascending: true }) if (error) throw new Error(`listMemos failed: ${error.message}`) return data ?? [] } export async function createMemo( client: D3roSupabaseClient, input: { meetingId: string userId: string content: string timestampMs: number } ): Promise { const { data, error } = await client .from('meeting_memos') .insert({ meeting_id: input.meetingId, user_id: input.userId, content: input.content, timestamp_ms: input.timestampMs }) .select('*') .single() if (error) throw new Error(`createMemo failed: ${error.message}`) return data } // ── meeting_documents ──────────────────────────────────────── export async function listDocuments( client: D3roSupabaseClient, meetingId: string ): Promise { const { data, error } = await client .from('meeting_documents') .select('*') .eq('meeting_id', meetingId) .order('created_at', { ascending: true }) if (error) throw new Error(`listDocuments failed: ${error.message}`) return data ?? [] } export async function createDocument( client: D3roSupabaseClient, input: { meetingId: string userId: string templateType: DocumentTemplateType title: string content: string promptUsed?: string | null llmModel?: string | null } ): Promise { const { data, error } = await client .from('meeting_documents') .insert({ meeting_id: input.meetingId, user_id: input.userId, template_type: input.templateType, title: input.title, content: input.content, prompt_used: input.promptUsed ?? null, llm_model: input.llmModel ?? null }) .select('*') .single() if (error) throw new Error(`createDocument failed: ${error.message}`) return data } // ── transcripts ────────────────────────────────────────────── export async function listTranscripts( client: D3roSupabaseClient, meetingId: string ): Promise { const { data, error } = await client .from('transcripts') .select('*') .eq('meeting_id', meetingId) .order('segment_index', { ascending: true }) if (error) throw new Error(`listTranscripts failed: ${error.message}`) return data ?? [] } export async function appendTranscript( client: D3roSupabaseClient, input: { meetingId: string segmentIndex: number timestampMs: number text: string speaker?: string | null durationMs?: number | null } ): Promise { const { data, error } = await client .from('transcripts') .insert({ meeting_id: input.meetingId, segment_index: input.segmentIndex, timestamp_ms: input.timestampMs, text: input.text, speaker: input.speaker ?? null, duration_ms: input.durationMs ?? null }) .select('*') .single() if (error) throw new Error(`appendTranscript failed: ${error.message}`) return data }