Skip to content

Commit d842feb

Browse files
authored
Merge pull request #31 from Enomdeul/develop
[FEAT] 카드 생성 api
2 parents 20742bb + 1a5e03a commit d842feb

14 files changed

Lines changed: 244 additions & 5 deletions

File tree

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.enomdeul.domain.card;
2+
3+
import com.enomdeul.domain.card.docs.CardControllerDocs;
4+
import com.enomdeul.domain.card.dto.UserCardReq;
5+
import com.enomdeul.domain.card.service.CardService;
6+
import com.enomdeul.global.common.response.ApiResponse;
7+
import com.enomdeul.global.common.response.code.ApiSuccessCode;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
@RestController
17+
@RequestMapping("/api/v1/cards")
18+
@RequiredArgsConstructor
19+
public class CardController implements CardControllerDocs {
20+
21+
private final CardService cardService;
22+
23+
@Override
24+
@PostMapping
25+
public ResponseEntity<ApiResponse<String>> createUserCard(@AuthenticationPrincipal String id, @RequestBody UserCardReq request) {
26+
Long userId = Long.parseLong(id);
27+
cardService.createUserCard(userId, request);
28+
29+
return ResponseEntity.ok(ApiResponse.of(ApiSuccessCode.SUCCESS));
30+
}
31+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.enomdeul.domain.card.docs;
2+
3+
import com.enomdeul.domain.card.dto.UserCardReq;
4+
import com.enomdeul.domain.skill.exception.SkillErrorCode;
5+
import com.enomdeul.global.common.response.ApiResponse;
6+
import com.enomdeul.global.common.response.code.ApiErrorCode;
7+
import com.enomdeul.global.exception.swagger.ApiErrorCodeExamples;
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
14+
@Tag(name = "Card", description = "카드 관련 API")
15+
public interface CardControllerDocs {
16+
17+
@Operation(summary = "유저 카드 생성", description = "유저 카드를 생성합니다.")
18+
@ApiErrorCodeExamples(
19+
value = {SkillErrorCode.class, ApiErrorCode.class},
20+
include = { "INTERNAL_SERVER_ERROR", "FORBIDDEN_ERROR", "SKILL_NOT_FOUND"})
21+
ResponseEntity<ApiResponse<String>> createUserCard(@AuthenticationPrincipal String userId, @RequestBody UserCardReq request);
22+
23+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.enomdeul.domain.card.dto;
2+
3+
import com.enomdeul.domain.skill.enums.JobGroup;
4+
import com.enomdeul.domain.user.enums.Gender;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.util.List;
10+
11+
@Getter
12+
@AllArgsConstructor
13+
public class UserCardReq {
14+
private String name;
15+
private Gender gender;
16+
private Integer age;
17+
private String organization;
18+
private JobGroup jobGroup;
19+
private String introduction;
20+
private String portfolioUrl;
21+
22+
// 보유 스킬 리스트
23+
private List<SkillRequest> skills;
24+
25+
// 더하고 싶은 스킬 리스트
26+
private List<SkillRequest> desiredSkills;
27+
28+
@Getter
29+
@NoArgsConstructor
30+
public static class SkillRequest {
31+
private Long skillId;
32+
}
33+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.enomdeul.domain.card.service;
2+
3+
import com.enomdeul.domain.card.dto.UserCardReq;
4+
import com.enomdeul.domain.skill.entity.DesiredSkill;
5+
import com.enomdeul.domain.skill.entity.Skill;
6+
import com.enomdeul.domain.skill.entity.UserSkill;
7+
import com.enomdeul.domain.skill.exception.SkillErrorCode;
8+
import com.enomdeul.domain.skill.exception.SkillException;
9+
import com.enomdeul.domain.skill.repository.DesiredSkillRepository;
10+
import com.enomdeul.domain.skill.repository.SkillRepository;
11+
import com.enomdeul.domain.skill.repository.UserSkillRepository;
12+
import com.enomdeul.domain.user.entity.User;
13+
import com.enomdeul.domain.user.exception.UserErrorCode;
14+
import com.enomdeul.domain.user.exception.UserException;
15+
import com.enomdeul.domain.user.repository.UserRepository;
16+
import lombok.RequiredArgsConstructor;
17+
import org.springframework.stereotype.Service;
18+
import org.springframework.transaction.annotation.Transactional;
19+
20+
import java.util.List;
21+
22+
@Service
23+
@RequiredArgsConstructor
24+
@Transactional
25+
public class CardService {
26+
27+
private final UserRepository userRepository;
28+
private final SkillRepository skillRepository;
29+
private final UserSkillRepository userSkillRepository;
30+
private final DesiredSkillRepository desiredSkillRepository;
31+
32+
public void createUserCard(Long userId, UserCardReq request) {
33+
User user = userRepository.findById(userId)
34+
.orElseThrow(() -> new UserException(UserErrorCode.USER_NOT_FOUND));
35+
36+
user.updateCardInfo(
37+
request.getName(),
38+
request.getGender(),
39+
request.getAge(),
40+
request.getOrganization(),
41+
request.getJobGroup(),
42+
request.getIntroduction()
43+
);
44+
45+
// 보유 스킬 등록
46+
List<UserSkill> userSkills = request.getSkills().stream()
47+
.map(skillReq -> {
48+
Skill skill = skillRepository.findById(skillReq.getSkillId())
49+
.orElseThrow(() -> new SkillException(SkillErrorCode.SKILL_NOT_FOUND));
50+
51+
return UserSkill.builder()
52+
.user(user)
53+
.skill(skill)
54+
.build();
55+
})
56+
.toList();
57+
58+
userSkillRepository.saveAll(userSkills);
59+
60+
// 더하고 싶은 스킬 등록
61+
List<DesiredSkill> desiredSkills = request.getDesiredSkills().stream()
62+
.map(dsReq -> {
63+
Skill skill = skillRepository.findById(dsReq.getSkillId())
64+
.orElseThrow(() -> new SkillException(SkillErrorCode.SKILL_NOT_FOUND));
65+
66+
return DesiredSkill.builder()
67+
.user(user)
68+
.skill(skill)
69+
.build();
70+
})
71+
.toList();
72+
73+
desiredSkillRepository.saveAll(desiredSkills);
74+
}
75+
}
76+
77+

‎src/main/java/com/enomdeul/domain/skill/entity/DesiredSkill.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
@Entity
99
@Getter
10+
@AllArgsConstructor
11+
@Builder
1012
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1113
@Table(name = "desired_skill")
1214
@IdClass(DesiredSkillId.class)

‎src/main/java/com/enomdeul/domain/skill/entity/UserSkill.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
@Entity
99
@Getter
10+
@AllArgsConstructor
11+
@Builder
1012
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1113
@Table(name = "user_skill")
1214
@IdClass(UserSkillId.class)

‎src/main/java/com/enomdeul/domain/skill/enums/JobGroup.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
@Getter
88
public enum JobGroup {
99

10-
PM("기획"), DESIGNER("디자인"), DEVELOPER("개발");
10+
PLAN("기획"), DESIGNER("디자인"), DEVELOPER("개발");
1111

1212
private final String description;
1313
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.enomdeul.domain.skill.exception;
2+
3+
import com.enomdeul.global.common.response.code.BaseErrorCode;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import org.springframework.http.HttpStatus;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public enum SkillErrorCode implements BaseErrorCode {
11+
12+
SKILL_NOT_FOUND("SKILL_NOT_FOUND", HttpStatus.NOT_FOUND, "스킬을 찾을 수 없습니다.");
13+
private final String code;
14+
private final HttpStatus status;
15+
private final String message;
16+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.enomdeul.domain.skill.exception;
2+
3+
import com.enomdeul.global.common.response.code.BaseErrorCode;
4+
import com.enomdeul.global.exception.CustomException;
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class SkillException extends CustomException {
9+
10+
public SkillException(BaseErrorCode errorCode) {
11+
super(errorCode);
12+
}
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.enomdeul.domain.skill.repository;
2+
3+
import com.enomdeul.domain.skill.entity.DesiredSkill;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface DesiredSkillRepository extends JpaRepository<DesiredSkill, Long> {
7+
}

0 commit comments

Comments
 (0)