197 lines
5.2 KiB
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
|
|
}
|