299 lines
17 KiB
Go
299 lines
17 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
const AssetIDMaxLength = 80
|
|
|
|
type Resource struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"index;size:36;index:idx_resources_user_created,priority:1"`
|
|
Kind string `json:"kind" gorm:"index;size:24"`
|
|
Status ResourceStatus `json:"status" gorm:"index;size:24"`
|
|
Provider string `json:"provider" gorm:"size:24"`
|
|
Endpoint string `json:"endpoint"`
|
|
Bucket string `json:"bucket" gorm:"size:160"`
|
|
// 用户 OSS 每次修改都会生成新版本,资源固定引用创建时的版本,避免历史资源因换密钥失效。
|
|
StorageSettingID string `json:"-" gorm:"index;size:36"`
|
|
ObjectKey string `json:"objectKey" gorm:"index"`
|
|
PublicURL string `json:"publicUrl"`
|
|
MimeType string `json:"mimeType" gorm:"size:120"`
|
|
Size int64 `json:"size"`
|
|
Width int `json:"width"`
|
|
Height int `json:"height"`
|
|
DurationMs int64 `json:"durationMs"`
|
|
ETag string `json:"etag" gorm:"size:160"`
|
|
Error string `json:"error"`
|
|
CreatedAt time.Time `json:"createdAt" gorm:"index:idx_resources_user_created,priority:2"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type Asset struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:80"`
|
|
UserID string `json:"userId" gorm:"index;size:36;index:idx_assets_user_updated,priority:1"`
|
|
Kind string `json:"kind" gorm:"index;size:24"`
|
|
Category AssetCategory `json:"category" gorm:"index;size:32"`
|
|
Status AssetVersionStatus `json:"status" gorm:"index;size:24"`
|
|
PrimaryVersionID string `json:"primaryVersionId,omitempty" gorm:"index;size:36"`
|
|
Title string `json:"title" gorm:"size:240"`
|
|
PayloadJSON string `json:"payloadJson" gorm:"type:text"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt" gorm:"index:idx_assets_user_updated,priority:2"`
|
|
}
|
|
|
|
type ProjectAssetLink struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:36;uniqueIndex:idx_project_asset_links_unique,priority:1"`
|
|
AssetID string `json:"assetId" gorm:"index;size:80;uniqueIndex:idx_project_asset_links_unique,priority:2"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type ProjectAssetCandidate struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:36"`
|
|
UnitID string `json:"unitId,omitempty" gorm:"index;size:36"`
|
|
ShotID string `json:"shotId,omitempty" gorm:"index;size:36"`
|
|
Name string `json:"name" gorm:"size:240"`
|
|
Category AssetCategory `json:"category" gorm:"index;size:32"`
|
|
Status string `json:"status" gorm:"index;size:32"`
|
|
DetailsJSON string `json:"detailsJson" gorm:"type:text"`
|
|
ResolvedAssetID string `json:"resolvedAssetId,omitempty" gorm:"index;size:80"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type AssetVersion struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
AssetID string `json:"assetId" gorm:"index;size:80;uniqueIndex:idx_asset_versions_number,priority:1"`
|
|
Version int `json:"version" gorm:"uniqueIndex:idx_asset_versions_number,priority:2"`
|
|
Status AssetVersionStatus `json:"status" gorm:"index;size:24"`
|
|
DefinitionJSON string `json:"definitionJson" gorm:"type:text"`
|
|
Prompt string `json:"prompt" gorm:"type:text"`
|
|
Note string `json:"note" gorm:"size:500"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type AssetRepresentation struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
TaskID string `json:"taskId,omitempty" gorm:"index;size:36;uniqueIndex:idx_asset_representations_task_role,priority:1"`
|
|
AssetVersionID string `json:"assetVersionId" gorm:"index;size:36;uniqueIndex:idx_asset_representations_version_role,priority:1"`
|
|
ResourceID string `json:"resourceId,omitempty" gorm:"index;size:36"`
|
|
MediaType string `json:"mediaType" gorm:"index;size:24"`
|
|
Role string `json:"role" gorm:"index;size:32;uniqueIndex:idx_asset_representations_task_role,priority:2;uniqueIndex:idx_asset_representations_version_role,priority:2"`
|
|
MetadataJSON string `json:"metadataJson" gorm:"type:text"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
// VoiceProfile 是可复用的声音身份;试听音频只是表现资源,不等同于声音本身。
|
|
type VoiceProfile struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"index;size:36;uniqueIndex:idx_voice_profiles_user_provider_key,priority:1"`
|
|
Name string `json:"name" gorm:"size:160"`
|
|
Provider string `json:"provider" gorm:"size:48;uniqueIndex:idx_voice_profiles_user_provider_key,priority:2"`
|
|
VoiceKey string `json:"voiceKey" gorm:"size:160;uniqueIndex:idx_voice_profiles_user_provider_key,priority:3"`
|
|
Language string `json:"language" gorm:"size:80"`
|
|
Timbre string `json:"timbre" gorm:"size:240"`
|
|
SampleResourceID string `json:"sampleResourceId,omitempty" gorm:"index;size:36"`
|
|
CompatibleModelsJSON string `json:"compatibleModelsJson" gorm:"type:text"`
|
|
Status string `json:"status" gorm:"index;size:24"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type CharacterVoiceBinding struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
AssetVersionID string `json:"assetVersionId" gorm:"uniqueIndex;size:36"`
|
|
VoiceProfileID string `json:"voiceProfileId" gorm:"index;size:36"`
|
|
Instructions string `json:"instructions" gorm:"type:text"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
// Project 是短剧领域聚合根;CanvasProject 仍代表可独立创作的画布文档。
|
|
type Project struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"index;size:36;uniqueIndex:idx_projects_user_name,priority:1"`
|
|
Name string `json:"name" gorm:"size:240;uniqueIndex:idx_projects_user_name,priority:2"`
|
|
Type string `json:"type" gorm:"size:32;index"`
|
|
AspectRatio string `json:"aspectRatio" gorm:"size:16"`
|
|
SourceType string `json:"sourceType" gorm:"size:32"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
StylePresetID string `json:"stylePresetId" gorm:"size:64"`
|
|
StyleProfileJSON string `json:"styleProfileJson" gorm:"type:text"`
|
|
Status ProjectStatus `json:"status" gorm:"index;size:24"`
|
|
Revision int64 `json:"revision"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt" gorm:"index"`
|
|
}
|
|
|
|
// StyleProfile 是用户可持续编辑的风格源;项目只保存应用当时的 JSON 快照,避免源对象更新污染历史生成。
|
|
type StyleProfile struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"index;size:36;index:idx_style_profiles_user_updated,priority:1"`
|
|
Name string `json:"name" gorm:"size:160"`
|
|
Description string `json:"description" gorm:"size:500"`
|
|
CoverURL string `json:"coverUrl" gorm:"type:text"`
|
|
TagsJSON string `json:"tagsJson" gorm:"type:text"`
|
|
ProfileJSON string `json:"profileJson" gorm:"type:text"`
|
|
Favorite bool `json:"favorite" gorm:"index"`
|
|
LastUsedAt *time.Time `json:"lastUsedAt,omitempty" gorm:"index"`
|
|
Revision int64 `json:"revision"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt" gorm:"index:idx_style_profiles_user_updated,priority:2"`
|
|
}
|
|
|
|
type ProjectUnit struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:36"`
|
|
ParentID string `json:"parentId,omitempty" gorm:"index;size:36"`
|
|
Kind ProjectUnitKind `json:"kind" gorm:"index;size:24"`
|
|
Title string `json:"title" gorm:"size:240"`
|
|
SourceText string `json:"sourceText" gorm:"type:text"`
|
|
Status ProjectUnitStatus `json:"status" gorm:"index;size:24"`
|
|
Position int `json:"position"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type CanvasUnitLink struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:36;uniqueIndex:idx_canvas_unit_links_unique,priority:1"`
|
|
CanvasID string `json:"canvasId" gorm:"index;size:80;uniqueIndex:idx_canvas_unit_links_unique,priority:2"`
|
|
UnitID string `json:"unitId" gorm:"index;size:36;uniqueIndex:idx_canvas_unit_links_unique,priority:3"`
|
|
Role string `json:"role" gorm:"size:32"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type Shot struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:36"`
|
|
UnitID string `json:"unitId" gorm:"index;size:36"`
|
|
Title string `json:"title" gorm:"size:240"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
Position int `json:"position"`
|
|
DurationMs int64 `json:"durationMs"`
|
|
Status string `json:"status" gorm:"index;size:24"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type ShotAssetReference struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ShotID string `json:"shotId" gorm:"index;size:36;uniqueIndex:idx_shot_asset_reference_unique,priority:1"`
|
|
AssetVersionID string `json:"assetVersionId" gorm:"index;size:36;uniqueIndex:idx_shot_asset_reference_unique,priority:2"`
|
|
Role string `json:"role" gorm:"index;size:32;uniqueIndex:idx_shot_asset_reference_unique,priority:3"`
|
|
Status string `json:"status" gorm:"index;size:24"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type WorkflowTemplateVersion struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
TemplateKey string `json:"templateKey" gorm:"size:80;uniqueIndex:idx_workflow_template_version,priority:1"`
|
|
Name string `json:"name" gorm:"size:160"`
|
|
Version int `json:"version" gorm:"uniqueIndex:idx_workflow_template_version,priority:2"`
|
|
DefinitionJSON string `json:"definitionJson" gorm:"type:text"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type WorkflowInstance struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:36;uniqueIndex:idx_workflow_instance_scope,priority:1"`
|
|
UnitID string `json:"unitId,omitempty" gorm:"index;size:36;uniqueIndex:idx_workflow_instance_scope,priority:2"`
|
|
TemplateVersionID string `json:"templateVersionId" gorm:"index;size:36;uniqueIndex:idx_workflow_instance_scope,priority:3"`
|
|
Scope string `json:"scope" gorm:"index;size:24"`
|
|
Status WorkflowStatus `json:"status" gorm:"index;size:24"`
|
|
Revision int64 `json:"revision"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type WorkflowStepInstance struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
WorkflowInstanceID string `json:"workflowInstanceId" gorm:"index;size:36;uniqueIndex:idx_workflow_steps_instance_key,priority:1"`
|
|
StepKey string `json:"stepKey" gorm:"size:80;uniqueIndex:idx_workflow_steps_instance_key,priority:2"`
|
|
Name string `json:"name" gorm:"size:160"`
|
|
Position int `json:"position"`
|
|
Status WorkflowStepStatus `json:"status" gorm:"index;size:24"`
|
|
InputJSON string `json:"inputJson" gorm:"type:text"`
|
|
OutputJSON string `json:"outputJson" gorm:"type:text"`
|
|
Error string `json:"error" gorm:"type:text"`
|
|
StartedAt *time.Time `json:"startedAt"`
|
|
CompletedAt *time.Time `json:"completedAt"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type WorkflowStepTask struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
WorkflowStepID string `json:"workflowStepId" gorm:"index;size:36;uniqueIndex:idx_workflow_step_tasks_unique,priority:1"`
|
|
TaskID string `json:"taskId" gorm:"index;size:36;uniqueIndex:idx_workflow_step_tasks_unique,priority:2"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|
|
|
|
type CanvasProject struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:80"`
|
|
UserID string `json:"userId" gorm:"index;size:36;index:idx_canvas_projects_user_updated,priority:1"`
|
|
ProjectID string `json:"projectId,omitempty" gorm:"index;size:36"`
|
|
Title string `json:"title" gorm:"size:240"`
|
|
PayloadJSON string `json:"payloadJson" gorm:"type:text"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt" gorm:"index:idx_canvas_projects_user_updated,priority:2"`
|
|
}
|
|
|
|
type CanvasShare struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"index;size:36;uniqueIndex:idx_canvas_share_owner_project,priority:1"`
|
|
ProjectID string `json:"projectId" gorm:"index;size:80;uniqueIndex:idx_canvas_share_owner_project,priority:2"`
|
|
TokenHash string `json:"-" gorm:"uniqueIndex;size:64"`
|
|
TokenCipher string `json:"-" gorm:"type:text"`
|
|
Enabled bool `json:"enabled" gorm:"index"`
|
|
ExpiresAt *time.Time `json:"expiresAt" gorm:"index"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type PromptTemplate struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
Operation string `json:"operation" gorm:"size:64;index;uniqueIndex:idx_prompt_template_operation_version,priority:1"`
|
|
Name string `json:"name" gorm:"size:120"`
|
|
Version int `json:"version" gorm:"uniqueIndex:idx_prompt_template_operation_version,priority:2"`
|
|
Content string `json:"content" gorm:"type:text"`
|
|
OutputType string `json:"outputType" gorm:"size:24"`
|
|
Enabled bool `json:"enabled" gorm:"index;index:idx_prompt_template_active,priority:2"`
|
|
CreatedBy string `json:"createdBy" gorm:"index;size:36"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
// UserPromptCustomization 只保存用户的创作策略层,动态上下文和输出契约始终由服务端编译器注入。
|
|
type UserPromptCustomization struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"size:36;index;uniqueIndex:idx_user_prompt_operation,priority:1"`
|
|
Operation string `json:"operation" gorm:"size:64;index;uniqueIndex:idx_user_prompt_operation,priority:2"`
|
|
Mode string `json:"mode" gorm:"size:24"`
|
|
Content string `json:"content" gorm:"type:text"`
|
|
BaseTemplateID string `json:"baseTemplateId" gorm:"size:36;index"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type Announcement struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
Title string `json:"title" gorm:"size:120"`
|
|
Content string `json:"content" gorm:"type:text"`
|
|
Level AnnouncementLevel `json:"level" gorm:"index;size:24"`
|
|
Status AnnouncementStatus `json:"status" gorm:"index;size:24;index:idx_announcements_status_published,priority:1"`
|
|
CreatedBy string `json:"createdBy" gorm:"index;size:36"`
|
|
PublishedAt time.Time `json:"publishedAt" gorm:"index:idx_announcements_status_published,priority:2"`
|
|
ClosedAt *time.Time `json:"closedAt"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
type UserAnnouncementRead struct {
|
|
ID string `json:"id" gorm:"primaryKey;size:36"`
|
|
UserID string `json:"userId" gorm:"index;size:36;uniqueIndex:idx_user_announcement_read,priority:1"`
|
|
AnnouncementID string `json:"announcementId" gorm:"index;size:36;uniqueIndex:idx_user_announcement_read,priority:2"`
|
|
ReadAt time.Time `json:"readAt"`
|
|
}
|