(ctx context.Context, provider string, originID string, targetID string)
| 158 | } |
| 159 | |
| 160 | func (i *imlAIKeyService) SortAfter(ctx context.Context, provider string, originID string, targetID string) ([]*Key, error) { |
| 161 | originKey, err := i.store.GetByUUID(ctx, originID) |
| 162 | if err != nil { |
| 163 | return nil, fmt.Errorf("get key error: %v,id is %s", err, originID) |
| 164 | } |
| 165 | targetKey, err := i.store.GetByUUID(ctx, targetID) |
| 166 | if err != nil { |
| 167 | return nil, fmt.Errorf("get key error: %v,id is %s", err, targetID) |
| 168 | } |
| 169 | originKeySort, targetKeySort := originKey.Sort, targetKey.Sort |
| 170 | // 初始化顺序,假设原始Key在目标Key之后,中间的Key往后移动,原始Key移动到`targetKeySort + 1`位置 |
| 171 | originKey.Sort = targetKeySort + 1 |
| 172 | fn := func(priority int) int { |
| 173 | return priority + 1 |
| 174 | } |
| 175 | sql := "provider = ? and sort < ? and sort > ?" |
| 176 | if originKeySort < targetKeySort { |
| 177 | // 如果原始Key在目标Key之前,中间的Key往前移动,原始Key移动到`targetKeySort`位置 |
| 178 | sql = "provider = ? and sort > ? and sort <= ?" |
| 179 | originKey.Sort = targetKeySort |
| 180 | fn = func(priority int) int { |
| 181 | return priority - 1 |
| 182 | } |
| 183 | } |
| 184 | list, err := i.store.ListQuery(ctx, sql, []interface{}{provider, originKeySort, targetKeySort}, "sort asc") |
| 185 | if err != nil { |
| 186 | return nil, err |
| 187 | } |
| 188 | result := make([]*Key, 0, len(list)+1) |
| 189 | err = i.transaction.Transaction(ctx, func(txCtx context.Context) error { |
| 190 | for _, l := range list { |
| 191 | l.Sort = fn(l.Sort) |
| 192 | _, err := i.store.Update(ctx, l) |
| 193 | if err != nil { |
| 194 | return err |
| 195 | } |
| 196 | result = append(result, FromEntity(l)) |
| 197 | } |
| 198 | _, err = i.store.Update(ctx, originKey) |
| 199 | return err |
| 200 | }) |
| 201 | if err != nil { |
| 202 | return nil, err |
| 203 | } |
| 204 | result = append(result, FromEntity(originKey)) |
| 205 | sort.Slice(list, func(i, j int) bool { return list[i].Sort < list[j].Sort }) |
| 206 | return result, nil |
| 207 | } |
| 208 | |
| 209 | func (i *imlAIKeyService) OnComplete() { |
| 210 | i.IServiceGet = universally.NewGet[Key, ai.Key](i.store, FromEntity) |
nothing calls this directly
no test coverage detected