89 lines
2.8 KiB
Go
89 lines
2.8 KiB
Go
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
|
|
}
|