package domain import ( "time" "gorm.io/gorm" ) type User struct { ID uint `gorm:"primaryKey"` Email string `gorm:"uniqueIndex;not null"` DisplayName string `gorm:"not null"` PasswordHash string `gorm:"not null"` Role string `gorm:"not null;default:user"` CreatedAt time.Time UpdatedAt time.Time } type Project struct { ID uint `gorm:"primaryKey"` OwnerID uint `gorm:"index;not null"` Name string `gorm:"not null"` Description string CreatedAt time.Time UpdatedAt time.Time } type InboxItem struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` CreatedBy uint `gorm:"index;not null"` SourceType string `gorm:"not null"` Title string Body string Status string `gorm:"not null;default:open"` CreatedAt time.Time UpdatedAt time.Time } type Task struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` CreatedBy uint `gorm:"index;not null"` AssigneeID *uint `gorm:"index"` Title string `gorm:"not null"` Description string Status string `gorm:"not null;default:open"` SortOrder int `gorm:"not null;default:0"` DueAt *time.Time CreatedAt time.Time UpdatedAt time.Time } type Note struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` CreatedBy uint `gorm:"index;not null"` Title string `gorm:"not null"` Markdown string `gorm:"type:text"` CreatedAt time.Time UpdatedAt time.Time } type Source struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` CreatedBy uint `gorm:"index;not null"` Kind string `gorm:"not null"` Title string `gorm:"not null"` URL string FilePath string ContentText string `gorm:"type:text"` CreatedAt time.Time UpdatedAt time.Time } type AISession struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` CreatedBy uint `gorm:"index;not null"` Title string `gorm:"not null"` Context string `gorm:"type:text"` CreatedAt time.Time UpdatedAt time.Time } type Tag struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` Name string `gorm:"not null"` CreatedAt time.Time } type ProjectEvent struct { ID uint `gorm:"primaryKey"` ProjectID uint `gorm:"index;not null"` ActorID uint `gorm:"index;not null"` EventType string `gorm:"not null"` EntityType string `gorm:"not null"` EntityID uint `gorm:"not null"` Summary string `gorm:"not null"` CreatedAt time.Time } type AIKey struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"uniqueIndex;not null"` Provider string `gorm:"not null"` EncryptedAPIKey string `gorm:"not null"` CreatedAt time.Time UpdatedAt time.Time } type AICallLog struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"index;not null"` Provider string `gorm:"not null"` UsedKeyType string `gorm:"not null"` Action string `gorm:"not null"` Status string `gorm:"not null"` Error string CreatedAt time.Time } type TaskShare struct { ID uint `gorm:"primaryKey"` TaskID uint `gorm:"index;not null"` ObjectType string `gorm:"not null"` ObjectID uint `gorm:"not null"` CreatedAt time.Time } func AutoMigrate(database *gorm.DB) error { return database.AutoMigrate( &User{}, &Project{}, &InboxItem{}, &Task{}, &Note{}, &Source{}, &AISession{}, &Tag{}, &ProjectEvent{}, &AIKey{}, &AICallLog{}, &TaskShare{}, ) }