package models import ( "database/sql/driver" "encoding/json" "errors" "gorm.io/gorm" "time" "github.com/google/uuid" ) // HLSStreamStatus représente le statut d'un stream HLS type HLSStreamStatus string const ( // HLSStatusPending indique que le stream est en attente de traitement HLSStatusPending HLSStreamStatus = "pending" // HLSStatusProcessing indique que le stream est en cours de traitement HLSStatusProcessing HLSStreamStatus = "processing" // HLSStatusReady indique que le stream est prêt et disponible HLSStatusReady HLSStreamStatus = "ready" // HLSStatusFailed indique que le traitement du stream a échoué HLSStatusFailed HLSStreamStatus = "failed" ) // BitrateList représente une liste de bitrates en kbps pour le JSONB type BitrateList []int // Scan implémente l'interface sql.Scanner pour lire depuis la base de données func (b *BitrateList) Scan(value interface{}) error { if value == nil { *b = BitrateList{} return nil } var bytes []byte switch v := value.(type) { case []byte: bytes = v case string: bytes = []byte(v) default: return errors.New("type assertion to []byte or string failed") } if len(bytes) == 0 { *b = BitrateList{} return nil } return json.Unmarshal(bytes, b) } // Value implémente l'interface driver.Valuer pour écrire dans la base de données func (b BitrateList) Value() (driver.Value, error) { return json.Marshal(b) } // HLSStream représente un stream HLS pour un track // MIGRATION UUID: Completée. ID et TrackID sont des UUIDs. type HLSStream struct { ID uuid.UUID `gorm:"type:uuid;primaryKey" json:"id" db:"id"` TrackID uuid.UUID `gorm:"type:uuid;not null;index:idx_hls_streams_track_id" json:"track_id" db:"track_id"` Track Track `gorm:"foreignKey:TrackID;constraint:OnDelete:CASCADE" json:"track,omitempty"` PlaylistURL string `gorm:"type:varchar(500);not null" json:"playlist_url" db:"playlist_url"` SegmentsCount int `gorm:"not null;default:0" json:"segments_count" db:"segments_count"` Bitrates BitrateList `gorm:"type:jsonb;default:'[]'" json:"bitrates" db:"bitrates"` Status HLSStreamStatus `gorm:"type:varchar(20);not null;default:'pending';index:idx_hls_streams_status" json:"status" db:"status"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at" db:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at" db:"updated_at"` } // TableName définit le nom de la table pour GORM func (HLSStream) TableName() string { return "hls_streams" } // BeforeCreate hook GORM pour générer UUID si non défini func (m *HLSStream) BeforeCreate(tx *gorm.DB) error { if m.ID == uuid.Nil { m.ID = uuid.New() } return nil }