package equipment import ( "errors" "rideaware/pkg/database" "time" "gorm.io/gorm" ) type Repository struct{} func NewRepository() *Repository { return &Repository{} } func (r *Repository) CreateEquipment(equipment *Equipment) error { return database.DB.Create(equipment).Error } func (r *Repository) GetEquipmentByID(id, userID uint) (*Equipment, error) { var equipment Equipment if err := database.DB.Where("id = ? AND user_id = ?", id, userID). First(&equipment).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("equipment not found") } return nil, err } return &equipment, nil } func (r *Repository) GetUserEquipment(userID uint) ([]Equipment, error) { var equipment []Equipment if err := database.DB.Where("user_id = ?", userID). Find(&equipment).Error; err != nil { return nil, err } return equipment, nil } func (r *Repository) GetActiveEquipment(userID uint) ([]Equipment, error) { var equipment []Equipment if err := database.DB.Where("user_id = ? AND active = ?", userID, true). Find(&equipment).Error; err != nil { return nil, err } return equipment, nil } func (r *Repository) UpdateEquipment(equipment *Equipment) error { return database.DB.Save(equipment).Error } func (r *Repository) DeleteEquipment(id, userID uint) error { return database.DB.Where("id = ? AND user_id = ?", id, userID). Delete(&Equipment{}).Error } // IncrementMileage atomically adds distance and duration to equipment totals. func (r *Repository) IncrementMileage(id, userID uint, distance float64, duration int) error { return database.DB.Model(&Equipment{}). Where("id = ? AND user_id = ?", id, userID). Updates(map[string]interface{}{ "total_distance": gorm.Expr("total_distance + ?", distance), "total_duration": gorm.Expr("total_duration + ?", duration), "total_rides": gorm.Expr("total_rides + 1"), "distance_since_service": gorm.Expr("distance_since_service + ?", distance), "duration_since_service": gorm.Expr("duration_since_service + ?", duration), }).Error } // ResetServiceCounters resets the service tracking counters after servicing. func (r *Repository) ResetServiceCounters(id, userID uint) error { now := time.Now() return database.DB.Model(&Equipment{}). Where("id = ? AND user_id = ?", id, userID). Updates(map[string]interface{}{ "distance_since_service": 0, "duration_since_service": 0, "last_service_date": now, }).Error }