15357fd3c0
yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarba
281 lines
8.0 KiB
Go
281 lines
8.0 KiB
Go
// service/event_service.go
|
|
package service
|
|
|
|
import (
|
|
"api_bb/internal/models"
|
|
"api_bb/internal/repository"
|
|
"api_bb/pkg/logger"
|
|
"fmt"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type EventService interface {
|
|
CreateEvent(event *models.Event) error
|
|
GetEventByID(id uint) (*models.Event, error)
|
|
GetAllEvents() ([]models.Event, error)
|
|
UpdateEvent(event *models.Event) error
|
|
DeleteEvent(id uint) error
|
|
GetEventsByType(eventType models.EventType) ([]models.Event, error)
|
|
GetUpcomingEvents() ([]models.Event, error)
|
|
GetEventsByDateRange(startDate, endDate time.Time) ([]models.Event, error)
|
|
UpdateParticipantsCount(eventID uint) error
|
|
ToggleRegistrationStatus(eventID uint, registrationOpen bool) error
|
|
}
|
|
|
|
type eventService struct {
|
|
eventRepo repository.EventRepository
|
|
registrationRepo repository.EventRegistrationRepository
|
|
logger logger.LoggerInterface
|
|
}
|
|
|
|
func NewEventService(
|
|
eventRepo repository.EventRepository,
|
|
registrationRepo repository.EventRegistrationRepository,
|
|
log logger.LoggerInterface,
|
|
) EventService {
|
|
serviceLogger := log.With(zap.String("service", "event"))
|
|
|
|
return &eventService{
|
|
eventRepo: eventRepo,
|
|
registrationRepo: registrationRepo,
|
|
logger: serviceLogger,
|
|
}
|
|
}
|
|
|
|
// CreateEvent создает новое событие
|
|
func (s *eventService) CreateEvent(event *models.Event) error {
|
|
s.logger.Info("Creating new event",
|
|
zap.String("title", event.Title),
|
|
zap.String("type", string(event.Type)),
|
|
zap.Time("date", event.Date),
|
|
)
|
|
|
|
if err := s.eventRepo.Create(event); err != nil {
|
|
s.logger.Error("Failed to create event",
|
|
zap.String("title", event.Title),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("failed to create event: %w", err)
|
|
}
|
|
|
|
s.logger.Info("Event created successfully",
|
|
zap.Uint("event_id", event.ID),
|
|
zap.String("title", event.Title),
|
|
)
|
|
return nil
|
|
}
|
|
|
|
// GetEventByID возвращает событие по ID
|
|
func (s *eventService) GetEventByID(id uint) (*models.Event, error) {
|
|
s.logger.Debug("Getting event by ID", zap.Uint("event_id", id))
|
|
|
|
event, err := s.eventRepo.FindByID(id)
|
|
if err != nil {
|
|
s.logger.Warn("Event not found",
|
|
zap.Uint("event_id", id),
|
|
zap.Error(err),
|
|
)
|
|
return nil, fmt.Errorf("event not found: %w", err)
|
|
}
|
|
|
|
s.logger.Debug("Event retrieved successfully",
|
|
zap.Uint("event_id", id),
|
|
zap.String("title", event.Title),
|
|
)
|
|
return event, nil
|
|
}
|
|
|
|
// GetAllEvents возвращает все события
|
|
func (s *eventService) GetAllEvents() ([]models.Event, error) {
|
|
s.logger.Debug("Getting all events")
|
|
|
|
events, err := s.eventRepo.FindAll()
|
|
if err != nil {
|
|
s.logger.Error("Failed to get events", zap.Error(err))
|
|
return nil, fmt.Errorf("failed to get events: %w", err)
|
|
}
|
|
|
|
s.logger.Debug("Events retrieved successfully",
|
|
zap.Int("count", len(events)),
|
|
)
|
|
return events, nil
|
|
}
|
|
|
|
// UpdateEvent обновляет событие
|
|
func (s *eventService) UpdateEvent(event *models.Event) error {
|
|
s.logger.Info("Updating event",
|
|
zap.Uint("event_id", event.ID),
|
|
zap.String("title", event.Title),
|
|
)
|
|
|
|
// Проверяем существование события
|
|
existingEvent, err := s.eventRepo.FindByID(event.ID)
|
|
if err != nil {
|
|
s.logger.Warn("Event not found for update",
|
|
zap.Uint("event_id", event.ID),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("event not found")
|
|
}
|
|
|
|
// Сохраняем неизменяемые поля
|
|
event.CreatedAt = existingEvent.CreatedAt
|
|
event.UpdatedAt = time.Now()
|
|
|
|
if err := s.eventRepo.Update(event); err != nil {
|
|
s.logger.Error("Failed to update event",
|
|
zap.Uint("event_id", event.ID),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("failed to update event: %w", err)
|
|
}
|
|
|
|
s.logger.Info("Event updated successfully",
|
|
zap.Uint("event_id", event.ID),
|
|
)
|
|
return nil
|
|
}
|
|
|
|
// DeleteEvent удаляет событие
|
|
func (s *eventService) DeleteEvent(id uint) error {
|
|
s.logger.Info("Deleting event", zap.Uint("event_id", id))
|
|
|
|
// Проверяем существование события
|
|
_, err := s.eventRepo.FindByID(id)
|
|
if err != nil {
|
|
s.logger.Warn("Event not found for deletion",
|
|
zap.Uint("event_id", id),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("event not found")
|
|
}
|
|
|
|
if err := s.eventRepo.Delete(id); err != nil {
|
|
s.logger.Error("Failed to delete event",
|
|
zap.Uint("event_id", id),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("failed to delete event: %w", err)
|
|
}
|
|
|
|
s.logger.Info("Event deleted successfully",
|
|
zap.Uint("event_id", id),
|
|
)
|
|
return nil
|
|
}
|
|
|
|
// GetEventsByType возвращает события по типу
|
|
func (s *eventService) GetEventsByType(eventType models.EventType) ([]models.Event, error) {
|
|
s.logger.Debug("Getting events by type", zap.String("type", string(eventType)))
|
|
|
|
events, err := s.eventRepo.FindByType(eventType)
|
|
if err != nil {
|
|
s.logger.Error("Failed to get events by type",
|
|
zap.String("type", string(eventType)),
|
|
zap.Error(err),
|
|
)
|
|
return nil, fmt.Errorf("failed to get events by type: %w", err)
|
|
}
|
|
|
|
s.logger.Debug("Events by type retrieved successfully",
|
|
zap.String("type", string(eventType)),
|
|
zap.Int("count", len(events)),
|
|
)
|
|
return events, nil
|
|
}
|
|
|
|
// GetUpcomingEvents возвращает предстоящие события
|
|
func (s *eventService) GetUpcomingEvents() ([]models.Event, error) {
|
|
s.logger.Debug("Getting upcoming events")
|
|
|
|
events, err := s.eventRepo.FindUpcoming()
|
|
if err != nil {
|
|
s.logger.Error("Failed to get upcoming events", zap.Error(err))
|
|
return nil, fmt.Errorf("failed to get upcoming events: %w", err)
|
|
}
|
|
|
|
s.logger.Debug("Upcoming events retrieved successfully",
|
|
zap.Int("count", len(events)),
|
|
)
|
|
return events, nil
|
|
}
|
|
|
|
// GetEventsByDateRange возвращает события в диапазоне дат
|
|
func (s *eventService) GetEventsByDateRange(startDate, endDate time.Time) ([]models.Event, error) {
|
|
s.logger.Debug("Getting events by date range",
|
|
zap.Time("start_date", startDate),
|
|
zap.Time("end_date", endDate),
|
|
)
|
|
|
|
events, err := s.eventRepo.FindByDateRange(startDate, endDate)
|
|
if err != nil {
|
|
s.logger.Error("Failed to get events by date range",
|
|
zap.Time("start_date", startDate),
|
|
zap.Time("end_date", endDate),
|
|
zap.Error(err),
|
|
)
|
|
return nil, fmt.Errorf("failed to get events by date range: %w", err)
|
|
}
|
|
|
|
s.logger.Debug("Events by date range retrieved successfully",
|
|
zap.Time("start_date", startDate),
|
|
zap.Time("end_date", endDate),
|
|
zap.Int("count", len(events)),
|
|
)
|
|
return events, nil
|
|
}
|
|
|
|
// UpdateParticipantsCount обновляет количество участников события
|
|
func (s *eventService) UpdateParticipantsCount(eventID uint) error {
|
|
s.logger.Debug("Updating participants count", zap.Uint("event_id", eventID))
|
|
|
|
count, err := s.registrationRepo.CountByEventID(eventID)
|
|
if err != nil {
|
|
s.logger.Error("Failed to count event registrations",
|
|
zap.Uint("event_id", eventID),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("failed to count registrations: %w", err)
|
|
}
|
|
|
|
if err := s.eventRepo.UpdateParticipantsCount(eventID, int(count)); err != nil {
|
|
s.logger.Error("Failed to update participants count",
|
|
zap.Uint("event_id", eventID),
|
|
zap.Int64("count", count),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("failed to update participants count: %w", err)
|
|
}
|
|
|
|
s.logger.Debug("Participants count updated successfully",
|
|
zap.Uint("event_id", eventID),
|
|
zap.Int64("count", count),
|
|
)
|
|
return nil
|
|
}
|
|
|
|
// ToggleRegistrationStatus переключает статус регистрации на событие
|
|
func (s *eventService) ToggleRegistrationStatus(eventID uint, registrationOpen bool) error {
|
|
s.logger.Info("Toggling registration status",
|
|
zap.Uint("event_id", eventID),
|
|
zap.Bool("registration_open", registrationOpen),
|
|
)
|
|
|
|
if err := s.eventRepo.UpdateRegistrationStatus(eventID, registrationOpen); err != nil {
|
|
s.logger.Error("Failed to toggle registration status",
|
|
zap.Uint("event_id", eventID),
|
|
zap.Bool("registration_open", registrationOpen),
|
|
zap.Error(err),
|
|
)
|
|
return fmt.Errorf("failed to toggle registration status: %w", err)
|
|
}
|
|
|
|
s.logger.Info("Registration status updated successfully",
|
|
zap.Uint("event_id", eventID),
|
|
zap.Bool("registration_open", registrationOpen),
|
|
)
|
|
return nil
|
|
}
|