83 lines
2.2 KiB
Go
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
|
|
}
|