| 22 | } |
| 23 | |
| 24 | func (i *imlPluginService) SaveDefine(ctx context.Context, defines []*plugin_model.Define) error { |
| 25 | return i.defineStore.Transaction(ctx, func(txCtx context.Context) error { |
| 26 | ov, err := i.defineStore.List(ctx, map[string]interface{}{}) |
| 27 | if err != nil { |
| 28 | return err |
| 29 | } |
| 30 | |
| 31 | ovm := utils.SliceToMap(ov, func(v *plugin.Define) string { |
| 32 | return v.Name |
| 33 | }) |
| 34 | |
| 35 | vsInsert := make([]*plugin.Define, 0, len(defines)) |
| 36 | vsUpdate := make([]*plugin.Define, 0, len(defines)) |
| 37 | for sort, dv := range defines { |
| 38 | ev := &plugin.Define{ |
| 39 | Id: 0, |
| 40 | Extend: dv.Extend, |
| 41 | Name: dv.Name, |
| 42 | Cname: dv.Cname, |
| 43 | Description: dv.Desc, |
| 44 | Kind: dv.Kind, |
| 45 | Status: dv.Status, |
| 46 | Render: dv.Render, |
| 47 | Config: dv.Config, |
| 48 | Sort: sort, |
| 49 | UpdateTime: time.Now(), |
| 50 | } |
| 51 | if oev, ok := ovm[dv.Name]; ok { |
| 52 | ev.Id = oev.Id |
| 53 | |
| 54 | delete(ovm, dv.Name) |
| 55 | vsUpdate = append(vsUpdate, ev) |
| 56 | } else { |
| 57 | vsInsert = append(vsInsert, ev) |
| 58 | } |
| 59 | } |
| 60 | // 删除多余的 |
| 61 | _, err = i.defineStore.Delete(ctx, utils.MapToSlice(ovm, func(n string, v *plugin.Define) int64 { |
| 62 | return v.Id |
| 63 | })...) |
| 64 | if err != nil { |
| 65 | return err |
| 66 | } |
| 67 | if len(vsInsert) > 0 { |
| 68 | err = i.defineStore.Insert(ctx, vsInsert...) |
| 69 | if err != nil { |
| 70 | return err |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | for _, v := range vsUpdate { |
| 75 | _, err := i.defineStore.Update(ctx, v) |
| 76 | if err != nil { |
| 77 | return err |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | return nil |