diff --git a/dao/file.go b/dao/file.go index a3a8451..c9fa6a1 100644 --- a/dao/file.go +++ b/dao/file.go @@ -177,3 +177,58 @@ func FindConfigFileByAuthID(auth_id int) []ConfigFile { } return files } + +// 通用通过用户id及类型查询 +func FileUserFileList(userID int, fileType string) []FileAuth { + var files []FileAuth + if proto.Config.SERVER_SQL_LOG { + DB.Debug().Where("auth_id = ? and upload_type = ?", userID, fileType).Find(&files) + } else { + DB.Where("auth_id = ? and upload_type = ?", userID, fileType).Find(&files) + } + return files +} + +// 通过文件名及用户id查询(文件名模糊查询),索引不生效查询较慢 +func FindFileByUserFileName(fileName string, userID int) []FileAuth { + var files []FileAuth + if proto.Config.SERVER_SQL_LOG { + DB.Debug().Where("auth_id = ? and user_file_name LIKE ?", userID, "%"+fileName+"%").Find(&files) + } else { + DB.Where("auth_id = ? and user_file_name LIKE ?", userID, "%"+fileName+"%").Find(&files) + } + return files +} + +// 删除文件 +func DeleteFileAuthByID(id int) error { + var res *gorm.DB + if proto.Config.SERVER_SQL_LOG { + res = DB.Debug().Delete(&FileAuth{}, id) + } else { + res = DB.Delete(&FileAuth{}, id) + } + return res.Error +} + +// 修改文件名(暂时只能改文件名) +func UpdateFileAuthByID(id int, file FileAuth) error { + var res *gorm.DB + if proto.Config.SERVER_SQL_LOG { + res = DB.Debug().Model(&FileAuth{}).Where("id = ?", id).Updates(&file) + } else { + res = DB.Model(&FileAuth{}).Where("id = ?", id).Updates(&file) + } + return res.Error +} + +// 根据FileAuth的id查询 +func FindFileAuthByID(id int) FileAuth { + var file FileAuth + if proto.Config.SERVER_SQL_LOG { + DB.Debug().Where("id = ?", id).First(&file) + } else { + DB.Where("id = ?", id).First(&file) + } + return file +} diff --git a/handler/file.go b/handler/file.go index be44adb..dd2bb00 100644 --- a/handler/file.go +++ b/handler/file.go @@ -16,9 +16,77 @@ func SetUpFileGroup(router *gin.Engine) { fileGroup.POST("/config_search", SearchConfigFile) fileGroup.POST("/upload", UploadFileV2) fileGroup.GET("/general/:filename", GetFile) + fileGroup.POST("/file_list", GetUserFileList) + fileGroup.POST("/file_delete", DeleteUserFile) + fileGroup.POST("/file_update", UpdateUserFile) } +type GetUserFileListReq struct { + FileID int `json:"file_id"` // 文件ID + FileName string `json:"file_name"` // 文件名search时必须 + Type string `json:"type"` // all,search +} + +func GetUserFileList(c *gin.Context) { + id, _ := c.Get("id") + user_id := int(id.(float64)) + var req GetUserFileListReq + if err := c.ShouldBind(&req); err == nil { + if req.Type == "all" { + fileList := dao.FileUserFileList(user_id, proto.UserFileTypeFile) + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "msg": "success", "data": fileList}) + } else if req.Type == "search" { + fileList := dao.FindFileByUserFileName(req.FileName, user_id) + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "msg": "success", "data": fileList}) + } else { + c.JSON(http.StatusOK, gin.H{"error": "search file type error", "code": proto.ParameterError, "message": "failed"}) + } + } else { + c.JSON(http.StatusOK, gin.H{"error": "upload form parameter decode error:" + err.Error(), "code": proto.ParameterError, "message": "failed"}) + return + } +} + +func DeleteUserFile(c *gin.Context) { + id, _ := c.Get("id") + userId := int(id.(float64)) + var req GetUserFileListReq + if err := c.ShouldBind(&req); err == nil { + err2 := service.DeleteUserFile(userId, req.FileID) + if err2 != nil { + c.JSON(http.StatusOK, gin.H{"error": "delete file failed", "code": proto.DeleteFileFailed, "message": "failed"}) + return + } else { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + return + } + + } else { + c.JSON(http.StatusOK, gin.H{"error": "upload form parameter decode error:" + err.Error(), "code": proto.ParameterError, "message": "failed"}) + return + } +} + +func UpdateUserFile(c *gin.Context) { + id, _ := c.Get("id") + userId := int(id.(float64)) + var req GetUserFileListReq + if err := c.ShouldBind(&req); err == nil { + err2 := service.UpdateUserFile(userId, req.FileID, req.FileName) + if err2 != nil { + c.JSON(http.StatusOK, gin.H{"error": "update file failed:" + err2.Error(), "code": proto.SaveFileInfoFailed, "message": "failed"}) + return + } else { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + return + } + + } else { + c.JSON(http.StatusOK, gin.H{"error": "upload form parameter decode error:" + err.Error(), "code": proto.ParameterError, "message": "failed"}) + } +} + func AddConfigFile(c *gin.Context) { id, _ := c.Get("id") user_id := int(id.(float64)) diff --git a/proto/status.go b/proto/status.go index ea708c3..afeab80 100644 --- a/proto/status.go +++ b/proto/status.go @@ -138,3 +138,12 @@ const ( DefaultTopK = 0.5 DefaultTopP = 0.8 ) + +// 文件 +const ( + UserFileTypeIM = "im" // IM文件 + UserFileTypeAvatar = "avatar" // 用户头像 + UserFileTypeFile = "file" // 通用文件 + UserFileTypeConfig = "config" // 配置文件 + +) diff --git a/service/fileService.go b/service/fileService.go index 31de438..3d8590a 100644 --- a/service/fileService.go +++ b/service/fileService.go @@ -5,6 +5,7 @@ import ( "StuAcaWorksAI/proto" "StuAcaWorksAI/worker" "crypto/md5" + "errors" "fmt" "github.com/gin-gonic/gin" "github.com/google/uuid" @@ -217,3 +218,27 @@ func (c *ConfigFileService) SearchAllConfigFile(userId int) ([]dao.ConfigFile, e config_files := dao.FindConfigFileByAuthID(userId) return config_files, nil } + +func UpdateUserFile(userID int, fileAuthID int, fileAuthName string) error { + fileAuth := dao.FindFileAuthByID(fileAuthID) + if fileAuth.ID == 0 { + return errors.New("file auth not found") + } + if fileAuth.AuthID != userID { + return errors.New("no permission") + } + fileAuth.UserFileName = fileAuthName + err := dao.UpdateFileAuthByID(userID, fileAuth) + return err +} +func DeleteUserFile(userID, fileAuthID int) error { + fileAuth := dao.FindFileAuthByID(fileAuthID) + if fileAuth.ID == 0 { + return errors.New("file auth not found") + } + if fileAuth.AuthID != userID { + return errors.New("no permission") + } + err := dao.DeleteFileAuthByID(fileAuthID) + return err +}