Line data Source code
1 : package education
2 :
3 : import (
4 : "context"
5 :
6 : "resume/internal/shared/apperr"
7 : "resume/internal/shared/valerr"
8 : )
9 :
10 : // DeleteUserEducation は 認証済みユーザーの学歴を削除します
11 : // 削除完了後に並び順の再構築を行う
12 : func (uc *Interactor) DeleteUserEducation(
13 : ctx context.Context,
14 : in DeleteInput,
15 0 : ) (DeleteOutput, error) {
16 0 : if err := uc.tx.Do(ctx, func(txCtx context.Context) error {
17 0 :
18 0 : edu, err := uc.ueRepo.FindByID(txCtx, in.EducationID)
19 0 : if err != nil {
20 0 : return err
21 0 : }
22 0 : if edu.UserID != in.UserID {
23 0 : ve := valerr.New()
24 0 : ve.Add(
25 0 : "domain.userEducation.id",
26 0 : "validation.rules.invalid",
27 0 : map[string]any{
28 0 : "field": "domain.userEducation.id",
29 0 : "value": in.EducationID,
30 0 : },
31 0 : )
32 0 : return apperr.New(
33 0 : apperr.CodeUnprocessable,
34 0 : "The request contains semantically invalid data.",
35 0 : ve.ToDetails(),
36 0 : )
37 0 : }
38 : // 1. Deleteの結果をハンドリング
39 0 : if err := uc.ueRepo.Delete(txCtx, in.EducationID); err != nil {
40 0 : return err
41 0 : }
42 0 : remainingList, err := uc.ueRepo.ListByUserID(txCtx, in.UserID)
43 0 : if err != nil {
44 0 : // ここは tx.Do の中なので error だけを返す
45 0 : return err
46 0 : }
47 :
48 0 : var newOrderIDs []uint64
49 0 : for _, edu := range remainingList {
50 0 : newOrderIDs = append(newOrderIDs, edu.ID)
51 0 : }
52 :
53 : // 2. UpdateOrderの結果を正しくハンドリング
54 0 : if len(newOrderIDs) > 0 {
55 0 : // if err := ...; err != nil の形に修正
56 0 : if err := uc.ueRepo.UpdateOrder(txCtx, in.UserID, newOrderIDs); err != nil {
57 0 : return err
58 0 : }
59 : }
60 : // 成功時は nil を返す
61 0 : return nil
62 :
63 0 : }); err != nil {
64 0 : return DeleteOutput{}, err
65 0 : }
66 0 : return DeleteOutput{}, nil
67 : }
|