Files
homebox/backend/internal/data/repo/repo_maintenance.go
Matt Kilgore 1ac86d9c04 Real Migrations System (#645)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-05-01 15:03:08 -04:00

79 lines
2.2 KiB
Go

package repo
import (
"context"
"fmt"
"time"
"github.com/google/uuid"
"github.com/sysadminsmedia/homebox/backend/internal/data/ent"
"github.com/sysadminsmedia/homebox/backend/internal/data/ent/group"
"github.com/sysadminsmedia/homebox/backend/internal/data/ent/item"
"github.com/sysadminsmedia/homebox/backend/internal/data/ent/maintenanceentry"
)
type (
MaintenanceEntryWithDetails struct {
MaintenanceEntry
ItemName string `json:"itemName"`
ItemID uuid.UUID `json:"itemID"`
}
)
var (
mapEachMaintenanceEntryWithDetails = mapTEachFunc(mapMaintenanceEntryWithDetails)
)
func mapMaintenanceEntryWithDetails(entry *ent.MaintenanceEntry) MaintenanceEntryWithDetails {
return MaintenanceEntryWithDetails{
MaintenanceEntry: mapMaintenanceEntry(entry),
ItemName: entry.Edges.Item.Name,
ItemID: entry.ItemID,
}
}
type MaintenanceFilterStatus string
const (
MaintenanceFilterStatusScheduled MaintenanceFilterStatus = "scheduled"
MaintenanceFilterStatusCompleted MaintenanceFilterStatus = "completed"
MaintenanceFilterStatusBoth MaintenanceFilterStatus = "both"
)
type MaintenanceFilters struct {
Status MaintenanceFilterStatus `json:"status" schema:"status"`
}
func (r *MaintenanceEntryRepository) GetAllMaintenance(ctx context.Context, groupID uuid.UUID, filters MaintenanceFilters) ([]MaintenanceEntryWithDetails, error) {
query := r.db.MaintenanceEntry.Query().Where(
maintenanceentry.HasItemWith(
item.HasGroupWith(group.IDEQ(groupID)),
),
)
switch filters.Status {
case MaintenanceFilterStatusScheduled:
query = query.Where(maintenanceentry.Or(
maintenanceentry.DateIsNil(),
maintenanceentry.DateEQ(time.Time{}),
))
case MaintenanceFilterStatusCompleted:
query = query.Where(
maintenanceentry.Not(maintenanceentry.Or(
maintenanceentry.DateIsNil(),
maintenanceentry.DateEQ(time.Time{})),
))
case MaintenanceFilterStatusBoth:
// No additional filters needed
default:
return nil, fmt.Errorf("unknown status %s", filters.Status)
}
entries, err := query.WithItem().Order(maintenanceentry.ByScheduledDate()).All(ctx)
if err != nil {
return nil, err
}
return mapEachMaintenanceEntryWithDetails(entries), nil
}