mirror of https://github.com/Xhofe/alist
160 lines
4.9 KiB
Go
160 lines
4.9 KiB
Go
package op
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/alist-org/alist/v3/internal/db"
|
||
"github.com/alist-org/alist/v3/internal/model"
|
||
"github.com/pkg/errors"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
type CreateLabelFileBinDingReq struct {
|
||
Id string `json:"id"`
|
||
Path string `json:"path"`
|
||
Name string `json:"name"`
|
||
Size int64 `json:"size"`
|
||
IsDir bool `json:"is_dir"`
|
||
Modified time.Time `json:"modified"`
|
||
Created time.Time `json:"created"`
|
||
Sign string `json:"sign"`
|
||
Thumb string `json:"thumb"`
|
||
Type int `json:"type"`
|
||
HashInfoStr string `json:"hashinfo"`
|
||
LabelIds string `json:"label_ids"`
|
||
}
|
||
|
||
type ObjLabelResp struct {
|
||
Id string `json:"id"`
|
||
Path string `json:"path"`
|
||
Name string `json:"name"`
|
||
Size int64 `json:"size"`
|
||
IsDir bool `json:"is_dir"`
|
||
Modified time.Time `json:"modified"`
|
||
Created time.Time `json:"created"`
|
||
Sign string `json:"sign"`
|
||
Thumb string `json:"thumb"`
|
||
Type int `json:"type"`
|
||
HashInfoStr string `json:"hashinfo"`
|
||
LabelList []model.Label `json:"label_list"`
|
||
}
|
||
|
||
func GetLabelByFileName(userId uint, fileName string) ([]model.Label, error) {
|
||
labelIds, err := db.GetLabelIds(userId, fileName)
|
||
if err != nil {
|
||
return nil, errors.WithMessage(err, "failed get label_file_binding")
|
||
}
|
||
var labels []model.Label
|
||
if len(labelIds) > 0 {
|
||
if labels, err = db.GetLabelByIds(labelIds); err != nil {
|
||
return nil, errors.WithMessage(err, "failed labels in database")
|
||
}
|
||
}
|
||
return labels, nil
|
||
}
|
||
|
||
func CreateLabelFileBinDing(req CreateLabelFileBinDingReq, userId uint) error {
|
||
if err := db.DelLabelFileBinDingByFileName(userId, req.Name); err != nil {
|
||
return errors.WithMessage(err, "failed del label_file_bin_ding in database")
|
||
}
|
||
if req.LabelIds == "" {
|
||
return nil
|
||
}
|
||
labelMap := strings.Split(req.LabelIds, ",")
|
||
for _, value := range labelMap {
|
||
labelId, err := strconv.ParseUint(value, 10, 64)
|
||
if err != nil {
|
||
return fmt.Errorf("invalid label ID '%s': %v", value, err)
|
||
}
|
||
if err = db.CreateLabelFileBinDing(req.Name, uint(labelId), userId); err != nil {
|
||
return errors.WithMessage(err, "failed labels in database")
|
||
}
|
||
}
|
||
if !db.GetFileByNameExists(req.Name) {
|
||
objFile := model.ObjFile{
|
||
Id: req.Id,
|
||
UserId: userId,
|
||
Path: req.Path,
|
||
Name: req.Name,
|
||
Size: req.Size,
|
||
IsDir: req.IsDir,
|
||
Modified: req.Modified,
|
||
Created: req.Created,
|
||
Sign: req.Sign,
|
||
Thumb: req.Thumb,
|
||
Type: req.Type,
|
||
HashInfoStr: req.HashInfoStr,
|
||
}
|
||
err := db.CreateObjFile(objFile)
|
||
if err != nil {
|
||
return errors.WithMessage(err, "failed file in database")
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func GetFileByLabel(userId uint, labelId string) (result []ObjLabelResp, err error) {
|
||
labelMap := strings.Split(labelId, ",")
|
||
var labelIds []uint
|
||
var labelsFile []model.LabelFileBinDing
|
||
var labels []model.Label
|
||
var labelsFileMap = make(map[string][]model.Label)
|
||
var labelsMap = make(map[uint]model.Label)
|
||
if labelIds, err = StringSliceToUintSlice(labelMap); err != nil {
|
||
return nil, errors.WithMessage(err, "failed string to uint err")
|
||
}
|
||
//查询标签信息
|
||
if labels, err = db.GetLabelByIds(labelIds); err != nil {
|
||
return nil, errors.WithMessage(err, "failed labels in database")
|
||
}
|
||
for _, val := range labels {
|
||
labelsMap[val.ID] = val
|
||
}
|
||
//查询标签对应文件名列表
|
||
if labelsFile, err = db.GetLabelFileBinDingByLabelId(labelIds, userId); err != nil {
|
||
return nil, errors.WithMessage(err, "failed labels in database")
|
||
}
|
||
for _, value := range labelsFile {
|
||
var labelTemp model.Label
|
||
labelTemp = labelsMap[value.LabelId]
|
||
labelsFileMap[value.FileName] = append(labelsFileMap[value.FileName], labelTemp)
|
||
}
|
||
for index, v := range labelsFileMap {
|
||
objFile, err := db.GetFileByName(index, userId)
|
||
if err != nil {
|
||
return nil, errors.WithMessage(err, "failed GetFileByName in database")
|
||
}
|
||
objLabel := ObjLabelResp{
|
||
Id: objFile.Id,
|
||
Path: objFile.Path,
|
||
Name: objFile.Name,
|
||
Size: objFile.Size,
|
||
IsDir: objFile.IsDir,
|
||
Modified: objFile.Modified,
|
||
Created: objFile.Created,
|
||
Sign: objFile.Sign,
|
||
Thumb: objFile.Thumb,
|
||
Type: objFile.Type,
|
||
HashInfoStr: objFile.HashInfoStr,
|
||
LabelList: v,
|
||
}
|
||
result = append(result, objLabel)
|
||
}
|
||
return result, nil
|
||
}
|
||
|
||
func StringSliceToUintSlice(strSlice []string) ([]uint, error) {
|
||
uintSlice := make([]uint, len(strSlice))
|
||
for i, str := range strSlice {
|
||
// 使用strconv.ParseUint将字符串转换为uint64
|
||
uint64Value, err := strconv.ParseUint(str, 10, 64)
|
||
if err != nil {
|
||
return nil, err // 如果转换失败,返回错误
|
||
}
|
||
// 将uint64值转换为uint(注意:这里可能存在精度损失,如果uint64值超出了uint的范围)
|
||
uintSlice[i] = uint(uint64Value)
|
||
}
|
||
return uintSlice, nil
|
||
}
|