242 lines
7.6 KiB
Go
242 lines
7.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"time"
|
|
|
|
"cloudnest/internal/domain/file/entity"
|
|
"cloudnest/internal/infrastructure/database"
|
|
"cloudnest/internal/pkg/errors"
|
|
)
|
|
|
|
// FileMetaRepository provides database operations for file metadata.
|
|
// FileMetaRepository 提供文件元数据的数据库操作。
|
|
//
|
|
// This repository handles operations related to file favorites and recycle bin,
|
|
// storing data in MySQL database.
|
|
//
|
|
// 此仓储处理文件收藏和回收站相关操作,数据存储在 MySQL 数据库中。
|
|
type FileMetaRepository struct {
|
|
db *database.MySQLClient
|
|
}
|
|
|
|
// NewFileMetaRepository creates a new FileMetaRepository.
|
|
// NewFileMetaRepository 创建一个新的 FileMetaRepository。
|
|
//
|
|
// Parameters:
|
|
// - db: The MySQL client for database operations.
|
|
//
|
|
// Returns:
|
|
// - *FileMetaRepository: A pointer to the new FileMetaRepository instance.
|
|
//
|
|
// 参数:
|
|
// - db: 用于数据库操作的 MySQL 客户端。
|
|
//
|
|
// 返回值:
|
|
// - *FileMetaRepository: 新创建的 FileMetaRepository 实例指针。
|
|
func NewFileMetaRepository(db *database.MySQLClient) *FileMetaRepository {
|
|
return &FileMetaRepository{db: db}
|
|
}
|
|
|
|
// AddFavorite adds a file to user's favorites.
|
|
// AddFavorite 将文件添加到用户的收藏夹。
|
|
//
|
|
// Parameters:
|
|
// - favorite: The Favorite entity to save.
|
|
//
|
|
// Returns:
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - favorite: 要保存的 Favorite 实体。
|
|
//
|
|
// 返回值:
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) AddFavorite(favorite *entity.Favorite) error {
|
|
var exists entity.Favorite
|
|
if err := r.db.DB.Where("user_code = ? AND file_key = ?", favorite.UserCode, favorite.FileKey).First(&exists).Error; err == nil {
|
|
return errors.BadRequest("文件已在收藏夹中")
|
|
}
|
|
if err := r.db.DB.Create(favorite).Error; err != nil {
|
|
return errors.InternalError("添加收藏失败", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// RemoveFavorite removes a file from user's favorites.
|
|
// RemoveFavorite 从用户的收藏夹中移除文件。
|
|
//
|
|
// Parameters:
|
|
// - userCode: The user's userCode.
|
|
// - fileKey: The file storage key.
|
|
//
|
|
// Returns:
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - userCode: 用户的用户代码。
|
|
// - fileKey: 文件的存储键。
|
|
//
|
|
// 返回值:
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) RemoveFavorite(userCode, fileKey string) error {
|
|
result := r.db.DB.Where("user_code = ? AND file_key = ?", userCode, fileKey).Delete(&entity.Favorite{})
|
|
if result.Error != nil {
|
|
return errors.InternalError("取消收藏失败", result.Error)
|
|
}
|
|
if result.RowsAffected == 0 {
|
|
return errors.NotFound("收藏记录不存在")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetFavorites retrieves all favorites for a user.
|
|
// GetFavorites 获取用户的所有收藏。
|
|
//
|
|
// Parameters:
|
|
// - userCode: The user's userCode.
|
|
//
|
|
// Returns:
|
|
// - []entity.Favorite: A list of Favorite entities.
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - userCode: 用户的用户代码。
|
|
//
|
|
// 返回值:
|
|
// - []entity.Favorite: Favorite 实体列表。
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) GetFavorites(userCode string) ([]entity.Favorite, error) {
|
|
var favorites []entity.Favorite
|
|
if err := r.db.DB.Where("user_code = ?", userCode).Order("created_at DESC").Find(&favorites).Error; err != nil {
|
|
return nil, errors.InternalError("获取收藏列表失败", err)
|
|
}
|
|
return favorites, nil
|
|
}
|
|
|
|
// AddToRecycleBin adds a file to the recycle bin.
|
|
// AddToRecycleBin 将文件添加到回收站。
|
|
//
|
|
// Parameters:
|
|
// - deletedFile: The DeletedFile entity to save.
|
|
//
|
|
// Returns:
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - deletedFile: 要保存的 DeletedFile 实体。
|
|
//
|
|
// 返回值:
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) AddToRecycleBin(deletedFile *entity.DeletedFile) error {
|
|
if err := r.db.DB.Create(deletedFile).Error; err != nil {
|
|
return errors.InternalError("添加到回收站失败", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// RestoreFromRecycleBin restores a file from the recycle bin.
|
|
// RestoreFromRecycleBin 从回收站恢复文件。
|
|
//
|
|
// Parameters:
|
|
// - userCode: The user's userCode.
|
|
// - fileKey: The file storage key.
|
|
//
|
|
// Returns:
|
|
// - *entity.DeletedFile: The restored DeletedFile entity.
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - userCode: 用户的用户代码。
|
|
// - fileKey: 文件的存储键。
|
|
//
|
|
// 返回值:
|
|
// - *entity.DeletedFile: 恢复的 DeletedFile 实体。
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) RestoreFromRecycleBin(userCode, fileKey string) (*entity.DeletedFile, error) {
|
|
var deletedFile entity.DeletedFile
|
|
if err := r.db.DB.Where("user_code = ? AND file_key = ?", userCode, fileKey).First(&deletedFile).Error; err != nil {
|
|
return nil, errors.NotFound("回收站中不存在该文件")
|
|
}
|
|
if err := r.db.DB.Delete(&deletedFile).Error; err != nil {
|
|
return nil, errors.InternalError("恢复文件失败", err)
|
|
}
|
|
return &deletedFile, nil
|
|
}
|
|
|
|
// DeleteFromRecycleBin permanently deletes a file from the recycle bin.
|
|
// DeleteFromRecycleBin 从回收站永久删除文件。
|
|
//
|
|
// Parameters:
|
|
// - userCode: The user's userCode.
|
|
// - fileKey: The file storage key.
|
|
//
|
|
// Returns:
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - userCode: 用户的用户代码。
|
|
// - fileKey: 文件的存储键。
|
|
//
|
|
// 返回值:
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) DeleteFromRecycleBin(userCode, fileKey string) error {
|
|
result := r.db.DB.Where("user_code = ? AND file_key = ?", userCode, fileKey).Delete(&entity.DeletedFile{})
|
|
if result.Error != nil {
|
|
return errors.InternalError("永久删除失败", result.Error)
|
|
}
|
|
if result.RowsAffected == 0 {
|
|
return errors.NotFound("回收站中不存在该文件")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetRecycleBin retrieves all deleted files for a user.
|
|
// GetRecycleBin 获取用户的所有已删除文件。
|
|
//
|
|
// Parameters:
|
|
// - userCode: The user's userCode.
|
|
//
|
|
// Returns:
|
|
// - []entity.DeletedFile: A list of DeletedFile entities.
|
|
// - error: An error if the operation fails.
|
|
//
|
|
// 参数:
|
|
// - userCode: 用户的用户代码。
|
|
//
|
|
// 返回值:
|
|
// - []entity.DeletedFile: DeletedFile 实体列表。
|
|
// - error: 如果操作失败则返回错误。
|
|
func (r *FileMetaRepository) GetRecycleBin(userCode string) ([]entity.DeletedFile, error) {
|
|
var deletedFiles []entity.DeletedFile
|
|
if err := r.db.DB.Where("user_code = ?", userCode).Order("deleted_at DESC").Find(&deletedFiles).Error; err != nil {
|
|
return nil, errors.InternalError("获取回收站列表失败", err)
|
|
}
|
|
return deletedFiles, nil
|
|
}
|
|
|
|
func (r *FileMetaRepository) GetDeletedFileKeys(userCode string) ([]string, error) {
|
|
var keys []string
|
|
if err := r.db.DB.Model(&entity.DeletedFile{}).Where("user_code = ?", userCode).Pluck("file_key", &keys).Error; err != nil {
|
|
return nil, errors.InternalError("获取已删除文件键失败", err)
|
|
}
|
|
return keys, nil
|
|
}
|
|
|
|
func (r *FileMetaRepository) CleanExpiredRecycleBin(expireDays int) ([]entity.DeletedFile, error) {
|
|
var expiredFiles []entity.DeletedFile
|
|
if err := r.db.DB.Where("deleted_at < ?", time.Now().AddDate(0, 0, -expireDays)).Find(&expiredFiles).Error; err != nil {
|
|
return nil, errors.InternalError("查询过期文件失败", err)
|
|
}
|
|
|
|
if len(expiredFiles) == 0 {
|
|
return []entity.DeletedFile{}, nil
|
|
}
|
|
|
|
result := r.db.DB.Where("deleted_at < ?", time.Now().AddDate(0, 0, -expireDays)).Delete(&entity.DeletedFile{})
|
|
if result.Error != nil {
|
|
return nil, errors.InternalError("清理过期文件失败", result.Error)
|
|
}
|
|
|
|
return expiredFiles, nil
|
|
}
|