diff --git a/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterController.java b/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterCommandController.java similarity index 72% rename from src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterController.java rename to src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterCommandController.java index 5ebd60b..585ec00 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterController.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterCommandController.java @@ -4,6 +4,7 @@ import com.mtvs.devlinkbackend.character.dto.response.UserCharacterSingleResponseDTO; import com.mtvs.devlinkbackend.character.dto.request.UserCharacterUpdateRequestDTO; import com.mtvs.devlinkbackend.character.service.UserCharacterService; +import com.mtvs.devlinkbackend.character.service.UserCharacterViewService; import com.mtvs.devlinkbackend.util.JwtUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -13,13 +14,15 @@ @RestController @RequestMapping("/api/character") -public class UserCharacterController { +public class UserCharacterCommandController { private final UserCharacterService userCharacterService; private final JwtUtil jwtUtil; + private final UserCharacterViewService userCharacterViewService; - public UserCharacterController(UserCharacterService userCharacterService, JwtUtil jwtUtil) { + public UserCharacterCommandController(UserCharacterService userCharacterService, JwtUtil jwtUtil, UserCharacterViewService userCharacterViewService) { this.userCharacterService = userCharacterService; this.jwtUtil = jwtUtil; + this.userCharacterViewService = userCharacterViewService; } @Operation(summary = "캐릭터 등록", description = "새로운 캐릭터를 등록합니다.") @@ -35,32 +38,15 @@ public ResponseEntity registerCharacter( return new ResponseEntity<>(userCharacter, HttpStatus.CREATED); } - @Operation(summary = "캐릭터 조회", description = "계정 ID로 캐릭터를 조회합니다.") - @ApiResponse(responseCode = "200", description = "캐릭터가 성공적으로 조회되었습니다.") - @ApiResponse(responseCode = "404", description = "해당 계정 ID로 캐릭터를 찾을 수 없습니다.") - @GetMapping - public ResponseEntity getCharacter( - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - UserCharacterSingleResponseDTO userCharacter = userCharacterService.findCharacterByAccountId(accountId); - if (userCharacter == null) { - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - return new ResponseEntity<>(userCharacter, HttpStatus.OK); - } - @Operation(summary = "캐릭터 수정", description = "계정 ID로 캐릭터를 수정합니다.") @ApiResponse(responseCode = "200", description = "캐릭터가 성공적으로 수정되었습니다.") @ApiResponse(responseCode = "404", description = "해당 계정 ID로 캐릭터를 찾을 수 없습니다.") @PatchMapping public ResponseEntity updateCharacter( - @RequestBody UserCharacterUpdateRequestDTO userCharacterUpdateRequestDTO, - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + @RequestBody UserCharacterUpdateRequestDTO userCharacterUpdateRequestDTO) throws Exception { - String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); try { - UserCharacterSingleResponseDTO updatedCharacter = userCharacterService.updateCharacter(userCharacterUpdateRequestDTO, accountId); + UserCharacterSingleResponseDTO updatedCharacter = userCharacterService.updateCharacter(userCharacterUpdateRequestDTO); return new ResponseEntity<>(updatedCharacter, HttpStatus.OK); } catch (IllegalArgumentException e) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); diff --git a/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterQueryController.java b/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterQueryController.java new file mode 100644 index 0000000..7cfd935 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/character/controller/UserCharacterQueryController.java @@ -0,0 +1,51 @@ +package com.mtvs.devlinkbackend.character.controller; + +import com.mtvs.devlinkbackend.character.dto.response.UserCharacterListResponseDTO; +import com.mtvs.devlinkbackend.character.dto.response.UserCharacterSingleResponseDTO; +import com.mtvs.devlinkbackend.character.service.UserCharacterViewService; +import com.mtvs.devlinkbackend.util.JwtUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/character") +public class UserCharacterQueryController { + private final JwtUtil jwtUtil; + private final UserCharacterViewService userCharacterViewService; + + public UserCharacterQueryController(JwtUtil jwtUtil, UserCharacterViewService userCharacterViewService) { + this.jwtUtil = jwtUtil; + this.userCharacterViewService = userCharacterViewService; + } + + @Operation(summary = "캐릭터 조회", description = "캐릭터 ID로 캐릭터를 조회합니다.") + @ApiResponse(responseCode = "200", description = "캐릭터가 성공적으로 조회되었습니다.") + @ApiResponse(responseCode = "404", description = "해당 계정 ID로 캐릭터를 찾을 수 없습니다.") + @GetMapping("/{characterId}") + public ResponseEntity getCharacterByCharacterId( + @PathVariable(name = "characterId") Long characterId) throws Exception { + + UserCharacterSingleResponseDTO userCharacter = userCharacterViewService.findCharacterByCharacterId(characterId); + if (userCharacter == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(userCharacter, HttpStatus.OK); + } + + @Operation(summary = "측정 캐릭터 userId로 조회", description = "유저 ID로 캐릭터를 조회합니다.") + @ApiResponse(responseCode = "200", description = "캐릭터가 성공적으로 조회되었습니다.") + @ApiResponse(responseCode = "404", description = "해당 계정 ID로 캐릭터를 찾을 수 없습니다.") + @GetMapping("/user/{userId}") + public ResponseEntity getCharacterByUserId( + @PathVariable(name = "userId") Long userId) throws Exception { + + UserCharacterSingleResponseDTO userCharacter = userCharacterViewService.findCharacterByUserId(userId); + if (userCharacter == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(userCharacter, HttpStatus.OK); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterRegistRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterRegistRequestDTO.java index 7ee21d2..b70b6d5 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterRegistRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterRegistRequestDTO.java @@ -1,5 +1,6 @@ package com.mtvs.devlinkbackend.character.dto.request; +import com.mtvs.devlinkbackend.character.entity.CustomInfo; import lombok.*; import java.util.List; @@ -9,5 +10,9 @@ @NoArgsConstructor @ToString public class UserCharacterRegistRequestDTO { - private List status; + private Long userId; + private Long guildId; + private List teamIdList; + private List customList; + private String characterPicture; } \ No newline at end of file diff --git a/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterUpdateRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterUpdateRequestDTO.java index 52045bf..092f998 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterUpdateRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/dto/request/UserCharacterUpdateRequestDTO.java @@ -1,5 +1,6 @@ package com.mtvs.devlinkbackend.character.dto.request; +import com.mtvs.devlinkbackend.character.entity.CustomInfo; import lombok.*; import java.util.List; @@ -9,6 +10,9 @@ @NoArgsConstructor @ToString public class UserCharacterUpdateRequestDTO { - private Long characterId; - private List status; + private Long userId; + private Long guildId; + private List teamIdList; + private List customList; + private String characterPicture; } \ No newline at end of file diff --git a/src/main/java/com/mtvs/devlinkbackend/character/dto/response/UserCharacterListResponseDTO.java b/src/main/java/com/mtvs/devlinkbackend/character/dto/response/UserCharacterListResponseDTO.java new file mode 100644 index 0000000..e705006 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/character/dto/response/UserCharacterListResponseDTO.java @@ -0,0 +1,14 @@ +package com.mtvs.devlinkbackend.character.dto.response; + +import com.mtvs.devlinkbackend.character.entity.UserCharacter; +import lombok.*; + +import java.util.List; + +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class UserCharacterListResponseDTO { + private List data; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/character/entity/CustomInfo.java b/src/main/java/com/mtvs/devlinkbackend/character/entity/CustomInfo.java new file mode 100644 index 0000000..eea9c12 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/character/entity/CustomInfo.java @@ -0,0 +1,27 @@ +package com.mtvs.devlinkbackend.character.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +public class CustomInfo { + @Column(name = "CUSTOM_TYPE") + private Integer customType; + + @Column(name = "CUSTOM_NAME") + private String customName; + + @Column(name = "CUSTOM_TEXTURE") + private String customTexture; + + @Column(name = "CUSTOM_INDEX") + private Integer customIndex; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/character/entity/UserCharacter.java b/src/main/java/com/mtvs/devlinkbackend/character/entity/UserCharacter.java index 2b0919b..1bb6500 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/entity/UserCharacter.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/entity/UserCharacter.java @@ -1,24 +1,25 @@ package com.mtvs.devlinkbackend.character.entity; -import com.mtvs.devlinkbackend.util.IntegerListConverter; -import com.mtvs.devlinkbackend.util.LongListConverter; +import com.mtvs.devlinkbackend.util.converter.LongListConverter; import jakarta.persistence.*; import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; +import java.time.LocalDateTime; import java.util.List; @Table(name = "USER_CHARACTER") @Entity(name = "UserCharacter") @Getter +@Setter public class UserCharacter { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "CHARACTER_ID") private Long characterId; - @Column(name = "ACCOUNT_ID", unique = true) - private String accountId; - @Column(name = "GUILD_ID") private Long guildId; @@ -30,26 +31,28 @@ public class UserCharacter { private String characterPicture; @ElementCollection - @CollectionTable(name = "STATUS_LIST", joinColumns = @JoinColumn(name = "CHARACTER_ID")) - @Column(name = "STATUS") - private List status; + @CollectionTable(name = "CUSTOM_LIST", joinColumns = @JoinColumn(name = "CHARACTER_ID")) + private List customList; @Column(name = "USER_ID") private Long userId; - public UserCharacter() { - } + @CreationTimestamp + @Column(name = "CREATED_AT", updatable = false) + private LocalDateTime createdAt; - public UserCharacter(String accountId, List status) { - this.accountId = accountId; - this.status = status; - } + @UpdateTimestamp + @Column(name = "MODIFIED_AT") + private LocalDateTime modifiedAt; - public void setAccountId(String accountId) { - this.accountId = accountId; + public UserCharacter() { } - public void setStatus(List status) { - this.status = status; + public UserCharacter(Long guildId, List teamIdList, String characterPicture, List customList, Long userId) { + this.guildId = guildId; + this.teamIdList = teamIdList; + this.characterPicture = characterPicture; + this.customList = customList; + this.userId = userId; } } diff --git a/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterRepository.java b/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterRepository.java index 05280e6..f92bba6 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterRepository.java @@ -6,6 +6,5 @@ @Repository public interface UserCharacterRepository extends JpaRepository { - UserCharacter findByAccountId(String accountId); - void deleteByAccountId(String accountId); + void deleteByUserId(Long userId); } diff --git a/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterViewRepository.java b/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterViewRepository.java new file mode 100644 index 0000000..329a205 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/character/repository/UserCharacterViewRepository.java @@ -0,0 +1,8 @@ +package com.mtvs.devlinkbackend.character.repository; + +import com.mtvs.devlinkbackend.character.entity.UserCharacter; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserCharacterViewRepository extends JpaRepository { + UserCharacter findByUserId(Long userId); +} diff --git a/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java b/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java index be03dd4..0af0ab1 100644 --- a/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java +++ b/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterService.java @@ -5,41 +5,52 @@ import com.mtvs.devlinkbackend.character.dto.request.UserCharacterUpdateRequestDTO; import com.mtvs.devlinkbackend.character.entity.UserCharacter; import com.mtvs.devlinkbackend.character.repository.UserCharacterRepository; +import com.mtvs.devlinkbackend.character.repository.UserCharacterViewRepository; +import com.mtvs.devlinkbackend.user.command.model.entity.User; +import com.mtvs.devlinkbackend.user.query.repository.UserViewRepository; import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; @Service public class UserCharacterService { private final UserCharacterRepository userCharacterRepository; + private final UserViewRepository userViewRepository; + private final UserCharacterViewRepository userCharacterViewRepository; - public UserCharacterService(UserCharacterRepository userCharacterRepository) { + public UserCharacterService(UserCharacterRepository userCharacterRepository, UserViewRepository userViewRepository, UserCharacterViewRepository userCharacterViewRepository) { this.userCharacterRepository = userCharacterRepository; + this.userViewRepository = userViewRepository; + this.userCharacterViewRepository = userCharacterViewRepository; } @Transactional public UserCharacterSingleResponseDTO registCharacter(UserCharacterRegistRequestDTO userCharacterRegistRequestDTO, String accountId) { return new UserCharacterSingleResponseDTO(userCharacterRepository.save(new UserCharacter( - accountId, - userCharacterRegistRequestDTO.getStatus() + userCharacterRegistRequestDTO.getGuildId(), + userCharacterRegistRequestDTO.getTeamIdList(), + userCharacterRegistRequestDTO.getCharacterPicture(), + userCharacterRegistRequestDTO.getCustomList(), + userCharacterRegistRequestDTO.getUserId() ))); } - public UserCharacterSingleResponseDTO findCharacterByAccountId(String accountId) { - return new UserCharacterSingleResponseDTO(userCharacterRepository.findByAccountId(accountId)); - } - @Transactional - public UserCharacterSingleResponseDTO updateCharacter(UserCharacterUpdateRequestDTO userCharacterUpdateRequestDTO, String accountId) { - UserCharacter userCharacter = userCharacterRepository.findByAccountId(accountId); + public UserCharacterSingleResponseDTO updateCharacter(UserCharacterUpdateRequestDTO userCharacterUpdateRequestDTO) { + UserCharacter userCharacter = userCharacterViewRepository.findByUserId(userCharacterUpdateRequestDTO.getUserId()); if(userCharacter == null) throw new IllegalArgumentException("잘못된 계정으로 캐릭터 수정 시도"); - userCharacter.setStatus(userCharacterUpdateRequestDTO.getStatus()); + userCharacter.setGuildId(userCharacterUpdateRequestDTO.getGuildId()); + userCharacter.setCharacterPicture(userCharacter.getCharacterPicture()); + userCharacter.setCustomList(userCharacterUpdateRequestDTO.getCustomList()); + userCharacter.setTeamIdList(userCharacterUpdateRequestDTO.getTeamIdList()); + return new UserCharacterSingleResponseDTO(userCharacter); } @Transactional public void deleteCharacterByAccountId(String accountId) { - userCharacterRepository.deleteByAccountId(accountId); + User foundUser = userViewRepository.findUserByEpicAccountId(accountId); + userCharacterRepository.deleteByUserId(foundUser.getUserId()); } } diff --git a/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterViewService.java b/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterViewService.java new file mode 100644 index 0000000..c0847b6 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/character/service/UserCharacterViewService.java @@ -0,0 +1,34 @@ +package com.mtvs.devlinkbackend.character.service; + +import com.mtvs.devlinkbackend.character.dto.response.UserCharacterSingleResponseDTO; +import com.mtvs.devlinkbackend.character.repository.UserCharacterRepository; +import com.mtvs.devlinkbackend.character.repository.UserCharacterViewRepository; +import com.mtvs.devlinkbackend.user.command.model.entity.User; +import com.mtvs.devlinkbackend.user.query.repository.UserViewRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserCharacterViewService { + private final UserViewRepository userViewRepository; + private final UserCharacterViewRepository userCharacterViewRepository; + + public UserCharacterViewService(UserViewRepository userViewRepository, UserCharacterViewRepository userCharacterViewRepository, UserCharacterRepository userCharacterRepository) { + this.userViewRepository = userViewRepository; + this.userCharacterViewRepository = userCharacterViewRepository; + } + + public UserCharacterSingleResponseDTO findCharacterByAccountId(String accountId) { + User foundUser = userViewRepository.findUserByEpicAccountId(accountId); + return new UserCharacterSingleResponseDTO(userCharacterViewRepository.findByUserId(foundUser.getUserId())); + } + + public UserCharacterSingleResponseDTO findCharacterByUserId(Long userId) { + return new UserCharacterSingleResponseDTO(userCharacterViewRepository.findByUserId(userId)); + } + + public UserCharacterSingleResponseDTO findCharacterByCharacterId(Long characterId) { + return new UserCharacterSingleResponseDTO(userCharacterViewRepository.findById(characterId).orElse(null)); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/Dev.java b/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/Dev.java index 626efd7..49de32d 100644 --- a/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/Dev.java +++ b/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/Dev.java @@ -1,7 +1,7 @@ package com.mtvs.devlinkbackend.user.command.model.entity; import com.fasterxml.jackson.annotation.JsonManagedReference; -import com.mtvs.devlinkbackend.util.StringListConverter; +import com.mtvs.devlinkbackend.util.converter.StringListConverter; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/User.java b/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/User.java index dde3da4..cfb0b40 100644 --- a/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/User.java +++ b/src/main/java/com/mtvs/devlinkbackend/user/command/model/entity/User.java @@ -1,7 +1,6 @@ package com.mtvs.devlinkbackend.user.command.model.entity; -import com.mtvs.devlinkbackend.util.LongListConverter; -import com.mtvs.devlinkbackend.util.StringListConverter; +import com.mtvs.devlinkbackend.util.converter.StringListConverter; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/mtvs/devlinkbackend/user/query/repository/UserViewRepository.java b/src/main/java/com/mtvs/devlinkbackend/user/query/repository/UserViewRepository.java index 2d730b6..b3b4341 100644 --- a/src/main/java/com/mtvs/devlinkbackend/user/query/repository/UserViewRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/user/query/repository/UserViewRepository.java @@ -4,7 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface UserViewRepository extends JpaRepository { User findUserByEpicAccountId(String epicAccountId); + + List findUsersByNickname(String nickname); } diff --git a/src/main/java/com/mtvs/devlinkbackend/util/IntegerListConverter.java b/src/main/java/com/mtvs/devlinkbackend/util/converter/IntegerListConverter.java similarity index 95% rename from src/main/java/com/mtvs/devlinkbackend/util/IntegerListConverter.java rename to src/main/java/com/mtvs/devlinkbackend/util/converter/IntegerListConverter.java index f47d0c6..3f9b644 100644 --- a/src/main/java/com/mtvs/devlinkbackend/util/IntegerListConverter.java +++ b/src/main/java/com/mtvs/devlinkbackend/util/converter/IntegerListConverter.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.util; +package com.mtvs.devlinkbackend.util.converter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/com/mtvs/devlinkbackend/util/LongListConverter.java b/src/main/java/com/mtvs/devlinkbackend/util/converter/LongListConverter.java similarity index 95% rename from src/main/java/com/mtvs/devlinkbackend/util/LongListConverter.java rename to src/main/java/com/mtvs/devlinkbackend/util/converter/LongListConverter.java index 539c6c8..47d3e0e 100644 --- a/src/main/java/com/mtvs/devlinkbackend/util/LongListConverter.java +++ b/src/main/java/com/mtvs/devlinkbackend/util/converter/LongListConverter.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.util; +package com.mtvs.devlinkbackend.util.converter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/com/mtvs/devlinkbackend/util/StringListConverter.java b/src/main/java/com/mtvs/devlinkbackend/util/converter/StringListConverter.java similarity index 95% rename from src/main/java/com/mtvs/devlinkbackend/util/StringListConverter.java rename to src/main/java/com/mtvs/devlinkbackend/util/converter/StringListConverter.java index 8f9b2c4..ddfdde5 100644 --- a/src/main/java/com/mtvs/devlinkbackend/util/StringListConverter.java +++ b/src/main/java/com/mtvs/devlinkbackend/util/converter/StringListConverter.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.util; +package com.mtvs.devlinkbackend.util.converter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/BusinessCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/BusinessCRUDTest.java index acc3f26..d1ac54a 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/BusinessCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/BusinessCRUDTest.java @@ -2,6 +2,7 @@ import com.mtvs.devlinkbackend.user.command.model.dto.request.BusinessRequestDTO; import com.mtvs.devlinkbackend.user.command.service.EpicBusinessService; +import com.mtvs.devlinkbackend.user.query.service.EpicBusinessViewService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -20,20 +21,22 @@ public class BusinessCRUDTest { @Autowired private EpicBusinessService epicBusinessService; + @Autowired + private EpicBusinessViewService epicBusinessViewService; private static Stream registUserClientGroup() { return Stream.of( Arguments.of(new BusinessRequestDTO( "UserClientGroup", "팀", - "그룹이름3", + null, "담당자이름3", "담당자핸드폰번호3" ), "계정3"), Arguments.of(new BusinessRequestDTO( "UserClientGroup", "팀2", - "그룹이름4", + null, "담당자이름4", "담당자핸드폰번호4" ), "계정4") @@ -45,14 +48,14 @@ private static Stream modifyUserClientGroup() { Arguments.of(new BusinessRequestDTO( "UserClientGroup", "팀", - "그룹이름2", + null, "담당자이름2", "담당자핸드폰번호2" ), "계정1"), Arguments.of(new BusinessRequestDTO( "UserClientGroup", "팀", - "그룹이름1", + null, "담당자이름1", "담당자핸드폰번호1" ), "계정2") @@ -64,14 +67,14 @@ public void setUp() { epicBusinessService.registUserClientGroup(new BusinessRequestDTO( "UserClientGroup", "팀", - "그룹이름1", + null, "담당자이름1", "담당자핸드폰번호1" ), "계정1"); epicBusinessService.registUserClientGroup(new BusinessRequestDTO( "UserClientGroup", "팀", - "그룹이름2", + null, "담당자이름2", "담당자핸드폰번호2" ), "계정2"); @@ -87,42 +90,10 @@ public void testRegistUserClientGroup(BusinessRequestDTO BusinessRequestDTO, Str @Order(2) @DisplayName("계정 ID로 UserClientGroup 조회") - @ValueSource(strings = {"계정1", "계정2"}) - @ParameterizedTest - public void testFindUserClientGroupByAccountId(String accountId) { - Assertions.assertDoesNotThrow(() -> epicBusinessService.findUserClientGroupByAccountId(accountId)); - } - - @Order(3) - @DisplayName("담당자이름으로 UserClientGroup 조회") - @ValueSource(strings = {"담당자이름1", "담당자이름2"}) - @ParameterizedTest - public void findByManagerNameContainingIgnoreCase(String managerName) { - Assertions.assertDoesNotThrow(() -> epicBusinessService.findByManagerNameContainingIgnoreCase(managerName)); - } - - @Order(4) - @DisplayName("그룹이름으로 UserClientGroup 조회") - @ValueSource(strings = {"그룹이름1", "그룹이름2"}) - @ParameterizedTest - public void testFindByGroupNameContainingIgnoreCase(String groupName) { - Assertions.assertDoesNotThrow(() -> epicBusinessService.findByGroupNameContainingIgnoreCase(groupName)); - } - - @Order(5) - @DisplayName("이메일로 UserClientGroup 조회") - @ValueSource(strings = {"팀", "법인"}) - @ParameterizedTest - public void testFindUserClientGroupsByEmail(String clientType) { - Assertions.assertDoesNotThrow(() -> epicBusinessService.findByClientType(clientType)); - } - - @Order(6) - @DisplayName("담당자 핸드폰 번호로 UserClientGroup 조회") - @ValueSource(strings = {"담당자핸드폰1", "담당자핸드폰2"}) + @ValueSource(longs = {1, 2}) @ParameterizedTest - public void testFindUserClientGroupByPhone(String managerPhone) { - Assertions.assertDoesNotThrow(() -> epicBusinessService.findByManagerPhone(managerPhone)); + public void testFindUserClientGroupByAccountId(Long businessId) { + Assertions.assertDoesNotThrow(() -> epicBusinessViewService.findBusinessByBusinessId(businessId)); } @Order(7) diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/DevCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/DevCRUDTest.java index 658c29b..dc37f2a 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/DevCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/DevCRUDTest.java @@ -1,7 +1,10 @@ package com.mtvs.devlinkbackend.crud; -import com.mtvs.devlinkbackend.user.command.model.dto.request.DevRequestDTO; +import com.mtvs.devlinkbackend.user.command.model.dto.request.DevInfoRequestDTO; +import com.mtvs.devlinkbackend.user.command.model.dto.request.DevRegistRequestDTO; +import com.mtvs.devlinkbackend.user.command.model.dto.request.DevUpdateRequestDTO; import com.mtvs.devlinkbackend.user.command.service.EpicDevService; +import com.mtvs.devlinkbackend.user.query.service.EpicDevViewService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -14,8 +17,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; import java.util.List; -import java.util.Map; import java.util.stream.Stream; @SpringBootTest @@ -24,151 +27,142 @@ public class DevCRUDTest { @Autowired private EpicDevService epicDevService; + @Autowired + private EpicDevViewService epicDevViewService; - private static Stream registUserPartner() { + private static Stream registDev() { return Stream.of( - Arguments.of(new DevRequestDTO( - "UserClientPartner", + Arguments.of(new DevRegistRequestDTO( "닉네임3", - "이름3", - "이메일3", - "핸드폰3", - "깃허브 링크3", - List.of("http://s","http://w"), - "경험3", - Map.of("Java",3), - "하고싶은말3" + new DevInfoRequestDTO( + "실명", + "이메일1", + "핸드폰", + "깃헙 링크", + null, + "", + List.of("",""), + List.of("",""), + "" + ) ), "계정3"), - Arguments.of(new DevRequestDTO( - "UserClientPartner", - "닉네임4", - "이름4", - "이메일4", - "핸드폰4", - "깃허브 링크4", - List.of("http://s","http://w"), - "경험4", - Map.of("Java",1), - "하고싶은말4" + Arguments.of(new DevRegistRequestDTO( + "닉네임3", + new DevInfoRequestDTO( + "실명", + "이메일1", + "핸드폰", + "깃헙 링크", + null, + "", + List.of("",""), + List.of("",""), + "" + ) ), "계정4") ); } - private static Stream modifyUserPartner() { + private static Stream modifyDev() { return Stream.of( - Arguments.of(new DevRequestDTO( - "UserClientPartner", - "닉네임1", - "이름1", - "이메일1", - "핸드폰1", - "깃허브 링크1", - List.of("http://s","http://w"), - "경험1", - Map.of("Java",3), - "하고싶은말1" + Arguments.of(new DevUpdateRequestDTO( + "닉네임3", + new DevInfoRequestDTO( + "실명", + "이메일1", + "핸드폰", + "깃헙 링크", + null, + "", + List.of("",""), + List.of("",""), + "" + ) ), "계정1"), - Arguments.of(new DevRequestDTO( - "UserClientPartner", - "닉네임2", - "이름2", - "이메일2", - "핸드폰2", - "깃허브 링크2", - List.of("http://s","http://w"), - "경험2", - Map.of("Java",1), - "하고싶은말2" + Arguments.of(new DevUpdateRequestDTO( + "닉네임3", + new DevInfoRequestDTO( + "실명", + "이메일1", + "핸드폰", + "깃헙 링크", + null, + "", + List.of("",""), + List.of("",""), + "" + ) ), "계정2") ); } @BeforeEach - public void setUp() { - epicDevService.registUserPartner(new DevRequestDTO( - "UserClientPartner", - "닉네임1", - "이름1", - "이메일1", - "핸드폰1", - "깃허브 링크5", - List.of("http://s","http://w"), - "경험1", - Map.of("Java",3), - "하고싶은말1" + public void setUp() throws IOException { + epicDevService.registDev(new DevRegistRequestDTO( + "닉네임3", + new DevInfoRequestDTO( + "실명", + "이메일1", + "핸드폰", + "깃헙 링크", + null, + "", + List.of("",""), + List.of("",""), + "" + ) ), "계정1"); - epicDevService.registUserPartner(new DevRequestDTO( - "UserClientPartner", - "닉네임2", - "이름2", - "이메일2", - "핸드폰2", - "깃허브 링크6", - List.of("http://s","http://w"), - "경험2", - Map.of("Java",1), - "하고싶은말2" + epicDevService.registDev(new DevRegistRequestDTO( + "닉네임3", + new DevInfoRequestDTO( + "실명", + "이메일1", + "핸드폰", + "깃헙 링크", + null, + "", + List.of("",""), + List.of("",""), + "" + ) ), "계정2"); } @Order(1) @DisplayName("UserPartner 등록") - @MethodSource("registUserPartner") + @MethodSource("registDev") @ParameterizedTest - public void testRegistUserPartner(DevRequestDTO devRequestDTO, String accountId) { - Assertions.assertDoesNotThrow(() -> epicDevService.registUserPartner(devRequestDTO, accountId)); + public void testRegistDev(DevRegistRequestDTO devRequestDTO, String accountId) { + Assertions.assertDoesNotThrow(() -> epicDevService.registDev(devRequestDTO, accountId)); } @Order(2) - @DisplayName("계정 ID로 UserPartner 조회") + @DisplayName("계정 ID로 Dev 조회") @ValueSource(strings = {"계정1", "계정2"}) @ParameterizedTest - public void testFindUserPartnerByAccountId(String accountId) { - Assertions.assertDoesNotThrow(() -> epicDevService.findUserPartnerByAccountId(accountId)); - } - - @Order(3) - @DisplayName("이름으로 UserPartner 조회") - @ValueSource(strings = {"이름1", "이름2"}) - @ParameterizedTest - public void testFindUserPartnersByNameContainingIgnoreCase(String name) { - Assertions.assertDoesNotThrow(() -> epicDevService.findUserPartnersByNameContainingIgnoreCase(name)); + public void testFindDevByEpicAccountId(String accountId) { + Assertions.assertDoesNotThrow(() -> epicDevViewService.findDevByEpicAccountId(accountId)); } @Order(4) - @DisplayName("닉네임으로 UserPartner 조회") - @ValueSource(strings = {"닉네임1", "닉네임2"}) - @ParameterizedTest - public void testFindUserPartnersByNicknameContainingIgnoreCase(String nickname) { - Assertions.assertDoesNotThrow(() -> epicDevService.findUserPartnersByNicknameContainingIgnoreCase(nickname)); - } - - @Order(5) - @DisplayName("이메일로 UserPartner 조회") - @ValueSource(strings = {"계정1", "계정2"}) + @DisplayName("닉네임으로 Dev 조회") + @ValueSource(longs = {1, 2}) @ParameterizedTest - public void testFindUserPartnersByEmail(String email) { - Assertions.assertDoesNotThrow(() -> epicDevService.findUserPartnersByEmail(email)); + public void testFindDevByUserId(Long userId) { + Assertions.assertDoesNotThrow(() -> epicDevViewService.findDevByUserId(userId)); } - @Order(6) - @DisplayName("핸드폰 번호로 UserPartner 조회") - @ValueSource(strings = {"핸드폰1", "핸드폰2"}) - @ParameterizedTest - public void testFindUserPartnerByPhone(String phone) { - Assertions.assertDoesNotThrow(() -> epicDevService.findUserPartnerByPhone(phone)); - } @Order(7) - @DisplayName("UserPartner 수정") - @MethodSource("modifyUserPartner") + @DisplayName("Dev 수정") + @MethodSource("modifyDev") @ParameterizedTest - public void testUpdateUserPartner(DevRequestDTO devRequestDTO, String accountId) { + public void testUpdateUserPartner(DevUpdateRequestDTO devRequestDTO, String accountId) { Assertions.assertDoesNotThrow(() -> epicDevService.updateUserPartner(devRequestDTO, accountId)); } @Order(8) - @DisplayName("UserPartner 삭제") + @DisplayName("Dev 삭제") @ValueSource(strings = {"계정1", "계정2"}) @ParameterizedTest public void testDeleteByAccountId(String accountId) { diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java index 264ad99..fe70921 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java @@ -2,7 +2,9 @@ import com.mtvs.devlinkbackend.character.dto.request.UserCharacterRegistRequestDTO; import com.mtvs.devlinkbackend.character.dto.request.UserCharacterUpdateRequestDTO; +import com.mtvs.devlinkbackend.character.entity.CustomInfo; import com.mtvs.devlinkbackend.character.service.UserCharacterService; +import com.mtvs.devlinkbackend.character.service.UserCharacterViewService; import jakarta.transaction.Transactional; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -23,14 +25,26 @@ public class UserCharacterCRUDTest { @Autowired private UserCharacterService userCharacterService; + @Autowired + private UserCharacterViewService userCharacterViewService; private static Stream registUserCharacter() { return Stream.of( Arguments.of(new UserCharacterRegistRequestDTO( - List.of(5,6) + 1L, + 2L, + List.of(1L, 2L), + List.of(new CustomInfo(1, "", "", 1), + new CustomInfo(1, "", "", 1)), + "" ), "계정3"), Arguments.of(new UserCharacterRegistRequestDTO( - List.of(7,8) + 1L, + 2L, + List.of(1L, 2L), + List.of(new CustomInfo(1, "", "", 1), + new CustomInfo(1, "", "", 1)), + "" ), "계정4") ); } @@ -39,11 +53,19 @@ private static Stream modifyUserCharacter() { return Stream.of( Arguments.of(new UserCharacterUpdateRequestDTO( 1L, - List.of(13,2) + 2L, + List.of(1L, 2L), + List.of(new CustomInfo(1, "", "", 1), + new CustomInfo(1, "", "", 1)), + "" ), "계정1"), Arguments.of(new UserCharacterUpdateRequestDTO( + 1L, 2L, - List.of(43,4) + List.of(1L, 2L), + List.of(new CustomInfo(1, "", "", 1), + new CustomInfo(1, "", "", 1)), + "" ), "계정2") ); } @@ -51,10 +73,20 @@ private static Stream modifyUserCharacter() { @BeforeEach public void setUp() { userCharacterService.registCharacter(new UserCharacterRegistRequestDTO( - List.of(1,2) + 1L, + 2L, + List.of(1L, 2L), + List.of(new CustomInfo(1, "", "", 1), + new CustomInfo(1, "", "", 1)), + "" ), "계정1"); userCharacterService.registCharacter(new UserCharacterRegistRequestDTO( - List.of(3,4) + 1L, + 2L, + List.of(1L, 2L), + List.of(new CustomInfo(1, "", "", 1), + new CustomInfo(1, "", "", 1)), + "" ), "계정2"); } @@ -71,15 +103,15 @@ public void testRegistUserCharacter(UserCharacterRegistRequestDTO userCharacterR @ValueSource(strings = {"계정1", "계정2"}) @ParameterizedTest public void testFindUserCharacterByAccountId(String accountId) { - Assertions.assertDoesNotThrow(() -> userCharacterService.findCharacterByAccountId(accountId)); + Assertions.assertDoesNotThrow(() -> userCharacterViewService.findCharacterByAccountId(accountId)); } @Order(3) @DisplayName("UserCharacter 수정") @MethodSource("modifyUserCharacter") @ParameterizedTest - public void testUpdateUserCharacter(UserCharacterUpdateRequestDTO userCharacterUpdateRequestDTO, String accountId) { - Assertions.assertDoesNotThrow(() -> userCharacterService.updateCharacter(userCharacterUpdateRequestDTO, accountId)); + public void testUpdateUserCharacter(UserCharacterUpdateRequestDTO userCharacterUpdateRequestDTO) { + Assertions.assertDoesNotThrow(() -> userCharacterService.updateCharacter(userCharacterUpdateRequestDTO)); } @Order(4) @@ -89,4 +121,20 @@ public void testUpdateUserCharacter(UserCharacterUpdateRequestDTO userCharacterU public void testDeleteByAccountId(String accountId) { Assertions.assertDoesNotThrow(() -> userCharacterService.deleteCharacterByAccountId(accountId)); } + + @Order(2) + @DisplayName("캐릭터 ID로 UserCharacter 조회") + @ValueSource(longs = {1, 2}) + @ParameterizedTest + public void testFindUserCharacterByUserId(Long characterId) { + Assertions.assertDoesNotThrow(() -> userCharacterViewService.findCharacterByCharacterId(characterId)); + } + + @Order(2) + @DisplayName("유저 ID로 UserCharacter 조회") + @ValueSource(longs = {1, 2}) + @ParameterizedTest + public void testFindUserCharacterByAccountId(Long userId) { + Assertions.assertDoesNotThrow(() -> userCharacterViewService.findCharacterByUserId(userId)); + } } diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/UserClientIndividualCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/UserClientIndividualCRUDTest.java deleted file mode 100644 index 37b46ff..0000000 --- a/src/test/java/com/mtvs/devlinkbackend/crud/UserClientIndividualCRUDTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.mtvs.devlinkbackend.crud; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import java.util.stream.Stream; - -@SpringBootTest -@Transactional -public class UserClientIndividualCRUDTest { - - @Autowired - private UserClientIndividualService userClientIndividualService; - - private static Stream registUserClientIndividual() { - return Stream.of( - Arguments.of(new UserClientIndividualRequestDTO( - "UserClientIndividual", - "이름3", - "핸드폰번호3" - ), "계정3"), - Arguments.of(new UserClientIndividualRequestDTO( - "UserClientIndividual", - "이름4", - "핸드폰번호4" - ), "계정4") - ); - } - - private static Stream modifyUserClientIndividual() { - return Stream.of( - Arguments.of(new UserClientIndividualRequestDTO( - "UserClientIndividual", - "이름2", - "핸드폰번호2" - ), "계정1"), - Arguments.of(new UserClientIndividualRequestDTO( - "UserClientIndividual", - "이름1", - "핸드폰번호1" - ), "계정2") - ); - } - - @BeforeEach - public void setUp() { - userClientIndividualService.registUserClientIndividual(new UserClientIndividualRequestDTO( - "UserClientIndividual", - "이름1", - "핸드폰번호1" - ), "계정1"); - userClientIndividualService.registUserClientIndividual(new UserClientIndividualRequestDTO( - "UserClientIndividual", - "이름2", - "핸드폰번호2" - ), "계정2"); - } - - @Order(1) - @DisplayName("UserClientIndividual 등록") - @MethodSource("registUserClientIndividual") - @ParameterizedTest - public void testRegistUserClientIndividual(UserClientIndividualRequestDTO UserClientIndividualRequestDTO, String accountId) { - Assertions.assertDoesNotThrow(() -> userClientIndividualService.registUserClientIndividual(UserClientIndividualRequestDTO, accountId)); - } - - @Order(2) - @DisplayName("계정 ID로 UserClientIndividual 조회") - @ValueSource(strings = {"계정1", "계정2"}) - @ParameterizedTest - public void testFindUserClientIndividualByAccountId(String accountId) { - Assertions.assertDoesNotThrow(() -> userClientIndividualService.findUserClientIndividualByAccountId(accountId)); - } - - @Order(3) - @DisplayName("이름으로 UserClientIndividual 조회") - @ValueSource(strings = {"이름1", "이름2"}) - @ParameterizedTest - public void findByManagerNameContainingIgnoreCase(String name) { - Assertions.assertDoesNotThrow(() -> userClientIndividualService.findUserClientIndividualsByNameContainingIgnoreCase(name)); - } - - @Order(4) - @DisplayName("핸드폰 번호로 UserClientIndividual 조회") - @ValueSource(strings = {"핸드폰1", "핸드폰2"}) - @ParameterizedTest - public void testFindUserClientIndividualByPhone(String phone) { - Assertions.assertDoesNotThrow(() -> userClientIndividualService.findUserClientIndividualsByPhone(phone)); - } - - @Order(5) - @DisplayName("UserClientIndividual 수정") - @MethodSource("modifyUserClientIndividual") - @ParameterizedTest - public void testUpdateUserClientIndividual(UserClientIndividualRequestDTO UserClientIndividualRequestDTO, String accountId) { - Assertions.assertDoesNotThrow(() -> userClientIndividualService.updateUserClientIndividual(UserClientIndividualRequestDTO, accountId)); - } - - @Order(6) - @DisplayName("UserClientIndividual 삭제") - @ValueSource(strings = {"계정1", "계정2"}) - @ParameterizedTest - public void testDeleteByAccountId(String accountId) { - Assertions.assertDoesNotThrow(() -> userClientIndividualService.deleteByAccountId(accountId)); - } -}