feat: Add tag field to file and uploading file models, and update related functions

This commit is contained in:
2025-11-22 17:42:00 +08:00
parent 070b9c7656
commit 1c23bf1d6e
5 changed files with 46 additions and 16 deletions

View File

@@ -43,6 +43,7 @@ func initUpload(c fiber.Ctx) error {
FileSize int64 `json:"file_size"` FileSize int64 `json:"file_size"`
ResourceID uint `json:"resource_id"` ResourceID uint `json:"resource_id"`
StorageID uint `json:"storage_id"` StorageID uint `json:"storage_id"`
Tag string `json:"tag"`
} }
var req InitUploadRequest var req InitUploadRequest
@@ -50,7 +51,10 @@ func initUpload(c fiber.Ctx) error {
return model.NewRequestError("Invalid request parameters") return model.NewRequestError("Invalid request parameters")
} }
result, err := service.CreateUploadingFile(uid, req.Filename, req.Description, req.FileSize, req.ResourceID, req.StorageID) req.Filename = strings.TrimSpace(req.Filename)
req.Tag = strings.TrimSpace(req.Tag)
result, err := service.CreateUploadingFile(uid, req.Filename, req.Description, req.FileSize, req.ResourceID, req.StorageID, req.Tag)
if err != nil { if err != nil {
return err return err
} }
@@ -136,6 +140,9 @@ func createRedirectFile(c fiber.Ctx) error {
Description string `json:"description"` Description string `json:"description"`
ResourceID uint `json:"resource_id"` ResourceID uint `json:"resource_id"`
RedirectURL string `json:"redirect_url"` RedirectURL string `json:"redirect_url"`
FileSize int64 `json:"file_size"`
Md5 string `json:"md5"`
Tag string `json:"tag"`
} }
var req CreateRedirectFileRequest var req CreateRedirectFileRequest
@@ -143,7 +150,11 @@ func createRedirectFile(c fiber.Ctx) error {
return model.NewRequestError("Invalid request parameters") return model.NewRequestError("Invalid request parameters")
} }
result, err := service.CreateRedirectFile(uid, req.Filename, req.Description, req.ResourceID, req.RedirectURL) req.Filename = strings.TrimSpace(req.Filename)
req.Md5 = strings.TrimSpace(req.Md5)
req.Tag = strings.TrimSpace(req.Tag)
result, err := service.CreateRedirectFile(uid, req.Filename, req.Description, req.ResourceID, req.RedirectURL, req.FileSize, req.Md5, req.Tag)
if err != nil { if err != nil {
return err return err
} }
@@ -172,6 +183,7 @@ func updateFile(c fiber.Ctx) error {
type UpdateFileRequest struct { type UpdateFileRequest struct {
Filename string `json:"filename"` Filename string `json:"filename"`
Description string `json:"description"` Description string `json:"description"`
Tag string `json:"tag"`
} }
var req UpdateFileRequest var req UpdateFileRequest
@@ -179,7 +191,10 @@ func updateFile(c fiber.Ctx) error {
return model.NewRequestError("Invalid request parameters") return model.NewRequestError("Invalid request parameters")
} }
result, err := service.UpdateFile(uid, c.Params("id"), req.Filename, req.Description) req.Filename = strings.TrimSpace(req.Filename)
req.Tag = strings.TrimSpace(req.Tag)
result, err := service.UpdateFile(uid, c.Params("id"), req.Filename, req.Description, req.Tag)
if err != nil { if err != nil {
return err return err
} }
@@ -259,13 +274,18 @@ func createServerDownloadTask(c fiber.Ctx) error {
Description string `json:"description"` Description string `json:"description"`
ResourceID uint `json:"resource_id"` ResourceID uint `json:"resource_id"`
StorageID uint `json:"storage_id"` StorageID uint `json:"storage_id"`
Tag string `json:"tag"`
} }
var req InitUploadRequest var req InitUploadRequest
if err := c.Bind().Body(&req); err != nil { if err := c.Bind().Body(&req); err != nil {
return model.NewRequestError("Invalid request parameters") return model.NewRequestError("Invalid request parameters")
} }
result, err := service.CreateServerDownloadTask(uid, req.Url, req.Filename, req.Description, req.ResourceID, req.StorageID)
req.Filename = strings.TrimSpace(req.Filename)
req.Tag = strings.TrimSpace(req.Tag)
result, err := service.CreateServerDownloadTask(uid, req.Url, req.Filename, req.Description, req.ResourceID, req.StorageID, req.Tag)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -10,7 +10,7 @@ import (
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )
func CreateUploadingFile(filename string, description string, fileSize int64, blockSize int64, tempPath string, resourceID, storageID, userID uint) (*model.UploadingFile, error) { func CreateUploadingFile(filename string, description string, fileSize int64, blockSize int64, tempPath string, resourceID, storageID, userID uint, tag string) (*model.UploadingFile, error) {
blocksCount := (fileSize + blockSize - 1) / blockSize blocksCount := (fileSize + blockSize - 1) / blockSize
uf := &model.UploadingFile{ uf := &model.UploadingFile{
Filename: filename, Filename: filename,
@@ -22,6 +22,7 @@ func CreateUploadingFile(filename string, description string, fileSize int64, bl
TargetResourceID: resourceID, TargetResourceID: resourceID,
TargetStorageID: storageID, TargetStorageID: storageID,
UserID: userID, UserID: userID,
Tag: tag,
} }
if err := db.Create(uf).Error; err != nil { if err := db.Create(uf).Error; err != nil {
return nil, err return nil, err
@@ -73,7 +74,7 @@ func GetUploadingFilesOlderThan(time time.Time) ([]model.UploadingFile, error) {
return files, nil return files, nil
} }
func CreateFile(filename string, description string, resourceID uint, storageID *uint, storageKey string, redirectUrl string, size int64, userID uint, hash string) (*model.File, error) { func CreateFile(filename string, description string, resourceID uint, storageID *uint, storageKey string, redirectUrl string, size int64, userID uint, hash string, tag string) (*model.File, error) {
if storageID == nil && redirectUrl == "" { if storageID == nil && redirectUrl == "" {
return nil, errors.New("storageID and redirectUrl cannot be both empty") return nil, errors.New("storageID and redirectUrl cannot be both empty")
} }
@@ -89,6 +90,7 @@ func CreateFile(filename string, description string, resourceID uint, storageID
Size: size, Size: size,
UserID: userID, UserID: userID,
Hash: hash, Hash: hash,
Tag: tag,
} }
err := db.Transaction(func(tx *gorm.DB) error { err := db.Transaction(func(tx *gorm.DB) error {
@@ -171,7 +173,7 @@ func DeleteFile(id string) error {
return nil return nil
} }
func UpdateFile(id string, filename string, description string) (*model.File, error) { func UpdateFile(id string, filename string, description string, tag string) (*model.File, error) {
f := &model.File{} f := &model.File{}
if err := db.Where("uuid = ?", id).First(f).Error; err != nil { if err := db.Where("uuid = ?", id).First(f).Error; err != nil {
return nil, err return nil, err
@@ -182,6 +184,9 @@ func UpdateFile(id string, filename string, description string) (*model.File, er
if description != "" { if description != "" {
f.Description = description f.Description = description
} }
if tag != "" {
f.Tag = tag
}
if err := db.Save(f).Error; err != nil { if err := db.Save(f).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, model.NewNotFoundError("file not found") return nil, model.NewNotFoundError("file not found")

View File

@@ -19,6 +19,7 @@ type File struct {
User User `gorm:"foreignKey:UserID"` User User `gorm:"foreignKey:UserID"`
Size int64 Size int64
Hash string `gorm:"default:null"` Hash string `gorm:"default:null"`
Tag string `gorm:"type:text;default:null"`
} }
type FileView struct { type FileView struct {
@@ -32,6 +33,7 @@ type FileView struct {
Hash string `json:"hash,omitempty"` Hash string `json:"hash,omitempty"`
StorageName string `json:"storage_name,omitempty"` StorageName string `json:"storage_name,omitempty"`
CreatedAt int64 `json:"created_at,omitempty"` CreatedAt int64 `json:"created_at,omitempty"`
Tag string `json:"tag,omitempty"`
} }
func (f *File) ToView() *FileView { func (f *File) ToView() *FileView {
@@ -45,6 +47,7 @@ func (f *File) ToView() *FileView {
Hash: f.Hash, Hash: f.Hash,
StorageName: f.Storage.Name, StorageName: f.Storage.Name,
CreatedAt: f.CreatedAt.Unix(), CreatedAt: f.CreatedAt.Unix(),
Tag: f.Tag,
} }
} }
@@ -64,5 +67,6 @@ func (f *File) ToViewWithResource() *FileView {
User: f.User.ToView(), User: f.User.ToView(),
Resource: resource, Resource: resource,
Hash: f.Hash, Hash: f.Hash,
Tag: f.Tag,
} }
} }

View File

@@ -21,6 +21,7 @@ type UploadingFile struct {
TempPath string TempPath string
Resource Resource `gorm:"foreignKey:TargetResourceID"` Resource Resource `gorm:"foreignKey:TargetResourceID"`
Storage Storage `gorm:"foreignKey:TargetStorageID"` Storage Storage `gorm:"foreignKey:TargetStorageID"`
Tag string `gorm:"type:text;default:null"`
} }
func (uf *UploadingFile) BlocksCount() int { func (uf *UploadingFile) BlocksCount() int {

View File

@@ -80,7 +80,7 @@ func init() {
}() }()
} }
func CreateUploadingFile(uid uint, filename string, description string, fileSize int64, resourceID, storageID uint) (*model.UploadingFileView, error) { func CreateUploadingFile(uid uint, filename string, description string, fileSize int64, resourceID, storageID uint, tag string) (*model.UploadingFileView, error) {
if filename == "" { if filename == "" {
return nil, model.NewRequestError("filename is empty") return nil, model.NewRequestError("filename is empty")
} }
@@ -113,7 +113,7 @@ func CreateUploadingFile(uid uint, filename string, description string, fileSize
log.Error("failed to create temp dir: ", err) log.Error("failed to create temp dir: ", err)
return nil, model.NewInternalServerError("failed to create temp dir") return nil, model.NewInternalServerError("failed to create temp dir")
} }
uploadingFile, err := dao.CreateUploadingFile(filename, description, fileSize, blockSize, tempPath, resourceID, storageID, uid) uploadingFile, err := dao.CreateUploadingFile(filename, description, fileSize, blockSize, tempPath, resourceID, storageID, uid, tag)
if err != nil { if err != nil {
log.Error("failed to create uploading file: ", err) log.Error("failed to create uploading file: ", err)
_ = os.Remove(tempPath) _ = os.Remove(tempPath)
@@ -245,7 +245,7 @@ func FinishUploadingFile(uid uint, fid uint, md5Str string) (*model.FileView, er
return nil, model.NewInternalServerError("failed to finish uploading file. please re-upload") return nil, model.NewInternalServerError("failed to finish uploading file. please re-upload")
} }
dbFile, err := dao.CreateFile(uploadingFile.Filename, uploadingFile.Description, uploadingFile.TargetResourceID, &uploadingFile.TargetStorageID, storageKeyUnavailable, "", uploadingFile.TotalSize, uid, sumStr) dbFile, err := dao.CreateFile(uploadingFile.Filename, uploadingFile.Description, uploadingFile.TargetResourceID, &uploadingFile.TargetStorageID, storageKeyUnavailable, "", uploadingFile.TotalSize, uid, sumStr, uploadingFile.Tag)
if err != nil { if err != nil {
log.Error("failed to create file in db: ", err) log.Error("failed to create file in db: ", err)
_ = os.Remove(resultFilePath) _ = os.Remove(resultFilePath)
@@ -309,7 +309,7 @@ func CancelUploadingFile(uid uint, fid uint) error {
return nil return nil
} }
func CreateRedirectFile(uid uint, filename string, description string, resourceID uint, redirectUrl string) (*model.FileView, error) { func CreateRedirectFile(uid uint, filename string, description string, resourceID uint, redirectUrl string, fileSize int64, md5 string, tag string) (*model.FileView, error) {
u, err := url.Parse(redirectUrl) u, err := url.Parse(redirectUrl)
if err != nil { if err != nil {
return nil, model.NewRequestError("URL is not valid") return nil, model.NewRequestError("URL is not valid")
@@ -329,7 +329,7 @@ func CreateRedirectFile(uid uint, filename string, description string, resourceI
return nil, model.NewUnAuthorizedError("user cannot upload file") return nil, model.NewUnAuthorizedError("user cannot upload file")
} }
file, err := dao.CreateFile(filename, description, resourceID, nil, "", redirectUrl, 0, uid, "") file, err := dao.CreateFile(filename, description, resourceID, nil, "", redirectUrl, fileSize, uid, md5, tag)
if err != nil { if err != nil {
log.Error("failed to create file in db: ", err) log.Error("failed to create file in db: ", err)
return nil, model.NewInternalServerError("failed to create file in db") return nil, model.NewInternalServerError("failed to create file in db")
@@ -373,7 +373,7 @@ func DeleteFile(uid uint, fid string) error {
return nil return nil
} }
func UpdateFile(uid uint, fid string, filename string, description string) (*model.FileView, error) { func UpdateFile(uid uint, fid string, filename string, description string, tag string) (*model.FileView, error) {
file, err := dao.GetFile(fid) file, err := dao.GetFile(fid)
if err != nil { if err != nil {
log.Error("failed to get file: ", err) log.Error("failed to get file: ", err)
@@ -390,7 +390,7 @@ func UpdateFile(uid uint, fid string, filename string, description string) (*mod
return nil, model.NewUnAuthorizedError("user cannot update file") return nil, model.NewUnAuthorizedError("user cannot update file")
} }
file, err = dao.UpdateFile(fid, filename, description) file, err = dao.UpdateFile(fid, filename, description, tag)
if err != nil { if err != nil {
log.Error("failed to update file in db: ", err) log.Error("failed to update file in db: ", err)
return nil, model.NewInternalServerError("failed to update file in db") return nil, model.NewInternalServerError("failed to update file in db")
@@ -575,7 +575,7 @@ func downloadFile(ctx context.Context, url string, path string) (string, error)
} }
} }
func CreateServerDownloadTask(uid uint, url, filename, description string, resourceID, storageID uint) (*model.FileView, error) { func CreateServerDownloadTask(uid uint, url, filename, description string, resourceID, storageID uint, tag string) (*model.FileView, error) {
canUpload, err := checkUserCanUpload(uid) canUpload, err := checkUserCanUpload(uid)
if err != nil { if err != nil {
log.Error("failed to check user permission: ", err) log.Error("failed to check user permission: ", err)
@@ -596,7 +596,7 @@ func CreateServerDownloadTask(uid uint, url, filename, description string, resou
return nil, model.NewRequestError("server is busy, please try again later") return nil, model.NewRequestError("server is busy, please try again later")
} }
file, err := dao.CreateFile(filename, description, resourceID, &storageID, storageKeyUnavailable, "", 0, uid, "") file, err := dao.CreateFile(filename, description, resourceID, &storageID, storageKeyUnavailable, "", 0, uid, "", tag)
if err != nil { if err != nil {
log.Error("failed to create file in db: ", err) log.Error("failed to create file in db: ", err)
return nil, model.NewInternalServerError("failed to create file in db") return nil, model.NewInternalServerError("failed to create file in db")