342 lines
6.6 KiB
Plaintext
342 lines
6.6 KiB
Plaintext
// Enums (expanded + used for Webhooks/JobEvents)
|
|
|
|
enum ProjectStatusEnum {
|
|
DRAFT
|
|
IN_PROGRESS
|
|
REVIEW
|
|
COMPLETED
|
|
ARCHIVED
|
|
CANCELED
|
|
}
|
|
|
|
enum StorageBackendEnum {
|
|
LOCAL
|
|
S3
|
|
}
|
|
|
|
enum MediaFileTypeEnum {
|
|
VIDEO
|
|
AUDIO
|
|
IMAGE
|
|
}
|
|
|
|
enum SourceTypeEnum {
|
|
UPLOAD
|
|
IMPORT
|
|
RECORDING
|
|
GENERATED
|
|
}
|
|
|
|
enum ArtifactTypeEnum {
|
|
VIDEO
|
|
AUDIO
|
|
THUMBNAIL
|
|
PREVIEW
|
|
WAVEFORM
|
|
TRANSCRIPT_JSON
|
|
METADATA
|
|
}
|
|
|
|
enum TranscribeEngineEnum {
|
|
LOCAL_WHISPER
|
|
GOOGLE_CLOUD
|
|
}
|
|
|
|
enum JobStatusEnum {
|
|
QUEUED
|
|
STARTED
|
|
IN_PROGRESS
|
|
SUCCEEDED
|
|
FAILED
|
|
CANCELED
|
|
RETRYING
|
|
}
|
|
|
|
enum WebhookEventEnum {
|
|
PROJECT_CREATED
|
|
PROJECT_UPDATED
|
|
FILE_UPLOADED
|
|
ARTIFACT_CREATED
|
|
TRANSCRIPTION_COMPLETED
|
|
JOB_STARTED
|
|
JOB_PROGRESS
|
|
JOB_SUCCEEDED
|
|
JOB_FAILED
|
|
}
|
|
|
|
enum JobEventTypeEnum {
|
|
LOG
|
|
STATUS_CHANGED
|
|
PROGRESS
|
|
WARNING
|
|
ERROR
|
|
}
|
|
|
|
// Tables
|
|
|
|
Table Users {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
username varchar(150) [unique]
|
|
email varchar [unique]
|
|
|
|
password_hash varchar(255)
|
|
|
|
first_name varchar(150)
|
|
last_name varchar(150)
|
|
|
|
phone_number varchar(16)
|
|
avatar varchar(2048)
|
|
|
|
email_verified boolean
|
|
phone_verified boolean
|
|
|
|
// Replace is_staff and is_superuser with role system later
|
|
is_staff boolean
|
|
is_superuser boolean
|
|
|
|
date_joined datetime
|
|
last_login datetime
|
|
|
|
Indexes {
|
|
(email) [name: "idx_users_email"]
|
|
(username) [name: "idx_users_username"]
|
|
(is_active) [name: "idx_users_is_active"]
|
|
(deleted_at) [name: "idx_users_deleted_at"]
|
|
}
|
|
}
|
|
|
|
Table Projects {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
owner_id uuid
|
|
|
|
name varchar(150)
|
|
description varchar(4096)
|
|
language varchar(3)
|
|
folder varchar
|
|
status ProjectStatusEnum
|
|
|
|
Indexes {
|
|
(owner_id) [name: "idx_projects_owner_id"]
|
|
(status) [name: "idx_projects_status"]
|
|
(is_active) [name: "idx_projects_is_active"]
|
|
(deleted_at) [name: "idx_projects_deleted_at"]
|
|
}
|
|
}
|
|
|
|
Table Files {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
project_id uuid
|
|
owner_id uuid
|
|
|
|
original_file_name varchar
|
|
path varchar
|
|
|
|
storage_backend StorageBackendEnum
|
|
mime_type varchar
|
|
size_bytes bigint
|
|
checksum varchar(256)
|
|
file_format varchar(10)
|
|
|
|
is_uploaded boolean
|
|
|
|
Indexes {
|
|
(project_id) [name: "idx_files_project_id"]
|
|
(owner_id) [name: "idx_files_owner_id"]
|
|
(checksum) [name: "idx_files_checksum"]
|
|
(is_uploaded) [name: "idx_files_is_uploaded"]
|
|
(is_active) [name: "idx_files_is_active"]
|
|
(deleted_at) [name: "idx_files_deleted_at"]
|
|
}
|
|
}
|
|
|
|
// Normalized: MediaFiles extends Files (no duplicate project_id/owner_id)
|
|
Table MediaFiles {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
file_id uuid [unique]
|
|
|
|
duration_sec float
|
|
frame_rate float
|
|
width integer
|
|
height integer
|
|
|
|
probe_json jsonb
|
|
notes varchar(4096)
|
|
meta jsonb
|
|
|
|
file_type MediaFileTypeEnum
|
|
source_type SourceTypeEnum
|
|
|
|
Indexes {
|
|
(file_id) [name: "idx_mediafiles_file_id"]
|
|
(file_type) [name: "idx_mediafiles_file_type"]
|
|
(source_type) [name: "idx_mediafiles_source_type"]
|
|
(is_active) [name: "idx_mediafiles_is_active"]
|
|
(deleted_at) [name: "idx_mediafiles_deleted_at"]
|
|
}
|
|
}
|
|
|
|
// Normalized: Artifact points to output file; lineage via source_media_file_id
|
|
Table Artifacts {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
output_file_id uuid [unique]
|
|
source_media_file_id uuid
|
|
|
|
artifact_type ArtifactTypeEnum
|
|
|
|
Indexes {
|
|
(output_file_id) [name: "idx_artifacts_output_file_id"]
|
|
(source_media_file_id) [name: "idx_artifacts_source_media_file_id"]
|
|
(artifact_type) [name: "idx_artifacts_artifact_type"]
|
|
(is_active) [name: "idx_artifacts_is_active"]
|
|
(deleted_at) [name: "idx_artifacts_deleted_at"]
|
|
}
|
|
}
|
|
|
|
// Normalized: no duplicate project_id; derive via input_file_id / transcript_artifact_id
|
|
Table Transcriptions {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
input_file_id uuid
|
|
transcript_artifact_id uuid
|
|
|
|
engine TranscribeEngineEnum
|
|
language varchar(3)
|
|
|
|
document jsonb
|
|
transcribe_options jsonb
|
|
|
|
Indexes {
|
|
(input_file_id) [name: "idx_transcriptions_input_file_id"]
|
|
(transcript_artifact_id) [unique, name: "ux_transcriptions_transcript_artifact_id"]
|
|
(engine) [name: "idx_transcriptions_engine"]
|
|
(is_active) [name: "idx_transcriptions_is_active"]
|
|
(deleted_at) [name: "idx_transcriptions_deleted_at"]
|
|
}
|
|
}
|
|
|
|
Table Jobs {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
|
|
broker_id varchar(255) [unique]
|
|
|
|
user_id uuid
|
|
project_id uuid
|
|
|
|
input_data jsonb
|
|
output_data jsonb
|
|
|
|
status JobStatusEnum
|
|
progress_pct integer
|
|
|
|
error_message varchar(4096)
|
|
current_message varchar(4096)
|
|
|
|
started_at datetime
|
|
finished_at datetime
|
|
|
|
Indexes {
|
|
(broker_id) [name: "idx_jobs_broker_id"]
|
|
(user_id) [name: "idx_jobs_user_id"]
|
|
(project_id) [name: "idx_jobs_project_id"]
|
|
(status) [name: "idx_jobs_status"]
|
|
(is_active) [name: "idx_jobs_is_active"]
|
|
}
|
|
}
|
|
|
|
Table JobEvents {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
|
|
job_id uuid
|
|
event_type JobEventTypeEnum
|
|
payload jsonb
|
|
|
|
Indexes {
|
|
(job_id) [name: "idx_jobevents_job_id"]
|
|
(event_type) [name: "idx_jobevents_event_type"]
|
|
(created_at) [name: "idx_jobevents_created_at"]
|
|
(is_active) [name: "idx_jobevents_is_active"]
|
|
}
|
|
}
|
|
|
|
Table Webhooks {
|
|
id uuid [pk]
|
|
created_at datetime
|
|
updated_at datetime
|
|
is_active boolean
|
|
deleted_at datetime
|
|
|
|
project_id uuid
|
|
user_id uuid
|
|
|
|
event WebhookEventEnum
|
|
url varchar(512)
|
|
secret varchar(256)
|
|
|
|
Indexes {
|
|
(project_id) [name: "idx_webhooks_project_id"]
|
|
(user_id) [name: "idx_webhooks_user_id"]
|
|
(event) [name: "idx_webhooks_event"]
|
|
(project_id, event, url) [unique, name: "ux_webhooks_project_event_url"]
|
|
(is_active) [name: "idx_webhooks_is_active"]
|
|
(deleted_at) [name: "idx_webhooks_deleted_at"]
|
|
}
|
|
}
|
|
|
|
// Refs (fixed + aligned to actual FK columns)
|
|
Ref: Projects.owner_id > Users.id
|
|
|
|
Ref: Files.project_id > Projects.id
|
|
Ref: Files.owner_id > Users.id
|
|
|
|
Ref: MediaFiles.file_id > Files.id
|
|
|
|
Ref: Artifacts.output_file_id > Files.id
|
|
Ref: Artifacts.source_media_file_id > MediaFiles.id
|
|
|
|
Ref: Transcriptions.input_file_id > Files.id
|
|
Ref: Transcriptions.transcript_artifact_id > Artifacts.id
|
|
|
|
Ref: Jobs.project_id > Projects.id
|
|
Ref: Jobs.user_id > Users.id
|
|
|
|
Ref: JobEvents.job_id > Jobs.id
|
|
|
|
Ref: Webhooks.project_id > Projects.id
|
|
Ref: Webhooks.user_id > Users.id
|
|
|