Files
rideaware-api/internal/event/service.go
2026-05-17 20:39:47 -05:00

106 lines
2.3 KiB
Go

package event
import (
"errors"
"time"
)
type Service struct {
repo *Repository
}
func NewService() *Service {
return &Service{repo: NewRepository()}
}
func (s *Service) CreateEvent(userID uint, name string, eventDate time.Time, eventType, priority, location, notes, url string, distance float64) (*Event, error) {
if name == "" {
return nil, errors.New("name is required")
}
if eventDate.IsZero() {
return nil, errors.New("event_date is required")
}
if !isValidEventType(eventType) {
return nil, errors.New("invalid event_type")
}
if !isValidPriority(priority) {
priority = "C"
}
event := &Event{
UserID: userID,
Name: name,
EventDate: eventDate,
EventType: eventType,
Distance: distance,
Priority: priority,
Location: location,
Notes: notes,
URL: url,
}
if err := s.repo.CreateEvent(event); err != nil {
return nil, err
}
return event, nil
}
func (s *Service) GetUserEvents(userID uint) ([]Event, error) {
return s.repo.GetUserEvents(userID)
}
func (s *Service) GetUpcomingEvents(userID uint, limit int) ([]Event, error) {
return s.repo.GetUpcomingEvents(userID, limit)
}
func (s *Service) UpdateEvent(id, userID uint, name string, eventDate time.Time, eventType, priority, location, notes, url string, distance float64) (*Event, error) {
event, err := s.repo.GetEventByID(id, userID)
if err != nil {
return nil, err
}
if name != "" {
event.Name = name
}
if !eventDate.IsZero() {
event.EventDate = eventDate
}
if eventType != "" {
if !isValidEventType(eventType) {
return nil, errors.New("invalid event_type")
}
event.EventType = eventType
}
if priority != "" {
if !isValidPriority(priority) {
return nil, errors.New("invalid priority")
}
event.Priority = priority
}
event.Location = location
event.Notes = notes
event.URL = url
event.Distance = distance
if err := s.repo.UpdateEvent(event); err != nil {
return nil, err
}
return event, nil
}
func (s *Service) DeleteEvent(id, userID uint) error {
return s.repo.DeleteEvent(id, userID)
}
func isValidEventType(t string) bool {
valid := map[string]bool{
"race": true, "gran_fondo": true, "group_ride": true,
"time_trial": true, "century": true,
}
return valid[t]
}
func isValidPriority(p string) bool {
return p == "A" || p == "B" || p == "C"
}