mirror of
https://github.com/AlistGo/alist.git
synced 2025-11-25 03:15:10 +08:00
feat: add tag backup and fix bugs (#9265)
* feat(label): enhance label file binding and router setup (feat/add-tag-backup) - Add `GetLabelsByFileNamesPublic` to retrieve labels using file names. - Refactor router setup for label and file binding routes. - Improve `toObjsResp` for efficient label retrieval by file names. - Comment out unnecessary user ID parameter in `toObjsResp`. * feat(label): enhance label file binding and router setup - Add `GetLabelsByFileNamesPublic` for label retrieval by file names. - Refactor router setup for label and file binding routes. - Improve `toObjsResp` for efficient label retrieval by file names. - Comment out unnecessary user ID parameter in `toObjsResp`. * refactor(db): comment out debug print in GetLabelIds (#feat/add-tag-backup) - Comment out debug print statement in GetLabelIds to clean up logs. - Enhance code readability by removing unnecessary debug output. * feat(label-file-binding): add batch creation and improve label ID handling - Introduced `CreateLabelFileBinDingBatch` API for batch label binding. - Added `collectLabelIDs` helper function to handle label ID parsing. - Enhanced label ID handling to support varied delimiters and input formats. - Refactored `CreateLabelFileBinDing` logic for improved code readability. - Updated router to include `POST /label_file_binding/create_batch`.
This commit is contained in:
@@ -23,6 +23,7 @@ type CreateLabelFileBinDingReq struct {
|
||||
Type int `json:"type"`
|
||||
HashInfoStr string `json:"hashinfo"`
|
||||
LabelIds string `json:"label_ids"`
|
||||
LabelIDs []uint64 `json:"labelIdList"`
|
||||
}
|
||||
|
||||
type ObjLabelResp struct {
|
||||
@@ -54,23 +55,29 @@ func GetLabelByFileName(userId uint, fileName string) ([]model.Label, error) {
|
||||
return labels, nil
|
||||
}
|
||||
|
||||
func GetLabelsByFileNamesPublic(fileNames []string) (map[string][]model.Label, error) {
|
||||
return db.GetLabelsByFileNamesPublic(fileNames)
|
||||
}
|
||||
|
||||
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 == "" {
|
||||
|
||||
ids, err := collectLabelIDs(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
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 {
|
||||
|
||||
for _, id := range ids {
|
||||
if err = db.CreateLabelFileBinDing(req.Name, uint(id), userId); err != nil {
|
||||
return errors.WithMessage(err, "failed labels in database")
|
||||
}
|
||||
}
|
||||
|
||||
if !db.GetFileByNameExists(req.Name) {
|
||||
objFile := model.ObjFile{
|
||||
Id: req.Id,
|
||||
@@ -86,8 +93,7 @@ func CreateLabelFileBinDing(req CreateLabelFileBinDingReq, userId uint) error {
|
||||
Type: req.Type,
|
||||
HashInfoStr: req.HashInfoStr,
|
||||
}
|
||||
err := db.CreateObjFile(objFile)
|
||||
if err != nil {
|
||||
if err := db.CreateObjFile(objFile); err != nil {
|
||||
return errors.WithMessage(err, "failed file in database")
|
||||
}
|
||||
}
|
||||
@@ -97,7 +103,7 @@ func CreateLabelFileBinDing(req CreateLabelFileBinDingReq, userId uint) error {
|
||||
func GetFileByLabel(userId uint, labelId string) (result []ObjLabelResp, err error) {
|
||||
labelMap := strings.Split(labelId, ",")
|
||||
var labelIds []uint
|
||||
var labelsFile []model.LabelFileBinDing
|
||||
var labelsFile []model.LabelFileBinding
|
||||
var labels []model.Label
|
||||
var labelsFileMap = make(map[string][]model.Label)
|
||||
var labelsMap = make(map[uint]model.Label)
|
||||
@@ -157,3 +163,33 @@ func StringSliceToUintSlice(strSlice []string) ([]uint, error) {
|
||||
}
|
||||
return uintSlice, nil
|
||||
}
|
||||
|
||||
func RestoreLabelFileBindings(bindings []model.LabelFileBinding, keepIDs bool, override bool) error {
|
||||
return db.RestoreLabelFileBindings(bindings, keepIDs, override)
|
||||
}
|
||||
|
||||
func collectLabelIDs(req CreateLabelFileBinDingReq) ([]uint64, error) {
|
||||
if len(req.LabelIDs) > 0 {
|
||||
return req.LabelIDs, nil
|
||||
}
|
||||
s := strings.TrimSpace(req.LabelIds)
|
||||
if s == "" {
|
||||
return nil, nil
|
||||
}
|
||||
replacer := strings.NewReplacer(",", ",", "、", ",", ";", ",", ";", ",")
|
||||
s = replacer.Replace(s)
|
||||
parts := strings.Split(s, ",")
|
||||
ids := make([]uint64, 0, len(parts))
|
||||
for _, p := range parts {
|
||||
p = strings.TrimSpace(p)
|
||||
if p == "" {
|
||||
continue
|
||||
}
|
||||
id, err := strconv.ParseUint(p, 10, 64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid label ID '%s': %v", p, err)
|
||||
}
|
||||
ids = append(ids, id)
|
||||
}
|
||||
return ids, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user