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" }