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 }