package repository import ( "database/sql" "encoding/json" "fmt" "spore-registry/internal/models" ) // FirmwareRepository handles database operations for firmware type FirmwareRepository struct { db *sql.DB } // NewFirmwareRepository creates a new firmware repository func NewFirmwareRepository(db *sql.DB) *FirmwareRepository { return &FirmwareRepository{db: db} } // StoreFirmwareMetadata stores firmware metadata in the database func (r *FirmwareRepository) StoreFirmwareMetadata(metadata models.FirmwareMetadata, size int64) error { labelsJSON, err := json.Marshal(metadata.Labels) if err != nil { return fmt.Errorf("failed to marshal labels: %w", err) } query := `INSERT OR REPLACE INTO firmware (name, version, size, labels) VALUES (?, ?, ?, ?)` _, err = r.db.Exec(query, metadata.Name, metadata.Version, size, string(labelsJSON)) if err != nil { return fmt.Errorf("failed to store firmware metadata: %w", err) } return nil } // GetFirmwareRecords retrieves firmware records with optional filtering func (r *FirmwareRepository) GetFirmwareRecords(name, version string) ([]models.FirmwareRecord, error) { var records []models.FirmwareRecord // Build query with optional filters query := ` SELECT name, version, size, labels FROM firmware WHERE 1=1` var args []interface{} if name != "" { query += " AND name = ?" args = append(args, name) } if version != "" { query += " AND version = ?" args = append(args, version) } rows, err := r.db.Query(query, args...) if err != nil { return nil, fmt.Errorf("failed to query firmware records: %w", err) } defer rows.Close() for rows.Next() { var record models.FirmwareRecord var labelsJSON string err := rows.Scan(&record.Name, &record.Version, &record.Size, &labelsJSON) if err != nil { return nil, fmt.Errorf("failed to scan firmware record: %w", err) } if err := json.Unmarshal([]byte(labelsJSON), &record.Labels); err != nil { return nil, fmt.Errorf("failed to unmarshal labels: %w", err) } // Construct download path record.Path = fmt.Sprintf("/firmware/%s/%s", record.Name, record.Version) records = append(records, record) } return records, nil }