From f4474eccd614298a2131edd82410f05b87fbdf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=84=EC=A3=BC=EC=9B=90?= <84346055+jinjoo-lab@users.noreply.github.com> Date: Wed, 27 Dec 2023 17:36:24 +0900 Subject: [PATCH 1/7] [FEAT] DeviceToken Entity + Save Logic --- backend/src/docs/auth.adoc | 3 ++ .../member/controller/AuthController.java | 8 ++++ .../dto/request/DeviceTokenRequest.java | 14 ++++++ .../domain/member/entity/DeviceToken.java | 43 +++++++++++++++++++ .../backend/domain/member/entity/Member.java | 19 ++++---- .../repository/DeviceTokenRepository.java | 9 ++++ .../domain/member/service/AuthService.java | 17 ++++++++ .../domain/member/service/MemberService.java | 3 ++ .../member/controller/AuthControllerTest.java | 28 ++++++++++++ .../repository/MemberRepositoryTest.java | 20 +++++++++ .../member/service/AuthServiceTest.java | 4 ++ .../member/service/MemberServiceTest.java | 4 ++ 12 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java create mode 100644 backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java create mode 100644 backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java diff --git a/backend/src/docs/auth.adoc b/backend/src/docs/auth.adoc index b38e5cc4..a34fd02f 100644 --- a/backend/src/docs/auth.adoc +++ b/backend/src/docs/auth.adoc @@ -16,3 +16,6 @@ operation::post save member[snippets='http-request,http-response'] === 저장된 멤버 로그인 operation::post login[snippets='http-request,http-response'] + +=== 디바이스 토큰 저장 +operation::post device token[snippets='http-request,http-response'] diff --git a/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java b/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java index 74386b9f..5e8b9c55 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java @@ -1,5 +1,6 @@ package com.twtw.backend.domain.member.controller; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.request.TokenRequest; @@ -43,4 +44,11 @@ public ResponseEntity afterSocialLogin( @RequestBody @Valid OAuthRequest request) { return ResponseEntity.status(HttpStatus.OK).body(authService.getTokenByOAuth(request)); } + + @PostMapping("/device") + public ResponseEntity saveDeviceToken(@RequestBody DeviceTokenRequest request){ + authService.saveDeviceToken(request); + return ResponseEntity.noContent().build(); + } + } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java new file mode 100644 index 00000000..b128bbd2 --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java @@ -0,0 +1,14 @@ +package com.twtw.backend.domain.member.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class DeviceTokenRequest { + private String deviceToken; +} diff --git a/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java b/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java new file mode 100644 index 00000000..6d60555b --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java @@ -0,0 +1,43 @@ +package com.twtw.backend.domain.member.entity; + +import com.twtw.backend.global.audit.AuditListener; +import com.twtw.backend.global.audit.Auditable; +import com.twtw.backend.global.audit.BaseTime; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.Where; + +import java.util.UUID; + +@Entity +@Getter +@Where(clause = "deleted_at is null") +@EntityListeners(AuditListener.class) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class DeviceToken implements Auditable { + + @Id + @GeneratedValue(generator = "uuid2") + @Column(name = "id", columnDefinition = "BINARY(16)") + private UUID id; + + private String deviceToken; + + @OneToOne(mappedBy = "deviceToken") + private Member member; + + @Setter + @Embedded + @Column(nullable = false) + private BaseTime baseTime; + + public DeviceToken(String deviceToken){ + this.deviceToken = deviceToken; + } + + public void setMember(Member member){this.member = member;} + +} diff --git a/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java b/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java index 99b76e6b..8844164a 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java @@ -5,15 +5,7 @@ import com.twtw.backend.global.audit.Auditable; import com.twtw.backend.global.audit.BaseTime; -import jakarta.persistence.Column; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.EntityListeners; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -51,6 +43,10 @@ public class Member implements Auditable { @OneToMany(mappedBy = "member") private List groupMembers = new ArrayList<>(); + @OneToOne + @JoinColumn(name = "device_token") + private DeviceToken deviceToken; + @Setter @Embedded @Column(nullable = false) @@ -75,4 +71,9 @@ public boolean hasNoGroupMember() { public void updateProfileImage(final String profileImage) { this.profileImage = profileImage; } + + public void updateDeviceToken(final DeviceToken deviceToken){ + this.deviceToken = deviceToken; + deviceToken.setMember(this); + } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java b/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java new file mode 100644 index 00000000..cc44449a --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java @@ -0,0 +1,9 @@ +package com.twtw.backend.domain.member.repository; + +import com.twtw.backend.domain.member.entity.DeviceToken; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface DeviceTokenRepository extends JpaRepository { +} diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java index b55f989c..bee5ecf5 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java @@ -1,18 +1,21 @@ package com.twtw.backend.domain.member.service; import com.twtw.backend.config.security.jwt.TokenProvider; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.request.TokenRequest; import com.twtw.backend.domain.member.dto.response.AfterLoginResponse; import com.twtw.backend.domain.member.dto.response.TokenDto; import com.twtw.backend.domain.member.entity.AuthStatus; +import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.entity.RefreshToken; import com.twtw.backend.domain.member.exception.NicknameExistsException; import com.twtw.backend.domain.member.exception.RefreshTokenInfoMismatchException; import com.twtw.backend.domain.member.exception.RefreshTokenValidationException; import com.twtw.backend.domain.member.mapper.MemberMapper; +import com.twtw.backend.domain.member.repository.DeviceTokenRepository; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.member.repository.RefreshTokenRepository; import com.twtw.backend.global.exception.EntityNotFoundException; @@ -30,16 +33,20 @@ public class AuthService { private final MemberRepository memberRepository; private final RefreshTokenRepository refreshTokenRepository; + + private final DeviceTokenRepository deviceTokenRepository; private final TokenProvider tokenProvider; private final MemberMapper memberMapper; public AuthService( MemberRepository memberRepository, RefreshTokenRepository refreshTokenRepository, + DeviceTokenRepository deviceTokenRepository, TokenProvider tokenProvider, MemberMapper memberMapper) { this.memberRepository = memberRepository; this.refreshTokenRepository = refreshTokenRepository; + this.deviceTokenRepository = deviceTokenRepository; this.tokenProvider = tokenProvider; this.memberMapper = memberMapper; } @@ -66,6 +73,7 @@ public AfterLoginResponse saveMember(MemberSaveRequest request) { return new AfterLoginResponse(AuthStatus.SIGNIN, tokenDto); } + private void validateNickname(final MemberSaveRequest request) { if (memberRepository.existsByNickname(request.getNickname())) { throw new NicknameExistsException(); @@ -142,4 +150,13 @@ public Member getMemberByJwt() { throw new EntityNotFoundException(); } + + + @Transactional + public void saveDeviceToken(DeviceTokenRequest request){ + Member member = getMemberByJwt(); + DeviceToken deviceToken = new DeviceToken(request.getDeviceToken()); + member.updateDeviceToken(deviceToken); + deviceTokenRepository.save(deviceToken); + } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java index aa01771a..e29eee70 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java @@ -1,15 +1,18 @@ package com.twtw.backend.domain.member.service; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.response.DuplicateNicknameResponse; import com.twtw.backend.domain.member.dto.response.MemberResponse; import com.twtw.backend.domain.member.dto.response.SearchMemberResponse; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.mapper.MemberMapper; +import com.twtw.backend.domain.member.repository.DeviceTokenRepository; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.plan.entity.Plan; import com.twtw.backend.global.exception.EntityNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; diff --git a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java index 646dc669..4ae38965 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java @@ -12,6 +12,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.request.TokenRequest; @@ -143,4 +144,31 @@ void afterSocialLogin() throws Exception { perform.andDo(print()) .andDo(document("post login", getDocumentRequest(), getDocumentResponse())); } + + @Test + @DisplayName("멤버의 DeviceToken이 저장되는가") + void saveDeviceToken() throws Exception { + // given + final AfterLoginResponse expected = + new AfterLoginResponse( + AuthStatus.SIGNIN, + new TokenDto("access.token.value", "refresh.token.value")); + given(authService.getTokenByOAuth(any())).willReturn(expected); + + // when + final ResultActions perform = + mockMvc.perform( + post("/auth/device") + .content( + toRequestBody( + new DeviceTokenRequest("THIS_IS_TEST_TOKEN"))) + .contentType(MediaType.APPLICATION_JSON)); + + // then + perform.andExpect(status().isNoContent()); + + // docs + perform.andDo(print()) + .andDo(document("post device token", getDocumentRequest(), getDocumentResponse())); + } } diff --git a/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java b/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java index 1954060e..61a5f28c 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; +import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.fixture.member.MemberEntityFixture; import com.twtw.backend.support.repository.RepositoryTest; @@ -19,6 +21,8 @@ public class MemberRepositoryTest extends RepositoryTest { @Autowired private MemberRepository memberRepository; + @Autowired private DeviceTokenRepository deviceTokenRepository; + @Autowired private EntityManager em; @Test @@ -50,4 +54,20 @@ void softDelete() { // then assertThat(memberRepository.findById(memberId)).isEmpty(); } + + @Test + @DisplayName("DeviceToken이 정상적으로 저장되는가") + void saveDeivceToken() { + // given + final Member member = memberRepository.save(MemberEntityFixture.LOGIN_MEMBER.toEntity()); + final DeviceTokenRequest deviceTokenRequest = new DeviceTokenRequest("THIS_IS_TEST_TOKEN"); + + // when + DeviceToken deviceToken = new DeviceToken(deviceTokenRequest.getDeviceToken()); + member.updateDeviceToken(deviceToken); + deviceTokenRepository.save(deviceToken); + + // then + assertThat(member.getDeviceToken().getDeviceToken().equals("THIS_IS_TEST_TOKEN")); + } } diff --git a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java index c5ce7d0c..583baac0 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java @@ -2,11 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.response.AfterLoginResponse; import com.twtw.backend.domain.member.entity.AuthStatus; import com.twtw.backend.domain.member.entity.AuthType; +import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.member.repository.RefreshTokenRepository; @@ -28,6 +30,7 @@ public class AuthServiceTest extends ExcludeTest { @Autowired private RefreshTokenRepository refreshTokenRepository; + @Test @DisplayName("Kakao 회원 가입이 수행되는가") void saveMemberKakao() { @@ -78,4 +81,5 @@ void getTokenByOAuthSuccess() { // then assertThat(response.getStatus().equals(AuthStatus.SIGNIN)).isTrue(); } + } diff --git a/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java index 8a01bfaf..5e46c7e3 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java @@ -3,9 +3,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; +import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.response.DuplicateNicknameResponse; import com.twtw.backend.domain.member.dto.response.MemberResponse; import com.twtw.backend.domain.member.dto.response.SearchMemberResponse; +import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.fixture.member.MemberEntityFixture; @@ -20,6 +22,7 @@ class MemberServiceTest extends LoginTest { @Autowired private MemberService memberService; @Autowired private MemberRepository memberRepository; + @Test @DisplayName("닉네임 중복 체크가 제대로 동작하는가") void checkNickname() { @@ -70,4 +73,5 @@ void searchMemberByNickname() { // then assertThat(response.getMemberResponse().getMemberId()).isEqualTo(member.getId()); } + } From 5d35fd0a19714b47ccf5c25d362d10be7425339a Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Wed, 27 Dec 2023 08:36:55 +0000 Subject: [PATCH 2/7] Google Java Format --- .../domain/member/controller/AuthController.java | 3 +-- .../domain/member/dto/request/DeviceTokenRequest.java | 2 -- .../twtw/backend/domain/member/entity/DeviceToken.java | 10 +++++++--- .../com/twtw/backend/domain/member/entity/Member.java | 2 +- .../member/repository/DeviceTokenRepository.java | 4 ++-- .../backend/domain/member/service/AuthService.java | 4 +--- .../backend/domain/member/service/MemberService.java | 3 --- .../domain/member/controller/AuthControllerTest.java | 3 +-- .../backend/domain/member/service/AuthServiceTest.java | 4 ---- .../domain/member/service/MemberServiceTest.java | 4 ---- 10 files changed, 13 insertions(+), 26 deletions(-) diff --git a/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java b/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java index 5e8b9c55..5690e0c2 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java @@ -46,9 +46,8 @@ public ResponseEntity afterSocialLogin( } @PostMapping("/device") - public ResponseEntity saveDeviceToken(@RequestBody DeviceTokenRequest request){ + public ResponseEntity saveDeviceToken(@RequestBody DeviceTokenRequest request) { authService.saveDeviceToken(request); return ResponseEntity.noContent().build(); } - } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java index b128bbd2..b7e8a9db 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/DeviceTokenRequest.java @@ -4,8 +4,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.UUID; - @Getter @NoArgsConstructor @AllArgsConstructor diff --git a/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java b/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java index 6d60555b..0d9b7da9 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java @@ -3,11 +3,14 @@ import com.twtw.backend.global.audit.AuditListener; import com.twtw.backend.global.audit.Auditable; import com.twtw.backend.global.audit.BaseTime; + import jakarta.persistence.*; + import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; + import org.hibernate.annotations.Where; import java.util.UUID; @@ -34,10 +37,11 @@ public class DeviceToken implements Auditable { @Column(nullable = false) private BaseTime baseTime; - public DeviceToken(String deviceToken){ + public DeviceToken(String deviceToken) { this.deviceToken = deviceToken; } - public void setMember(Member member){this.member = member;} - + public void setMember(Member member) { + this.member = member; + } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java b/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java index 8844164a..ef7226d1 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java @@ -72,7 +72,7 @@ public void updateProfileImage(final String profileImage) { this.profileImage = profileImage; } - public void updateDeviceToken(final DeviceToken deviceToken){ + public void updateDeviceToken(final DeviceToken deviceToken) { this.deviceToken = deviceToken; deviceToken.setMember(this); } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java b/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java index cc44449a..92fce073 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java @@ -1,9 +1,9 @@ package com.twtw.backend.domain.member.repository; import com.twtw.backend.domain.member.entity.DeviceToken; + import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; -public interface DeviceTokenRepository extends JpaRepository { -} +public interface DeviceTokenRepository extends JpaRepository {} diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java index bee5ecf5..b994a4a9 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java @@ -73,7 +73,6 @@ public AfterLoginResponse saveMember(MemberSaveRequest request) { return new AfterLoginResponse(AuthStatus.SIGNIN, tokenDto); } - private void validateNickname(final MemberSaveRequest request) { if (memberRepository.existsByNickname(request.getNickname())) { throw new NicknameExistsException(); @@ -151,9 +150,8 @@ public Member getMemberByJwt() { throw new EntityNotFoundException(); } - @Transactional - public void saveDeviceToken(DeviceTokenRequest request){ + public void saveDeviceToken(DeviceTokenRequest request) { Member member = getMemberByJwt(); DeviceToken deviceToken = new DeviceToken(request.getDeviceToken()); member.updateDeviceToken(deviceToken); diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java index e29eee70..aa01771a 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java @@ -1,18 +1,15 @@ package com.twtw.backend.domain.member.service; -import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.response.DuplicateNicknameResponse; import com.twtw.backend.domain.member.dto.response.MemberResponse; import com.twtw.backend.domain.member.dto.response.SearchMemberResponse; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.mapper.MemberMapper; -import com.twtw.backend.domain.member.repository.DeviceTokenRepository; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.plan.entity.Plan; import com.twtw.backend.global.exception.EntityNotFoundException; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; diff --git a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java index 4ae38965..5df773ca 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java @@ -160,8 +160,7 @@ void saveDeviceToken() throws Exception { mockMvc.perform( post("/auth/device") .content( - toRequestBody( - new DeviceTokenRequest("THIS_IS_TEST_TOKEN"))) + toRequestBody(new DeviceTokenRequest("THIS_IS_TEST_TOKEN"))) .contentType(MediaType.APPLICATION_JSON)); // then diff --git a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java index 583baac0..c5ce7d0c 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java @@ -2,13 +2,11 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.response.AfterLoginResponse; import com.twtw.backend.domain.member.entity.AuthStatus; import com.twtw.backend.domain.member.entity.AuthType; -import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.member.repository.RefreshTokenRepository; @@ -30,7 +28,6 @@ public class AuthServiceTest extends ExcludeTest { @Autowired private RefreshTokenRepository refreshTokenRepository; - @Test @DisplayName("Kakao 회원 가입이 수행되는가") void saveMemberKakao() { @@ -81,5 +78,4 @@ void getTokenByOAuthSuccess() { // then assertThat(response.getStatus().equals(AuthStatus.SIGNIN)).isTrue(); } - } diff --git a/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java index 5e46c7e3..8a01bfaf 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/service/MemberServiceTest.java @@ -3,11 +3,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.response.DuplicateNicknameResponse; import com.twtw.backend.domain.member.dto.response.MemberResponse; import com.twtw.backend.domain.member.dto.response.SearchMemberResponse; -import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.fixture.member.MemberEntityFixture; @@ -22,7 +20,6 @@ class MemberServiceTest extends LoginTest { @Autowired private MemberService memberService; @Autowired private MemberRepository memberRepository; - @Test @DisplayName("닉네임 중복 체크가 제대로 동작하는가") void checkNickname() { @@ -73,5 +70,4 @@ void searchMemberByNickname() { // then assertThat(response.getMemberResponse().getMemberId()).isEqualTo(member.getId()); } - } From 47929b3d44813191fe597ff0560a0e4d4527544c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sat, 30 Dec 2023 03:02:29 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[FEAT]=20=EC=95=8C=EB=A6=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/converter/ConverterConfig.java | 14 ++++++ .../config/rabbitmq/RabbitMQConfig.java | 50 ++++++++++++------- .../domain/friend/service/FriendService.java | 17 ++++++- .../domain/group/service/GroupService.java | 25 +++++++--- .../controller/LocationController.java | 7 ++- .../member/controller/AuthController.java | 4 +- .../member/controller/MemberController.java | 2 +- .../member/dto/request/MemberSaveRequest.java | 6 +-- .../domain/member/entity/DeviceToken.java | 2 +- .../backend/domain/member/entity/Member.java | 13 +++-- .../repository/DeviceTokenRepository.java | 9 ---- .../domain/member/service/AuthService.java | 16 +----- .../domain/member/service/MemberService.java | 10 +--- .../notification/dto/NotificationRequest.java | 18 ++++--- .../mapper/NotificationMapper.java | 6 --- .../messagequeue/FcmConsumer.java | 21 ++++++++ .../messagequeue/FcmProducer.java | 21 ++++++++ .../notification/service/FcmService.java | 27 ---------- .../domain/plan/entity/PlanMember.java | 4 ++ .../domain/plan/service/PlanService.java | 31 ++++++++++-- .../global/constant/NotificationBody.java | 17 +++++++ .../global/constant/NotificationTitle.java | 15 ++++++ .../global/constant/RabbitMQConstant.java | 19 +++++++ 23 files changed, 237 insertions(+), 117 deletions(-) create mode 100644 backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java delete mode 100644 backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java delete mode 100644 backend/src/main/java/com/twtw/backend/domain/notification/mapper/NotificationMapper.java create mode 100644 backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java create mode 100644 backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java delete mode 100644 backend/src/main/java/com/twtw/backend/domain/notification/service/FcmService.java create mode 100644 backend/src/main/java/com/twtw/backend/global/constant/NotificationBody.java create mode 100644 backend/src/main/java/com/twtw/backend/global/constant/NotificationTitle.java create mode 100644 backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java diff --git a/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java b/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java new file mode 100644 index 00000000..ec5571ee --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java @@ -0,0 +1,14 @@ +package com.twtw.backend.config.converter; + +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ConverterConfig { + + @Bean + public Jackson2JsonMessageConverter jsonMessageConverter(){ + return new Jackson2JsonMessageConverter(); + } +} diff --git a/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java b/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java index ceabcdc5..5cf2a5bb 100644 --- a/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java +++ b/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java @@ -1,6 +1,7 @@ package com.twtw.backend.config.rabbitmq; import com.fasterxml.jackson.databind.ObjectMapper; +import com.twtw.backend.global.constant.RabbitMQConstant; import com.twtw.backend.global.properties.RabbitMQProperties; import lombok.RequiredArgsConstructor; @@ -23,25 +24,39 @@ @RequiredArgsConstructor public class RabbitMQConfig { - private static final String QUEUE_NAME = "map.queue"; - private static final String EXCHANGE_NAME = "map"; - private static final String ROUTING_KEY = "plan.*"; private final RabbitMQProperties rabbitMQProperties; private final ObjectMapper objectMapper; @Bean - public Queue queue() { - return new Queue(QUEUE_NAME, true); + public Queue locationQueue() { + return new Queue(RabbitMQConstant.LOCATION_QUEUE.getName(), true); } @Bean - public TopicExchange topicExchange() { - return new TopicExchange(EXCHANGE_NAME); + public TopicExchange locationTopicExchange() { + return new TopicExchange(RabbitMQConstant.LOCATION_EXCHANGE.getName()); } @Bean - public Binding binding(final Queue queue, final TopicExchange topicExchange) { - return BindingBuilder.bind(queue).to(topicExchange).with(ROUTING_KEY); + public Binding locationBinding() { + return BindingBuilder.bind(locationQueue()).to(locationTopicExchange()) + .with(RabbitMQConstant.LOCATION_ROUTING_KEY.getName()); + } + + @Bean + public Queue notificationQueue() { + return new Queue(RabbitMQConstant.NOTIFICATION_QUEUE.getName(), true); + } + + @Bean + public TopicExchange notificationTopicExchange() { + return new TopicExchange(RabbitMQConstant.NOTIFICATION_EXCHANGE.getName()); + } + + @Bean + public Binding notificationBinding() { + return BindingBuilder.bind(notificationQueue()).to(notificationTopicExchange()) + .with(RabbitMQConstant.NOTIFICATION_ROUTING_KEY.getName()); } @Bean @@ -63,20 +78,21 @@ public Jackson2JsonMessageConverter jsonMessageConverter() { public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); rabbitTemplate.setMessageConverter(jsonMessageConverter()); - rabbitTemplate.setRoutingKey(QUEUE_NAME); return rabbitTemplate; } @Bean public RabbitAdmin rabbitAdmin( - final ConnectionFactory connectionFactory, - final Queue queue, - final TopicExchange topicExchange, - final Binding binding) { + final ConnectionFactory connectionFactory) { final RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); - rabbitAdmin.declareQueue(queue); - rabbitAdmin.declareExchange(topicExchange); - rabbitAdmin.declareBinding(binding); + + rabbitAdmin.declareQueue(locationQueue()); + rabbitAdmin.declareExchange(locationTopicExchange()); + rabbitAdmin.declareBinding(locationBinding()); + + rabbitAdmin.declareQueue(notificationQueue()); + rabbitAdmin.declareExchange(notificationTopicExchange()); + rabbitAdmin.declareBinding(notificationBinding()); return rabbitAdmin; } } diff --git a/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java b/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java index bd306490..8d2c3fc3 100644 --- a/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java +++ b/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java @@ -10,10 +10,12 @@ import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.service.AuthService; import com.twtw.backend.domain.member.service.MemberService; +import com.twtw.backend.domain.notification.dto.NotificationRequest; +import com.twtw.backend.domain.notification.messagequeue.FcmProducer; +import com.twtw.backend.global.constant.NotificationBody; +import com.twtw.backend.global.constant.NotificationTitle; import com.twtw.backend.global.exception.EntityNotFoundException; - import lombok.RequiredArgsConstructor; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,11 +29,22 @@ public class FriendService { private final FriendMapper friendMapper; private final MemberService memberService; private final AuthService authService; + private final FcmProducer fcmProducer; public void addRequest(final FriendRequest friendRequest) { final Member loginMember = authService.getMemberByJwt(); final Member member = memberService.getMemberById(friendRequest.getMemberId()); friendRepository.save(friendMapper.toEntity(loginMember, member)); + + sendNotification(member.getDeviceTokenValue(), loginMember.getNickname()); + } + + private void sendNotification(final String deviceToken, final String nickname) { + fcmProducer.sendNotification( + new NotificationRequest( + deviceToken, + NotificationTitle.FRIEND_REQUEST_TITLE.getName(), + NotificationBody.FRIEND_REQUEST_BODY.toNotificationBody(nickname))); } @Transactional diff --git a/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java b/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java index 53690b1b..2c555a5b 100644 --- a/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java +++ b/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java @@ -12,9 +12,11 @@ import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.service.AuthService; import com.twtw.backend.domain.member.service.MemberService; -import com.twtw.backend.domain.notification.service.FcmService; +import com.twtw.backend.domain.notification.dto.NotificationRequest; +import com.twtw.backend.domain.notification.messagequeue.FcmProducer; +import com.twtw.backend.global.constant.NotificationBody; +import com.twtw.backend.global.constant.NotificationTitle; import com.twtw.backend.global.exception.EntityNotFoundException; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,11 +29,9 @@ public class GroupService { private final GroupRepository groupRepository; private final GroupMemberRepository groupMemberRepository; private final AuthService authService; - private final MemberService memberService; private final GroupMapper groupMapper; - - private final FcmService fcmService; + private final FcmProducer fcmProducer; public GroupService( GroupRepository groupRepository, @@ -39,13 +39,13 @@ public GroupService( AuthService authService, MemberService memberService, GroupMapper groupMapper, - FcmService fcmService) { + FcmProducer fcmProducer) { this.groupRepository = groupRepository; this.groupMemberRepository = groupMemberRepository; this.authService = authService; this.memberService = memberService; this.groupMapper = groupMapper; - this.fcmService = fcmService; + this.fcmProducer = fcmProducer; } public GroupInfoResponse getGroupById(UUID groupId) { @@ -117,11 +117,20 @@ public GroupInfoResponse inviteGroup(InviteGroupRequest inviteGroupRequest) { memberService.getMembersByIds(inviteGroupRequest.getFriendMemberIds()); group.inviteAll(friends); - // invite push Alert + String groupName = group.getName(); + friends.forEach(friend -> sendNotification(friend.getDeviceTokenValue(), groupName)); return groupMapper.toGroupInfo(group); } + private void sendNotification(final String deviceToken, final String groupName) { + fcmProducer.sendNotification( + new NotificationRequest( + deviceToken, + NotificationTitle.GROUP_REQUEST_TITLE.getName(), + NotificationBody.GROUP_REQUEST_BODY.toNotificationBody(groupName))); + } + public GroupInfoResponse getGroupInfoResponse(Group group) { return groupMapper.toGroupInfo(group); } diff --git a/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java b/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java index a846bb0f..4fec5503 100644 --- a/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java +++ b/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java @@ -3,6 +3,7 @@ import com.twtw.backend.domain.location.dto.request.LocationRequest; import com.twtw.backend.domain.location.service.LocationService; +import com.twtw.backend.global.constant.RabbitMQConstant; import lombok.RequiredArgsConstructor; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -17,8 +18,6 @@ @RequiredArgsConstructor public class LocationController { - private static final String EXCHANGE_NAME = "map"; - private static final String ROUTING_KEY = "plan."; private final RabbitTemplate rabbitTemplate; private final LocationService locationService; @@ -27,8 +26,8 @@ public void share( @DestinationVariable final UUID planId, @Payload final LocationRequest locationRequest) { rabbitTemplate.convertAndSend( - EXCHANGE_NAME, - ROUTING_KEY + planId, + RabbitMQConstant.LOCATION_EXCHANGE.getName(), + RabbitMQConstant.LOCATION_ROUTING_KEY_PREFIX.getName() + planId, locationService.addInfo(planId, locationRequest)); } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java b/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java index 5690e0c2..4df40dc7 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/controller/AuthController.java @@ -46,8 +46,8 @@ public ResponseEntity afterSocialLogin( } @PostMapping("/device") - public ResponseEntity saveDeviceToken(@RequestBody DeviceTokenRequest request) { - authService.saveDeviceToken(request); + public ResponseEntity updateDeviceToken(@RequestBody DeviceTokenRequest request) { + authService.updateDeviceToken(request); return ResponseEntity.noContent().build(); } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/controller/MemberController.java b/backend/src/main/java/com/twtw/backend/domain/member/controller/MemberController.java index 342bfcaf..63a76b0c 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/controller/MemberController.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/controller/MemberController.java @@ -21,7 +21,7 @@ public ResponseEntity duplicateNickname(@PathVariable return ResponseEntity.ok(memberService.duplicateNickname(name)); } - @GetMapping() + @GetMapping public ResponseEntity searchMemberByNickname( @RequestParam(name = "nickname") String nickname) { return ResponseEntity.ok(memberService.getMemberByNickname(nickname)); diff --git a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java index 70d0a18d..ebb129e4 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java @@ -1,8 +1,6 @@ package com.twtw.backend.domain.member.dto.request; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,7 +10,7 @@ @AllArgsConstructor public class MemberSaveRequest { @NotBlank private String nickname; - @NotNull private String profileImage; - + @NotBlank private String profileImage; + @NotBlank private String deviceToken; private OAuthRequest oauthRequest; } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java b/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java index 0d9b7da9..36d9e7cf 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/entity/DeviceToken.java @@ -41,7 +41,7 @@ public DeviceToken(String deviceToken) { this.deviceToken = deviceToken; } - public void setMember(Member member) { + public void organizeMember(Member member) { this.member = member; } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java b/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java index ef7226d1..ce9afbaf 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/entity/Member.java @@ -43,8 +43,8 @@ public class Member implements Auditable { @OneToMany(mappedBy = "member") private List groupMembers = new ArrayList<>(); - @OneToOne - @JoinColumn(name = "device_token") + @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinColumn private DeviceToken deviceToken; @Setter @@ -53,11 +53,12 @@ public class Member implements Auditable { private BaseTime baseTime; @Builder - public Member(String nickname, String profileImage, OAuth2Info oauthInfo) { + public Member(String nickname, String profileImage, OAuth2Info oauthInfo, String deviceToken) { this.nickname = nickname; this.profileImage = profileImage; this.role = Role.ROLE_USER; this.oauthInfo = oauthInfo; + updateDeviceToken(new DeviceToken(deviceToken)); } public void addGroupMember(final GroupMember groupMember) { @@ -74,6 +75,10 @@ public void updateProfileImage(final String profileImage) { public void updateDeviceToken(final DeviceToken deviceToken) { this.deviceToken = deviceToken; - deviceToken.setMember(this); + deviceToken.organizeMember(this); + } + + public String getDeviceTokenValue() { + return this.deviceToken.getDeviceToken(); } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java b/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java deleted file mode 100644 index 92fce073..00000000 --- a/backend/src/main/java/com/twtw/backend/domain/member/repository/DeviceTokenRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.twtw.backend.domain.member.repository; - -import com.twtw.backend.domain.member.entity.DeviceToken; - -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.UUID; - -public interface DeviceTokenRepository extends JpaRepository {} diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java index b994a4a9..7c565cad 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java @@ -15,11 +15,9 @@ import com.twtw.backend.domain.member.exception.RefreshTokenInfoMismatchException; import com.twtw.backend.domain.member.exception.RefreshTokenValidationException; import com.twtw.backend.domain.member.mapper.MemberMapper; -import com.twtw.backend.domain.member.repository.DeviceTokenRepository; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.member.repository.RefreshTokenRepository; import com.twtw.backend.global.exception.EntityNotFoundException; - import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -34,19 +32,16 @@ public class AuthService { private final MemberRepository memberRepository; private final RefreshTokenRepository refreshTokenRepository; - private final DeviceTokenRepository deviceTokenRepository; private final TokenProvider tokenProvider; private final MemberMapper memberMapper; public AuthService( MemberRepository memberRepository, RefreshTokenRepository refreshTokenRepository, - DeviceTokenRepository deviceTokenRepository, TokenProvider tokenProvider, MemberMapper memberMapper) { this.memberRepository = memberRepository; this.refreshTokenRepository = refreshTokenRepository; - this.deviceTokenRepository = deviceTokenRepository; this.tokenProvider = tokenProvider; this.memberMapper = memberMapper; } @@ -141,20 +136,13 @@ public Member getMemberByJwt() { UUID id = UUID.fromString(authentication.getName()); - Optional member = memberRepository.findById(id); - - if (member.isPresent()) { - return member.get(); - } - - throw new EntityNotFoundException(); + return memberRepository.findById(id).orElseThrow(EntityNotFoundException::new); } @Transactional - public void saveDeviceToken(DeviceTokenRequest request) { + public void updateDeviceToken(DeviceTokenRequest request) { Member member = getMemberByJwt(); DeviceToken deviceToken = new DeviceToken(request.getDeviceToken()); member.updateDeviceToken(deviceToken); - deviceTokenRepository.save(deviceToken); } } diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java index aa01771a..ce6ddb99 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/MemberService.java @@ -29,17 +29,11 @@ public MemberService(MemberRepository memberRepository, MemberMapper memberMappe public DuplicateNicknameResponse duplicateNickname(String nickName) { Optional member = memberRepository.findByNickname(nickName); - if (member.isPresent()) { - return new DuplicateNicknameResponse(true); - } - - return new DuplicateNicknameResponse(false); + return new DuplicateNicknameResponse(member.isPresent()); } public Member getMemberById(UUID id) { - Member member = memberRepository.findById(id).orElseThrow(EntityNotFoundException::new); - - return member; + return memberRepository.findById(id).orElseThrow(EntityNotFoundException::new); } public SearchMemberResponse getMemberByNickname(String nickname) { diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java b/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java index 1ca241d1..9dc479e8 100644 --- a/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java +++ b/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java @@ -1,24 +1,30 @@ package com.twtw.backend.domain.notification.dto; +import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; - -import jakarta.validation.constraints.NotBlank; - import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; @Getter +@ToString @NoArgsConstructor @AllArgsConstructor public class NotificationRequest { - @NotBlank private String deviceToken; + private String deviceToken; private String title; - private String body; - public Notification toNotification() { + public Message toMessage() { + return Message.builder() + .setToken(deviceToken) + .setNotification(toNotification()) + .build(); + } + + private Notification toNotification() { return new Notification(title, body); } } diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/mapper/NotificationMapper.java b/backend/src/main/java/com/twtw/backend/domain/notification/mapper/NotificationMapper.java deleted file mode 100644 index c7865378..00000000 --- a/backend/src/main/java/com/twtw/backend/domain/notification/mapper/NotificationMapper.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.twtw.backend.domain.notification.mapper; - -import org.springframework.stereotype.Component; - -@Component -public class NotificationMapper {} diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java new file mode 100644 index 00000000..d50cce08 --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java @@ -0,0 +1,21 @@ +package com.twtw.backend.domain.notification.messagequeue; + +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; +import com.twtw.backend.domain.notification.dto.NotificationRequest; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +@Component +public class FcmConsumer { + private final FirebaseMessaging firebaseMessaging; + + public FcmConsumer(FirebaseMessaging firebaseMessaging) { + this.firebaseMessaging = firebaseMessaging; + } + + @RabbitListener(queues = "notification.queue") + public void sendNotification(final NotificationRequest request) throws FirebaseMessagingException { + firebaseMessaging.send(request.toMessage()); + } +} diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java new file mode 100644 index 00000000..5b4195ad --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java @@ -0,0 +1,21 @@ +package com.twtw.backend.domain.notification.messagequeue; + +import com.twtw.backend.domain.notification.dto.NotificationRequest; +import com.twtw.backend.global.constant.RabbitMQConstant; +import lombok.RequiredArgsConstructor; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FcmProducer { + + private final RabbitTemplate rabbitTemplate; + + public void sendNotification(final NotificationRequest request) { + rabbitTemplate.convertAndSend( + RabbitMQConstant.NOTIFICATION_EXCHANGE.getName(), + RabbitMQConstant.NOTIFICATION_ROUTING_KEY.getName(), + request); + } +} diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/service/FcmService.java b/backend/src/main/java/com/twtw/backend/domain/notification/service/FcmService.java deleted file mode 100644 index a894afb3..00000000 --- a/backend/src/main/java/com/twtw/backend/domain/notification/service/FcmService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.twtw.backend.domain.notification.service; - -import com.google.firebase.messaging.FirebaseMessaging; -import com.google.firebase.messaging.FirebaseMessagingException; -import com.google.firebase.messaging.Message; -import com.twtw.backend.domain.notification.dto.NotificationRequest; - -import org.springframework.stereotype.Service; - -@Service -public class FcmService { - private final FirebaseMessaging firebaseMessaging; - - public FcmService(FirebaseMessaging firebaseMessaging) { - this.firebaseMessaging = firebaseMessaging; - } - - public void sendNotification(NotificationRequest request) throws FirebaseMessagingException { - Message message = - Message.builder() - .setToken(request.getDeviceToken()) - .setNotification(request.toNotification()) - .build(); - - firebaseMessaging.send(message); - } -} diff --git a/backend/src/main/java/com/twtw/backend/domain/plan/entity/PlanMember.java b/backend/src/main/java/com/twtw/backend/domain/plan/entity/PlanMember.java index 1937c651..03241c61 100644 --- a/backend/src/main/java/com/twtw/backend/domain/plan/entity/PlanMember.java +++ b/backend/src/main/java/com/twtw/backend/domain/plan/entity/PlanMember.java @@ -69,4 +69,8 @@ public boolean isAccepted() { public void acceptInvite() { this.planInviteCode = PlanInviteCode.ACCEPTED; } + + public String getDeviceTokenValue() { + return this.member.getDeviceTokenValue(); + } } diff --git a/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java b/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java index f35855a9..78074161 100644 --- a/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java +++ b/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java @@ -7,6 +7,8 @@ import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.service.AuthService; import com.twtw.backend.domain.member.service.MemberService; +import com.twtw.backend.domain.notification.dto.NotificationRequest; +import com.twtw.backend.domain.notification.messagequeue.FcmProducer; import com.twtw.backend.domain.place.entity.Place; import com.twtw.backend.domain.place.service.PlaceService; import com.twtw.backend.domain.plan.dto.client.PlaceClientDetails; @@ -23,6 +25,8 @@ import com.twtw.backend.domain.plan.mapper.PlanMapper; import com.twtw.backend.domain.plan.repository.PlanRepository; import com.twtw.backend.global.client.MapClient; +import com.twtw.backend.global.constant.NotificationBody; +import com.twtw.backend.global.constant.NotificationTitle; import com.twtw.backend.global.exception.EntityNotFoundException; import lombok.RequiredArgsConstructor; @@ -43,13 +47,11 @@ public class PlanService { DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); private final PlanRepository planRepository; private final GroupService groupService; - private final MemberService memberService; - private final PlaceService placeService; private final AuthService authService; private final PlanMapper planMapper; - + private final FcmProducer fcmProducer; private final MapClient destinationClient; @Cacheable( @@ -98,9 +100,19 @@ public PlanResponse invitePlan(PlanMemberRequest request) { Plan plan = getPlanEntity(request.getPlanId()); plan.addMember(member); + sendRequestNotification(member.getDeviceTokenValue(), plan.getName()); + return planMapper.toPlanResponse(plan); } + private void sendRequestNotification(final String deviceToken, final String planName) { + fcmProducer.sendNotification( + new NotificationRequest( + deviceToken, + NotificationTitle.PLAN_REQUEST_TITLE.getName(), + NotificationBody.PLAN_REQUEST_BODY.toNotificationBody(planName))); + } + public void outPlan(PlanMemberRequest request) { Member member = authService.getMemberByJwt(); Plan plan = getPlanEntity(request.getPlanId()); @@ -157,10 +169,11 @@ public List getPlans() { public void updatePlan(final UpdatePlanRequest updatePlanRequest) { final Plan plan = getPlanEntity(updatePlanRequest.getPlanId()); + final String placeName = updatePlanRequest.getPlaceName(); plan.updatePlace( updatePlanRequest.getName(), updatePlanRequest.getPlanDay(), - updatePlanRequest.getPlaceName(), + placeName, updatePlanRequest.getPlaceUrl(), updatePlanRequest.getCategoryGroupCode(), updatePlanRequest.getRoadAddressName(), @@ -168,6 +181,16 @@ public void updatePlan(final UpdatePlanRequest updatePlanRequest) { updatePlanRequest.getLatitude()); plan.addMembers(memberService.getMembersByIds(updatePlanRequest.getMemberIds())); + + plan.getPlanMembers().forEach(planMember -> sendDestinationNotification(planMember.getDeviceTokenValue(), placeName)); + } + + private void sendDestinationNotification(final String deviceToken, final String destinationName) { + fcmProducer.sendNotification( + new NotificationRequest( + deviceToken, + NotificationTitle.DESTINATION_CHANGE_TITLE.getName(), + NotificationBody.DESTINATION_CHANGE_BODY.toNotificationBody(destinationName))); } @Transactional diff --git a/backend/src/main/java/com/twtw/backend/global/constant/NotificationBody.java b/backend/src/main/java/com/twtw/backend/global/constant/NotificationBody.java new file mode 100644 index 00000000..fd38ddc2 --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/global/constant/NotificationBody.java @@ -0,0 +1,17 @@ +package com.twtw.backend.global.constant; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum NotificationBody { + GROUP_REQUEST_BODY("그룹명: %s"), + PLAN_REQUEST_BODY("계획명: %s"), + FRIEND_REQUEST_BODY("친구명: %s"), + DESTINATION_CHANGE_BODY("장소명: %s"); + + private final String name; + + public String toNotificationBody(final String content) { + return String.format(name, content); + } +} diff --git a/backend/src/main/java/com/twtw/backend/global/constant/NotificationTitle.java b/backend/src/main/java/com/twtw/backend/global/constant/NotificationTitle.java new file mode 100644 index 00000000..e3f40ff8 --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/global/constant/NotificationTitle.java @@ -0,0 +1,15 @@ +package com.twtw.backend.global.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum NotificationTitle { + FRIEND_REQUEST_TITLE("친구 요청이 도착했습니다."), + GROUP_REQUEST_TITLE("그룹 초대가 도착했습니다."), + PLAN_REQUEST_TITLE("계획 초대가 도착했습니다."), + DESTINATION_CHANGE_TITLE("목적지가 변경되었습니다."); + + private final String name; +} diff --git a/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java b/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java new file mode 100644 index 00000000..dca7dafe --- /dev/null +++ b/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java @@ -0,0 +1,19 @@ +package com.twtw.backend.global.constant; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum RabbitMQConstant { + + LOCATION_QUEUE("map.queue"), + LOCATION_EXCHANGE("map"), + LOCATION_ROUTING_KEY("plan.*"), + LOCATION_ROUTING_KEY_PREFIX("plan."), + NOTIFICATION_QUEUE("notification.queue"), + NOTIFICATION_EXCHANGE("notification"), + NOTIFICATION_ROUTING_KEY("notification"); + + private final String name; +} From 0fd7acf2ac4f8f005eb2be0fe179b91e4d6e748b Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Fri, 29 Dec 2023 18:03:03 +0000 Subject: [PATCH 4/7] Google Java Format --- .../backend/config/converter/ConverterConfig.java | 2 +- .../twtw/backend/config/rabbitmq/RabbitMQConfig.java | 9 +++++---- .../backend/domain/friend/service/FriendService.java | 2 ++ .../backend/domain/group/service/GroupService.java | 1 + .../location/controller/LocationController.java | 2 +- .../domain/member/dto/request/MemberSaveRequest.java | 1 + .../backend/domain/member/service/AuthService.java | 1 + .../domain/notification/dto/NotificationRequest.java | 6 ++---- .../notification/messagequeue/FcmConsumer.java | 4 +++- .../notification/messagequeue/FcmProducer.java | 2 ++ .../backend/domain/plan/service/PlanService.java | 12 +++++++++--- .../backend/global/constant/RabbitMQConstant.java | 1 - 12 files changed, 28 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java b/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java index ec5571ee..2fa98ac1 100644 --- a/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java +++ b/backend/src/main/java/com/twtw/backend/config/converter/ConverterConfig.java @@ -8,7 +8,7 @@ public class ConverterConfig { @Bean - public Jackson2JsonMessageConverter jsonMessageConverter(){ + public Jackson2JsonMessageConverter jsonMessageConverter() { return new Jackson2JsonMessageConverter(); } } diff --git a/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java b/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java index 5cf2a5bb..5eff0f38 100644 --- a/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java +++ b/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java @@ -39,7 +39,8 @@ public TopicExchange locationTopicExchange() { @Bean public Binding locationBinding() { - return BindingBuilder.bind(locationQueue()).to(locationTopicExchange()) + return BindingBuilder.bind(locationQueue()) + .to(locationTopicExchange()) .with(RabbitMQConstant.LOCATION_ROUTING_KEY.getName()); } @@ -55,7 +56,8 @@ public TopicExchange notificationTopicExchange() { @Bean public Binding notificationBinding() { - return BindingBuilder.bind(notificationQueue()).to(notificationTopicExchange()) + return BindingBuilder.bind(notificationQueue()) + .to(notificationTopicExchange()) .with(RabbitMQConstant.NOTIFICATION_ROUTING_KEY.getName()); } @@ -82,8 +84,7 @@ public RabbitTemplate rabbitTemplate() { } @Bean - public RabbitAdmin rabbitAdmin( - final ConnectionFactory connectionFactory) { + public RabbitAdmin rabbitAdmin(final ConnectionFactory connectionFactory) { final RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); rabbitAdmin.declareQueue(locationQueue()); diff --git a/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java b/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java index 8d2c3fc3..ccab37a7 100644 --- a/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java +++ b/backend/src/main/java/com/twtw/backend/domain/friend/service/FriendService.java @@ -15,7 +15,9 @@ import com.twtw.backend.global.constant.NotificationBody; import com.twtw.backend.global.constant.NotificationTitle; import com.twtw.backend.global.exception.EntityNotFoundException; + import lombok.RequiredArgsConstructor; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java b/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java index 2c555a5b..9e4121ea 100644 --- a/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java +++ b/backend/src/main/java/com/twtw/backend/domain/group/service/GroupService.java @@ -17,6 +17,7 @@ import com.twtw.backend.global.constant.NotificationBody; import com.twtw.backend.global.constant.NotificationTitle; import com.twtw.backend.global.exception.EntityNotFoundException; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java b/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java index 4fec5503..d4792564 100644 --- a/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java +++ b/backend/src/main/java/com/twtw/backend/domain/location/controller/LocationController.java @@ -2,8 +2,8 @@ import com.twtw.backend.domain.location.dto.request.LocationRequest; import com.twtw.backend.domain.location.service.LocationService; - import com.twtw.backend.global.constant.RabbitMQConstant; + import lombok.RequiredArgsConstructor; import org.springframework.amqp.rabbit.core.RabbitTemplate; diff --git a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java index ebb129e4..3cc7f4f4 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/dto/request/MemberSaveRequest.java @@ -1,6 +1,7 @@ package com.twtw.backend.domain.member.dto.request; import jakarta.validation.constraints.NotBlank; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java index 7c565cad..c13d4719 100644 --- a/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java +++ b/backend/src/main/java/com/twtw/backend/domain/member/service/AuthService.java @@ -18,6 +18,7 @@ import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.domain.member.repository.RefreshTokenRepository; import com.twtw.backend.global.exception.EntityNotFoundException; + import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java b/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java index 9dc479e8..b56baea6 100644 --- a/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java +++ b/backend/src/main/java/com/twtw/backend/domain/notification/dto/NotificationRequest.java @@ -2,6 +2,7 @@ import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -18,10 +19,7 @@ public class NotificationRequest { private String body; public Message toMessage() { - return Message.builder() - .setToken(deviceToken) - .setNotification(toNotification()) - .build(); + return Message.builder().setToken(deviceToken).setNotification(toNotification()).build(); } private Notification toNotification() { diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java index d50cce08..af0de0cc 100644 --- a/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java +++ b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmConsumer.java @@ -3,6 +3,7 @@ import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.FirebaseMessagingException; import com.twtw.backend.domain.notification.dto.NotificationRequest; + import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @@ -15,7 +16,8 @@ public FcmConsumer(FirebaseMessaging firebaseMessaging) { } @RabbitListener(queues = "notification.queue") - public void sendNotification(final NotificationRequest request) throws FirebaseMessagingException { + public void sendNotification(final NotificationRequest request) + throws FirebaseMessagingException { firebaseMessaging.send(request.toMessage()); } } diff --git a/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java index 5b4195ad..aa5b1d4b 100644 --- a/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java +++ b/backend/src/main/java/com/twtw/backend/domain/notification/messagequeue/FcmProducer.java @@ -2,7 +2,9 @@ import com.twtw.backend.domain.notification.dto.NotificationRequest; import com.twtw.backend.global.constant.RabbitMQConstant; + import lombok.RequiredArgsConstructor; + import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Component; diff --git a/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java b/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java index 78074161..c4f5d85c 100644 --- a/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java +++ b/backend/src/main/java/com/twtw/backend/domain/plan/service/PlanService.java @@ -182,15 +182,21 @@ public void updatePlan(final UpdatePlanRequest updatePlanRequest) { plan.addMembers(memberService.getMembersByIds(updatePlanRequest.getMemberIds())); - plan.getPlanMembers().forEach(planMember -> sendDestinationNotification(planMember.getDeviceTokenValue(), placeName)); + plan.getPlanMembers() + .forEach( + planMember -> + sendDestinationNotification( + planMember.getDeviceTokenValue(), placeName)); } - private void sendDestinationNotification(final String deviceToken, final String destinationName) { + private void sendDestinationNotification( + final String deviceToken, final String destinationName) { fcmProducer.sendNotification( new NotificationRequest( deviceToken, NotificationTitle.DESTINATION_CHANGE_TITLE.getName(), - NotificationBody.DESTINATION_CHANGE_BODY.toNotificationBody(destinationName))); + NotificationBody.DESTINATION_CHANGE_BODY.toNotificationBody( + destinationName))); } @Transactional diff --git a/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java b/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java index dca7dafe..0107b13c 100644 --- a/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java +++ b/backend/src/main/java/com/twtw/backend/global/constant/RabbitMQConstant.java @@ -6,7 +6,6 @@ @Getter @RequiredArgsConstructor public enum RabbitMQConstant { - LOCATION_QUEUE("map.queue"), LOCATION_EXCHANGE("map"), LOCATION_ROUTING_KEY("plan.*"), From 6fe2631c97edd4e9d7fb9a550b6148f1140be05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sat, 30 Dec 2023 03:14:33 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[TEST]=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/rabbitmq/RabbitMQConfig.java | 2 ++ .../repository/FriendRepositoryTest.java | 25 +++++++++---------- .../friend/service/FriendServiceTest.java | 15 ++++++----- .../member/controller/AuthControllerTest.java | 25 +++++++++---------- .../repository/MemberRepositoryTest.java | 11 +++----- .../member/service/AuthServiceTest.java | 11 ++++---- .../fixture/member/MemberEntityFixture.java | 10 ++++---- .../backend/support/exclude/ExcludeTest.java | 13 +++++++++- 8 files changed, 59 insertions(+), 53 deletions(-) diff --git a/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java b/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java index 5eff0f38..07e3b5be 100644 --- a/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java +++ b/backend/src/main/java/com/twtw/backend/config/rabbitmq/RabbitMQConfig.java @@ -18,7 +18,9 @@ import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +@Profile("!test") @EnableRabbit @Configuration @RequiredArgsConstructor diff --git a/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java b/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java index 6ff545d2..8e2dac00 100644 --- a/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java @@ -1,7 +1,5 @@ package com.twtw.backend.domain.friend.repository; -import static org.assertj.core.api.Assertions.assertThat; - import com.twtw.backend.domain.friend.entity.Friend; import com.twtw.backend.domain.friend.entity.FriendStatus; import com.twtw.backend.domain.member.entity.AuthType; @@ -9,7 +7,6 @@ import com.twtw.backend.domain.member.entity.OAuth2Info; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.support.repository.RepositoryTest; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +14,8 @@ import java.util.List; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; + @DisplayName("FriendRepository에") class FriendRepositoryTest extends RepositoryTest { @@ -29,10 +28,10 @@ void save() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE))); + new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "test")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO))); + new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken")); final Friend friend = new Friend(from, to); // when @@ -48,10 +47,10 @@ void findByTwoMemberId() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE))); + new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO))); + new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); final Friend friend = new Friend(from, to); final Friend expected = friendRepository.save(friend); @@ -69,10 +68,10 @@ void findByMember() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE))); + new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO))); + new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); final Friend friend = new Friend(from, to); final Friend expected = friendRepository.save(friend); expected.updateStatus(FriendStatus.ACCEPTED); @@ -90,10 +89,10 @@ void findByMemberAndFriendStatus() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE))); + new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO))); + new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); final Friend friend = new Friend(from, to); friendRepository.save(friend); @@ -111,11 +110,11 @@ void findByMemberAndMemberNickname() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE))); + new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final String friendNickname = "2"; final Member to = memberRepository.save( - new Member(friendNickname, "1234", new OAuth2Info("123", AuthType.KAKAO))); + new Member(friendNickname, "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); final Friend friend = new Friend(from, to); final Friend expected = friendRepository.save(friend); expected.updateStatus(FriendStatus.ACCEPTED); diff --git a/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java index 970cf8ed..149e1bb0 100644 --- a/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java @@ -1,7 +1,5 @@ package com.twtw.backend.domain.friend.service; -import static org.assertj.core.api.Assertions.assertThat; - import com.twtw.backend.domain.friend.dto.request.FriendRequest; import com.twtw.backend.domain.friend.dto.request.FriendUpdateRequest; import com.twtw.backend.domain.friend.dto.response.FriendResponse; @@ -12,7 +10,6 @@ import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.entity.OAuth2Info; import com.twtw.backend.support.service.LoginTest; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +17,8 @@ import java.util.List; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; + @DisplayName("FriendService의") class FriendServiceTest extends LoginTest { @@ -32,7 +31,7 @@ void addRequest() { // given final UUID id = memberRepository - .save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE))) + .save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")) .getId(); // when @@ -49,7 +48,7 @@ void addRequest() { void updateStatus() { // given final Member toMember = - memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE))); + memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); final Friend friend = friendRepository.save(new Friend(loginUser, toMember)); // when @@ -66,7 +65,7 @@ void updateStatus() { void getFriends() { // given final Member toMember = - memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE))); + memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); friendRepository.save(new Friend(loginUser, toMember)); friendService.updateStatus( new FriendUpdateRequest(toMember.getId(), FriendStatus.ACCEPTED)); @@ -83,7 +82,7 @@ void getFriends() { void getFriendsByStatus() { // given final Member toMember = - memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE))); + memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); friendRepository.save(new Friend(loginUser, toMember)); // when @@ -101,7 +100,7 @@ void getFriendByNickname() { final String nickname = "1"; final Member toMember = memberRepository.save( - new Member(nickname, "12", new OAuth2Info("123", AuthType.APPLE))); + new Member(nickname, "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); final Friend expected = friendRepository.save(new Friend(loginUser, toMember)); expected.updateStatus(FriendStatus.ACCEPTED); diff --git a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java index 5df773ca..b0e8ac65 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java @@ -1,17 +1,5 @@ package com.twtw.backend.domain.member.controller; -import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentRequest; -import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentResponse; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; @@ -22,7 +10,6 @@ import com.twtw.backend.domain.member.entity.AuthType; import com.twtw.backend.domain.member.service.AuthService; import com.twtw.backend.support.docs.RestDocsTest; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -30,6 +17,17 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultActions; +import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentRequest; +import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentResponse; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + @DisplayName("AuthController의") @WebMvcTest(AuthController.class) class AuthControllerTest extends RestDocsTest { @@ -102,6 +100,7 @@ void saveMember() throws Exception { new MemberSaveRequest( "정해진", "http://some-url-to-profile-image", + "DEVICE_TOKEN", new OAuthRequest( "client-id", AuthType.APPLE)))) .contentType(MediaType.APPLICATION_JSON)); diff --git a/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java b/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java index 61a5f28c..70a792c9 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java @@ -1,28 +1,24 @@ package com.twtw.backend.domain.member.repository; -import static org.assertj.core.api.Assertions.assertThat; - import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.fixture.member.MemberEntityFixture; import com.twtw.backend.support.repository.RepositoryTest; - import jakarta.persistence.EntityManager; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; + @DisplayName("MemberRepository의") -public class MemberRepositoryTest extends RepositoryTest { +class MemberRepositoryTest extends RepositoryTest { @Autowired private MemberRepository memberRepository; - @Autowired private DeviceTokenRepository deviceTokenRepository; - @Autowired private EntityManager em; @Test @@ -65,7 +61,6 @@ void saveDeivceToken() { // when DeviceToken deviceToken = new DeviceToken(deviceTokenRequest.getDeviceToken()); member.updateDeviceToken(deviceToken); - deviceTokenRepository.save(deviceToken); // then assertThat(member.getDeviceToken().getDeviceToken().equals("THIS_IS_TEST_TOKEN")); diff --git a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java index c5ce7d0c..055bd441 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java @@ -1,7 +1,5 @@ package com.twtw.backend.domain.member.service; -import static org.assertj.core.api.Assertions.assertThat; - import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.response.AfterLoginResponse; @@ -13,11 +11,12 @@ import com.twtw.backend.fixture.member.MemberEntityFixture; import com.twtw.backend.support.database.DatabaseTest; import com.twtw.backend.support.exclude.ExcludeTest; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import static org.assertj.core.api.Assertions.assertThat; + @DatabaseTest @DisplayName("AuthService의 ") public class AuthServiceTest extends ExcludeTest { @@ -36,6 +35,7 @@ void saveMemberKakao() { new MemberSaveRequest( "JinJooWon_Kakao", "TEST_PROFILE_IMAGE", + "deviceToken", new OAuthRequest("TEST_KAKAO_TOKEN", AuthType.KAKAO)); // when @@ -53,13 +53,14 @@ void saveMemberApple() { new MemberSaveRequest( "JinJooWon_Apple", "TEST_PROFILE_IMAGE", + "deviceToken", new OAuthRequest("TEST_APPLE_TOKEN", AuthType.APPLE)); // when AfterLoginResponse response = authService.saveMember(appleRequest); // then - assertThat(response.getStatus().equals(AuthStatus.SIGNIN)).isTrue(); + assertThat(response.getStatus()).isEqualTo(AuthStatus.SIGNIN); } @Test @@ -76,6 +77,6 @@ void getTokenByOAuthSuccess() { AfterLoginResponse response = authService.getTokenByOAuth(request); // then - assertThat(response.getStatus().equals(AuthStatus.SIGNIN)).isTrue(); + assertThat(response.getStatus()).isEqualTo(AuthStatus.SIGNIN); } } diff --git a/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java b/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java index 28fb4c06..61128512 100644 --- a/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java +++ b/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java @@ -3,21 +3,21 @@ import com.twtw.backend.domain.member.entity.AuthType; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.entity.OAuth2Info; - import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum MemberEntityFixture { - LOGIN_MEMBER("호즨이", "http://someUrlToS3", "12345", AuthType.APPLE), - FIRST_MEMBER("담이와써요", "http://myPictureIsExpensive", "777", AuthType.APPLE), - SECOND_MEMBER("홍담진", "http://fighting", "1234567", AuthType.KAKAO); + LOGIN_MEMBER("호즨이", "http://someUrlToS3", "12345", "device", AuthType.APPLE), + FIRST_MEMBER("담이와써요", "http://myPictureIsExpensive", "777", "deviceToken", AuthType.APPLE), + SECOND_MEMBER("홍담진", "http://fighting", "1234567", "DeviceToken!", AuthType.KAKAO); private final String name; private final String profileImage; private final String clientId; + private final String deviceToken; private final AuthType authType; public Member toEntity() { - return new Member(name, profileImage, new OAuth2Info(clientId, authType)); + return new Member(name, profileImage, new OAuth2Info(clientId, authType), deviceToken); } } diff --git a/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java b/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java index de03bfa2..be2aa697 100644 --- a/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java +++ b/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java @@ -2,13 +2,17 @@ import com.twtw.backend.config.rabbitmq.RabbitMQConfig; import com.twtw.backend.domain.location.controller.LocationController; - +import com.twtw.backend.domain.notification.messagequeue.FcmProducer; +import org.junit.jupiter.api.BeforeEach; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.boot.actuate.autoconfigure.amqp.RabbitHealthContributorAutoConfiguration; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; + @ActiveProfiles("test") public abstract class ExcludeTest { @@ -22,4 +26,11 @@ public abstract class ExcludeTest { private RabbitHealthContributorAutoConfiguration rabbitHealthContributorAutoConfiguration; @MockBean private LocationController locationController; + + @MockBean private FcmProducer fcmProducer; + + @BeforeEach + void setUp() { + doNothing().when(fcmProducer).sendNotification(any()); + } } From b44ebaab5cc648b1aedd6f146bf584aafff5f32d Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Fri, 29 Dec 2023 18:14:50 +0000 Subject: [PATCH 6/7] Google Java Format --- .../repository/FriendRepositoryTest.java | 44 ++++++++++++++----- .../friend/service/FriendServiceTest.java | 30 ++++++++++--- .../member/controller/AuthControllerTest.java | 24 +++++----- .../repository/MemberRepositoryTest.java | 6 ++- .../member/service/AuthServiceTest.java | 5 ++- .../fixture/member/MemberEntityFixture.java | 1 + .../backend/support/exclude/ExcludeTest.java | 7 +-- 7 files changed, 81 insertions(+), 36 deletions(-) diff --git a/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java b/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java index 8e2dac00..ae35c795 100644 --- a/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/friend/repository/FriendRepositoryTest.java @@ -1,5 +1,7 @@ package com.twtw.backend.domain.friend.repository; +import static org.assertj.core.api.Assertions.assertThat; + import com.twtw.backend.domain.friend.entity.Friend; import com.twtw.backend.domain.friend.entity.FriendStatus; import com.twtw.backend.domain.member.entity.AuthType; @@ -7,6 +9,7 @@ import com.twtw.backend.domain.member.entity.OAuth2Info; import com.twtw.backend.domain.member.repository.MemberRepository; import com.twtw.backend.support.repository.RepositoryTest; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -14,8 +17,6 @@ import java.util.List; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThat; - @DisplayName("FriendRepository에") class FriendRepositoryTest extends RepositoryTest { @@ -31,7 +32,8 @@ void save() { new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "test")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken")); + new Member( + "2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken")); final Friend friend = new Friend(from, to); // when @@ -47,10 +49,15 @@ void findByTwoMemberId() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); + new Member( + "1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); + new Member( + "2", + "1234", + new OAuth2Info("123", AuthType.KAKAO), + "deviceToken2")); final Friend friend = new Friend(from, to); final Friend expected = friendRepository.save(friend); @@ -68,10 +75,15 @@ void findByMember() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); + new Member( + "1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); + new Member( + "2", + "1234", + new OAuth2Info("123", AuthType.KAKAO), + "deviceToken2")); final Friend friend = new Friend(from, to); final Friend expected = friendRepository.save(friend); expected.updateStatus(FriendStatus.ACCEPTED); @@ -89,10 +101,15 @@ void findByMemberAndFriendStatus() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); + new Member( + "1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final Member to = memberRepository.save( - new Member("2", "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); + new Member( + "2", + "1234", + new OAuth2Info("123", AuthType.KAKAO), + "deviceToken2")); final Friend friend = new Friend(from, to); friendRepository.save(friend); @@ -110,11 +127,16 @@ void findByMemberAndMemberNickname() { // given final Member from = memberRepository.save( - new Member("1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); + new Member( + "1", "123", new OAuth2Info("321", AuthType.APPLE), "deviceToken1")); final String friendNickname = "2"; final Member to = memberRepository.save( - new Member(friendNickname, "1234", new OAuth2Info("123", AuthType.KAKAO), "deviceToken2")); + new Member( + friendNickname, + "1234", + new OAuth2Info("123", AuthType.KAKAO), + "deviceToken2")); final Friend friend = new Friend(from, to); final Friend expected = friendRepository.save(friend); expected.updateStatus(FriendStatus.ACCEPTED); diff --git a/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java index 149e1bb0..1f9b35e9 100644 --- a/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/friend/service/FriendServiceTest.java @@ -1,5 +1,7 @@ package com.twtw.backend.domain.friend.service; +import static org.assertj.core.api.Assertions.assertThat; + import com.twtw.backend.domain.friend.dto.request.FriendRequest; import com.twtw.backend.domain.friend.dto.request.FriendUpdateRequest; import com.twtw.backend.domain.friend.dto.response.FriendResponse; @@ -10,6 +12,7 @@ import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.entity.OAuth2Info; import com.twtw.backend.support.service.LoginTest; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -17,8 +20,6 @@ import java.util.List; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThat; - @DisplayName("FriendService의") class FriendServiceTest extends LoginTest { @@ -31,7 +32,12 @@ void addRequest() { // given final UUID id = memberRepository - .save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")) + .save( + new Member( + "1", + "12", + new OAuth2Info("123", AuthType.APPLE), + "deviceToken")) .getId(); // when @@ -48,7 +54,9 @@ void addRequest() { void updateStatus() { // given final Member toMember = - memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); + memberRepository.save( + new Member( + "1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); final Friend friend = friendRepository.save(new Friend(loginUser, toMember)); // when @@ -65,7 +73,9 @@ void updateStatus() { void getFriends() { // given final Member toMember = - memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); + memberRepository.save( + new Member( + "1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); friendRepository.save(new Friend(loginUser, toMember)); friendService.updateStatus( new FriendUpdateRequest(toMember.getId(), FriendStatus.ACCEPTED)); @@ -82,7 +92,9 @@ void getFriends() { void getFriendsByStatus() { // given final Member toMember = - memberRepository.save(new Member("1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); + memberRepository.save( + new Member( + "1", "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); friendRepository.save(new Friend(loginUser, toMember)); // when @@ -100,7 +112,11 @@ void getFriendByNickname() { final String nickname = "1"; final Member toMember = memberRepository.save( - new Member(nickname, "12", new OAuth2Info("123", AuthType.APPLE), "deviceToken")); + new Member( + nickname, + "12", + new OAuth2Info("123", AuthType.APPLE), + "deviceToken")); final Friend expected = friendRepository.save(new Friend(loginUser, toMember)); expected.updateStatus(FriendStatus.ACCEPTED); diff --git a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java index b0e8ac65..d6a7dfc1 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/controller/AuthControllerTest.java @@ -1,5 +1,17 @@ package com.twtw.backend.domain.member.controller; +import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentRequest; +import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentResponse; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; @@ -10,6 +22,7 @@ import com.twtw.backend.domain.member.entity.AuthType; import com.twtw.backend.domain.member.service.AuthService; import com.twtw.backend.support.docs.RestDocsTest; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -17,17 +30,6 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultActions; -import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentRequest; -import static com.twtw.backend.support.docs.ApiDocsUtils.getDocumentResponse; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @DisplayName("AuthController의") @WebMvcTest(AuthController.class) class AuthControllerTest extends RestDocsTest { diff --git a/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java b/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java index 70a792c9..fe16e0d8 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/repository/MemberRepositoryTest.java @@ -1,19 +1,21 @@ package com.twtw.backend.domain.member.repository; +import static org.assertj.core.api.Assertions.assertThat; + import com.twtw.backend.domain.member.dto.request.DeviceTokenRequest; import com.twtw.backend.domain.member.entity.DeviceToken; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.fixture.member.MemberEntityFixture; import com.twtw.backend.support.repository.RepositoryTest; + import jakarta.persistence.EntityManager; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.util.UUID; -import static org.assertj.core.api.Assertions.assertThat; - @DisplayName("MemberRepository의") class MemberRepositoryTest extends RepositoryTest { diff --git a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java index 055bd441..4f581ce3 100644 --- a/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java +++ b/backend/src/test/java/com/twtw/backend/domain/member/service/AuthServiceTest.java @@ -1,5 +1,7 @@ package com.twtw.backend.domain.member.service; +import static org.assertj.core.api.Assertions.assertThat; + import com.twtw.backend.domain.member.dto.request.MemberSaveRequest; import com.twtw.backend.domain.member.dto.request.OAuthRequest; import com.twtw.backend.domain.member.dto.response.AfterLoginResponse; @@ -11,12 +13,11 @@ import com.twtw.backend.fixture.member.MemberEntityFixture; import com.twtw.backend.support.database.DatabaseTest; import com.twtw.backend.support.exclude.ExcludeTest; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import static org.assertj.core.api.Assertions.assertThat; - @DatabaseTest @DisplayName("AuthService의 ") public class AuthServiceTest extends ExcludeTest { diff --git a/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java b/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java index 61128512..4e8a5f94 100644 --- a/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java +++ b/backend/src/test/java/com/twtw/backend/fixture/member/MemberEntityFixture.java @@ -3,6 +3,7 @@ import com.twtw.backend.domain.member.entity.AuthType; import com.twtw.backend.domain.member.entity.Member; import com.twtw.backend.domain.member.entity.OAuth2Info; + import lombok.RequiredArgsConstructor; @RequiredArgsConstructor diff --git a/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java b/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java index be2aa697..854f8bb2 100644 --- a/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java +++ b/backend/src/test/java/com/twtw/backend/support/exclude/ExcludeTest.java @@ -1,8 +1,12 @@ package com.twtw.backend.support.exclude; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; + import com.twtw.backend.config.rabbitmq.RabbitMQConfig; import com.twtw.backend.domain.location.controller.LocationController; import com.twtw.backend.domain.notification.messagequeue.FcmProducer; + import org.junit.jupiter.api.BeforeEach; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.boot.actuate.autoconfigure.amqp.RabbitHealthContributorAutoConfiguration; @@ -10,9 +14,6 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; - @ActiveProfiles("test") public abstract class ExcludeTest { From 9cec0dce8686f9f1c32e8efc7bc1daebacdd1c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sat, 30 Dec 2023 03:15:58 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[CHORE]=20api=20docs=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/docs/auth.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/docs/auth.adoc b/backend/src/docs/auth.adoc index a34fd02f..19630712 100644 --- a/backend/src/docs/auth.adoc +++ b/backend/src/docs/auth.adoc @@ -17,5 +17,5 @@ operation::post save member[snippets='http-request,http-response'] === 저장된 멤버 로그인 operation::post login[snippets='http-request,http-response'] -=== 디바이스 토큰 저장 +=== 디바이스 토큰 업데이트 operation::post device token[snippets='http-request,http-response']