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

89 lines
2.8 KiB
Go
Raw Normal View History

package repository
import (
"strings"
"web-qudo-be/app/database"
"web-qudo-be/app/database/entity"
"web-qudo-be/utils/paginator"
"github.com/google/uuid"
"github.com/rs/zerolog"
"gorm.io/gorm"
)
type MediaLibraryRepository interface {
FindByPublicURLAny(publicURL string) (*entity.MediaLibraryItem, error)
Create(item *entity.MediaLibraryItem) error
Update(id uint, fields map[string]interface{}) error
GetAll(clientID *uuid.UUID, q string, sourceType *string, p *paginator.Pagination) ([]*entity.MediaLibraryItem, *paginator.Pagination, error)
SoftDelete(clientID *uuid.UUID, id uint) error
}
type mediaLibraryRepository struct {
DB *database.Database
Log zerolog.Logger
}
func NewMediaLibraryRepository(db *database.Database, log zerolog.Logger) MediaLibraryRepository {
return &mediaLibraryRepository{DB: db, Log: log}
}
func (_i *mediaLibraryRepository) FindByPublicURLAny(publicURL string) (*entity.MediaLibraryItem, error) {
var row entity.MediaLibraryItem
err := _i.DB.DB.Where("public_url = ?", publicURL).First(&row).Error
if err != nil {
return nil, err
}
return &row, nil
}
func (_i *mediaLibraryRepository) Create(item *entity.MediaLibraryItem) error {
return _i.DB.DB.Create(item).Error
}
func (_i *mediaLibraryRepository) Update(id uint, fields map[string]interface{}) error {
return _i.DB.DB.Model(&entity.MediaLibraryItem{}).Where("id = ?", id).Updates(fields).Error
}
func (_i *mediaLibraryRepository) GetAll(clientID *uuid.UUID, q string, sourceType *string, p *paginator.Pagination) ([]*entity.MediaLibraryItem, *paginator.Pagination, error) {
var rows []*entity.MediaLibraryItem
var count int64
query := _i.DB.DB.Model(&entity.MediaLibraryItem{}).Where("is_active = ?", true)
if clientID != nil {
query = query.Where("client_id = ?", clientID)
}
if sourceType != nil && strings.TrimSpace(*sourceType) != "" {
query = query.Where("source_type = ?", strings.TrimSpace(*sourceType))
}
if strings.TrimSpace(q) != "" {
like := "%" + strings.ToLower(strings.TrimSpace(q)) + "%"
query = query.Where(
"LOWER(COALESCE(original_filename,'')) LIKE ? OR LOWER(public_url) LIKE ? OR LOWER(COALESCE(source_label,'')) LIKE ?",
like, like, like,
)
}
if err := query.Count(&count).Error; err != nil {
return nil, p, err
}
p.Count = count
p = paginator.Paging(p)
err := query.Order("created_at DESC").Offset(p.Offset).Limit(p.Limit).Find(&rows).Error
return rows, p, err
}
func (_i *mediaLibraryRepository) SoftDelete(clientID *uuid.UUID, id uint) error {
q := _i.DB.DB.Model(&entity.MediaLibraryItem{}).Where("id = ?", id)
if clientID != nil {
q = q.Where("client_id = ?", clientID)
}
res := q.Update("is_active", false)
if res.Error != nil {
return res.Error
}
if res.RowsAffected == 0 {
return gorm.ErrRecordNotFound
}
return nil
}