231 lines
6.6 KiB
Go
231 lines
6.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"kra/internal/biz"
|
|
"kra/internal/server/httpx"
|
|
servermiddleware "kra/internal/server/middleware"
|
|
"kra/internal/service"
|
|
"kra/internal/service/dto"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type Media struct{ service *service.MediaService }
|
|
|
|
func NewMedia(service *service.MediaService) *Media { return &Media{service: service} }
|
|
|
|
func (h *Media) Upload(c *gin.Context) {
|
|
claims := servermiddleware.Claims(c)
|
|
header, err := c.FormFile("file")
|
|
if claims == nil || err != nil {
|
|
httpx.Fail(c, "接收文件失败")
|
|
return
|
|
}
|
|
opened, err := header.Open()
|
|
if err != nil {
|
|
httpx.Fail(c, "读取文件失败")
|
|
return
|
|
}
|
|
defer opened.Close()
|
|
category, _ := strconv.Atoi(c.DefaultPostForm("classId", "0"))
|
|
save := c.DefaultQuery("noSave", "0") == "0"
|
|
item, err := h.service.Upload(c.Request.Context(), claims.ID, header.Filename, header.Header.Get("Content-Type"), category, opened, save)
|
|
if err != nil {
|
|
httpx.Fail(c, "上传文件失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{"file": item}, "上传成功")
|
|
}
|
|
|
|
func (h *Media) List(c *gin.Context) {
|
|
var req dto.MediaListRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
items, total, err := h.service.MediaList(c.Request.Context(), biz.MediaFilter{Page: req.Page, PageSize: req.PageSize, Keyword: req.Keyword, CategoryID: req.ClassID, Tag: req.Tag, UserID: req.UserID, StartCreatedAt: req.StartCreatedAt, EndCreatedAt: req.EndCreatedAt, OrderKey: req.OrderKey, Desc: req.Desc})
|
|
if err != nil {
|
|
httpx.Fail(c, "获取失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, httpx.PageResult{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, "获取成功")
|
|
}
|
|
func (h *Media) Delete(c *gin.Context) {
|
|
var req dto.IDRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
if err := h.service.Delete(c.Request.Context(), req.ID); err != nil {
|
|
httpx.Fail(c, "删除失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{}, "删除成功")
|
|
}
|
|
func (h *Media) DeleteMany(c *gin.Context) {
|
|
var req dto.IDsRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
failed := []uint{}
|
|
for _, id := range req.IDs {
|
|
if h.service.Delete(c.Request.Context(), id) != nil {
|
|
failed = append(failed, id)
|
|
}
|
|
}
|
|
if len(failed) > 0 {
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{"failedIds": failed}, "部分文件删除失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{}, "批量删除成功")
|
|
}
|
|
func (h *Media) Find(c *gin.Context) {
|
|
id, parseErr := strconv.ParseUint(c.Query("id"), 10, 64)
|
|
if parseErr != nil {
|
|
httpx.Fail(c, "文件ID非法")
|
|
return
|
|
}
|
|
item, err := h.service.Media(c.Request.Context(), uint(id))
|
|
if err != nil {
|
|
httpx.Fail(c, "查询失败")
|
|
return
|
|
}
|
|
httpx.OKWithData(c, item)
|
|
}
|
|
func (h *Media) Rename(c *gin.Context) {
|
|
var req dto.RenameMediaRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
if err := h.service.Rename(c.Request.Context(), req.ID, req.Name); err != nil {
|
|
httpx.Fail(c, "编辑失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{}, "编辑成功")
|
|
}
|
|
func (h *Media) ImportURLs(c *gin.Context) {
|
|
var req []dto.ImportMediaRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
if err := h.service.ImportURLRequests(c.Request.Context(), req); err != nil {
|
|
httpx.Fail(c, "导入URL失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{}, "导入URL成功")
|
|
}
|
|
func (h *Media) Storage(c *gin.Context) {
|
|
var req dto.StorageListRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
items, next, more, err := h.service.Storage(c.Request.Context(), req.Prefix, req.Cursor, req.Limit)
|
|
if err != nil {
|
|
httpx.Fail(c, "列举失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{"list": items, "nextCursor": next, "hasMore": more}, "获取成功")
|
|
}
|
|
|
|
func (h *Media) Categories(c *gin.Context) {
|
|
items, err := h.service.Categories(c.Request.Context())
|
|
if err != nil {
|
|
httpx.Fail(c, "获取失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, items, "获取成功")
|
|
}
|
|
func (h *Media) SaveCategory(c *gin.Context) {
|
|
var req dto.CategoryRequest
|
|
if c.ShouldBindJSON(&req) != nil || req.Name == "" {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
if err := h.service.SaveCategoryRequest(c.Request.Context(), &req); err != nil {
|
|
httpx.Fail(c, "创建/更新失败:"+err.Error())
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{}, "创建/更新成功")
|
|
}
|
|
func (h *Media) DeleteCategory(c *gin.Context) {
|
|
var req dto.IDRequest
|
|
if c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
if err := h.service.DeleteCategory(c.Request.Context(), req.ID); err != nil {
|
|
httpx.Fail(c, "删除失败")
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{}, "删除成功")
|
|
}
|
|
|
|
func (h *Media) InitUpload(c *gin.Context) {
|
|
claims := servermiddleware.Claims(c)
|
|
var req dto.InitUploadRequest
|
|
if claims == nil || c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
result, err := h.service.InitUpload(c.Request.Context(), claims.ID, req.FileName, req.FileHash, req.FileSize, req.ChunkSize, req.ChunkTotal)
|
|
if err != nil {
|
|
httpx.Fail(c, err.Error())
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, result, "获取成功")
|
|
}
|
|
func (h *Media) SaveChunk(c *gin.Context) {
|
|
claims := servermiddleware.Claims(c)
|
|
uploadID, _ := strconv.ParseUint(c.PostForm("uploadId"), 10, 64)
|
|
index, _ := strconv.Atoi(c.PostForm("chunkIndex"))
|
|
header, err := c.FormFile("chunk")
|
|
if claims == nil || err != nil {
|
|
httpx.Fail(c, "接收分片失败")
|
|
return
|
|
}
|
|
opened, err := header.Open()
|
|
if err != nil {
|
|
httpx.Fail(c, "读取分片失败")
|
|
return
|
|
}
|
|
defer opened.Close()
|
|
if err = h.service.SaveChunk(c.Request.Context(), claims.ID, uint(uploadID), index, c.PostForm("chunkHash"), opened); err != nil {
|
|
httpx.Fail(c, err.Error())
|
|
return
|
|
}
|
|
httpx.OK(c)
|
|
}
|
|
func (h *Media) CompleteUpload(c *gin.Context) {
|
|
claims := servermiddleware.Claims(c)
|
|
var req dto.CompleteUploadRequest
|
|
if claims == nil || c.ShouldBindJSON(&req) != nil {
|
|
httpx.Fail(c, "参数错误")
|
|
return
|
|
}
|
|
item, err := h.service.CompleteUpload(c.Request.Context(), claims.ID, req.UploadID)
|
|
if err != nil {
|
|
httpx.Fail(c, err.Error())
|
|
return
|
|
}
|
|
httpx.Write(c, httpx.CodeSuccess, gin.H{"media": item}, "上传成功")
|
|
}
|
|
func (h *Media) CancelUpload(c *gin.Context) {
|
|
claims := servermiddleware.Claims(c)
|
|
id, _ := strconv.ParseUint(c.Param("uploadId"), 10, 64)
|
|
if claims == nil {
|
|
httpx.Fail(c, "未登录")
|
|
return
|
|
}
|
|
if err := h.service.CancelUpload(c.Request.Context(), claims.ID, uint(id)); err != nil {
|
|
httpx.Fail(c, err.Error())
|
|
return
|
|
}
|
|
httpx.OK(c)
|
|
}
|