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

197 lines
5.2 KiB
Go

package repository
import (
"web-qudo-be/app/database"
"web-qudo-be/app/database/entity"
"web-qudo-be/app/module/schedules/request"
"web-qudo-be/utils/paginator"
"github.com/google/uuid"
)
type SchedulesRepository interface {
All(clientId *uuid.UUID, req request.SchedulesQueryRequest) ([]*entity.Schedules, *paginator.Pagination, error)
Show(clientId *uuid.UUID, id uint) (*entity.Schedules, error)
Save(clientId *uuid.UUID, schedule *entity.Schedules) (*entity.Schedules, error)
Update(clientId *uuid.UUID, id uint, schedule *entity.Schedules) error
Delete(clientId *uuid.UUID, id uint) error
Count(clientId *uuid.UUID, req request.SchedulesQueryRequest) (int64, error)
}
type schedulesRepository struct {
db *database.Database
}
func NewSchedulesRepository(db *database.Database) SchedulesRepository {
return &schedulesRepository{
db: db,
}
}
func (_i *schedulesRepository) All(clientId *uuid.UUID, req request.SchedulesQueryRequest) ([]*entity.Schedules, *paginator.Pagination, error) {
var schedules []*entity.Schedules
var total int64
query := _i.db.DB.Model(&entity.Schedules{})
// Apply client filter
if clientId != nil {
query = query.Where("client_id = ?", *clientId)
}
// Apply filters
if req.Title != nil {
query = query.Where("title ILIKE ?", "%"+*req.Title+"%")
}
if req.Description != nil {
query = query.Where("description ILIKE ?", "%"+*req.Description+"%")
}
if req.Location != nil {
query = query.Where("location ILIKE ?", "%"+*req.Location+"%")
}
if req.TypeId != nil {
query = query.Where("type_id = ?", *req.TypeId)
}
if req.StartDate != nil {
query = query.Where("start_date >= ?", *req.StartDate)
}
if req.EndDate != nil {
query = query.Where("end_date <= ?", *req.EndDate)
}
if req.IsLiveStreaming != nil {
query = query.Where("is_live_streaming = ?", *req.IsLiveStreaming)
}
if req.Speakers != nil {
query = query.Where("speakers ILIKE ?", "%"+*req.Speakers+"%")
}
if req.StatusId != nil {
query = query.Where("status_id = ?", *req.StatusId)
}
if req.CreatedById != nil {
query = query.Where("created_by_id = ?", *req.CreatedById)
}
// Count total records
if err := query.Count(&total).Error; err != nil {
return nil, nil, err
}
// Apply pagination
if req.Pagination != nil {
offset := (req.Pagination.Page - 1) * req.Pagination.Limit
query = query.Offset(offset).Limit(req.Pagination.Limit)
}
// Order by created_at desc
query = query.Order("created_at DESC")
// Execute query
if err := query.Find(&schedules).Error; err != nil {
return nil, nil, err
}
// Create pagination response
pagination := &paginator.Pagination{
Page: req.Pagination.Page,
Limit: req.Pagination.Limit,
Count: total,
TotalPage: int((total + int64(req.Pagination.Limit) - 1) / int64(req.Pagination.Limit)),
}
return schedules, pagination, nil
}
func (_i *schedulesRepository) Show(clientId *uuid.UUID, id uint) (*entity.Schedules, error) {
var schedule entity.Schedules
query := _i.db.DB.Model(&entity.Schedules{})
// Apply client filter
if clientId != nil {
query = query.Where("client_id = ?", *clientId)
}
if err := query.Where("id = ?", id).First(&schedule).Error; err != nil {
return nil, err
}
return &schedule, nil
}
func (_i *schedulesRepository) Save(clientId *uuid.UUID, schedule *entity.Schedules) (*entity.Schedules, error) {
schedule.ClientId = clientId
if err := _i.db.DB.Create(schedule).Error; err != nil {
return nil, err
}
return schedule, nil
}
func (_i *schedulesRepository) Update(clientId *uuid.UUID, id uint, schedule *entity.Schedules) error {
query := _i.db.DB.Model(&entity.Schedules{})
// Apply client filter
if clientId != nil {
query = query.Where("client_id = ?", *clientId)
}
return query.Where("id = ?", id).Updates(schedule).Error
}
func (_i *schedulesRepository) Delete(clientId *uuid.UUID, id uint) error {
query := _i.db.DB.Model(&entity.Schedules{})
// Apply client filter
if clientId != nil {
query = query.Where("client_id = ?", *clientId)
}
return query.Where("id = ?", id).Delete(&entity.Schedules{}).Error
}
func (_i *schedulesRepository) Count(clientId *uuid.UUID, req request.SchedulesQueryRequest) (int64, error) {
var total int64
query := _i.db.DB.Model(&entity.Schedules{})
// Apply client filter
if clientId != nil {
query = query.Where("client_id = ?", *clientId)
}
// Apply filters
if req.Title != nil {
query = query.Where("title ILIKE ?", "%"+*req.Title+"%")
}
if req.Description != nil {
query = query.Where("description ILIKE ?", "%"+*req.Description+"%")
}
if req.Location != nil {
query = query.Where("location ILIKE ?", "%"+*req.Location+"%")
}
if req.TypeId != nil {
query = query.Where("type_id = ?", *req.TypeId)
}
if req.StartDate != nil {
query = query.Where("start_date >= ?", *req.StartDate)
}
if req.EndDate != nil {
query = query.Where("end_date <= ?", *req.EndDate)
}
if req.IsLiveStreaming != nil {
query = query.Where("is_live_streaming = ?", *req.IsLiveStreaming)
}
if req.Speakers != nil {
query = query.Where("speakers ILIKE ?", "%"+*req.Speakers+"%")
}
if req.StatusId != nil {
query = query.Where("status_id = ?", *req.StatusId)
}
if req.CreatedById != nil {
query = query.Where("created_by_id = ?", *req.CreatedById)
}
return total, query.Count(&total).Error
}