From 67f8882ddc1b8af0ac57961ddc2992cd1207c898 Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Sat, 13 Jul 2024 19:16:11 +0900 Subject: [PATCH 1/6] =?UTF-8?q?:fire:=20fix:=20=EA=B7=B8=EB=A3=B9=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=EC=A1=B0=ED=9A=8C=20endpoint=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#17)=20-=20POST=20/groups/create=20->=20P?= =?UTF-8?q?OST=20/groups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../khu/toyouserver/presentation/GroupController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java index dce9f80..13c4311 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java @@ -1,8 +1,6 @@ package slvtwn.khu.toyouserver.presentation; -import java.util.List; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -17,11 +15,11 @@ public class GroupController { private final GroupService groupService; - @PostMapping("/groups/create") + @PostMapping("/groups") public GroupResponse createGroup(@RequestBody GroupCreateRequest request) { return groupService.create(request.name()); } - + @PostMapping("/groups/{groupId}/members") public GroupResponse registerMember(@PathVariable long groupId) { return groupService.registerUser(groupId, 1L); // TODO: user -> argumentResolver 등록 필요 From a2da75efc56af7f44341799ddf737780038e705e Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Sun, 14 Jul 2024 17:37:33 +0900 Subject: [PATCH 2/6] =?UTF-8?q?:fire:=20fix:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=84=B8=EC=85=98=20=ED=85=8C=EC=9D=B4=EB=B8=94=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#17)=20session=5Fuser=20->=20session=5Fus?= =?UTF-8?q?ers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/slvtwn/khu/toyouserver/domain/SessionUser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/slvtwn/khu/toyouserver/domain/SessionUser.java b/src/main/java/slvtwn/khu/toyouserver/domain/SessionUser.java index 21383a6..9afe297 100644 --- a/src/main/java/slvtwn/khu/toyouserver/domain/SessionUser.java +++ b/src/main/java/slvtwn/khu/toyouserver/domain/SessionUser.java @@ -3,12 +3,14 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import slvtwn.khu.toyouserver.common.BaseTimeEntity; @Entity +@Table(name = "session_users") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class SessionUser extends BaseTimeEntity { @@ -20,6 +22,8 @@ public class SessionUser extends BaseTimeEntity { @Column(name = "user_id", nullable = false) private Long userId; + // TODO ; 카드 + public SessionUser(String sessionId, Long userId) { this.sessionId = sessionId; this.userId = userId; From b5367d676f52090057ed375802e90691c463dcda Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Sun, 14 Jul 2024 18:11:42 +0900 Subject: [PATCH 3/6] =?UTF-8?q?:sparkles:=20feat:=20=EA=B0=80=EC=9E=85?= =?UTF-8?q?=ED=95=9C=20=EC=9C=A0=EC=A0=80=20=EC=A1=B0=ED=9A=8CAPI=20Presen?= =?UTF-8?q?tation=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../khu/toyouserver/presentation/GroupController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java b/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java index 13c4311..7505f91 100644 --- a/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java +++ b/src/main/java/slvtwn/khu/toyouserver/presentation/GroupController.java @@ -1,11 +1,15 @@ package slvtwn.khu.toyouserver.presentation; +import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import slvtwn.khu.toyouserver.application.GroupService; +import slvtwn.khu.toyouserver.common.UserAuthentication; +import slvtwn.khu.toyouserver.domain.User; import slvtwn.khu.toyouserver.dto.GroupCreateRequest; import slvtwn.khu.toyouserver.dto.GroupResponse; @@ -24,4 +28,9 @@ public GroupResponse createGroup(@RequestBody GroupCreateRequest request) { public GroupResponse registerMember(@PathVariable long groupId) { return groupService.registerUser(groupId, 1L); // TODO: user -> argumentResolver 등록 필요 } + + @GetMapping("/groups") + public List findRegisteredGroups(@UserAuthentication User user) { + return groupService.findRegisteredGroups(user.getId()); + } } From 9b804e3fe3149f07506c555805149dc3430189ab Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Sun, 14 Jul 2024 18:12:28 +0900 Subject: [PATCH 4/6] =?UTF-8?q?:sparkles:=20feat:=20=EA=B0=80=EC=9E=85?= =?UTF-8?q?=ED=95=9C=20=EC=9C=A0=EC=A0=80=20=EC=A1=B0=ED=9A=8CAPI=20Applic?= =?UTF-8?q?ation=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../slvtwn/khu/toyouserver/application/GroupService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java b/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java index 62ba856..3841903 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java @@ -41,4 +41,12 @@ public GroupResponse create(String name) { Group savedGroup = groupRepository.save(group); return new GroupResponse(savedGroup.getId(), savedGroup.getName()); } + + @Transactional(readOnly = true) + public List findRegisteredGroups(long userId) { + List groups = memberRepository.findGroupsByUserId(userId); + return groups.stream() + .map(group -> new GroupResponse(group.getId(), group.getName())) + .toList(); + } } From af64d2bd3f51ccfdb2017696b14493d081a9e661 Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Sun, 14 Jul 2024 18:23:22 +0900 Subject: [PATCH 5/6] =?UTF-8?q?:recycle:=20refactor:=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=EA=B7=B8=EB=A3=B9=20=EA=B0=80=EC=9E=85=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20Member=20=EC=9C=84=EC=9E=84=20API=20Application=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toyouserver/application/GroupService.java | 21 ++++------- .../application/MemberService.java | 35 +++++++++++++++++++ .../slvtwn/khu/toyouserver/domain/Member.java | 29 ++++++++------- .../toyouserver/domain/MemberRepository.java | 4 +++ 4 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 src/main/java/slvtwn/khu/toyouserver/application/MemberService.java diff --git a/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java b/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java index 3841903..c886d5c 100644 --- a/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java +++ b/src/main/java/slvtwn/khu/toyouserver/application/GroupService.java @@ -1,38 +1,31 @@ package slvtwn.khu.toyouserver.application; +import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import slvtwn.khu.toyouserver.common.ErrorType; import slvtwn.khu.toyouserver.domain.Group; import slvtwn.khu.toyouserver.domain.MemberRepository; -import slvtwn.khu.toyouserver.domain.User; import slvtwn.khu.toyouserver.dto.GroupResponse; -import slvtwn.khu.toyouserver.exception.ToyouException; import slvtwn.khu.toyouserver.persistance.GroupRepository; -import slvtwn.khu.toyouserver.persistance.UserRepository; @Service -@Transactional(readOnly = true) public class GroupService { private final GroupRepository groupRepository; - private final UserRepository userRepository; private final MemberRepository memberRepository; + private final MemberService memberService; - public GroupService(GroupRepository groupRepository, UserRepository userRepository, - MemberRepository memberRepository) { + public GroupService(GroupRepository groupRepository, + MemberRepository memberRepository, MemberService memberService) { this.groupRepository = groupRepository; - this.userRepository = userRepository; this.memberRepository = memberRepository; + this.memberService = memberService; } @Transactional public GroupResponse registerUser(long groupId, long userId) { - Group group = groupRepository.findById(groupId) - .orElseThrow(() -> new ToyouException(ErrorType.GROUP_NOT_FOUND)); - User user = userRepository.findById(userId) - .orElseThrow(() -> new ToyouException(ErrorType.USER_NOT_FOUND)); - return new GroupResponse(group.getId(), group.getName()); + Group savedGroup = memberService.registerMember(groupId, userId).getGroup(); + return new GroupResponse(savedGroup.getId(), savedGroup.getName()); } @Transactional diff --git a/src/main/java/slvtwn/khu/toyouserver/application/MemberService.java b/src/main/java/slvtwn/khu/toyouserver/application/MemberService.java new file mode 100644 index 0000000..5eb8581 --- /dev/null +++ b/src/main/java/slvtwn/khu/toyouserver/application/MemberService.java @@ -0,0 +1,35 @@ +package slvtwn.khu.toyouserver.application; + +import org.springframework.stereotype.Service; +import slvtwn.khu.toyouserver.common.ErrorType; +import slvtwn.khu.toyouserver.domain.Group; +import slvtwn.khu.toyouserver.domain.Member; +import slvtwn.khu.toyouserver.domain.MemberRepository; +import slvtwn.khu.toyouserver.domain.User; +import slvtwn.khu.toyouserver.exception.ToyouException; +import slvtwn.khu.toyouserver.persistance.GroupRepository; +import slvtwn.khu.toyouserver.persistance.UserRepository; + +@Service +public class MemberService { + + private final UserRepository userRepository; + private final MemberRepository memberRepository; + private final GroupRepository groupRepository; + + + public MemberService(GroupRepository groupRepository, UserRepository userRepository, + MemberRepository memberRepository) { + this.groupRepository = groupRepository; + this.userRepository = userRepository; + this.memberRepository = memberRepository; + } + + public Member registerMember(long groupId, long userId) { + Group group = groupRepository.findById(groupId) + .orElseThrow(() -> new ToyouException(ErrorType.GROUP_NOT_FOUND)); + User user = userRepository.findById(userId) + .orElseThrow(() -> new ToyouException(ErrorType.USER_NOT_FOUND)); + return memberRepository.save(new Member(user, group)); + } +} diff --git a/src/main/java/slvtwn/khu/toyouserver/domain/Member.java b/src/main/java/slvtwn/khu/toyouserver/domain/Member.java index c47ecb1..140d709 100644 --- a/src/main/java/slvtwn/khu/toyouserver/domain/Member.java +++ b/src/main/java/slvtwn/khu/toyouserver/domain/Member.java @@ -16,19 +16,24 @@ @Getter public class Member extends BaseTimeEntity { - @Id - @GeneratedValue - private Long id; + @Id + @GeneratedValue + private Long id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "group_id") - private Group group; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "group_id") + private Group group; - public Member(Group group) { - this.group = group; - } + public Member(Group group) { + this.group = group; + } + + public Member(User user, Group group) { + this.user = user; + this.group = group; + } } diff --git a/src/main/java/slvtwn/khu/toyouserver/domain/MemberRepository.java b/src/main/java/slvtwn/khu/toyouserver/domain/MemberRepository.java index 0bf3e99..68606f1 100644 --- a/src/main/java/slvtwn/khu/toyouserver/domain/MemberRepository.java +++ b/src/main/java/slvtwn/khu/toyouserver/domain/MemberRepository.java @@ -2,9 +2,13 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository public interface MemberRepository extends JpaRepository { List findByGroupId(Long groupId); + + @Query("SELECT m.group FROM Member m WHERE m.user.id = :userId") + List findGroupsByUserId(Long userId); } From bf84e4005e99e09809abeac308c54120c1fdc4b5 Mon Sep 17 00:00:00 2001 From: Hyoseop Song Date: Sun, 14 Jul 2024 18:26:23 +0900 Subject: [PATCH 6/6] =?UTF-8?q?:white=5Fcheck=5Fmark:=20test:=20=EA=B7=B8?= =?UTF-8?q?=EB=A3=B9=20=EC=83=9D=EC=84=B1,=EA=B4=80=EB=A6=AC=20=EB=8B=A8?= =?UTF-8?q?=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/GroupServiceTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/slvtwn/khu/toyouserver/application/GroupServiceTest.java diff --git a/src/test/java/slvtwn/khu/toyouserver/application/GroupServiceTest.java b/src/test/java/slvtwn/khu/toyouserver/application/GroupServiceTest.java new file mode 100644 index 0000000..020e92f --- /dev/null +++ b/src/test/java/slvtwn/khu/toyouserver/application/GroupServiceTest.java @@ -0,0 +1,73 @@ +package slvtwn.khu.toyouserver.application; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDate; +import java.util.List; +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 slvtwn.khu.toyouserver.domain.Group; +import slvtwn.khu.toyouserver.domain.User; +import slvtwn.khu.toyouserver.dto.GroupResponse; +import slvtwn.khu.toyouserver.persistance.GroupRepository; +import slvtwn.khu.toyouserver.persistance.UserRepository; + +@SpringBootTest +class GroupServiceTest { + + @Autowired + GroupRepository groupRepository; + + @Autowired + UserRepository userRepository; + + @Autowired + GroupService groupService; + + @DisplayName("그룹은 이름을 필수로 가진다.") + @Test + void 그룹은_이름으로_생성된다() { + String groupName = "Name Created Group"; + Group group = new Group(groupName); + groupRepository.save(group); + + GroupResponse groupResponse = groupService.create(groupName); + assertThat(groupResponse.name()).isEqualTo(groupName); + } + + @DisplayName("사용자는 그룹에 가입한다.") + @Test + void 사용자는_그룹에_가입한다() { + Group group = new Group("Group"); + groupRepository.save(group); + User user = new User("Hart", LocalDate.now(), "www.profile-picture.com"); + userRepository.save(user); + + GroupResponse groupResponse = groupService.registerUser(group.getId(), 1L); + + assertThat(groupResponse.id()).isEqualTo(group.getId()); + assertThat(groupResponse.name()).isEqualTo(group.getName()); + } + + @DisplayName("사용자는 가입한 그룹을 조회한다.") + @Test + void 사용자별_그룹을_조회한다() { + Group group1 = new Group("Group-1"), group2 = new Group("Group-2"); + groupRepository.save(group1); + groupRepository.save(group2); + + User user = new User("Hart", LocalDate.now(), "www.profile-picture.com"); + userRepository.save(user); + + groupService.registerUser(group1.getId(), user.getId()); + groupService.registerUser(group2.getId(), user.getId()); + + List groups = groupService.findRegisteredGroups(user.getId()); + + assertThat(groups).hasSize(2); + assertThat(groups.get(0).name()).isEqualTo(group1.getName()); + assertThat(groups.get(1).name()).isEqualTo(group2.getName()); + } +} \ No newline at end of file