first commit
This commit is contained in:
384
Overview/.$meeting_system_architecture.drawio.bkp
Normal file
384
Overview/.$meeting_system_architecture.drawio.bkp
Normal file
@@ -0,0 +1,384 @@
|
||||
<mxfile host="Electron" agent="ChatGPT" pages="4">
|
||||
<diagram id="architecture" name="Architecture Overview">
|
||||
<mxGraphModel dx="3654" dy="2201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="client_zone" parent="1" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;fontSize=14;" value="USER MACHINE" vertex="1">
|
||||
<mxGeometry height="720" width="430" x="-150" y="70" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="K5FFtGGXxMcr7Zq1do-5-1" edge="1" parent="client_zone" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="recorder" value="">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="browser" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Browser / Desktop UI React / Next.js" vertex="1">
|
||||
<mxGeometry height="90" width="170" x="105" y="55" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="recorder" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Meeting Recorder WebRTC / MediaRecorder (or native recorder)" vertex="1">
|
||||
<mxGeometry height="90" width="170" x="105" y="180" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="local_tx" parent="client_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Local Transcription Engine Whisper / whisper.cpp / other local STT Runs on user machine" vertex="1">
|
||||
<mxGeometry height="120" width="200" x="90" y="330" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="local_data" parent="client_zone" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" value="Local temporary data • video/audio chunks • transcript text / segments • timestamps / speakers" vertex="1">
|
||||
<mxGeometry height="120" width="240" x="70" y="510" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e1" edge="1" parent="client_zone" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="recorder">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e2" edge="1" parent="client_zone" source="recorder" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="local_tx">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e3" edge="1" parent="client_zone" source="local_tx" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" target="local_data">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="backend_zone" parent="1" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;fontSize=14;" value="YOUR BACKEND / PRIVATE INFRASTRUCTURE" vertex="1">
|
||||
<mxGeometry height="820" width="1010" x="520" y="-30" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="api" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Backend API FastAPI / Node.js Auth • Meetings • Upload URLs Transcript ingestion • Job creation" vertex="1">
|
||||
<mxGeometry height="150" width="230" x="30" y="160" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="pg" parent="backend_zone" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" value="PostgreSQL users auth_identities subscriptions meetings meeting_files transcripts meeting_tasks meeting_schedules processing_jobs" vertex="1">
|
||||
<mxGeometry height="170" width="210" x="460" y="190" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="seaweed" parent="backend_zone" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" value="SeaweedFS S3-compatible object storage videos audio thumbnails attachments exports" vertex="1">
|
||||
<mxGeometry height="100" width="240" x="580" y="60" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="queue" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" value="Job Queue Redis / PostgreSQL queue (optional for MVP)" vertex="1">
|
||||
<mxGeometry height="100" width="200" x="80" y="485" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="summary_worker" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;dashed=1;" value="Summarization Worker Reads transcript from PostgreSQL Generates summary + action items Writes results back" vertex="1">
|
||||
<mxGeometry height="150" width="240" x="330" y="460" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="reminder_worker" parent="backend_zone" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;dashed=1;" value="Reminder Worker / Scheduler Finds due schedules Sends notification / email / webhook Updates execution status" vertex="1">
|
||||
<mxGeometry height="150" width="240" x="730" y="450" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="security_note" parent="backend_zone" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" value="Important: • S3/SeaweedFS credentials stay on backend • Browser uses presigned URLs for large video uploads/downloads • Transcript is uploaded as structured JSON/text after local transcription" vertex="1">
|
||||
<mxGeometry height="110" width="535" x="390" y="680" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="upload_video" edge="1" parent="1" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="api" value="HTTPS / request presigned upload">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="460" y="170" />
|
||||
<mxPoint x="460" y="170" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="api_pg" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="SQL">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="800" y="200" />
|
||||
<mxPoint x="800" y="200" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="api_s3" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="seaweed" value="S3 API / presigned URLs">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="665" y="80" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="browser_s3" edge="1" parent="1" source="browser" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" target="seaweed" value="Direct large-file upload/download">
|
||||
<mxGeometry relative="1" x="-0.2784" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
<Array as="points">
|
||||
<mxPoint x="200" y="190" />
|
||||
<mxPoint x="200" y="400" />
|
||||
<mxPoint x="1270" y="400" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="api_queue" edge="1" parent="1" source="api" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="queue" value="enqueue summarization / reminder jobs">
|
||||
<mxGeometry relative="1" x="-0.4286" y="100" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
<Array as="points">
|
||||
<mxPoint x="690" y="440" />
|
||||
<mxPoint x="690" y="440" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="queue_sum" edge="1" parent="1" source="queue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="summary_worker">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="820" y="510" />
|
||||
<mxPoint x="820" y="510" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="queue_rem" edge="1" parent="1" source="queue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="reminder_worker">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="700" y="620" />
|
||||
<mxPoint x="1360" y="620" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="sum_pg" edge="1" parent="1" source="summary_worker" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="read transcript / write summary & tasks">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="1040" y="380" />
|
||||
<mxPoint x="1040" y="380" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="rem_pg" edge="1" parent="1" source="reminder_worker" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" target="pg" value="read schedules / update status">
|
||||
<mxGeometry relative="1" x="0.0154" y="-20" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
<Array as="points">
|
||||
<mxPoint x="1150" y="555" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
<diagram id="database" name="PostgreSQL Database Design">
|
||||
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1200" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="dbtitle" value="PostgreSQL Logical Data Model" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="500" y="20" width="800" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="users" value="users PK id UUID email UNIQUE display_name identification_status account_status created_at updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="50" y="100" width="260" height="210" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="auth" value="auth_identities PK id UUID FK user_id → users.id provider provider_user_id password_hash created_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="50" y="370" width="260" height="190" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="subs" value="subscriptions PK id UUID FK user_id → users.id provider plan status current_period_end cancel_at_period_end" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="50" y="620" width="260" height="200" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="meetings" value="meetings PK id UUID FK owner_user_id → users.id title description started_at / ended_at status summary extra_metadata JSONB created_at / updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="410" y="100" width="300" height="250" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="files" value="meeting_files PK id UUID FK meeting_id → meetings.id FK uploaded_by → users.id file_type bucket object_key UNIQUE mime_type size_bytes checksum upload_status" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="800" y="80" width="310" height="260" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="transcripts" value="transcripts PK id UUID FK meeting_id → meetings.id language provider = local plain_text transcript_json JSONB status created_at / updated_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="800" y="410" width="310" height="230" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="tasks" value="meeting_tasks PK id UUID FK meeting_id → meetings.id FK assigned_user_id → users.id title description due_at status source source_data JSONB" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="1200" y="80" width="310" height="240" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="schedules" value="meeting_schedules PK id UUID FK meeting_id → meetings.id FK user_id → users.id schedule_type scheduled_at status payload JSONB executed_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="1200" y="390" width="310" height="220" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jobs" value="processing_jobs PK id UUID FK meeting_id → meetings.id job_type status attempts error_message input_data JSONB output_data JSONB started_at completed_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="800" y="720" width="310" height="260" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="participants" value="meeting_participants PK id UUID FK meeting_id → meetings.id FK user_id → users.id NULL display_name email role joined_at / left_at" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="410" y="450" width="300" height="220" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="access" value="meeting_access PK id UUID FK meeting_id → meetings.id FK user_id → users.id permission created_at UNIQUE(meeting_id,user_id)" style="rounded=0;whiteSpace=wrap;html=1;align=left;verticalAlign=top;fontSize=12;spacing=8;" vertex="1" parent="1">
|
||||
<mxGeometry x="1200" y="700" width="310" height="190" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r1" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="auth">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r2" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="subs">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r3" value="owner" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="meetings">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r4" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="files">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r5" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="transcripts">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r6" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="tasks">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r7" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="schedules">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r8" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="jobs">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r9" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="participants">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r10" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="meetings" target="access">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r11" value="assigned" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="tasks">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="r12" value="owner" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;startArrow=none;" edge="1" parent="1" source="users" target="schedules">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="dbnote" value="Recommended indexes: • meetings(owner_user_id, started_at DESC) • meeting_files(meeting_id) • transcripts(meeting_id) • meeting_schedules(status, scheduled_at) • processing_jobs(status, created_at) • GIN on transcript_json / extra_metadata only if queried" style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" vertex="1" parent="1">
|
||||
<mxGeometry x="50" y="930" width="660" height="180" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
<diagram id="flows" name="Main Flows">
|
||||
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1700" pageHeight="1100" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="ftitle" value="Core Runtime Flows" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="500" y="20" width="700" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fuser" value="User Machine" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="70" y="90" width="250" height="870" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fapi" value="Backend API" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="420" y="90" width="250" height="870" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fpg" value="PostgreSQL" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="770" y="90" width="250" height="870" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fs3" value="SeaweedFS" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="1120" y="90" width="250" height="870" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fworker" value="Backend Workers" style="swimlane;horizontal=1;startSize=28;rounded=1;html=1;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="1450" y="90" width="250" height="870" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="s1" value="1. Record meeting" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
|
||||
<mxGeometry x="30" y="60" width="180" height="70" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="s2" value="2. Upload video using presigned URL" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
|
||||
<mxGeometry x="30" y="180" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="s3" value="3. Transcribe locally" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
|
||||
<mxGeometry x="30" y="330" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="s4" value="4. Upload transcript JSON/text" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
|
||||
<mxGeometry x="30" y="480" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="s5" value="5. View summary / reminders" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fuser">
|
||||
<mxGeometry x="30" y="670" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="a1" value="Create meeting Generate presigned URL" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
|
||||
<mxGeometry x="35" y="90" width="180" height="90" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="a2" value="Register completed upload" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
|
||||
<mxGeometry x="35" y="240" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="a3" value="Validate + save transcript Create summarization job" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
|
||||
<mxGeometry x="35" y="470" width="180" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="a4" value="Create/update reminders" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fapi">
|
||||
<mxGeometry x="35" y="630" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="p1" value="meeting row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
|
||||
<mxGeometry x="35" y="90" width="180" height="70" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="p2" value="meeting_files row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
|
||||
<mxGeometry x="35" y="240" width="180" height="70" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="p3" value="transcripts row" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
|
||||
<mxGeometry x="35" y="470" width="180" height="70" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="p4" value="processing_jobs meeting_tasks meeting_schedules" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fpg">
|
||||
<mxGeometry x="35" y="630" width="180" height="110" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="o1" value="video/audio object" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fs3">
|
||||
<mxGeometry x="35" y="190" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="o2" value="attachments / exports" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fs3">
|
||||
<mxGeometry x="35" y="380" width="180" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="w1" value="Summarization job → summary → action items" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fworker">
|
||||
<mxGeometry x="35" y="470" width="180" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="w2" value="Reminder scheduler → due reminders → send + mark executed" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="fworker">
|
||||
<mxGeometry x="35" y="640" width="180" height="110" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx1" value="Create meeting" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s1" target="a1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx2" value="INSERT" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a1" target="p1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx3" value="presigned PUT" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" edge="1" parent="1" source="s2" target="o1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx4" value="upload complete" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s2" target="a2">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx5" value="INSERT metadata" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a2" target="p2">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx6" value="local only" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;dashed=1;" edge="1" parent="1" source="s3" target="s4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx7" value="POST transcript" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="s4" target="a3">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx8" value="INSERT transcript" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a3" target="p3">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx9" value="enqueue" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="a3" target="w1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx10" value="summary/tasks" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="w1" target="p4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx11" value="due schedules" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="p4" target="w2">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="fx12" value="execution status" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="w2" target="p4">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
<diagram id="storage" name="SeaweedFS Storage Layout">
|
||||
<mxGraphModel dx="1422" dy="794" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="stitle" value="SeaweedFS — S3-Compatible Object Layout" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="430" y="20" width="740" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="bucket" value="Bucket: meeting-storage" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="620" y="100" width="360" height="120" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="userpath" value="users/{user_id}/" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="620" y="280" width="360" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="meetpath" value="meetings/{meeting_id}/" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="620" y="420" width="360" height="80" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="orig" value="original/ meeting.webm / meeting.mp4" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="210" y="620" width="250" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="audio" value="audio/ meeting.opus / meeting.wav" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="620" width="250" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="thumb" value="thumbnails/ cover.jpg" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="830" y="620" width="250" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="attach" value="attachments/ agenda.pdf / files" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=middle;fontSize=14;" vertex="1" parent="1">
|
||||
<mxGeometry x="1140" y="620" width="250" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="se1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="bucket" target="userpath">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="se2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="userpath" target="meetpath">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e_orig" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="orig">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e_audio" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="audio">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e_thumb" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="thumb">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="e_attach" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;fontSize=11;" edge="1" parent="1" source="meetpath" target="attach">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="snote" value="PostgreSQL stores only bucket + object_key + metadata. The video/audio bytes live in SeaweedFS, not PostgreSQL." style="shape=note;whiteSpace=wrap;html=1;size=15;fontSize=12;" vertex="1" parent="1">
|
||||
<mxGeometry x="500" y="810" width="600" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
Reference in New Issue
Block a user