feat: get-file by uid and gid

pull/1882/head
WintBit 2 years ago
parent ee8f90df1c
commit 2165c03c9d

@ -126,11 +126,21 @@ func (folder *Folder) GetChildFiles() ([]File, error) {
// GetFilesByIDs 根据文件ID批量获取文件, // GetFilesByIDs 根据文件ID批量获取文件,
// UID为0表示忽略用户只根据文件ID检索 // UID为0表示忽略用户只根据文件ID检索
func GetFilesByIDs(ids []uint, uid uint) ([]File, error) { func GetFilesByIDs(ids []uint, uid, gid uint) ([]File, error) {
return GetFilesByIDsFromTX(DB, ids, uid) uResult, err := GetFilesByIDsFromTX(DB, ids, int(uid))
if err == nil && len(uResult) > 0 {
return uResult, nil
}
gResult, err := GetFilesByIDsFromTX(DB, ids, -int(gid))
if err == nil && len(gResult) > 0 {
return gResult, nil
}
return []File{}, err
} }
func GetFilesByIDsFromTX(tx *gorm.DB, ids []uint, uid uint) ([]File, error) { func GetFilesByIDsFromTX(tx *gorm.DB, ids []uint, uid int) ([]File, error) {
var files []File var files []File
var result *gorm.DB var result *gorm.DB
if uid == 0 { if uid == 0 {
@ -295,9 +305,13 @@ func GetFilesByParentIDs(ids []uint, uid uint) ([]File, error) {
} }
// GetFilesByUploadSession 查找上传会话对应的文件 // GetFilesByUploadSession 查找上传会话对应的文件
func GetFilesByUploadSession(sessionID string, uid uint) (*File, error) { func GetFilesByUploadSession(sessionID string, user *User) (*File, error) {
file := File{} file := File{}
result := DB.Where("user_id = ? and upload_session_id = ?", uid, sessionID).Find(&file) result := DB.Where("user_id = ? and upload_session_id = ?", user.ID, sessionID).Find(&file)
if result.Error != nil {
result = DB.Where("user_id = ? and upload_session_id = ?", -int(user.GroupID), sessionID).Find(&file)
}
return &file, result.Error return &file, result.Error
} }

@ -118,7 +118,7 @@ func (share *Share) SourceFolder() *Folder {
// SourceFile 获取源文件 // SourceFile 获取源文件
func (share *Share) SourceFile() *File { func (share *Share) SourceFile() *File {
if share.File.ID == 0 { if share.File.ID == 0 {
files, _ := GetFilesByIDs([]uint{share.SourceID}, share.UserID) files, _ := GetFilesByIDs([]uint{share.SourceID}, share.UserID, 0)
if len(files) > 0 { if len(files) > 0 {
share.File = files[0] share.File = files[0]
} }

@ -32,7 +32,7 @@ func (s *SourceLink) Link() (string, error) {
func GetSourceLinkByID(id interface{}) (*SourceLink, error) { func GetSourceLinkByID(id interface{}) (*SourceLink, error) {
link := &SourceLink{} link := &SourceLink{}
result := DB.Where("id = ?", id).First(link) result := DB.Where("id = ?", id).First(link)
files, _ := GetFilesByIDs([]uint{link.FileID}, 0) files, _ := GetFilesByIDs([]uint{link.FileID}, 0, 0)
if len(files) > 0 { if len(files) > 0 {
link.File = files[0] link.File = files[0]
} }

@ -33,7 +33,7 @@ func (fs *FileSystem) Compress(ctx context.Context, writer io.Writer, folderIDs,
} }
// 查找待压缩文件 // 查找待压缩文件
files, err := model.GetFilesByIDs(fileIDs, fs.User.ID) files, err := model.GetFilesByIDs(fileIDs, fs.User.ID, fs.User.GroupID)
if err != nil && len(fileIDs) != 0 { if err != nil && len(fileIDs) != 0 {
return ErrDBListObjects return ErrDBListObjects
} }

@ -53,10 +53,17 @@ func (fs *FileSystem) AddFile(ctx context.Context, parent *model.Folder, file fs
} }
uploadInfo := file.Info() uploadInfo := file.Info()
var id int
if parent.OwnerID < 0 {
id = parent.OwnerID
} else {
id = int(fs.User.ID)
}
newFile := model.File{ newFile := model.File{
Name: uploadInfo.FileName, Name: uploadInfo.FileName,
SourceName: uploadInfo.SavePath, SourceName: uploadInfo.SavePath,
UserID: int(fs.User.ID), UserID: id,
Size: uploadInfo.Size, Size: uploadInfo.Size,
FolderID: parent.ID, FolderID: parent.ID,
PolicyID: fs.Policy.ID, PolicyID: fs.Policy.ID,
@ -325,20 +332,20 @@ func (fs *FileSystem) ResetFileIfNotExist(ctx context.Context, path string) erro
// ResetFileIfNotExist 重设当前目标文件为 id如果当前目标为空 // ResetFileIfNotExist 重设当前目标文件为 id如果当前目标为空
func (fs *FileSystem) resetFileIDIfNotExist(ctx context.Context, id uint) error { func (fs *FileSystem) resetFileIDIfNotExist(ctx context.Context, id uint) error {
// 找到文件 // 如果上下文限制了父目录,则进行检查
if len(fs.FileTarget) == 0 { if parent, ok := ctx.Value(fsctx.LimitParentCtx).(*model.Folder); ok {
file, err := model.GetFilesByIDs([]uint{id}, fs.User.ID) if parent.ID != fs.FileTarget[0].FolderID {
if err != nil || len(file) == 0 {
return ErrObjectNotExist return ErrObjectNotExist
} }
fs.FileTarget = []model.File{file[0]}
} }
// 如果上下文限制了父目录,则进行检查 // 找到文件
if parent, ok := ctx.Value(fsctx.LimitParentCtx).(*model.Folder); ok { if len(fs.FileTarget) == 0 {
if parent.ID != fs.FileTarget[0].FolderID { file, err := model.GetFilesByIDs([]uint{id}, fs.User.ID, fs.User.GroupID)
if err != nil || len(file) == 0 {
return ErrObjectNotExist return ErrObjectNotExist
} }
fs.FileTarget = []model.File{file[0]}
} }
// 将当前存储策略重设为文件使用的 // 将当前存储策略重设为文件使用的

@ -262,7 +262,7 @@ func (fs *FileSystem) SetTargetDir(dirs *[]model.Folder) {
// SetTargetFileByIDs 根据文件ID设置目标文件忽略用户ID // SetTargetFileByIDs 根据文件ID设置目标文件忽略用户ID
func (fs *FileSystem) SetTargetFileByIDs(ids []uint) error { func (fs *FileSystem) SetTargetFileByIDs(ids []uint) error {
files, err := model.GetFilesByIDs(ids, 0) files, err := model.GetFilesByIDs(ids, 0, 0)
if err != nil || len(files) == 0 { if err != nil || len(files) == 0 {
return ErrFileExisted.WithError(err) return ErrFileExisted.WithError(err)
} }

@ -26,7 +26,7 @@ func (fs *FileSystem) Rename(ctx context.Context, dir, file []uint, new string)
// 如果源对象是文件 // 如果源对象是文件
if len(file) > 0 { if len(file) > 0 {
fileObject, err := model.GetFilesByIDs([]uint{file[0]}, fs.User.ID) fileObject, err := model.GetFilesByIDs([]uint{file[0]}, fs.User.ID, fs.User.GroupID)
if err != nil || len(fileObject) == 0 { if err != nil || len(fileObject) == 0 {
return ErrPathNotExist return ErrPathNotExist
} }
@ -257,7 +257,7 @@ func (fs *FileSystem) ListDeleteDirs(ctx context.Context, ids []uint) error {
// ListDeleteFiles 根据给定的路径列出要删除的文件 // ListDeleteFiles 根据给定的路径列出要删除的文件
func (fs *FileSystem) ListDeleteFiles(ctx context.Context, ids []uint) error { func (fs *FileSystem) ListDeleteFiles(ctx context.Context, ids []uint) error {
files, err := model.GetFilesByIDs(ids, fs.User.ID) files, err := model.GetFilesByIDs(ids, fs.User.ID, fs.User.GroupID)
if err != nil { if err != nil {
return ErrDBListObjects.WithError(err) return ErrDBListObjects.WithError(err)
} }

@ -87,7 +87,7 @@ func (service *ListFolderService) List(c *gin.Context) serializer.Response {
// Delete 删除文件 // Delete 删除文件
func (service *FileBatchService) Delete(c *gin.Context) serializer.Response { func (service *FileBatchService) Delete(c *gin.Context) serializer.Response {
files, err := model.GetFilesByIDs(service.ID, 0) files, err := model.GetFilesByIDs(service.ID, 0, 0)
if err != nil { if err != nil {
return serializer.DBErr("Failed to list files for deleting", err) return serializer.DBErr("Failed to list files for deleting", err)
} }
@ -141,7 +141,7 @@ func (service *FileBatchService) Delete(c *gin.Context) serializer.Response {
// Get 预览文件 // Get 预览文件
func (service *FileService) Get(c *gin.Context) serializer.Response { func (service *FileService) Get(c *gin.Context) serializer.Response {
file, err := model.GetFilesByIDs([]uint{service.ID}, 0) file, err := model.GetFilesByIDs([]uint{service.ID}, 0, 0)
if err != nil { if err != nil {
return serializer.Err(serializer.CodeFileNotFound, "", err) return serializer.Err(serializer.CodeFileNotFound, "", err)
} }

@ -120,7 +120,7 @@ func ProcessCallback(service CallbackProcessService, c *gin.Context) serializer.
uploadSession := c.MustGet(filesystem.UploadSessionCtx).(*serializer.UploadSession) uploadSession := c.MustGet(filesystem.UploadSessionCtx).(*serializer.UploadSession)
// 查找上传会话创建的占位文件 // 查找上传会话创建的占位文件
file, err := model.GetFilesByUploadSession(uploadSession.Key, fs.User.ID) file, err := model.GetFilesByUploadSession(uploadSession.Key, fs.User)
if err != nil { if err != nil {
return serializer.Err(serializer.CodeUploadSessionExpired, "LocalUpload session file placeholder not exist", err) return serializer.Err(serializer.CodeUploadSessionExpired, "LocalUpload session file placeholder not exist", err)
} }

@ -433,7 +433,7 @@ func (service *FileIDService) PutContent(ctx context.Context, c *gin.Context) se
// 取得现有文件 // 取得现有文件
fileID, _ := c.Get("object_id") fileID, _ := c.Get("object_id")
originFile, _ := model.GetFilesByIDs([]uint{fileID.(uint)}, fs.User.ID) originFile, _ := model.GetFilesByIDs([]uint{fileID.(uint)}, fs.User.ID, fs.User.GroupID)
if len(originFile) == 0 { if len(originFile) == 0 {
return serializer.Err(serializer.CodeFileNotFound, "", nil) return serializer.Err(serializer.CodeFileNotFound, "", nil)
} }
@ -485,7 +485,7 @@ func (s *ItemIDService) Sources(ctx context.Context, c *gin.Context) serializer.
} }
res := make([]serializer.Sources, 0, len(s.Raw().Items)) res := make([]serializer.Sources, 0, len(s.Raw().Items))
files, err := model.GetFilesByIDs(s.Raw().Items, fs.User.ID) files, err := model.GetFilesByIDs(s.Raw().Items, fs.User.ID, fs.User.GroupID)
if err != nil || len(files) == 0 { if err != nil || len(files) == 0 {
return serializer.Err(serializer.CodeFileNotFound, "", err) return serializer.Err(serializer.CodeFileNotFound, "", err)
} }

@ -381,7 +381,7 @@ func (service *ItemPropertyService) GetProperty(ctx context.Context, c *gin.Cont
return serializer.Err(serializer.CodeNotFound, "", err) return serializer.Err(serializer.CodeNotFound, "", err)
} }
file, err := model.GetFilesByIDs([]uint{res}, user.ID) file, err := model.GetFilesByIDs([]uint{res}, user.ID, user.GroupID)
if err != nil { if err != nil {
return serializer.DBErr("Failed to query file records", err) return serializer.DBErr("Failed to query file records", err)
} }

@ -94,7 +94,7 @@ func (service *UploadService) LocalUpload(ctx context.Context, c *gin.Context) s
} }
// 查找上传会话创建的占位文件 // 查找上传会话创建的占位文件
file, err := model.GetFilesByUploadSession(service.ID, fs.User.ID) file, err := model.GetFilesByUploadSession(service.ID, fs.User)
if err != nil { if err != nil {
return serializer.Err(serializer.CodeUploadSessionExpired, "", err) return serializer.Err(serializer.CodeUploadSessionExpired, "", err)
} }
@ -232,7 +232,7 @@ func (service *UploadSessionService) Delete(ctx context.Context, c *gin.Context)
defer fs.Recycle() defer fs.Recycle()
// 查找需要删除的上传会话的占位文件 // 查找需要删除的上传会话的占位文件
file, err := model.GetFilesByUploadSession(service.ID, fs.User.ID) file, err := model.GetFilesByUploadSession(service.ID, fs.User)
if err != nil { if err != nil {
return serializer.Err(serializer.CodeUploadSessionExpired, "", err) return serializer.Err(serializer.CodeUploadSessionExpired, "", err)
} }

@ -101,7 +101,7 @@ func (service *ShareCreateService) Create(c *gin.Context) serializer.Response {
sourceName = folder[0].Name sourceName = folder[0].Name
} }
} else { } else {
file, err := model.GetFilesByIDs([]uint{sourceID}, user.ID) file, err := model.GetFilesByIDs([]uint{sourceID}, user.ID, user.GroupID)
if err != nil || len(file) == 0 { if err != nil || len(file) == 0 {
exist = false exist = false
} else { } else {

Loading…
Cancel
Save