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

103 lines
2.7 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
}
// DeleteFirmwareMetadata deletes firmware metadata from the database
func (r *FirmwareRepository) DeleteFirmwareMetadata(name, version string) error {
query := `DELETE FROM firmware WHERE name = ? AND version = ?`
result, err := r.db.Exec(query, name, version)
if err != nil {
return fmt.Errorf("failed to delete firmware metadata: %w", err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return fmt.Errorf("failed to get rows affected: %w", err)
}
if rowsAffected == 0 {
return fmt.Errorf("firmware not found")
}
return nil
}