From 1281dd7fad377280ab9013bf5482ddbe3c65de8b Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 7 Nov 2024 13:11:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20Guild=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20Entity=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20API=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/service/CommentViewService.java | 9 +- .../controller/GuildCommandController.java | 75 ++++++++++ .../guild/controller/GuildController.java | 133 ------------------ .../controller/GuildQueryController.java | 61 ++++++++ .../request/GuildMemberModifyRequestDTO.java | 4 +- .../dto/request/GuildRegistRequestDTO.java | 6 +- .../dto/request/GuildUpdateRequestDTO.java | 8 +- .../response/GuildDetailListResponseDTO.java | 15 ++ .../GuildDetailSingleResponseDTO.java | 13 ++ .../dto/response/sub/GuildAndMemberDTO.java | 20 +++ .../devlinkbackend/guild/entity/Guild.java | 53 +++---- .../guild/repository/GuildRepository.java | 5 - .../guild/repository/GuildViewRepository.java | 22 +++ .../guild/service/GuildService.java | 93 ++++++------ .../guild/service/GuildViewService.java | 93 ++++++++++++ .../repository/MemberViewRepository.java | 3 + .../query/service/MemberViewService.java | 7 + .../request/TeamMemberModifyRequestDTO.java | 1 - .../user/query/service/UserViewService.java | 9 +- .../devlinkbackend/crud/GuildCRUDTest.java | 83 ----------- 20 files changed, 390 insertions(+), 323 deletions(-) create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildCommandController.java delete mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildQueryController.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailListResponseDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailSingleResponseDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/dto/response/sub/GuildAndMemberDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildViewRepository.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/service/GuildViewService.java diff --git a/src/main/java/com/mtvs/devlinkbackend/comment/service/CommentViewService.java b/src/main/java/com/mtvs/devlinkbackend/comment/service/CommentViewService.java index cc8a587..8c349b2 100644 --- a/src/main/java/com/mtvs/devlinkbackend/comment/service/CommentViewService.java +++ b/src/main/java/com/mtvs/devlinkbackend/comment/service/CommentViewService.java @@ -9,6 +9,7 @@ import com.mtvs.devlinkbackend.comment.entity.Comment; import com.mtvs.devlinkbackend.comment.repository.CommentViewRepository; import com.mtvs.devlinkbackend.guild.repository.GuildRepository; +import com.mtvs.devlinkbackend.guild.repository.GuildViewRepository; import com.mtvs.devlinkbackend.user.command.model.entity.User; import com.mtvs.devlinkbackend.user.query.model.dto.response.UserDetailSingleResponseDTO; import com.mtvs.devlinkbackend.user.query.model.dto.response.sub.CharacterInfoDTO; @@ -29,15 +30,15 @@ public class CommentViewService { private final UserCharacterViewService userCharacterViewService; private final UserViewRepository userViewRepository; private final SkillCategoryInfoViewRepository skillCategoryInfoViewRepository; - private final GuildRepository guildRepository; + private final GuildViewRepository guildViewRepository; - public CommentViewService(CommentViewRepository commentViewRepository, UserViewService userViewService, UserCharacterViewService userCharacterViewService, UserViewRepository userViewRepository, SkillCategoryInfoViewRepository skillCategoryInfoViewRepository, GuildRepository guildRepository) { + public CommentViewService(CommentViewRepository commentViewRepository, UserViewService userViewService, UserCharacterViewService userCharacterViewService, UserViewRepository userViewRepository, SkillCategoryInfoViewRepository skillCategoryInfoViewRepository, GuildViewRepository guildViewRepository) { this.commentViewRepository = commentViewRepository; this.userViewService = userViewService; this.userCharacterViewService = userCharacterViewService; this.userViewRepository = userViewRepository; this.skillCategoryInfoViewRepository = skillCategoryInfoViewRepository; - this.guildRepository = guildRepository; + this.guildViewRepository = guildViewRepository; } public CommentSingleResponseDTO findCommentByCommentId(Long commentId) { @@ -67,7 +68,7 @@ public CommentDetailSingleResponseDTO findCommentDetailByCommentId(Long commentI foundUserCharacter != null ? new CharacterInfoDTO( foundUserCharacter.getGuildId() != null ? - guildRepository.findByGuildId(foundUserCharacter.getGuildId()) : null, + guildViewRepository.findByGuildId(foundUserCharacter.getGuildId()) : null, foundUserCharacter.getCharacterPicture()) : null; diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildCommandController.java b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildCommandController.java new file mode 100644 index 0000000..e22c02a --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildCommandController.java @@ -0,0 +1,75 @@ +package com.mtvs.devlinkbackend.guild.controller; + +import com.mtvs.devlinkbackend.guild.dto.request.GuildMemberModifyRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.request.GuildRegistRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.request.GuildUpdateRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailSingleResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildSingleResponseDTO; +import com.mtvs.devlinkbackend.guild.service.GuildService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/guild") +public class GuildCommandController { + + private final GuildService guildService; + + public GuildCommandController(GuildService guildService) { + this.guildService = guildService; + } + + @Operation(summary = "길드 생성", description = "새로운 길드를 생성합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "길드가 성공적으로 생성되었습니다."), + @ApiResponse(responseCode = "400", description = "길드 생성 요청이 잘못되었습니다.") + }) + @PostMapping + public ResponseEntity createGuild( + @RequestBody GuildRegistRequestDTO guildRegistRequestDTO) { + + return ResponseEntity.ok(guildService.createGuild(guildRegistRequestDTO)); + } + + @Operation(summary = "길드 수정", description = "길드 정보를 수정합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "길드가 성공적으로 수정되었습니다."), + @ApiResponse(responseCode = "403", description = "수정 권한이 없습니다."), + @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") + }) + @PatchMapping + public ResponseEntity updateGuild( + @RequestBody GuildUpdateRequestDTO guildUpdateRequestDTO) { + + return ResponseEntity.ok(guildService.updateGuild(guildUpdateRequestDTO)); + } + + @Operation(summary = "길드 멤버 추가", description = "길드에 멤버를 추가합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "멤버가 성공적으로 추가되었습니다."), + @ApiResponse(responseCode = "403", description = "추가 권한이 없습니다."), + @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") + }) + @PostMapping("/apply/{guildId}") + public GuildDetailSingleResponseDTO addMemberToGuild( + @RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO) { + + return guildService.applyMemberToGuild(guildMemberModifyRequestDTO); + } + + @Operation(summary = "길드 삭제", description = "길드를 삭제합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "길드가 성공적으로 삭제되었습니다."), + @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") + }) + @DeleteMapping("/{guildId}") + public ResponseEntity deleteGuild(@PathVariable Long guildId) { + + guildService.deleteGuild(guildId); + return ResponseEntity.ok().build(); + } +} + diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java deleted file mode 100644 index 92149ed..0000000 --- a/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.mtvs.devlinkbackend.guild.controller; - -import com.mtvs.devlinkbackend.guild.dto.request.GuildMemberModifyRequestDTO; -import com.mtvs.devlinkbackend.guild.dto.request.GuildRegistRequestDTO; -import com.mtvs.devlinkbackend.guild.dto.request.GuildUpdateRequestDTO; -import com.mtvs.devlinkbackend.guild.dto.response.GuildListResponseDTO; -import com.mtvs.devlinkbackend.guild.dto.response.GuildSingleResponseDTO; -import com.mtvs.devlinkbackend.common.util.JwtUtil; -import com.mtvs.devlinkbackend.guild.service.GuildService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("/api/guild") -public class GuildController { - - private final GuildService guildService; - private final JwtUtil jwtUtil; - - public GuildController(GuildService guildService, JwtUtil jwtUtil) { - this.guildService = guildService; - this.jwtUtil = jwtUtil; - } - - @Operation(summary = "길드 생성", description = "새로운 길드를 생성합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "길드가 성공적으로 생성되었습니다."), - @ApiResponse(responseCode = "400", description = "길드 생성 요청이 잘못되었습니다.") - }) - @PostMapping - public GuildSingleResponseDTO createGuild( - @RequestBody GuildRegistRequestDTO guildRegistRequestDTO, - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - return guildService.createGuild(guildRegistRequestDTO, accountId); - } - - @Operation(summary = "길드 조회", description = "길드 ID로 길드를 조회합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "길드가 성공적으로 조회되었습니다."), - @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") - }) - @GetMapping("/{guildId}") - public GuildSingleResponseDTO findGuildByGuildId(@PathVariable Long guildId) { - return guildService.findGuildByGuildId(guildId); - } - - @Operation(summary = "길드 이름 검색", description = "이름이 특정 문자열을 포함하는 길드 목록을 조회합니다.") - @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") - @GetMapping("/search") - public GuildListResponseDTO findGuildsByGuildNameContaining(@RequestParam String guildName) { - return guildService.findGuildsByGuildNameContaining(guildName); - } - - @Operation(summary = "사용자가 소유자인 길드 조회", description = "사용자가 소유자인 길드를 조회합니다.") - @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") - @GetMapping("/owner") - public GuildListResponseDTO findGuildsByOwnerId( - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String ownerId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - return guildService.findGuildsByOwnerId(ownerId); - } - - @Operation(summary = "사용자가 멤버인 길드 조회", description = "사용자가 멤버인 길드를 조회합니다.") - @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") - @GetMapping("/member") - public GuildListResponseDTO findGuildsByMemberIdContaining( - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String memberId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - return guildService.findGuildsByMemberIdContaining(memberId); - } - - @Operation(summary = "길드 수정", description = "길드 정보를 수정합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "길드가 성공적으로 수정되었습니다."), - @ApiResponse(responseCode = "403", description = "수정 권한이 없습니다."), - @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") - }) - @PatchMapping - public GuildSingleResponseDTO updateGuild( - @RequestBody GuildUpdateRequestDTO guildUpdateRequestDTO, - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - return guildService.updateGuild(guildUpdateRequestDTO, accountId); - } - - @Operation(summary = "길드 멤버 추가", description = "길드에 멤버를 추가합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "멤버가 성공적으로 추가되었습니다."), - @ApiResponse(responseCode = "403", description = "추가 권한이 없습니다."), - @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") - }) - @PostMapping("/member") - public GuildSingleResponseDTO addMemberToGuild( - @RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - return guildService.addMemberToGuild(guildMemberModifyRequestDTO, accountId); - } - - @Operation(summary = "길드 멤버 제거", description = "길드에서 멤버를 제거합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "멤버가 성공적으로 제거되었습니다."), - @ApiResponse(responseCode = "403", description = "제거 권한이 없습니다."), - @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") - }) - @DeleteMapping("/member") - public GuildSingleResponseDTO removeMemberFromGuild( - @RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, - @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { - - String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); - return guildService.removeMemberToGuild(guildMemberModifyRequestDTO, accountId); - } - - @Operation(summary = "길드 삭제", description = "길드를 삭제합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "길드가 성공적으로 삭제되었습니다."), - @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") - }) - @DeleteMapping("/{guildId}") - public void deleteGuild(@PathVariable Long guildId) { - guildService.deleteGuild(guildId); - } -} - diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildQueryController.java b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildQueryController.java new file mode 100644 index 0000000..a3af085 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildQueryController.java @@ -0,0 +1,61 @@ +package com.mtvs.devlinkbackend.guild.controller; + +import com.mtvs.devlinkbackend.common.util.JwtUtil; +import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailListResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailSingleResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildListResponseDTO; +import com.mtvs.devlinkbackend.guild.service.GuildViewService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/guild") +public class GuildQueryController { + private final GuildViewService guildViewService; + private final JwtUtil jwtUtil; + + public GuildQueryController(GuildViewService guildViewService, JwtUtil jwtUtil) { + this.guildViewService = guildViewService; + this.jwtUtil = jwtUtil; + } + + @Operation(summary = "길드 조회", description = "길드 ID로 길드를 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "길드가 성공적으로 조회되었습니다."), + @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") + }) + @GetMapping("/{guildId}") + public ResponseEntity findGuildByGuildId(@PathVariable Long guildId) { + return ResponseEntity.ok(guildViewService.findGuildDetailByGuildId(guildId)); + } + + @Operation(summary = "길드 목록 조회", description = "이름이 특정 문자열을 포함하는 길드 목록을 조회합니다.") + @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") + @GetMapping("/list/{page}") + public ResponseEntity findGuildsWithPagination(@PathVariable Integer page) { + return ResponseEntity.ok(guildViewService.findGuildDetailsWithPagination(page)); + } + + @Operation(summary = "사용자가 소유자인 길드 조회", description = "사용자가 소유자인 길드를 조회합니다.") + @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") + @GetMapping("/owner") + public ResponseEntity findGuildsByOwnerId( + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); + return ResponseEntity.ok(guildViewService.findGuildsByMasterAccountId(accountId)); + } + + @Operation(summary = "사용자가 멤버인 길드 조회", description = "사용자가 멤버인 길드를 조회합니다.") + @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") + @GetMapping("/member") + public ResponseEntity findGuildsByMemberIdContaining( + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader); + return ResponseEntity.ok(guildViewService.findGuildsByAccountIdInGuild(accountId)); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildMemberModifyRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildMemberModifyRequestDTO.java index 5ef114c..6b61d10 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildMemberModifyRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildMemberModifyRequestDTO.java @@ -1,5 +1,6 @@ package com.mtvs.devlinkbackend.guild.dto.request; +import com.mtvs.devlinkbackend.member.command.model.entity.Member; import lombok.*; import java.util.List; @@ -10,5 +11,6 @@ @ToString public class GuildMemberModifyRequestDTO { private Long guildId; - private List newMemberList; + private Long masterUserId; + private List guildMemberList; } diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildRegistRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildRegistRequestDTO.java index 93f5717..ebb2b6a 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildRegistRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildRegistRequestDTO.java @@ -10,7 +10,7 @@ @ToString public class GuildRegistRequestDTO { private String guildName; - private String introduction; - private Long maximumMember; - private List memberList; + private String guildIntroduction; + private Long masterUserId; + private Integer maximumMember; } diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildUpdateRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildUpdateRequestDTO.java index 5c2e782..541a007 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildUpdateRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/request/GuildUpdateRequestDTO.java @@ -1,5 +1,6 @@ package com.mtvs.devlinkbackend.guild.dto.request; +import com.mtvs.devlinkbackend.member.command.model.entity.Member; import lombok.*; import java.util.List; @@ -12,8 +13,7 @@ public class GuildUpdateRequestDTO { private Long guildId; private String guildName; - private String introduction; - private Long maximumMember; - private List memberList; - private Long channelId; + private String guildIntroduction; + private Long masterUserId; + private Integer maximumMember; } diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailListResponseDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailListResponseDTO.java new file mode 100644 index 0000000..aa4c489 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailListResponseDTO.java @@ -0,0 +1,15 @@ +package com.mtvs.devlinkbackend.guild.dto.response; + +import com.mtvs.devlinkbackend.guild.dto.response.sub.GuildAndMemberDTO; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GuildDetailListResponseDTO { + private List data; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailSingleResponseDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailSingleResponseDTO.java new file mode 100644 index 0000000..849d612 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/GuildDetailSingleResponseDTO.java @@ -0,0 +1,13 @@ +package com.mtvs.devlinkbackend.guild.dto.response; + +import com.mtvs.devlinkbackend.guild.dto.response.sub.GuildAndMemberDTO; +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GuildDetailSingleResponseDTO { + private GuildAndMemberDTO data; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/sub/GuildAndMemberDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/sub/GuildAndMemberDTO.java new file mode 100644 index 0000000..b1dadd1 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/response/sub/GuildAndMemberDTO.java @@ -0,0 +1,20 @@ +package com.mtvs.devlinkbackend.guild.dto.response.sub; + +import com.mtvs.devlinkbackend.member.command.model.entity.Member; +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GuildAndMemberDTO { + private Long guildId; + private String guildName; + private String guildIntroduction; + private Long masterUserId; + private Integer maximumMember; + private List guildMemberList; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java b/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java index aa69b20..aa53b09 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java @@ -1,5 +1,6 @@ package com.mtvs.devlinkbackend.guild.entity; +import com.mtvs.devlinkbackend.common.util.converter.LongListConverter; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; @@ -23,23 +24,20 @@ public class Guild { private Long guildId; @Column(name = "OWNER_ID") - private String ownerId; + private Long masterUserId; @Column(name = "GUILD_NAME") private String guildName; - @Column(name = "INTRODUCTION") - private String introduction; + @Column(name = "GUILD_INTRODUCTION") + private String guildIntroduction; @Column(name = "MAXIMUM_MEMBER") - private Long maximumMember; + private Integer maximumMember; - @Column(name = "CHANNEL_ID") - private Long channelId; - - @ElementCollection - @CollectionTable(name = "GUILD_MEMBER", joinColumns = @JoinColumn(name = "GUILD_ID")) - private List memberList = new ArrayList<>(); + @Convert(converter = LongListConverter.class) + @Column(name = "GUILD_MEMBER_LIST", columnDefinition = "TEXT") + private List guildMemberList = new ArrayList<>(); @CreationTimestamp @Column(name = "CREATED_AT", updatable = false) @@ -49,44 +47,31 @@ public class Guild { @Column(name = "MODIFIED_AT") private LocalDateTime modifiedAt; - public Guild(String ownerId, String guildName, String introduction, Long maximumMember, List memberList) { - this.ownerId = ownerId; + public Guild(Long masterUserId, String guildName, String guildIntroduction, Integer maximumMember, List guildMemberList) { + this.masterUserId = masterUserId; this.guildName = guildName; - this.introduction = introduction; + this.guildIntroduction = guildIntroduction; this.maximumMember = maximumMember; - this.memberList = new ArrayList<>(memberList); + this.guildMemberList = new ArrayList<>(guildMemberList); } - public Guild(String ownerId, String guildName, String introduction, Long maximumMember, List memberList, Long channelId) { - this.ownerId = ownerId; - this.guildName = guildName; - this.introduction = introduction; - this.maximumMember = maximumMember; - this.memberList = new ArrayList<>(memberList); - this.channelId = channelId; - } - - public void setOwnerId(String ownerId) { - this.ownerId = ownerId; + public void setMasterUserId(Long masterUserId) { + this.masterUserId = masterUserId; } public void setGuildName(String guildName) { this.guildName = guildName; } - public void setIntroduction(String introduction) { - this.introduction = introduction; + public void setGuildIntroduction(String guildIntroduction) { + this.guildIntroduction = guildIntroduction; } - public void setMaximumMember(Long maximumMember) { + public void setMaximumMember(Integer maximumMember) { this.maximumMember = maximumMember; } - public void setChannelId(Long channelId) { - this.channelId = channelId; - } - - public void setMemberList(List memberList) { - this.memberList = new ArrayList<>(memberList); + public void setMemberList(List guildMemberList) { + this.guildMemberList = new ArrayList<>(guildMemberList); } } diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java b/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java index 9176702..68078ea 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java @@ -11,9 +11,4 @@ @Repository public interface GuildRepository extends JpaRepository { - List findGuildsByGuildNameContaining(String guildName); - List findGuildsByOwnerId(String ownerId); - @Query("SELECT g FROM Guild g JOIN g.memberList m WHERE m LIKE :memberId") - List findGuildsByMemberIdContaining(@Param("memberId") String accountId); - Guild_GuildName findByGuildId(Long guildId); } diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildViewRepository.java b/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildViewRepository.java new file mode 100644 index 0000000..9caab6e --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildViewRepository.java @@ -0,0 +1,22 @@ +package com.mtvs.devlinkbackend.guild.repository; + +import com.mtvs.devlinkbackend.guild.entity.Guild; +import com.mtvs.devlinkbackend.guild.repository.projection.Guild_GuildName; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface GuildViewRepository extends JpaRepository { + List findGuildsByMasterUserId(Long masterUserId); + Guild_GuildName findByGuildId(Long guildId); + Page findAllBy(Pageable pageable); + + @Query(value = "SELECT * FROM GUILD g WHERE " + + "EXISTS (SELECT 1 FROM JSON_TABLE(g.GUILD_MEMBER_LIST, '$[*]' COLUMNS(memberId BIGINT PATH '$')) jt " + + "WHERE jt.memberId IN :memberIds)", nativeQuery = true) + List findAllByMemberIdsInGuildMemberList(@Param("memberIds") List memberIds); +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java index d7fb384..d63d952 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java @@ -1,90 +1,81 @@ package com.mtvs.devlinkbackend.guild.service; +import com.mtvs.devlinkbackend.common.model.AcceptStatus; import com.mtvs.devlinkbackend.guild.dto.request.GuildMemberModifyRequestDTO; import com.mtvs.devlinkbackend.guild.dto.request.GuildRegistRequestDTO; import com.mtvs.devlinkbackend.guild.dto.request.GuildUpdateRequestDTO; -import com.mtvs.devlinkbackend.guild.dto.response.GuildListResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailSingleResponseDTO; import com.mtvs.devlinkbackend.guild.dto.response.GuildSingleResponseDTO; import com.mtvs.devlinkbackend.guild.entity.Guild; import com.mtvs.devlinkbackend.guild.repository.GuildRepository; +import com.mtvs.devlinkbackend.member.command.model.entity.Member; +import com.mtvs.devlinkbackend.member.command.service.MemberService; import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; @Service public class GuildService { private final GuildRepository guildRepository; + private final MemberService memberService; - public GuildService(GuildRepository guildRepository) { + public GuildService(GuildRepository guildRepository, MemberService memberService) { this.guildRepository = guildRepository; + this.memberService = memberService; } @Transactional - public GuildSingleResponseDTO createGuild(GuildRegistRequestDTO guildRegistRequestDTO, String accountId) { + public GuildSingleResponseDTO createGuild(GuildRegistRequestDTO guildRegistRequestDTO) { return new GuildSingleResponseDTO(guildRepository.save(new Guild( - accountId, + guildRegistRequestDTO.getMasterUserId(), guildRegistRequestDTO.getGuildName(), - guildRegistRequestDTO.getIntroduction(), - guildRegistRequestDTO.getMaximumMember(), - guildRegistRequestDTO.getMemberList() + guildRegistRequestDTO.getGuildIntroduction(), + 1000, + new ArrayList<>() ))); } - public GuildSingleResponseDTO findGuildByGuildId(Long guildId) { - return new GuildSingleResponseDTO(guildRepository.findById(guildId).orElse(null)); - } - - public GuildListResponseDTO findGuildsByGuildNameContaining(String guildName) { - return new GuildListResponseDTO(guildRepository.findGuildsByGuildNameContaining(guildName)); - } - - public GuildListResponseDTO findGuildsByOwnerId(String ownerId) { - return new GuildListResponseDTO(guildRepository.findGuildsByOwnerId(ownerId)); - } - - public GuildListResponseDTO findGuildsByMemberIdContaining(String memberId) { - return new GuildListResponseDTO(guildRepository.findGuildsByMemberIdContaining(memberId)); - } - @Transactional - public GuildSingleResponseDTO updateGuild(GuildUpdateRequestDTO guildUpdateRequestDTO, String accountId) { + public GuildSingleResponseDTO updateGuild(GuildUpdateRequestDTO guildUpdateRequestDTO) { Optional guild = guildRepository.findById(guildUpdateRequestDTO.getGuildId()); - if (guild.isPresent()) { - Guild foundGuild = guild.get(); - if (foundGuild.getOwnerId().equals(accountId)) { - foundGuild.setGuildName(guildUpdateRequestDTO.getGuildName()); - foundGuild.setIntroduction(guildUpdateRequestDTO.getIntroduction()); - foundGuild.setMaximumMember(guildUpdateRequestDTO.getMaximumMember()); - foundGuild.setMemberList(guildUpdateRequestDTO.getMemberList()); - foundGuild.setChannelId(guildUpdateRequestDTO.getChannelId()); - return new GuildSingleResponseDTO(); - } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); - } else return null; - } + if (guild.isEmpty()) + throw new IllegalArgumentException("잘못된 길드 ID로 접근중"); - @Transactional - public GuildSingleResponseDTO addMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, String accountId) { - Optional guild = guildRepository.findById(guildMemberModifyRequestDTO.getGuildId()); - if (guild.isPresent()) { - Guild foundGuild = guild.get(); - if(foundGuild.getOwnerId().equals(accountId)) { - foundGuild.getMemberList().addAll(guildMemberModifyRequestDTO.getNewMemberList()); - return new GuildSingleResponseDTO(foundGuild); - } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); - } else return null; + Guild foundGuild = guild.get(); + if (foundGuild.getMasterUserId().equals(guildUpdateRequestDTO.getMasterUserId())) { + foundGuild.setGuildName(guildUpdateRequestDTO.getGuildName()); + foundGuild.setGuildIntroduction(guildUpdateRequestDTO.getGuildIntroduction()); + foundGuild.setMaximumMember(guildUpdateRequestDTO.getMaximumMember()); + + return new GuildSingleResponseDTO(); + } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); } @Transactional - public GuildSingleResponseDTO removeMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, String accountId) { + public GuildDetailSingleResponseDTO applyMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO) { Optional guild = guildRepository.findById(guildMemberModifyRequestDTO.getGuildId()); if (guild.isPresent()) { Guild foundGuild = guild.get(); - if(foundGuild.getOwnerId().equals(accountId)) { - foundGuild.getMemberList().removeAll(guildMemberModifyRequestDTO.getNewMemberList()); - return new GuildSingleResponseDTO(foundGuild); - } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); + List memberList = guildMemberModifyRequestDTO.getGuildMemberList().stream() + .map(guildMember -> + new Member( + guildMember.getType(), + guildMember.getUserId(), + guildMember.getAssigneesId(), + guildMember.getMotive(), + AcceptStatus.PENDING)).toList(); + + memberService.registAll(memberList); + + foundGuild.getGuildMemberList().addAll(memberList.stream().map(Member::getMemberId).toList()); + + return new GuildDetailSingleResponseDTO( + + ); } else return null; } diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildViewService.java b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildViewService.java new file mode 100644 index 0000000..7cefa37 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildViewService.java @@ -0,0 +1,93 @@ +package com.mtvs.devlinkbackend.guild.service; + +import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailListResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailSingleResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.GuildListResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.sub.GuildAndMemberDTO; +import com.mtvs.devlinkbackend.guild.entity.Guild; +import com.mtvs.devlinkbackend.guild.repository.GuildViewRepository; +import com.mtvs.devlinkbackend.member.command.model.entity.Member; +import com.mtvs.devlinkbackend.member.query.service.MemberViewService; +import com.mtvs.devlinkbackend.user.command.model.entity.User; +import com.mtvs.devlinkbackend.user.query.service.UserViewService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class GuildViewService { + + private final static Integer PAGE_SIZE = 15; + + private final GuildViewRepository guildViewRepository; + private final MemberViewService memberViewService; + private final UserViewService userViewService; + + public GuildViewService(GuildViewRepository guildViewRepository, MemberViewService memberViewService, UserViewService userViewService) { + this.guildViewRepository = guildViewRepository; + this.memberViewService = memberViewService; + this.userViewService = userViewService; + } + + public GuildDetailSingleResponseDTO findGuildDetailByGuildId(Long guildId) { + Guild guild = guildViewRepository.findById(guildId).orElse(null); + + if(guild == null) + throw new IllegalArgumentException("잘못된 guildId로 접근"); + + return new GuildDetailSingleResponseDTO( + new GuildAndMemberDTO( + guildId, + guild.getGuildName(), + guild.getGuildIntroduction(), + guild.getMasterUserId(), + guild.getMaximumMember(), + guild.getGuildMemberList().stream().map(memberId -> + memberViewService.findMemberByMemberId(memberId).getData()).toList() + ) + ); + } + + public GuildDetailListResponseDTO findGuildDetailsWithPagination(Integer page) { + Pageable pageable = PageRequest.of(page, PAGE_SIZE, Sort.by("createdAt").ascending()); + Page guildPage = guildViewRepository.findAllBy(pageable); + + List guildAndMemberDTOList = guildPage.getContent().stream().map(guild -> + new GuildAndMemberDTO( + guild.getGuildId(), + guild.getGuildName(), + guild.getGuildIntroduction(), + guild.getMasterUserId(), + guild.getMaximumMember(), + guild.getGuildMemberList().stream().map(memberId -> + memberViewService.findMemberByMemberId(memberId).getData()).toList() + )).toList(); + + return new GuildDetailListResponseDTO(guildAndMemberDTOList); + } + + public GuildListResponseDTO findGuildsByAccountIdInGuild(String accountId) { + User user = userViewService.findUserByEpicAccountId(accountId); + if(user == null) + throw new IllegalArgumentException("잘못된 에픽 계정으로 접근"); + + List memberList = memberViewService.findMemberByUserId(user.getUserId()); + List memberIdList = memberList.stream().map(Member::getMemberId).toList(); + + return new GuildListResponseDTO(guildViewRepository.findAllByMemberIdsInGuildMemberList(memberIdList)); + } + + public GuildListResponseDTO findGuildsByMasterAccountId(String accountId) { + User user = userViewService.findUserByEpicAccountId(accountId); + if(user == null) + throw new IllegalArgumentException("잘못된 에픽 계정으로 접근"); + + return new GuildListResponseDTO( + guildViewRepository.findGuildsByMasterUserId(user.getUserId()) + ); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/member/query/repository/MemberViewRepository.java b/src/main/java/com/mtvs/devlinkbackend/member/query/repository/MemberViewRepository.java index 26eba55..71f6079 100644 --- a/src/main/java/com/mtvs/devlinkbackend/member/query/repository/MemberViewRepository.java +++ b/src/main/java/com/mtvs/devlinkbackend/member/query/repository/MemberViewRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface MemberViewRepository extends JpaRepository { + List findByUserId(Long userId); } diff --git a/src/main/java/com/mtvs/devlinkbackend/member/query/service/MemberViewService.java b/src/main/java/com/mtvs/devlinkbackend/member/query/service/MemberViewService.java index 72e3b20..c3f6bd7 100644 --- a/src/main/java/com/mtvs/devlinkbackend/member/query/service/MemberViewService.java +++ b/src/main/java/com/mtvs/devlinkbackend/member/query/service/MemberViewService.java @@ -1,9 +1,12 @@ package com.mtvs.devlinkbackend.member.query.service; +import com.mtvs.devlinkbackend.member.command.model.entity.Member; import com.mtvs.devlinkbackend.member.query.repository.MemberViewRepository; import com.mtvs.devlinkbackend.member.query.view.response.MemberStatusResponseDTO; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class MemberViewService { private final MemberViewRepository memberViewRepository; @@ -15,4 +18,8 @@ public MemberViewService(MemberViewRepository memberViewRepository) { public MemberStatusResponseDTO findMemberByMemberId(Long memberId) { return new MemberStatusResponseDTO(memberViewRepository.findById(memberId).orElse(null)); } + + public List findMemberByUserId(Long userId) { + return memberViewRepository.findByUserId(userId); + } } diff --git a/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java index eda9e1e..7cafa9f 100644 --- a/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java @@ -12,6 +12,5 @@ @ToString public class TeamMemberModifyRequestDTO { private Long teamId; - private Long leaderUserId; private List teamMemberList; } diff --git a/src/main/java/com/mtvs/devlinkbackend/user/query/service/UserViewService.java b/src/main/java/com/mtvs/devlinkbackend/user/query/service/UserViewService.java index 841ccba..59a97e5 100644 --- a/src/main/java/com/mtvs/devlinkbackend/user/query/service/UserViewService.java +++ b/src/main/java/com/mtvs/devlinkbackend/user/query/service/UserViewService.java @@ -3,6 +3,7 @@ import com.mtvs.devlinkbackend.character.entity.UserCharacter; import com.mtvs.devlinkbackend.character.repository.UserCharacterRepository; import com.mtvs.devlinkbackend.guild.repository.GuildRepository; +import com.mtvs.devlinkbackend.guild.repository.GuildViewRepository; import com.mtvs.devlinkbackend.user.command.model.entity.User; import com.mtvs.devlinkbackend.user.query.model.dto.response.UserDetailSingleResponseDTO; import com.mtvs.devlinkbackend.user.query.model.dto.response.UserSingleResponseDTO; @@ -19,16 +20,16 @@ public class UserViewService { private final JwtUtil jwtUtil; private final UserViewRepository userViewRepository; - private final GuildRepository guildRepository; private final UserCharacterRepository userCharacterRepository; private final SkillCategoryInfoViewRepository skillCategoryInfoViewRepository; + private final GuildViewRepository guildViewRepository; - public UserViewService(JwtUtil jwtUtil, UserViewRepository userViewRepository, GuildRepository guildRepository, UserCharacterRepository userCharacterRepository, SkillCategoryInfoViewRepository skillCategoryInfoViewRepository) { + public UserViewService(JwtUtil jwtUtil, UserViewRepository userViewRepository, UserCharacterRepository userCharacterRepository, SkillCategoryInfoViewRepository skillCategoryInfoViewRepository, GuildViewRepository guildViewRepository) { this.jwtUtil = jwtUtil; this.userViewRepository = userViewRepository; - this.guildRepository = guildRepository; this.userCharacterRepository = userCharacterRepository; this.skillCategoryInfoViewRepository = skillCategoryInfoViewRepository; + this.guildViewRepository = guildViewRepository; } public Boolean isExistedUserByEpicAccountId(String accountId) throws Exception { @@ -54,7 +55,7 @@ public UserDetailSingleResponseDTO findUserDetailByUserId(Long userId) { foundUserCharacter != null ? new CharacterInfoDTO( foundUserCharacter.getGuildId() != null ? - guildRepository.findByGuildId(foundUserCharacter.getGuildId()) : null, + guildViewRepository.findByGuildId(foundUserCharacter.getGuildId()) : null, foundUserCharacter.getCharacterPicture()) : null; DevInfoDTO devInfoDTO = diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java index af89a26..376b380 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java @@ -20,88 +20,5 @@ @SpringBootTest @Transactional public class GuildCRUDTest { - @Autowired - private GuildService guildService; - @Autowired - private GuildRepository guildRepository; - - private GuildSingleResponseDTO guild; - - @BeforeEach - public void setUp() { - guild = guildService.createGuild( - new GuildRegistRequestDTO("테스트 길드", "테스트 길드 소개", 10L, List.of("member1", "member2")), - "testOwner" - ); - } - - @Test - public void testCreateGuild() { - assertNotNull(guild); - assertEquals("테스트 길드", guild.getData().getGuildName()); - assertEquals("testOwner", guild.getData().getOwnerId()); - } - - @Test - public void testFindGuildByGuildId() { - GuildSingleResponseDTO foundGuild = guildService.findGuildByGuildId(guild.getData().getGuildId()); - assertNotNull(foundGuild); - assertEquals(guild.getData().getGuildId(), foundGuild.getData().getGuildId()); - } - - @Test - public void testFindGuildsByGuildNameContaining() { - GuildListResponseDTO foundGuilds = guildService.findGuildsByGuildNameContaining("테스트"); - assertFalse(foundGuilds.getData().isEmpty()); - assertTrue(foundGuilds.getData().stream().anyMatch(g -> g.getGuildName().contains("테스트"))); - } - - @Test - public void testFindGuildsByOwnerId() { - GuildListResponseDTO foundGuilds = guildService.findGuildsByOwnerId("testOwner"); - assertFalse(foundGuilds.getData().isEmpty()); - assertTrue(foundGuilds.getData().stream().anyMatch(g -> g.getOwnerId().equals("testOwner"))); - } - - @Test - public void testUpdateGuild() { - GuildUpdateRequestDTO updateRequest = new GuildUpdateRequestDTO( - guild.getData().getGuildId(), "업데이트 길드 이름", "업데이트 소개", 15L, List.of("member1"), 1L - ); - - GuildSingleResponseDTO updatedGuild = guildService.updateGuild(updateRequest, "testOwner"); - assertNotNull(updatedGuild); - assertEquals("업데이트 길드 이름", updatedGuild.getData().getGuildName()); - assertEquals(1L, updatedGuild.getData().getChannelId()); - } - - @Test - public void testAddMemberToGuild() { - GuildMemberModifyRequestDTO addRequest = new GuildMemberModifyRequestDTO( - guild.getData().getGuildId(), List.of("newMember") - ); - - GuildSingleResponseDTO updatedGuild = guildService.addMemberToGuild(addRequest, "testOwner"); - assertNotNull(updatedGuild); - assertTrue(updatedGuild.getData().getMemberList().contains("newMember")); - } - - @Test - public void testRemoveMemberToGuild() { - GuildMemberModifyRequestDTO removeRequest = new GuildMemberModifyRequestDTO( - guild.getData().getGuildId(), List.of("member1") - ); - - GuildSingleResponseDTO updatedGuild = guildService.removeMemberToGuild(removeRequest, "testOwner"); - assertNotNull(updatedGuild); - assertFalse(updatedGuild.getData().getMemberList().contains("member1")); - } - - @Test - public void testDeleteGuild() { - guildService.deleteGuild(guild.getData().getGuildId()); - GuildSingleResponseDTO deletedGuild = guildService.findGuildByGuildId(guild.getData().getGuildId()); - assertNull(deletedGuild); - } } From efd98643cedf6484fe1bed3398ad6a5a07dcd316 Mon Sep 17 00:00:00 2001 From: in seong Park <123macanic@naver.com> Date: Thu, 7 Nov 2024 13:30:31 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20Guild=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=ED=95=9C=20Ser?= =?UTF-8?q?vice=20=EB=A1=9C=EC=A7=81=20TestCode=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guild/service/GuildService.java | 20 +++- .../request/TeamMemberModifyRequestDTO.java | 1 + .../devlinkbackend/crud/GuildCRUDTest.java | 91 +++++++++++++++++++ .../crud/UserCharacterCRUDTest.java | 13 +-- 4 files changed, 116 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java index d63d952..070485e 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java @@ -6,10 +6,12 @@ import com.mtvs.devlinkbackend.guild.dto.request.GuildUpdateRequestDTO; import com.mtvs.devlinkbackend.guild.dto.response.GuildDetailSingleResponseDTO; import com.mtvs.devlinkbackend.guild.dto.response.GuildSingleResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.sub.GuildAndMemberDTO; import com.mtvs.devlinkbackend.guild.entity.Guild; import com.mtvs.devlinkbackend.guild.repository.GuildRepository; import com.mtvs.devlinkbackend.member.command.model.entity.Member; import com.mtvs.devlinkbackend.member.command.service.MemberService; +import com.mtvs.devlinkbackend.member.query.service.MemberViewService; import jakarta.transaction.Transactional; import org.springframework.stereotype.Service; @@ -22,10 +24,14 @@ public class GuildService { private final GuildRepository guildRepository; private final MemberService memberService; + private final GuildViewService guildViewService; + private final MemberViewService memberViewService; - public GuildService(GuildRepository guildRepository, MemberService memberService) { + public GuildService(GuildRepository guildRepository, MemberService memberService, GuildViewService guildViewService, MemberViewService memberViewService) { this.guildRepository = guildRepository; this.memberService = memberService; + this.guildViewService = guildViewService; + this.memberViewService = memberViewService; } @Transactional @@ -51,7 +57,7 @@ public GuildSingleResponseDTO updateGuild(GuildUpdateRequestDTO guildUpdateReque foundGuild.setGuildIntroduction(guildUpdateRequestDTO.getGuildIntroduction()); foundGuild.setMaximumMember(guildUpdateRequestDTO.getMaximumMember()); - return new GuildSingleResponseDTO(); + return new GuildSingleResponseDTO(foundGuild); } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); } @@ -74,7 +80,15 @@ public GuildDetailSingleResponseDTO applyMemberToGuild(GuildMemberModifyRequestD foundGuild.getGuildMemberList().addAll(memberList.stream().map(Member::getMemberId).toList()); return new GuildDetailSingleResponseDTO( - + new GuildAndMemberDTO( + foundGuild.getGuildId(), + foundGuild.getGuildName(), + foundGuild.getGuildIntroduction(), + foundGuild.getMasterUserId(), + foundGuild.getMaximumMember(), + foundGuild.getGuildMemberList().stream().map(memberId -> + memberViewService.findMemberByMemberId(memberId).getData()).toList() + ) ); } else return null; } diff --git a/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java index 7cafa9f..eda9e1e 100644 --- a/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/team/dto/request/TeamMemberModifyRequestDTO.java @@ -12,5 +12,6 @@ @ToString public class TeamMemberModifyRequestDTO { private Long teamId; + private Long leaderUserId; private List teamMemberList; } diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java index 376b380..e72f3ef 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java @@ -1,24 +1,115 @@ package com.mtvs.devlinkbackend.crud; +import com.mtvs.devlinkbackend.common.model.AcceptStatus; import com.mtvs.devlinkbackend.guild.dto.request.GuildMemberModifyRequestDTO; import com.mtvs.devlinkbackend.guild.dto.request.GuildRegistRequestDTO; import com.mtvs.devlinkbackend.guild.dto.request.GuildUpdateRequestDTO; import com.mtvs.devlinkbackend.guild.dto.response.GuildListResponseDTO; import com.mtvs.devlinkbackend.guild.dto.response.GuildSingleResponseDTO; +import com.mtvs.devlinkbackend.guild.dto.response.sub.GuildAndMemberDTO; +import com.mtvs.devlinkbackend.guild.entity.Guild; import com.mtvs.devlinkbackend.guild.repository.GuildRepository; import com.mtvs.devlinkbackend.guild.service.GuildService; +import com.mtvs.devlinkbackend.guild.service.GuildViewService; +import com.mtvs.devlinkbackend.member.command.model.entity.Member; +import com.mtvs.devlinkbackend.member.command.service.MemberService; import jakarta.transaction.Transactional; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; +import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional public class GuildCRUDTest { + @Autowired + private GuildService guildService; + @Autowired + private GuildViewService guildViewService; + + @Test + @DisplayName("Guild 생성 테스트") + void createGuildTest() { + GuildRegistRequestDTO requestDTO = new GuildRegistRequestDTO("Test Guild", "Test Guild Introduction", 1L, 1000); + var responseDTO = guildService.createGuild(requestDTO); + assertThat(responseDTO).isNotNull(); + assertThat(responseDTO.getData().getGuildName()).isEqualTo("Test Guild"); + } + + @Test + @DisplayName("Guild 수정 테스트") + void updateGuildTest() { + GuildRegistRequestDTO requestDTO = new GuildRegistRequestDTO("Test Guild", "Test Guild Introduction", 1L, 1000); + var responseDTO = guildService.createGuild(requestDTO); + + GuildUpdateRequestDTO updateRequestDTO = new GuildUpdateRequestDTO( + responseDTO.getData().getGuildId(), + "Updated Guild Name", + "Updated Guild Introduction", + 1L, + 2000 + ); + + var updatedGuildDTO = guildService.updateGuild(updateRequestDTO); + assertThat(updatedGuildDTO).isNotNull(); + assertThat(updatedGuildDTO.getData().getGuildName()).isEqualTo("Updated Guild Name"); + } + + @Test + @DisplayName("잘못된 Guild 수정 시도 테스트") + void updateGuildWithInvalidMasterUserIdTest() { + GuildRegistRequestDTO requestDTO = new GuildRegistRequestDTO("Test Guild", "Test Guild Introduction", 1L, 1000); + var responseDTO = guildService.createGuild(requestDTO); + + GuildUpdateRequestDTO updateRequestDTO = new GuildUpdateRequestDTO( + responseDTO.getData().getGuildId(), + "Updated Guild Name", + "Updated Guild Introduction", + 2L, // 다른 masterUserId를 사용하여 수정 시도 + 2000 + ); + + assertThatThrownBy(() -> guildService.updateGuild(updateRequestDTO)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("owner가 아닌 계정으로 Guild 수정 시도"); + } + + @Test + @DisplayName("Guild 멤버 추가 테스트") + void applyMemberToGuildTest() { + GuildRegistRequestDTO requestDTO = new GuildRegistRequestDTO("Test Guild", "Test Guild Introduction", 1L, 1000); + var responseDTO = guildService.createGuild(requestDTO); + + GuildMemberModifyRequestDTO memberRequestDTO = new GuildMemberModifyRequestDTO( + responseDTO.getData().getGuildId(), + responseDTO.getData().getMasterUserId(), + List.of(new Member("Guild", 1L, 2L, "motive", AcceptStatus.PENDING)) + ); + + var modifiedGuildDTO = guildService.applyMemberToGuild(memberRequestDTO); + assertThat(modifiedGuildDTO).isNotNull(); + assertThat(modifiedGuildDTO.getData().getGuildMemberList()).hasSize(1); + } + + @Test + @DisplayName("Guild 삭제 테스트") + void deleteGuildTest() { + GuildRegistRequestDTO requestDTO = new GuildRegistRequestDTO("Test Guild", "Test Guild Introduction", 1L, 1000); + var responseDTO = guildService.createGuild(requestDTO); + + Long guildId = responseDTO.getData().getGuildId(); + guildService.deleteGuild(guildId); + + assertThrows(IllegalArgumentException.class, () -> guildViewService.findGuildDetailByGuildId(guildId)); + } } diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java index fe70921..a15c9c1 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/UserCharacterCRUDTest.java @@ -2,6 +2,7 @@ import com.mtvs.devlinkbackend.character.dto.request.UserCharacterRegistRequestDTO; import com.mtvs.devlinkbackend.character.dto.request.UserCharacterUpdateRequestDTO; +import com.mtvs.devlinkbackend.character.entity.CharacterPicture; import com.mtvs.devlinkbackend.character.entity.CustomInfo; import com.mtvs.devlinkbackend.character.service.UserCharacterService; import com.mtvs.devlinkbackend.character.service.UserCharacterViewService; @@ -36,7 +37,7 @@ private static Stream registUserCharacter() { List.of(1L, 2L), List.of(new CustomInfo(1, "", "", 1), new CustomInfo(1, "", "", 1)), - "" + new CharacterPicture(1.0F, 1.0F, 1.0F, 1.0F) ), "계정3"), Arguments.of(new UserCharacterRegistRequestDTO( 1L, @@ -44,7 +45,7 @@ private static Stream registUserCharacter() { List.of(1L, 2L), List.of(new CustomInfo(1, "", "", 1), new CustomInfo(1, "", "", 1)), - "" + new CharacterPicture(1.0F, 1.0F, 1.0F, 1.0F) ), "계정4") ); } @@ -57,7 +58,7 @@ private static Stream modifyUserCharacter() { List.of(1L, 2L), List.of(new CustomInfo(1, "", "", 1), new CustomInfo(1, "", "", 1)), - "" + new CharacterPicture(1.0F, 1.0F, 1.0F, 1.0F) ), "계정1"), Arguments.of(new UserCharacterUpdateRequestDTO( 1L, @@ -65,7 +66,7 @@ private static Stream modifyUserCharacter() { List.of(1L, 2L), List.of(new CustomInfo(1, "", "", 1), new CustomInfo(1, "", "", 1)), - "" + new CharacterPicture(1.0F, 1.0F, 1.0F, 1.0F) ), "계정2") ); } @@ -78,7 +79,7 @@ public void setUp() { List.of(1L, 2L), List.of(new CustomInfo(1, "", "", 1), new CustomInfo(1, "", "", 1)), - "" + new CharacterPicture(1.0F, 1.0F, 1.0F, 1.0F) ), "계정1"); userCharacterService.registCharacter(new UserCharacterRegistRequestDTO( 1L, @@ -86,7 +87,7 @@ public void setUp() { List.of(1L, 2L), List.of(new CustomInfo(1, "", "", 1), new CustomInfo(1, "", "", 1)), - "" + new CharacterPicture(1.0F, 1.0F, 1.0F, 1.0F) ), "계정2"); }