mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 03:15:04 +08:00
168 lines
4.8 KiB
Go
168 lines
4.8 KiB
Go
package repo
|
|
|
|
import (
|
|
"github.com/ctwj/urldb/db/entity"
|
|
"github.com/ctwj/urldb/utils"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// FileRepository 文件Repository接口
|
|
type FileRepository interface {
|
|
BaseRepository[entity.File]
|
|
FindByFileName(fileName string) (*entity.File, error)
|
|
FindByHash(fileHash string) (*entity.File, error)
|
|
FindByUserID(userID uint, page, pageSize int) ([]entity.File, int64, error)
|
|
FindPublicFiles(page, pageSize int) ([]entity.File, int64, error)
|
|
SearchFiles(search string, fileType, status string, userID uint, page, pageSize int) ([]entity.File, int64, error)
|
|
SoftDeleteByIDs(ids []uint) error
|
|
UpdateFileStatus(id uint, status string) error
|
|
UpdateFilePublic(id uint, isPublic bool) error
|
|
}
|
|
|
|
// FileRepositoryImpl 文件Repository实现
|
|
type FileRepositoryImpl struct {
|
|
BaseRepositoryImpl[entity.File]
|
|
}
|
|
|
|
// NewFileRepository 创建文件Repository
|
|
func NewFileRepository(db *gorm.DB) FileRepository {
|
|
return &FileRepositoryImpl{
|
|
BaseRepositoryImpl: BaseRepositoryImpl[entity.File]{db: db},
|
|
}
|
|
}
|
|
|
|
// FindByFileName 根据文件名查找文件
|
|
func (r *FileRepositoryImpl) FindByFileName(fileName string) (*entity.File, error) {
|
|
var file entity.File
|
|
err := r.db.Where("file_name = ? AND is_deleted = ?", fileName, false).First(&file).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &file, nil
|
|
}
|
|
|
|
// FindByUserID 根据用户ID查找文件
|
|
func (r *FileRepositoryImpl) FindByUserID(userID uint, page, pageSize int) ([]entity.File, int64, error) {
|
|
var files []entity.File
|
|
var total int64
|
|
|
|
offset := (page - 1) * pageSize
|
|
|
|
// 获取总数
|
|
err := r.db.Model(&entity.File{}).Where("user_id = ? AND is_deleted = ?", userID, false).Count(&total).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 获取文件列表
|
|
err = r.db.Where("user_id = ? AND is_deleted = ?", userID, false).
|
|
Preload("User").
|
|
Order("created_at DESC").
|
|
Offset(offset).
|
|
Limit(pageSize).
|
|
Find(&files).Error
|
|
|
|
return files, total, err
|
|
}
|
|
|
|
// FindPublicFiles 查找公开文件
|
|
func (r *FileRepositoryImpl) FindPublicFiles(page, pageSize int) ([]entity.File, int64, error) {
|
|
var files []entity.File
|
|
var total int64
|
|
|
|
offset := (page - 1) * pageSize
|
|
|
|
// 获取总数
|
|
err := r.db.Model(&entity.File{}).Where("is_public = ? AND is_deleted = ? AND status = ?", true, false, entity.FileStatusActive).Count(&total).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 获取文件列表
|
|
err = r.db.Where("is_public = ? AND is_deleted = ? AND status = ?", true, false, entity.FileStatusActive).
|
|
Preload("User").
|
|
Order("created_at DESC").
|
|
Offset(offset).
|
|
Limit(pageSize).
|
|
Find(&files).Error
|
|
|
|
return files, total, err
|
|
}
|
|
|
|
// SearchFiles 搜索文件
|
|
func (r *FileRepositoryImpl) SearchFiles(search string, fileType, status string, userID uint, page, pageSize int) ([]entity.File, int64, error) {
|
|
var files []entity.File
|
|
var total int64
|
|
|
|
offset := (page - 1) * pageSize
|
|
query := r.db.Model(&entity.File{}).Where("is_deleted = ?", false)
|
|
|
|
// 添加调试日志
|
|
utils.Info("搜索文件参数: search='%s', fileType='%s', status='%s', userID=%d, page=%d, pageSize=%d",
|
|
search, fileType, status, userID, page, pageSize)
|
|
|
|
// 添加搜索条件
|
|
if search != "" {
|
|
query = query.Where("original_name LIKE ?", "%"+search+"%")
|
|
utils.Info("添加搜索条件: file_name LIKE '%%%s%%'", search)
|
|
}
|
|
|
|
if fileType != "" {
|
|
query = query.Where("file_type = ?", fileType)
|
|
}
|
|
|
|
if status != "" {
|
|
query = query.Where("status = ?", status)
|
|
}
|
|
|
|
if userID > 0 {
|
|
query = query.Where("user_id = ?", userID)
|
|
}
|
|
|
|
// 获取总数
|
|
err := query.Count(&total).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 获取文件列表
|
|
err = query.Preload("User").
|
|
Order("created_at DESC").
|
|
Offset(offset).
|
|
Limit(pageSize).
|
|
Find(&files).Error
|
|
|
|
// 添加调试日志
|
|
utils.Info("搜索结果: 总数=%d, 当前页文件数=%d", total, len(files))
|
|
if len(files) > 0 {
|
|
utils.Info("第一个文件: ID=%d, 文件名='%s'", files[0].ID, files[0].OriginalName)
|
|
}
|
|
|
|
return files, total, err
|
|
}
|
|
|
|
// SoftDeleteByIDs 软删除文件
|
|
func (r *FileRepositoryImpl) SoftDeleteByIDs(ids []uint) error {
|
|
return r.db.Model(&entity.File{}).Where("id IN ?", ids).Update("is_deleted", true).Error
|
|
}
|
|
|
|
// UpdateFileStatus 更新文件状态
|
|
func (r *FileRepositoryImpl) UpdateFileStatus(id uint, status string) error {
|
|
return r.db.Model(&entity.File{}).Where("id = ?", id).Update("status", status).Error
|
|
}
|
|
|
|
// UpdateFilePublic 更新文件公开状态
|
|
func (r *FileRepositoryImpl) UpdateFilePublic(id uint, isPublic bool) error {
|
|
return r.db.Model(&entity.File{}).Where("id = ?", id).Update("is_public", isPublic).Error
|
|
}
|
|
|
|
// FindByHash 根据文件哈希查找文件
|
|
func (r *FileRepositoryImpl) FindByHash(fileHash string) (*entity.File, error) {
|
|
var file entity.File
|
|
err := r.db.Where("file_hash = ? AND is_deleted = ?", fileHash, false).First(&file).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &file, nil
|
|
}
|