Skip to content

Commit be82765

Browse files
committed
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`.
1 parent 340c00b commit be82765

File tree

3 files changed

+83
-10
lines changed

3 files changed

+83
-10
lines changed

internal/op/label_file_binding.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type CreateLabelFileBinDingReq struct {
2323
Type int `json:"type"`
2424
HashInfoStr string `json:"hashinfo"`
2525
LabelIds string `json:"label_ids"`
26+
LabelIDs []uint64 `json:"labelIdList"`
2627
}
2728

2829
type ObjLabelResp struct {
@@ -62,19 +63,21 @@ func CreateLabelFileBinDing(req CreateLabelFileBinDingReq, userId uint) error {
6263
if err := db.DelLabelFileBinDingByFileName(userId, req.Name); err != nil {
6364
return errors.WithMessage(err, "failed del label_file_bin_ding in database")
6465
}
65-
if req.LabelIds == "" {
66+
67+
ids, err := collectLabelIDs(req)
68+
if err != nil {
69+
return err
70+
}
71+
if len(ids) == 0 {
6672
return nil
6773
}
68-
labelMap := strings.Split(req.LabelIds, ",")
69-
for _, value := range labelMap {
70-
labelId, err := strconv.ParseUint(value, 10, 64)
71-
if err != nil {
72-
return fmt.Errorf("invalid label ID '%s': %v", value, err)
73-
}
74-
if err = db.CreateLabelFileBinDing(req.Name, uint(labelId), userId); err != nil {
74+
75+
for _, id := range ids {
76+
if err = db.CreateLabelFileBinDing(req.Name, uint(id), userId); err != nil {
7577
return errors.WithMessage(err, "failed labels in database")
7678
}
7779
}
80+
7881
if !db.GetFileByNameExists(req.Name) {
7982
objFile := model.ObjFile{
8083
Id: req.Id,
@@ -90,8 +93,7 @@ func CreateLabelFileBinDing(req CreateLabelFileBinDingReq, userId uint) error {
9093
Type: req.Type,
9194
HashInfoStr: req.HashInfoStr,
9295
}
93-
err := db.CreateObjFile(objFile)
94-
if err != nil {
96+
if err := db.CreateObjFile(objFile); err != nil {
9597
return errors.WithMessage(err, "failed file in database")
9698
}
9799
}
@@ -165,3 +167,29 @@ func StringSliceToUintSlice(strSlice []string) ([]uint, error) {
165167
func RestoreLabelFileBindings(bindings []model.LabelFileBinding, keepIDs bool, override bool) error {
166168
return db.RestoreLabelFileBindings(bindings, keepIDs, override)
167169
}
170+
171+
func collectLabelIDs(req CreateLabelFileBinDingReq) ([]uint64, error) {
172+
if len(req.LabelIDs) > 0 {
173+
return req.LabelIDs, nil
174+
}
175+
s := strings.TrimSpace(req.LabelIds)
176+
if s == "" {
177+
return nil, nil
178+
}
179+
replacer := strings.NewReplacer(",", ",", "、", ",", ";", ",", ";", ",")
180+
s = replacer.Replace(s)
181+
parts := strings.Split(s, ",")
182+
ids := make([]uint64, 0, len(parts))
183+
for _, p := range parts {
184+
p = strings.TrimSpace(p)
185+
if p == "" {
186+
continue
187+
}
188+
id, err := strconv.ParseUint(p, 10, 64)
189+
if err != nil {
190+
return nil, fmt.Errorf("invalid label ID '%s': %v", p, err)
191+
}
192+
ids = append(ids, id)
193+
}
194+
return ids, nil
195+
}

server/handles/label_file_binding.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,47 @@ func RestoreLabelFileBinding(c *gin.Context) {
204204
"msg": fmt.Sprintf("restored %d rows", len(req.Bindings)),
205205
})
206206
}
207+
208+
func CreateLabelFileBinDingBatch(c *gin.Context) {
209+
var req struct {
210+
Items []op.CreateLabelFileBinDingReq `json:"items" binding:"required"`
211+
}
212+
if err := c.ShouldBindJSON(&req); err != nil || len(req.Items) == 0 {
213+
common.ErrorResp(c, err, 400)
214+
return
215+
}
216+
217+
userObj, ok := c.Value("user").(*model.User)
218+
if !ok {
219+
common.ErrorStrResp(c, "user invalid", 401)
220+
return
221+
}
222+
223+
type perResult struct {
224+
Name string `json:"name"`
225+
Ok bool `json:"ok"`
226+
ErrMsg string `json:"errMsg,omitempty"`
227+
}
228+
results := make([]perResult, 0, len(req.Items))
229+
succeed := 0
230+
231+
for _, item := range req.Items {
232+
if item.IsDir {
233+
results = append(results, perResult{Name: item.Name, Ok: false, ErrMsg: "Unable to bind folder"})
234+
continue
235+
}
236+
if err := op.CreateLabelFileBinDing(item, userObj.ID); err != nil {
237+
results = append(results, perResult{Name: item.Name, Ok: false, ErrMsg: err.Error()})
238+
continue
239+
}
240+
succeed++
241+
results = append(results, perResult{Name: item.Name, Ok: true})
242+
}
243+
244+
common.SuccessResp(c, gin.H{
245+
"total": len(req.Items),
246+
"succeed": succeed,
247+
"failed": len(req.Items) - succeed,
248+
"results": results,
249+
})
250+
}

server/router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ func admin(g *gin.RouterGroup) {
179179
labelFileBinding := g.Group("/label_file_binding")
180180
labelFileBinding.GET("/list", handles.ListLabelFileBinding)
181181
labelFileBinding.POST("/create", handles.CreateLabelFileBinDing)
182+
labelFileBinding.POST("/create_batch", handles.CreateLabelFileBinDingBatch)
182183
labelFileBinding.POST("/delete", handles.DelLabelByFileName)
183184
labelFileBinding.POST("/restore", handles.RestoreLabelFileBinding)
184185

0 commit comments

Comments
 (0)