From 302b36f59d6ef275459423be774f4f8ca5f2a15f Mon Sep 17 00:00:00 2001 From: HEX <123macanic@naver.com> Date: Sun, 13 Oct 2024 21:14:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20=EA=B8=B8=EB=93=9C=20CRUD=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guild/controller/GuildController.java | 134 ++++++++++++++++++ .../dto/GuildMemberModifyRequestDTO.java | 14 ++ .../guild/dto/GuildRegistRequestDTO.java | 16 +++ .../guild/dto/GuildUpdateRequestDTO.java | 19 +++ .../devlinkbackend/guild/entity/Guild.java | 100 +++++++++++++ .../guild/repository/GuildRepository.java | 17 +++ .../guild/service/GuildService.java | 97 +++++++++++++ .../mtvs/devlinkbackend/team/entity/Team.java | 11 ++ 8 files changed, 408 insertions(+) create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildRegistRequestDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildUpdateRequestDTO.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java create mode 100644 src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java new file mode 100644 index 0000000..b0a4c0e --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/controller/GuildController.java @@ -0,0 +1,134 @@ +package com.mtvs.devlinkbackend.guild.controller; + +import com.mtvs.devlinkbackend.config.JwtUtil; +import com.mtvs.devlinkbackend.guild.dto.GuildMemberModifyRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.GuildRegistRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.GuildUpdateRequestDTO; +import com.mtvs.devlinkbackend.guild.entity.Guild; +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.*; + +import java.util.List; + +@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 Guild createGuild( + @RequestBody GuildRegistRequestDTO guildRegistRequestDTO, + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader); + return guildService.createGuild(guildRegistRequestDTO, accountId); + } + + @Operation(summary = "길드 조회", description = "길드 ID로 길드를 조회합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "길드가 성공적으로 조회되었습니다."), + @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") + }) + @GetMapping("/{guildId}") + public Guild findGuildByGuildId(@PathVariable Long guildId) { + return guildService.findGuildByGuildId(guildId); + } + + @Operation(summary = "길드 이름 검색", description = "이름이 특정 문자열을 포함하는 길드 목록을 조회합니다.") + @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") + @GetMapping("/search") + public List findGuildsByGuildNameContaining(@RequestParam String guildName) { + return guildService.findGuildsByGuildNameContaining(guildName); + } + + @Operation(summary = "사용자가 소유자인 길드 조회", description = "사용자가 소유자인 길드를 조회합니다.") + @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") + @GetMapping("/owner") + public List findGuildsByOwnerId( + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String ownerId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader); + return guildService.findGuildsByOwnerId(ownerId); + } + + @Operation(summary = "사용자가 멤버인 길드 조회", description = "사용자가 멤버인 길드를 조회합니다.") + @ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.") + @GetMapping("/member") + public List findGuildsByMemberIdContaining( + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String memberId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader); + return guildService.findGuildsByMemberIdContaining(memberId); + } + + @Operation(summary = "길드 수정", description = "길드 정보를 수정합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "길드가 성공적으로 수정되었습니다."), + @ApiResponse(responseCode = "403", description = "수정 권한이 없습니다."), + @ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.") + }) + @PatchMapping + public Guild updateGuild( + @RequestBody GuildUpdateRequestDTO guildUpdateRequestDTO, + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(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 Guild addMemberToGuild( + @RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(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 Guild removeMemberFromGuild( + @RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, + @RequestHeader(name = "Authorization") String authorizationHeader) throws Exception { + + String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(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/dto/GuildMemberModifyRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java new file mode 100644 index 0000000..afcbb2b --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java @@ -0,0 +1,14 @@ +package com.mtvs.devlinkbackend.guild.dto; + +import lombok.*; + +import java.util.List; + +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GuildMemberModifyRequestDTO { + private Long guildId; + private List newMemberId; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildRegistRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildRegistRequestDTO.java new file mode 100644 index 0000000..8829192 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildRegistRequestDTO.java @@ -0,0 +1,16 @@ +package com.mtvs.devlinkbackend.guild.dto; + +import lombok.*; + +import java.util.List; + +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GuildRegistRequestDTO { + private String guildName; + private String introduction; + private Long maximumMember; + private List memberList; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildUpdateRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildUpdateRequestDTO.java new file mode 100644 index 0000000..c7ace17 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildUpdateRequestDTO.java @@ -0,0 +1,19 @@ +package com.mtvs.devlinkbackend.guild.dto; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class GuildUpdateRequestDTO { + private Long guildId; + private String guildName; + private String introduction; + private Long maximumMember; + private List memberList; + private Long channelId; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java b/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java new file mode 100644 index 0000000..3a00a33 --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java @@ -0,0 +1,100 @@ +package com.mtvs.devlinkbackend.guild.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Table(name = "GUILD") +@Entity(name = "Guild") +@ToString +@NoArgsConstructor +@Getter +public class Guild { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "GUILD_ID") + private Long guildId; + + @Column(name = "OWNER_ID") + private String ownerId; + + @Column(name = "GUILD_NAME") + private String guildName; + + @Column(name = "INTRODUCTION") + private String introduction; + + @Column(name = "MAXIMUM_MEMBER") + private Long maximumMember; + + @Column(name = "CHANNEL_ID") + private Long channelId; + + @ElementCollection + @CollectionTable(name = "GUILD_MEMBER", joinColumns = @JoinColumn(name = "GUILD_ID")) + private List memberList = new ArrayList<>(); + + @CreationTimestamp + @Column(name = "CREATED_AT", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "MODIFIED_AT") + private LocalDateTime modifiedAt; + + public Guild(String ownerId, String guildName, String introduction, Long maximumMember, List memberList) { + this.ownerId = ownerId; + this.guildName = guildName; + this.introduction = introduction; + this.maximumMember = maximumMember; + this.memberList = memberList; + } + + 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 = memberList; + this.channelId = channelId; + } + + public void setOwnerId(String ownerId) { + this.ownerId = ownerId; + } + + public void setGuildName(String guildName) { + this.guildName = guildName; + } + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + public void setMaximumMember(Long maximumMember) { + this.maximumMember = maximumMember; + } + + public void setChannelId(Long channelId) { + this.channelId = channelId; + } + + public void setMemberList(List memberList) { + this.memberList = memberList; + } + + public void addMemberList(String memberId) { + this.memberList.add(memberId); + } + + public void removeMemberList(String memberId) { + this.memberList.remove(memberId); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java b/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java new file mode 100644 index 0000000..3b92bcc --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/repository/GuildRepository.java @@ -0,0 +1,17 @@ +package com.mtvs.devlinkbackend.guild.repository; + +import com.mtvs.devlinkbackend.guild.entity.Guild; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@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); +} diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java new file mode 100644 index 0000000..d94cd1f --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java @@ -0,0 +1,97 @@ +package com.mtvs.devlinkbackend.guild.service; + +import com.mtvs.devlinkbackend.guild.dto.GuildMemberModifyRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.GuildRegistRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.GuildUpdateRequestDTO; +import com.mtvs.devlinkbackend.guild.entity.Guild; +import com.mtvs.devlinkbackend.guild.repository.GuildRepository; +import jakarta.transaction.Transactional; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class GuildService { + + private final GuildRepository guildRepository; + + public GuildService(GuildRepository guildRepository) { + this.guildRepository = guildRepository; + } + + @Transactional + public Guild createGuild(GuildRegistRequestDTO guildRegistRequestDTO, String accountId) { + return guildRepository.save(new Guild( + accountId, + guildRegistRequestDTO.getGuildName(), + guildRegistRequestDTO.getIntroduction(), + guildRegistRequestDTO.getMaximumMember(), + guildRegistRequestDTO.getMemberList() + )); + } + + public Guild findGuildByGuildId(Long guildId) { + return guildRepository.findById(guildId).orElse(null); + } + + public List findGuildsByGuildNameContaining(String guildName) { + return guildRepository.findGuildsByGuildNameContaining(guildName); + } + + public List findGuildsByOwnerId(String ownerId) { + return guildRepository.findGuildsByOwnerId(ownerId); + } + + public List findGuildsByMemberIdContaining(String memberId) { + return guildRepository.findGuildsByMemberIdContaining(memberId); + } + + @Transactional + public Guild updateGuild(GuildUpdateRequestDTO guildUpdateRequestDTO, String accountId) { + 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 foundGuild; + } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); + } else return null; + } + + @Transactional + public Guild addMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, String accountId) { + Optional guild = guildRepository.findById(guildMemberModifyRequestDTO.getGuildId()); + if (guild.isPresent()) { + Guild foundGuild = guild.get(); + if(foundGuild.getOwnerId().equals(accountId)) { + for(String memberId : foundGuild.getMemberList()) { + foundGuild.addMemberList(memberId); + } + return foundGuild; + } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); + } else return null; + } + + @Transactional + public Guild removeMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, String accountId) { + Optional guild = guildRepository.findById(guildMemberModifyRequestDTO.getGuildId()); + if (guild.isPresent()) { + Guild foundGuild = guild.get(); + if(foundGuild.getOwnerId().equals(accountId)) { + for(String memberId : foundGuild.getMemberList()) { + foundGuild.removeMemberList(memberId); + } + return foundGuild; + } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); + } else return null; + } + + public void deleteGuild(Long guildId) { + guildRepository.deleteById(guildId); + } +} diff --git a/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java b/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java index 08b05ab..c59ecf6 100644 --- a/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java +++ b/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java @@ -4,7 +4,10 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -33,6 +36,14 @@ public class Team { @Column(name = "MEMBER_LIST") private List memberList = new ArrayList<>(); + @CreationTimestamp + @Column(name = "CREATED_AT", updatable = false) + private LocalDateTime createdAt; + + @UpdateTimestamp + @Column(name = "MODIFIED_AT") + private LocalDateTime modifiedAt; + public Team(String pmId, String teamName, String introduction, List memberList) { this.pmId = pmId; this.teamName = teamName; From ae805c13b35ab47f483c1b18fe7ff992be8b741a Mon Sep 17 00:00:00 2001 From: HEX <123macanic@naver.com> Date: Sun, 13 Oct 2024 21:16:33 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Refactor:=20TestCode=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{comment => crud}/CommentCRUDTest.java | 2 +- .../devlinkbackend/{ether => crud}/EtherCRUDTest.java | 6 +----- .../com/mtvs/devlinkbackend/crud/GuildCRUDTest.java | 10 ++++++++++ .../{question => crud}/QuestionCRUDTest.java | 2 +- .../devlinkbackend/{reply => crud}/ReplyCRUDTest.java | 4 +--- .../{request => crud}/RequestCRUDTest.java | 2 +- .../devlinkbackend/{team => crud}/TeamCRUDTest.java | 3 +-- 7 files changed, 16 insertions(+), 13 deletions(-) rename src/test/java/com/mtvs/devlinkbackend/{comment => crud}/CommentCRUDTest.java (98%) rename src/test/java/com/mtvs/devlinkbackend/{ether => crud}/EtherCRUDTest.java (92%) create mode 100644 src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java rename src/test/java/com/mtvs/devlinkbackend/{question => crud}/QuestionCRUDTest.java (98%) rename src/test/java/com/mtvs/devlinkbackend/{reply => crud}/ReplyCRUDTest.java (94%) rename src/test/java/com/mtvs/devlinkbackend/{request => crud}/RequestCRUDTest.java (98%) rename src/test/java/com/mtvs/devlinkbackend/{team => crud}/TeamCRUDTest.java (97%) diff --git a/src/test/java/com/mtvs/devlinkbackend/comment/CommentCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/CommentCRUDTest.java similarity index 98% rename from src/test/java/com/mtvs/devlinkbackend/comment/CommentCRUDTest.java rename to src/test/java/com/mtvs/devlinkbackend/crud/CommentCRUDTest.java index f408a98..451166f 100644 --- a/src/test/java/com/mtvs/devlinkbackend/comment/CommentCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/CommentCRUDTest.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.comment; +package com.mtvs.devlinkbackend.crud; import com.mtvs.devlinkbackend.comment.dto.CommentRegistRequestDTO; import com.mtvs.devlinkbackend.comment.dto.CommentUpdateRequestDTO; diff --git a/src/test/java/com/mtvs/devlinkbackend/ether/EtherCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/EtherCRUDTest.java similarity index 92% rename from src/test/java/com/mtvs/devlinkbackend/ether/EtherCRUDTest.java rename to src/test/java/com/mtvs/devlinkbackend/crud/EtherCRUDTest.java index af47872..071e709 100644 --- a/src/test/java/com/mtvs/devlinkbackend/ether/EtherCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/EtherCRUDTest.java @@ -1,17 +1,13 @@ -package com.mtvs.devlinkbackend.ether; +package com.mtvs.devlinkbackend.crud; import com.mtvs.devlinkbackend.ether.dto.EtherRegistRequestDTO; import com.mtvs.devlinkbackend.ether.dto.EtherUpdateRequestDTO; import com.mtvs.devlinkbackend.ether.service.EtherService; -import com.mtvs.devlinkbackend.question.dto.QuestionRegistRequestDTO; -import com.mtvs.devlinkbackend.question.dto.QuestionUpdateRequestDTO; -import com.mtvs.devlinkbackend.question.service.QuestionService; import org.junit.jupiter.api.Assertions; 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.CsvSource; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java new file mode 100644 index 0000000..4811336 --- /dev/null +++ b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java @@ -0,0 +1,10 @@ +package com.mtvs.devlinkbackend.crud; + +import jakarta.transaction.Transactional; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@Transactional +public class GuildCRUDTest { + +} diff --git a/src/test/java/com/mtvs/devlinkbackend/question/QuestionCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/QuestionCRUDTest.java similarity index 98% rename from src/test/java/com/mtvs/devlinkbackend/question/QuestionCRUDTest.java rename to src/test/java/com/mtvs/devlinkbackend/crud/QuestionCRUDTest.java index c9e526d..6a3c9d5 100644 --- a/src/test/java/com/mtvs/devlinkbackend/question/QuestionCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/QuestionCRUDTest.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.question; +package com.mtvs.devlinkbackend.crud; import com.mtvs.devlinkbackend.question.dto.QuestionRegistRequestDTO; import com.mtvs.devlinkbackend.question.dto.QuestionUpdateRequestDTO; diff --git a/src/test/java/com/mtvs/devlinkbackend/reply/ReplyCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/ReplyCRUDTest.java similarity index 94% rename from src/test/java/com/mtvs/devlinkbackend/reply/ReplyCRUDTest.java rename to src/test/java/com/mtvs/devlinkbackend/crud/ReplyCRUDTest.java index 72f2081..41c8346 100644 --- a/src/test/java/com/mtvs/devlinkbackend/reply/ReplyCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/ReplyCRUDTest.java @@ -1,7 +1,5 @@ -package com.mtvs.devlinkbackend.reply; +package com.mtvs.devlinkbackend.crud; -import com.mtvs.devlinkbackend.question.dto.QuestionRegistRequestDTO; -import com.mtvs.devlinkbackend.question.dto.QuestionUpdateRequestDTO; import com.mtvs.devlinkbackend.reply.dto.ReplyRegistRequestDTO; import com.mtvs.devlinkbackend.reply.dto.ReplyUpdateRequestDTO; import com.mtvs.devlinkbackend.reply.service.ReplyService; diff --git a/src/test/java/com/mtvs/devlinkbackend/request/RequestCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/RequestCRUDTest.java similarity index 98% rename from src/test/java/com/mtvs/devlinkbackend/request/RequestCRUDTest.java rename to src/test/java/com/mtvs/devlinkbackend/crud/RequestCRUDTest.java index 1f5a169..80268c0 100644 --- a/src/test/java/com/mtvs/devlinkbackend/request/RequestCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/RequestCRUDTest.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.request; +package com.mtvs.devlinkbackend.crud; import com.mtvs.devlinkbackend.request.dto.RequestRegistRequestDTO; import com.mtvs.devlinkbackend.request.dto.RequestUpdateRequestDTO; diff --git a/src/test/java/com/mtvs/devlinkbackend/team/TeamCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/TeamCRUDTest.java similarity index 97% rename from src/test/java/com/mtvs/devlinkbackend/team/TeamCRUDTest.java rename to src/test/java/com/mtvs/devlinkbackend/crud/TeamCRUDTest.java index 3778a24..1c81c3c 100644 --- a/src/test/java/com/mtvs/devlinkbackend/team/TeamCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/TeamCRUDTest.java @@ -1,4 +1,4 @@ -package com.mtvs.devlinkbackend.team; +package com.mtvs.devlinkbackend.crud; import com.mtvs.devlinkbackend.team.dto.TeamRegistRequestDTO; import com.mtvs.devlinkbackend.team.dto.TeamUpdateRequestDTO; @@ -9,7 +9,6 @@ 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.CsvSource; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; From ef7810ded9e90e64e55826980276fe7cece9b7ab Mon Sep 17 00:00:00 2001 From: HEX <123macanic@naver.com> Date: Sun, 13 Oct 2024 21:31:11 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Test:=20=EA=B8=B8=EB=93=9C=20CRUD=20TestCod?= =?UTF-8?q?e=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/GuildMemberModifyRequestDTO.java | 2 +- .../devlinkbackend/guild/entity/Guild.java | 14 +-- .../guild/service/GuildService.java | 8 +- .../team/dto/TeamMemberModifyRequestDTO.java | 15 +++ .../mtvs/devlinkbackend/team/entity/Team.java | 8 -- .../team/service/TeamService.java | 26 +++++ .../devlinkbackend/crud/GuildCRUDTest.java | 96 +++++++++++++++++++ 7 files changed, 143 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/mtvs/devlinkbackend/team/dto/TeamMemberModifyRequestDTO.java diff --git a/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java index afcbb2b..5968ebb 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/dto/GuildMemberModifyRequestDTO.java @@ -10,5 +10,5 @@ @ToString public class GuildMemberModifyRequestDTO { private Long guildId; - private List newMemberId; + private List newMemberList; } 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 3a00a33..aa69b20 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java @@ -54,7 +54,7 @@ public Guild(String ownerId, String guildName, String introduction, Long maximum this.guildName = guildName; this.introduction = introduction; this.maximumMember = maximumMember; - this.memberList = memberList; + this.memberList = new ArrayList<>(memberList); } public Guild(String ownerId, String guildName, String introduction, Long maximumMember, List memberList, Long channelId) { @@ -62,7 +62,7 @@ public Guild(String ownerId, String guildName, String introduction, Long maximum this.guildName = guildName; this.introduction = introduction; this.maximumMember = maximumMember; - this.memberList = memberList; + this.memberList = new ArrayList<>(memberList); this.channelId = channelId; } @@ -87,14 +87,6 @@ public void setChannelId(Long channelId) { } public void setMemberList(List memberList) { - this.memberList = memberList; - } - - public void addMemberList(String memberId) { - this.memberList.add(memberId); - } - - public void removeMemberList(String memberId) { - this.memberList.remove(memberId); + this.memberList = new ArrayList<>(memberList); } } 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 d94cd1f..31c6915 100644 --- a/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java +++ b/src/main/java/com/mtvs/devlinkbackend/guild/service/GuildService.java @@ -69,9 +69,7 @@ public Guild addMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyReque if (guild.isPresent()) { Guild foundGuild = guild.get(); if(foundGuild.getOwnerId().equals(accountId)) { - for(String memberId : foundGuild.getMemberList()) { - foundGuild.addMemberList(memberId); - } + foundGuild.getMemberList().addAll(guildMemberModifyRequestDTO.getNewMemberList()); return foundGuild; } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); } else return null; @@ -83,9 +81,7 @@ public Guild removeMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRe if (guild.isPresent()) { Guild foundGuild = guild.get(); if(foundGuild.getOwnerId().equals(accountId)) { - for(String memberId : foundGuild.getMemberList()) { - foundGuild.removeMemberList(memberId); - } + foundGuild.getMemberList().removeAll(guildMemberModifyRequestDTO.getNewMemberList()); return foundGuild; } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); } else return null; diff --git a/src/main/java/com/mtvs/devlinkbackend/team/dto/TeamMemberModifyRequestDTO.java b/src/main/java/com/mtvs/devlinkbackend/team/dto/TeamMemberModifyRequestDTO.java new file mode 100644 index 0000000..0fd420d --- /dev/null +++ b/src/main/java/com/mtvs/devlinkbackend/team/dto/TeamMemberModifyRequestDTO.java @@ -0,0 +1,15 @@ +package com.mtvs.devlinkbackend.team.dto; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class TeamMemberModifyRequestDTO { + private Long teamId; + private List newMemberList; +} diff --git a/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java b/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java index c59ecf6..07758f8 100644 --- a/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java +++ b/src/main/java/com/mtvs/devlinkbackend/team/entity/Team.java @@ -66,12 +66,4 @@ public void setIntroduction(String introduction) { public void setMemberList(List memberList) { this.memberList = memberList; } - - public void addMember(String memberId) { - this.memberList.add(memberId); - } - - public void removeMember(String memberId) { - this.memberList.remove(memberId); - } } diff --git a/src/main/java/com/mtvs/devlinkbackend/team/service/TeamService.java b/src/main/java/com/mtvs/devlinkbackend/team/service/TeamService.java index cc1d0ae..8a93aba 100644 --- a/src/main/java/com/mtvs/devlinkbackend/team/service/TeamService.java +++ b/src/main/java/com/mtvs/devlinkbackend/team/service/TeamService.java @@ -1,5 +1,7 @@ package com.mtvs.devlinkbackend.team.service; +import com.mtvs.devlinkbackend.guild.entity.Guild; +import com.mtvs.devlinkbackend.team.dto.TeamMemberModifyRequestDTO; import com.mtvs.devlinkbackend.team.dto.TeamRegistRequestDTO; import com.mtvs.devlinkbackend.team.dto.TeamUpdateRequestDTO; import com.mtvs.devlinkbackend.team.entity.Team; @@ -58,6 +60,30 @@ public Team updateTeam(TeamUpdateRequestDTO teamUpdateRequestDTO, String account } else throw new IllegalArgumentException("해당 Team은 존재하지 않음"); } + @Transactional + public Team addMemberToTeam(TeamMemberModifyRequestDTO teamMemberModifyRequestDTO, String accountId) { + Optional team = teamRepository.findById(teamMemberModifyRequestDTO.getTeamId()); + if (team.isPresent()) { + Team foundTeam = team.get(); + if(foundTeam.getPmId().equals(accountId)) { + foundTeam.getMemberList().addAll(teamMemberModifyRequestDTO.getNewMemberList()); + return foundTeam; + } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); + } else return null; + } + + @Transactional + public Team removeMemberToTeam(TeamMemberModifyRequestDTO teamMemberModifyRequestDTO, String accountId) { + Optional team = teamRepository.findById(teamMemberModifyRequestDTO.getTeamId()); + if (team.isPresent()) { + Team foundTeam = team.get(); + if(foundTeam.getPmId().equals(accountId)) { + foundTeam.getMemberList().removeAll(teamMemberModifyRequestDTO.getNewMemberList()); + return foundTeam; + } else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도"); + } else return null; + } + public void deleteTeam(Long teamId) { teamRepository.deleteById(teamId); } diff --git a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java index 4811336..c525192 100644 --- a/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java +++ b/src/test/java/com/mtvs/devlinkbackend/crud/GuildCRUDTest.java @@ -1,10 +1,106 @@ package com.mtvs.devlinkbackend.crud; +import com.mtvs.devlinkbackend.guild.dto.GuildMemberModifyRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.GuildRegistRequestDTO; +import com.mtvs.devlinkbackend.guild.dto.GuildUpdateRequestDTO; +import com.mtvs.devlinkbackend.guild.entity.Guild; +import com.mtvs.devlinkbackend.guild.repository.GuildRepository; +import com.mtvs.devlinkbackend.guild.service.GuildService; import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +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 static org.junit.jupiter.api.Assertions.*; + @SpringBootTest @Transactional public class GuildCRUDTest { + @Autowired + private GuildService guildService; + + @Autowired + private GuildRepository guildRepository; + + private Guild guild; + + @BeforeEach + public void setUp() { + guild = guildService.createGuild( + new GuildRegistRequestDTO("테스트 길드", "테스트 길드 소개", 10L, List.of("member1", "member2")), + "testOwner" + ); + } + + @Test + public void testCreateGuild() { + assertNotNull(guild); + assertEquals("테스트 길드", guild.getGuildName()); + assertEquals("testOwner", guild.getOwnerId()); + } + + @Test + public void testFindGuildByGuildId() { + Guild foundGuild = guildService.findGuildByGuildId(guild.getGuildId()); + assertNotNull(foundGuild); + assertEquals(guild.getGuildId(), foundGuild.getGuildId()); + } + + @Test + public void testFindGuildsByGuildNameContaining() { + List foundGuilds = guildService.findGuildsByGuildNameContaining("테스트"); + assertFalse(foundGuilds.isEmpty()); + assertTrue(foundGuilds.stream().anyMatch(g -> g.getGuildName().contains("테스트"))); + } + + @Test + public void testFindGuildsByOwnerId() { + List foundGuilds = guildService.findGuildsByOwnerId("testOwner"); + assertFalse(foundGuilds.isEmpty()); + assertTrue(foundGuilds.stream().anyMatch(g -> g.getOwnerId().equals("testOwner"))); + } + + @Test + public void testUpdateGuild() { + GuildUpdateRequestDTO updateRequest = new GuildUpdateRequestDTO( + guild.getGuildId(), "업데이트 길드 이름", "업데이트 소개", 15L, List.of("member1"), 1L + ); + + Guild updatedGuild = guildService.updateGuild(updateRequest, "testOwner"); + assertNotNull(updatedGuild); + assertEquals("업데이트 길드 이름", updatedGuild.getGuildName()); + assertEquals(1L, updatedGuild.getChannelId()); + } + + @Test + public void testAddMemberToGuild() { + GuildMemberModifyRequestDTO addRequest = new GuildMemberModifyRequestDTO( + guild.getGuildId(), List.of("newMember") + ); + + Guild updatedGuild = guildService.addMemberToGuild(addRequest, "testOwner"); + assertNotNull(updatedGuild); + assertTrue(updatedGuild.getMemberList().contains("newMember")); + } + + @Test + public void testRemoveMemberToGuild() { + GuildMemberModifyRequestDTO removeRequest = new GuildMemberModifyRequestDTO( + guild.getGuildId(), List.of("member1") + ); + + Guild updatedGuild = guildService.removeMemberToGuild(removeRequest, "testOwner"); + assertNotNull(updatedGuild); + assertFalse(updatedGuild.getMemberList().contains("member1")); + } + @Test + public void testDeleteGuild() { + guildService.deleteGuild(guild.getGuildId()); + Guild deletedGuild = guildService.findGuildByGuildId(guild.getGuildId()); + assertNull(deletedGuild); + } }