package store import ( "database/sql" "errors" "fmt" "time" ) type UploadRecord struct { UploadID string Binding []byte Asset []byte Grant []byte ObjectKey string Bucket string State string CreatedAt time.Time CompletedAt *time.Time } func (s *Store) LoadUpload(uploadID string) (UploadRecord, error) { if uploadID == "" { return UploadRecord{}, errors.New("upload ID is required") } s.mu.Lock() defer s.mu.Unlock() var record UploadRecord var createdAt string var completedAt sql.NullString err := s.db.QueryRow(`SELECT uploads.upload_id,binding,asset,grant,object_key,d.bucket, CASE WHEN state='granted' AND ( EXISTS(SELECT 1 FROM upload_notifications n WHERE n.upload_id=uploads.upload_id) OR EXISTS(SELECT 1 FROM local_v01_call_terminals f WHERE f.upload_id=uploads.upload_id AND f.recording_status IS NOT NULL) ) THEN 'uploaded' ELSE state END, created_at,completed_at FROM uploads JOIN upload_destinations d ON d.upload_id=uploads.upload_id WHERE uploads.upload_id=?`, uploadID).Scan(&record.UploadID, &record.Binding, &record.Asset, &record.Grant, &record.ObjectKey, &record.Bucket, &record.State, &createdAt, &completedAt) if err != nil { return UploadRecord{}, fmt.Errorf("load upload: %w", err) } record.CreatedAt, err = time.Parse(time.RFC3339Nano, createdAt) if err != nil { return UploadRecord{}, fmt.Errorf("parse upload created_at: %w", err) } if completedAt.Valid { parsed, err := time.Parse(time.RFC3339Nano, completedAt.String) if err != nil { return UploadRecord{}, fmt.Errorf("parse upload completed_at: %w", err) } record.CompletedAt = &parsed } return record, nil }