83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
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
|
|
} |