Files
spore-registry/internal/repository/firmware.go
2025-10-21 22:43:18 +02:00

83 lines
2.2 KiB
Go

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
}