diff --git a/backend/core/contracts/upload.go b/backend/core/contracts/upload.go index 0bb5b4d6..2d5b0a04 100644 --- a/backend/core/contracts/upload.go +++ b/backend/core/contracts/upload.go @@ -5,6 +5,9 @@ package contracts import ( "context" + "database/sql/driver" + "encoding/json" + "fmt" "io" "time" ) @@ -21,6 +24,27 @@ type UploadMetadataDTO struct { Extra map[string]any `json:"extra,omitempty"` } +// Value implements the driver.Valuer interface for database serialization. +func (m UploadMetadataDTO) Value() (driver.Value, error) { + return json.Marshal(m) +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (m *UploadMetadataDTO) Scan(value any) error { + if value == nil { + *m = UploadMetadataDTO{} + return nil + } + switch v := value.(type) { + case []byte: + return json.Unmarshal(v, m) + case string: + return json.Unmarshal([]byte(v), m) + default: + return fmt.Errorf("cannot scan type %T into UploadMetadataDTO", value) + } +} + // UploadDTO represents an uploaded file record. type UploadDTO struct { ID uint64 `json:"id"`