Add user files.

This commit is contained in:
2025-07-13 16:41:39 +08:00
parent e9f6e1968e
commit 891b3d4a1a
8 changed files with 236 additions and 14 deletions

View File

@@ -30,6 +30,7 @@ func AddFileRoutes(router fiber.Router) {
fileGroup.Delete("/:id", deleteFile)
fileGroup.Get("/download/local", downloadLocalFile)
fileGroup.Get("/download/:id", downloadFile, middleware.NewDynamicRequestLimiter(config.MaxDownloadsPerDayForSingleIP, 24*time.Hour))
fileGroup.Get("/user/:username", listUserFiles, middleware.NewRequestLimiter(100, 24*time.Hour))
}
}
@@ -273,3 +274,22 @@ func createServerDownloadTask(c fiber.Ctx) error {
Data: result,
})
}
func listUserFiles(c fiber.Ctx) error {
username := c.Params("username")
page, err := strconv.Atoi(c.Query("page", "1"))
if err != nil || page < 1 {
return model.NewRequestError("Invalid page number")
}
files, totalPages, err := service.ListUserFiles(username, page)
if err != nil {
return err
}
return c.JSON(model.PageResponse[*model.FileView]{
Success: true,
Data: files,
TotalPages: totalPages,
})
}

View File

@@ -215,3 +215,20 @@ func SetFileStorageKeyAndSize(id string, storageKey string, size int64) error {
}
return nil
}
func ListUserFiles(userID uint, page, pageSize int) ([]*model.File, int64, error) {
var files []*model.File
var count int64
if err := db.Model(&model.File{}).
Preload("Resource").
Where("user_id = ?", userID).
Count(&count).
Order("created_at DESC").
Offset((page - 1) * pageSize).
Limit(pageSize).
Find(&files).Error; err != nil {
return nil, 0, err
}
return files, count, nil
}

View File

@@ -21,12 +21,13 @@ type File struct {
}
type FileView struct {
ID string `json:"id"`
Filename string `json:"filename"`
Description string `json:"description"`
Size int64 `json:"size"`
IsRedirect bool `json:"is_redirect"`
User UserView `json:"user"`
ID string `json:"id"`
Filename string `json:"filename"`
Description string `json:"description"`
Size int64 `json:"size"`
IsRedirect bool `json:"is_redirect"`
User UserView `json:"user"`
Resource *ResourceView `json:"resource,omitempty"`
}
func (f *File) ToView() *FileView {
@@ -39,3 +40,21 @@ func (f *File) ToView() *FileView {
User: f.User.ToView(),
}
}
func (f *File) ToViewWithResource() *FileView {
var resource *ResourceView
if f.Resource.ID != 0 {
rv := f.Resource.ToView()
resource = &rv
}
return &FileView{
ID: f.UUID,
Filename: f.Filename,
Description: f.Description,
Size: f.Size,
IsRedirect: f.RedirectUrl != "",
User: f.User.ToView(),
Resource: resource,
}
}

View File

@@ -614,3 +614,26 @@ func CreateServerDownloadTask(uid uint, url, filename, description string, resou
return file.ToView(), nil
}
func ListUserFiles(username string, page int) ([]*model.FileView, int, error) {
user, err := dao.GetUserByUsername(username)
if err != nil {
log.Error("failed to get user by username: ", err)
return nil, 0, model.NewNotFoundError("user not found")
}
uid := user.ID
files, total, err := dao.ListUserFiles(uid, page, pageSize)
if err != nil {
log.Error("failed to list user files: ", err)
return nil, 0, model.NewInternalServerError("failed to list user files")
}
fileViews := make([]*model.FileView, len(files))
for i, file := range files {
fileViews[i] = file.ToViewWithResource()
}
totalPages := (total + pageSize - 1) / pageSize
return fileViews, int(totalPages), nil
}