qudoco-be/app/module/schedules/service/schedules.service.go

132 lines
3.8 KiB
Go

package service
import (
"web-qudo-be/app/module/schedules/mapper"
"web-qudo-be/app/module/schedules/repository"
"web-qudo-be/app/module/schedules/request"
schedulesResponse "web-qudo-be/app/module/schedules/response"
"web-qudo-be/utils/paginator"
"github.com/google/uuid"
)
type SchedulesService interface {
All(clientId *uuid.UUID, req request.SchedulesQueryRequest) ([]*schedulesResponse.SchedulesResponse, *paginator.Pagination, error)
Show(clientId *uuid.UUID, id uint) (*schedulesResponse.SchedulesResponse, error)
Save(clientId *uuid.UUID, req request.SchedulesCreateRequest) (*schedulesResponse.SchedulesResponse, error)
Update(clientId *uuid.UUID, id uint, req request.SchedulesUpdateRequest) error
Delete(clientId *uuid.UUID, id uint) error
SummaryStats(clientId *uuid.UUID) (*schedulesResponse.SchedulesSummaryStats, error)
}
type schedulesService struct {
schedulesRepository repository.SchedulesRepository
}
func NewSchedulesService(schedulesRepository repository.SchedulesRepository) SchedulesService {
return &schedulesService{
schedulesRepository: schedulesRepository,
}
}
func (_i *schedulesService) All(clientId *uuid.UUID, req request.SchedulesQueryRequest) ([]*schedulesResponse.SchedulesResponse, *paginator.Pagination, error) {
schedules, pagination, err := _i.schedulesRepository.All(clientId, req)
if err != nil {
return nil, nil, err
}
responses := mapper.ToSchedulesResponseList(schedules)
return responses, pagination, nil
}
func (_i *schedulesService) Show(clientId *uuid.UUID, id uint) (*schedulesResponse.SchedulesResponse, error) {
schedule, err := _i.schedulesRepository.Show(clientId, id)
if err != nil {
return nil, err
}
response := mapper.ToSchedulesResponse(schedule)
return response, nil
}
func (_i *schedulesService) Save(clientId *uuid.UUID, req request.SchedulesCreateRequest) (*schedulesResponse.SchedulesResponse, error) {
schedule := req.ToEntity()
savedSchedule, err := _i.schedulesRepository.Save(clientId, schedule)
if err != nil {
return nil, err
}
response := mapper.ToSchedulesResponse(savedSchedule)
return response, nil
}
func (_i *schedulesService) Update(clientId *uuid.UUID, id uint, req request.SchedulesUpdateRequest) error {
schedule := req.ToEntity()
err := _i.schedulesRepository.Update(clientId, id, schedule)
if err != nil {
return err
}
return nil
}
func (_i *schedulesService) Delete(clientId *uuid.UUID, id uint) error {
err := _i.schedulesRepository.Delete(clientId, id)
if err != nil {
return err
}
return nil
}
func (_i *schedulesService) SummaryStats(clientId *uuid.UUID) (*schedulesResponse.SchedulesSummaryStats, error) {
// Get today's count
todayReq := request.SchedulesQueryRequest{}
todayCount, err := _i.schedulesRepository.Count(clientId, todayReq)
if err != nil {
return nil, err
}
// Get this week's count
weekReq := request.SchedulesQueryRequest{}
weekCount, err := _i.schedulesRepository.Count(clientId, weekReq)
if err != nil {
return nil, err
}
// Get total count
totalReq := request.SchedulesQueryRequest{}
totalCount, err := _i.schedulesRepository.Count(clientId, totalReq)
if err != nil {
return nil, err
}
// Get live streaming count
liveReq := request.SchedulesQueryRequest{
IsLiveStreaming: &[]bool{true}[0],
}
liveCount, err := _i.schedulesRepository.Count(clientId, liveReq)
if err != nil {
return nil, err
}
// Get upcoming count (start_date > today)
upcomingReq := request.SchedulesQueryRequest{}
upcomingCount, err := _i.schedulesRepository.Count(clientId, upcomingReq)
if err != nil {
return nil, err
}
stats := &schedulesResponse.SchedulesSummaryStats{
TotalToday: int(todayCount),
TotalThisWeek: int(weekCount),
TotalAll: int(totalCount),
TotalLive: int(liveCount),
TotalUpcoming: int(upcomingCount),
}
return stats, nil
}