feat: basic firmware registry
This commit is contained in:
82
internal/repository/firmware.go
Normal file
82
internal/repository/firmware.go
Normal file
@@ -0,0 +1,82 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user