106 lines
2.3 KiB
Go
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"
|
|
}
|