Line data Source code
1 : // Package skill は ユーザーのスキルに関するユースケース(アプリケーションロジック)を提供します
2 : package skill
3 :
4 : import (
5 : "context"
6 :
7 : "resume/internal/domain/entity"
8 : "resume/internal/shared/util"
9 : )
10 :
11 : // CreateUserSkill はスキルの作成に関するユースケースを実装します。
12 : func (uc *Interactor) CreateUserSkill(
13 : ctx context.Context,
14 : in CreateUserSkillInput,
15 0 : ) (CreateUserSkillOutput, error) {
16 0 : norm := util.ToCanonical(in.SkillName)
17 0 : var createdID uint64
18 0 :
19 0 : // 既存(論削)を含む、重複の検索
20 0 : err := uc.tx.Do(ctx, func(txCtx context.Context) error {
21 0 : existing, err := uc.usRepo.FindByUserAndNorm(txCtx, in.UserID, in.SkillCategoryID, norm)
22 0 : if err == nil && existing != nil {
23 0 : // 論理削除済みなら復活、そうでなければ一意制約違反相当としてそのまま返す
24 0 : if !existing.DeletedAt.Valid {
25 0 : createdID = existing.ID
26 0 : return nil
27 0 : }
28 0 : if err := uc.usRepo.Restore(txCtx, existing.ID, in.UserID); err != nil {
29 0 : return err
30 0 : }
31 : // 復活後に最新の内容で更新(証跡やレベル、カテゴリなど)
32 0 : existing.SkillCategoryID = in.SkillCategoryID
33 0 : existing.SkillLevelID = in.SkillLevelID
34 0 : existing.ExperienceID = in.ExperienceID
35 0 : existing.SkillName = in.SkillName
36 0 : existing.Evidence = in.Evidence
37 0 : if _, err := uc.usRepo.Update(txCtx, existing); err != nil {
38 0 : return err
39 0 : }
40 0 : createdID = existing.ID
41 0 : return nil
42 : }
43 :
44 : // 新規作成(末尾に並ぶよう sort_order は Count+1 を利用)
45 0 : count, err := uc.usRepo.CountByUser(txCtx, in.UserID)
46 0 : if err != nil {
47 0 : return err
48 0 : }
49 :
50 0 : s := &entity.UserSkill{
51 0 : UserID: in.UserID,
52 0 : SkillCategoryID: in.SkillCategoryID,
53 0 : SkillLevelID: in.SkillLevelID,
54 0 : ExperienceID: in.ExperienceID,
55 0 : SkillName: in.SkillName,
56 0 : SkillNameNorm: norm,
57 0 : Evidence: in.Evidence,
58 0 : SortOrder: count + 1,
59 0 : }
60 0 : created, err := uc.usRepo.Create(txCtx, s)
61 0 : if err != nil {
62 0 : return err
63 0 : }
64 0 : createdID = created.ID
65 0 : return nil
66 : })
67 :
68 0 : if err != nil {
69 0 : return CreateUserSkillOutput{}, err
70 0 : }
71 :
72 0 : return CreateUserSkillOutput{ID: createdID}, nil
73 : }
|