- store/sqlite: 75.4% (repos + db coverage) - host/sub2api: 80.8% (httptest mock server, pure function tests) - app: 74.2% (handler error paths, NewActionSet closures) - pack: 72.4% - provision: 75.2% - access: 77.3% - config: 94.7% (lookup mock tests) All tests pass: build, vet, race, coverage gates.
77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type ManagedResource struct {
|
|
ID int64
|
|
BatchID int64
|
|
ResourceType string
|
|
HostResourceID string
|
|
ResourceName string
|
|
}
|
|
|
|
type ManagedResourcesRepo struct {
|
|
db execQuerier
|
|
}
|
|
|
|
func newManagedResourcesRepo(db execQuerier) *ManagedResourcesRepo {
|
|
return &ManagedResourcesRepo{db: db}
|
|
}
|
|
|
|
func (r *ManagedResourcesRepo) Create(ctx context.Context, resource ManagedResource) (int64, error) {
|
|
resourceType := strings.TrimSpace(resource.ResourceType)
|
|
hostResourceID := strings.TrimSpace(resource.HostResourceID)
|
|
resourceName := strings.TrimSpace(resource.ResourceName)
|
|
|
|
switch {
|
|
case resource.BatchID <= 0:
|
|
return 0, fmt.Errorf("batch_id is required")
|
|
case resourceType == "":
|
|
return 0, fmt.Errorf("resource_type is required")
|
|
case hostResourceID == "":
|
|
return 0, fmt.Errorf("host_resource_id is required")
|
|
case resourceName == "":
|
|
return 0, fmt.Errorf("resource_name is required")
|
|
}
|
|
|
|
result, err := r.db.ExecContext(ctx, `INSERT INTO managed_resources (batch_id, resource_type, host_resource_id, resource_name) VALUES (?, ?, ?, ?)`, resource.BatchID, resourceType, hostResourceID, resourceName)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("insert managed resource %q: %w", hostResourceID, err)
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("read inserted managed resource id for %q: %w", hostResourceID, err)
|
|
}
|
|
return id, nil
|
|
}
|
|
|
|
func (r *ManagedResourcesRepo) GetByBatchID(ctx context.Context, batchID int64) ([]ManagedResource, error) {
|
|
if batchID <= 0 {
|
|
return nil, fmt.Errorf("batch_id is required")
|
|
}
|
|
|
|
rows, err := r.db.QueryContext(ctx, `SELECT id, batch_id, resource_type, host_resource_id, resource_name FROM managed_resources WHERE batch_id = ? ORDER BY id`, batchID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("query managed resources: %w", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
resources := make([]ManagedResource, 0)
|
|
for rows.Next() {
|
|
var resource ManagedResource
|
|
if err := rows.Scan(&resource.ID, &resource.BatchID, &resource.ResourceType, &resource.HostResourceID, &resource.ResourceName); err != nil {
|
|
return nil, fmt.Errorf("scan managed resource: %w", err)
|
|
}
|
|
resources = append(resources, resource)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, fmt.Errorf("iterate managed resources: %w", err)
|
|
}
|
|
return resources, nil
|
|
}
|