From 25cfe50ea4bb77232a2bae1638fc2aee35b7a428 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 16:29:41 +0900 Subject: [PATCH 01/66] =?UTF-8?q?M3-286=20Feat=20:=20fcm=20token=20entity?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/domain/entity/FcmToken.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java new file mode 100644 index 00000000..b0dd472a --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java @@ -0,0 +1,37 @@ +package com.m3pro.groundflip.domain.entity; + +import com.m3pro.groundflip.domain.entity.global.BaseTimeEntity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "fcm_token") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class FcmToken extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "fcm_token_id") + private Long id; + + private String token; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; +} From 2f658e53259ff431d721111c37e90eb5da17270a Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 16:36:59 +0900 Subject: [PATCH 02/66] =?UTF-8?q?M3-286=20Feat=20:=20FcmTokenRequest=20dto?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/user/FcmTokenRequest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java new file mode 100644 index 00000000..17dab09f --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java @@ -0,0 +1,20 @@ +package com.m3pro.groundflip.domain.dto.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(title = "FCM 등록 토큰 저장") +public class FcmTokenRequest { + @Schema(description = "사용자 Id", example = "125") + private Long userId; + + @Schema(description = "사용자 fcm token", example = "sdfghweredasdvasdfq/weqwefs;dvsdghrthwdffevdrer") + private String fcmToken; +} From e9d878a99e1b00fa8245c48faff52b3566168b15 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 16:37:45 +0900 Subject: [PATCH 03/66] =?UTF-8?q?M3-286=20Feat=20:=20FcmToken=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m3pro/groundflip/controller/UserController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/controller/UserController.java b/src/main/java/com/m3pro/groundflip/controller/UserController.java index e7e7c948..cffb54a6 100644 --- a/src/main/java/com/m3pro/groundflip/controller/UserController.java +++ b/src/main/java/com/m3pro/groundflip/controller/UserController.java @@ -13,6 +13,7 @@ import org.springframework.web.multipart.MultipartFile; import com.m3pro.groundflip.domain.dto.Response; +import com.m3pro.groundflip.domain.dto.user.FcmTokenRequest; import com.m3pro.groundflip.domain.dto.user.UserDeleteRequest; import com.m3pro.groundflip.domain.dto.user.UserInfoRequest; import com.m3pro.groundflip.domain.dto.user.UserInfoResponse; @@ -62,4 +63,12 @@ public Response putUserInfo( userService.deleteUser(userId, userDeleteRequest); return Response.createSuccessWithNoData(); } + + @Operation(summary = "FCM 등록 토큰 등록", description = "푸시 알림을 위한 FCM 등록 토큰을 저장한다.") + @PutMapping("/fcm-token") + public Response postFcmToken( + @RequestBody FcmTokenRequest fcmTokenRequest + ) { + return Response.createSuccessWithNoData(); + } } From 3190370dcb16d83846ab33329a0aba38165e6cd2 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 17:04:16 +0900 Subject: [PATCH 04/66] =?UTF-8?q?M3-286=20Feat=20:=20fcmToken=20=EC=9D=84?= =?UTF-8?q?=20user=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EC=B0=BE?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/repository/FcmTokenRepository.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java diff --git a/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java b/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java new file mode 100644 index 00000000..7c64c778 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java @@ -0,0 +1,12 @@ +package com.m3pro.groundflip.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.m3pro.groundflip.domain.entity.FcmToken; +import com.m3pro.groundflip.domain.entity.User; + +public interface FcmTokenRepository extends JpaRepository { + Optional findByUser(User user); +} From d14886e7d4cb8d2942f3cb4f007bcc5b7d03410b Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 17:06:21 +0900 Subject: [PATCH 05/66] =?UTF-8?q?M3-286=20Feat=20:=20=ED=86=A0=ED=81=B0?= =?UTF-8?q?=EC=9D=84=20=EB=93=B1=EB=A1=9D=ED=95=98=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m3pro/groundflip/service/FcmService.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/service/FcmService.java diff --git a/src/main/java/com/m3pro/groundflip/service/FcmService.java b/src/main/java/com/m3pro/groundflip/service/FcmService.java new file mode 100644 index 00000000..9bb253c2 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/service/FcmService.java @@ -0,0 +1,43 @@ +package com.m3pro.groundflip.service; + +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.m3pro.groundflip.domain.dto.user.FcmTokenRequest; +import com.m3pro.groundflip.domain.entity.FcmToken; +import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; +import com.m3pro.groundflip.repository.FcmTokenRepository; +import com.m3pro.groundflip.repository.UserRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@RequiredArgsConstructor +@Slf4j +public class FcmService { + private final UserRepository userRepository; + private final FcmTokenRepository fcmTokenRepository; + + @Transactional + public void registerFcmToken(FcmTokenRequest fcmTokenRequest) { + Long userId = fcmTokenRequest.getUserId(); + User user = userRepository.findById(userId).orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND)); + Optional fcmToken = fcmTokenRepository.findByUser(user); + + if (fcmToken.isPresent()) { + fcmToken.get().updateModifiedAt(); + } else { + fcmTokenRepository.save( + FcmToken.builder() + .user(user) + .token(fcmTokenRequest.getFcmToken()) + .build() + ); + } + } +} From c693f52575daf3c936f36c9d461573376893af3b Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 17:16:36 +0900 Subject: [PATCH 06/66] =?UTF-8?q?M3-286=20Feat=20:=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20api=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m3pro/groundflip/controller/UserController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/m3pro/groundflip/controller/UserController.java b/src/main/java/com/m3pro/groundflip/controller/UserController.java index cffb54a6..b360b08c 100644 --- a/src/main/java/com/m3pro/groundflip/controller/UserController.java +++ b/src/main/java/com/m3pro/groundflip/controller/UserController.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,6 +18,7 @@ import com.m3pro.groundflip.domain.dto.user.UserDeleteRequest; import com.m3pro.groundflip.domain.dto.user.UserInfoRequest; import com.m3pro.groundflip.domain.dto.user.UserInfoResponse; +import com.m3pro.groundflip.service.FcmService; import com.m3pro.groundflip.service.UserService; import io.swagger.v3.oas.annotations.Operation; @@ -32,6 +34,7 @@ @SecurityRequirement(name = "Authorization") public class UserController { private final UserService userService; + private final FcmService fcmService; @Operation(summary = "사용자 기본 정보 조회", description = "닉네임, id, 출생년도, 성별, 프로필 사진, 그룹이름, 그룹 id 를 조회 한다.") @GetMapping("/{userId}") @@ -65,10 +68,11 @@ public Response putUserInfo( } @Operation(summary = "FCM 등록 토큰 등록", description = "푸시 알림을 위한 FCM 등록 토큰을 저장한다.") - @PutMapping("/fcm-token") + @PostMapping("/fcm-token") public Response postFcmToken( @RequestBody FcmTokenRequest fcmTokenRequest ) { + fcmService.registerFcmToken(fcmTokenRequest); return Response.createSuccessWithNoData(); } } From ea9f433b2b1433191ebc7ffd301c829dd5965590 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 17:20:33 +0900 Subject: [PATCH 07/66] =?UTF-8?q?M3-286=20Feat=20:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=EC=8B=9C=20fcm=20=ED=86=A0=ED=81=B0=EB=8F=84?= =?UTF-8?q?=20=EA=B0=99=EC=9D=B4=20=EC=82=AD=EC=A0=9C=20=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m3pro/groundflip/repository/FcmTokenRepository.java | 2 ++ src/main/java/com/m3pro/groundflip/service/UserService.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java b/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java index 7c64c778..b75cadee 100644 --- a/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/FcmTokenRepository.java @@ -9,4 +9,6 @@ public interface FcmTokenRepository extends JpaRepository { Optional findByUser(User user); + + void deleteByUser(User user); } diff --git a/src/main/java/com/m3pro/groundflip/service/UserService.java b/src/main/java/com/m3pro/groundflip/service/UserService.java index 23d7ad3e..a6d88e7e 100644 --- a/src/main/java/com/m3pro/groundflip/service/UserService.java +++ b/src/main/java/com/m3pro/groundflip/service/UserService.java @@ -21,6 +21,7 @@ import com.m3pro.groundflip.exception.ErrorCode; import com.m3pro.groundflip.jwt.JwtProvider; import com.m3pro.groundflip.repository.AppleRefreshTokenRepository; +import com.m3pro.groundflip.repository.FcmTokenRepository; import com.m3pro.groundflip.repository.RankingRedisRepository; import com.m3pro.groundflip.repository.UserCommunityRepository; import com.m3pro.groundflip.repository.UserRepository; @@ -39,6 +40,7 @@ public class UserService { private final UserRepository userRepository; private final AppleRefreshTokenRepository appleRefreshTokenRepository; private final UserCommunityRepository userCommunityRepository; + private final FcmTokenRepository fcmTokenRepository; private final S3Uploader s3Uploader; private final JwtProvider jwtProvider; private final AppleApiClient appleApiClient; @@ -122,6 +124,8 @@ public void deleteUser(Long userId, UserDeleteRequest userDeleteRequest) { if (deletedUser.getProvider() == Provider.APPLE) { revokeAppleToken(deletedUser.getId()); } + fcmTokenRepository.deleteByUser(deletedUser); + deletedUser.updateBirthYear(convertToDate(1900)); deletedUser.updateNickName(null); deletedUser.updateProfileImage(null); From b50da7bc417ac6b0c1436fbf7fa9f73f7937c114 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 17:46:43 +0900 Subject: [PATCH 08/66] =?UTF-8?q?M3-286=20Test=20:=20registerFcmToken=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/service/FcmServiceTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java diff --git a/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java b/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java new file mode 100644 index 00000000..96ce4b4b --- /dev/null +++ b/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java @@ -0,0 +1,75 @@ +package com.m3pro.groundflip.service; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.m3pro.groundflip.domain.dto.user.FcmTokenRequest; +import com.m3pro.groundflip.domain.entity.FcmToken; +import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; +import com.m3pro.groundflip.repository.FcmTokenRepository; +import com.m3pro.groundflip.repository.UserRepository; + +@ExtendWith(MockitoExtension.class) +class FcmServiceTest { + private static final Long testUserId = 1L; + private static final String testFcmToken = "test token"; + private static FcmTokenRequest fcmTokenRequest; + @Mock + private UserRepository userRepository; + @Mock + private FcmTokenRepository fcmTokenRepository; + @InjectMocks + private FcmService fcmService; + + @BeforeAll + static void beforeAll() { + fcmTokenRequest = new FcmTokenRequest(testUserId, testFcmToken); + } + + @Test + @DisplayName("[registerFcmToken] user 가 없는 경우 에러 발생") + void registerFcmToken_UserNotFound() { + when(userRepository.findById(testUserId)).thenReturn(Optional.empty()); + + AppException exception = assertThrows(AppException.class, () -> fcmService.registerFcmToken(fcmTokenRequest)); + assertThat(exception.getErrorCode()).isEqualTo(ErrorCode.USER_NOT_FOUND); + } + + @Test + @DisplayName("[registerFcmToken] fcm 토큰 새로 등록") + void registerFcmToken_RegisterNewToken() { + User user = User.builder().id(1L).email("test@test.com").build(); + when(userRepository.findById(testUserId)).thenReturn(Optional.of(user)); + when(fcmTokenRepository.findByUser(user)).thenReturn(Optional.empty()); + + fcmService.registerFcmToken(fcmTokenRequest); + + verify(fcmTokenRepository, times(1)).save(any()); + } + + @Test + @DisplayName("[registerFcmToken] fcm 토큰이 이미 등록된 경우 수정 날짜만 변경") + void registerFcmToken_UpdateModifiedDate() { + User user = User.builder().id(1L).email("test@test.com").build(); + FcmToken fcmToken = FcmToken.builder().id(1L).token(testFcmToken).user(user).build(); + when(userRepository.findById(testUserId)).thenReturn(Optional.of(user)); + when(fcmTokenRepository.findByUser(user)).thenReturn(Optional.of(fcmToken)); + + fcmService.registerFcmToken(fcmTokenRequest); + + assertThat(fcmToken.getModifiedAt()).isNotNull(); + } +} \ No newline at end of file From 90d3d4722f848d4fd1b40ec04c78dc443a24aae3 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 17:50:19 +0900 Subject: [PATCH 09/66] =?UTF-8?q?M3-286=20Test=20:=20deleteUser=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20fcm=20token=20=EC=82=AD=EC=A0=9C=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B6=80=EB=B6=84=EB=8F=84=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/service/UserServiceTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/com/m3pro/groundflip/service/UserServiceTest.java b/src/test/java/com/m3pro/groundflip/service/UserServiceTest.java index 4a6ec5d2..10f41aa8 100644 --- a/src/test/java/com/m3pro/groundflip/service/UserServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/UserServiceTest.java @@ -36,6 +36,7 @@ import com.m3pro.groundflip.exception.ErrorCode; import com.m3pro.groundflip.jwt.JwtProvider; import com.m3pro.groundflip.repository.AppleRefreshTokenRepository; +import com.m3pro.groundflip.repository.FcmTokenRepository; import com.m3pro.groundflip.repository.RankingRedisRepository; import com.m3pro.groundflip.repository.UserCommunityRepository; import com.m3pro.groundflip.repository.UserRepository; @@ -50,6 +51,9 @@ class UserServiceTest { @Mock private RankingRedisRepository rankingRedisRepository; + @Mock + private FcmTokenRepository fcmTokenRepository; + @Mock private S3Uploader s3Uploader; @@ -207,6 +211,7 @@ void deleteUserTest() { Calendar calendar = Calendar.getInstance(); calendar.setTime(deleteUser.getBirthYear()); + verify(fcmTokenRepository, times(1)).deleteByUser(any()); assertThat(deleteUser.getNickname()).isEqualTo(null); assertThat(deleteUser.getProfileImage()).isEqualTo(null); assertThat(calendar.get(Calendar.YEAR)).isEqualTo(1900); @@ -236,6 +241,7 @@ void deleteUserTestInApple() { Calendar calendar = Calendar.getInstance(); calendar.setTime(deleteUser.getBirthYear()); + verify(fcmTokenRepository, times(1)).deleteByUser(any()); verify(appleApiClient, times(1)).revokeToken(any()); verify(appleRefreshTokenRepository, times(1)).delete(any()); assertThat(deleteUser.getNickname()).isEqualTo(null); From ebd979c7b785f93c05de5a05ddb6530991dbc0a4 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 18:24:16 +0900 Subject: [PATCH 10/66] =?UTF-8?q?M3-286=20Refactor=20:=20=EB=9E=AD?= =?UTF-8?q?=ED=82=B9=EC=9D=84=20=EC=88=98=EC=A0=95=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9D=84=20rankingService=20=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/service/PixelService.java | 28 +------------------ .../groundflip/service/RankingService.java | 22 +++++++++++++++ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/service/PixelService.java b/src/main/java/com/m3pro/groundflip/service/PixelService.java index 9923ba74..507add1d 100644 --- a/src/main/java/com/m3pro/groundflip/service/PixelService.java +++ b/src/main/java/com/m3pro/groundflip/service/PixelService.java @@ -150,7 +150,7 @@ private void occupyPixel(PixelOccupyRequest pixelOccupyRequest) { Pixel targetPixel = pixelRepository.findByXAndY(pixelOccupyRequest.getX(), pixelOccupyRequest.getY()) .orElseThrow(() -> new AppException(ErrorCode.PIXEL_NOT_FOUND)); - updateRankingOnCache(targetPixel, occupyingUserId); + rankingService.updateRanking(targetPixel, occupyingUserId); updatePixelOwner(targetPixel, occupyingUserId); updatePixelAddress(targetPixel); @@ -178,32 +178,6 @@ private void updatePixelAddress(Pixel targetPixel) { } } - /** - * 레디스 상에서 랭킹을 조정한다. - * @param targetPixel 랭킹을 조정할 픽셀 - * @param occupyingUserId 현재 픽셀을 방문한 유저 - * @return - * @author 김민욱 - */ - private void updateRankingOnCache(Pixel targetPixel, Long occupyingUserId) { - Long originalOwnerUserId = targetPixel.getUserId(); - LocalDateTime thisWeekStart = DateUtils.getThisWeekStartDate().atTime(0, 0); - LocalDateTime modifiedAt = targetPixel.getModifiedAt(); - - if (Objects.equals(originalOwnerUserId, occupyingUserId)) { - if (modifiedAt.isAfter(thisWeekStart)) { - return; - } - rankingService.increaseCurrentPixelCount(occupyingUserId); - } else { - if (originalOwnerUserId == null || modifiedAt.isBefore(thisWeekStart)) { - rankingService.increaseCurrentPixelCount(occupyingUserId); - } else { - rankingService.updateRankingAfterOccupy(occupyingUserId, originalOwnerUserId); - } - } - } - /** * 개인 기록 모드에서 픽셀 방문 기록을 가져온다 * @param pixelId 기록을 조회할 픽셀 diff --git a/src/main/java/com/m3pro/groundflip/service/RankingService.java b/src/main/java/com/m3pro/groundflip/service/RankingService.java index 4ea38f20..5195211a 100644 --- a/src/main/java/com/m3pro/groundflip/service/RankingService.java +++ b/src/main/java/com/m3pro/groundflip/service/RankingService.java @@ -1,8 +1,10 @@ package com.m3pro.groundflip.service; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -11,6 +13,7 @@ import com.m3pro.groundflip.domain.dto.ranking.Ranking; import com.m3pro.groundflip.domain.dto.ranking.UserRankingResponse; +import com.m3pro.groundflip.domain.entity.Pixel; import com.m3pro.groundflip.domain.entity.RankingHistory; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.exception.AppException; @@ -31,6 +34,25 @@ public class RankingService { private final UserRepository userRepository; private final RankingHistoryRepository rankingHistoryRepository; + public void updateRanking(Pixel targetPixel, Long occupyingUserId) { + Long originalOwnerUserId = targetPixel.getUserId(); + LocalDateTime thisWeekStart = DateUtils.getThisWeekStartDate().atTime(0, 0); + LocalDateTime modifiedAt = targetPixel.getModifiedAt(); + + if (Objects.equals(originalOwnerUserId, occupyingUserId)) { + if (modifiedAt.isAfter(thisWeekStart)) { + return; + } + increaseCurrentPixelCount(occupyingUserId); + } else { + if (originalOwnerUserId == null || modifiedAt.isBefore(thisWeekStart)) { + increaseCurrentPixelCount(occupyingUserId); + } else { + updateRankingAfterOccupy(occupyingUserId, originalOwnerUserId); + } + } + } + /** * 현재 픽셀의 수를 1 증가 시킨다. * @param userId 사용자 id From ed082ab2cfe92752368d481344d2f8992d739d5f Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 8 Aug 2024 18:55:28 +0900 Subject: [PATCH 11/66] =?UTF-8?q?M3-286=20Test=20:=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=9E=AD=ED=82=B9=EC=9D=84=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/global/BaseTimeEntity.java | 6 +- .../m3pro/groundflip/service/FcmService.java | 2 +- .../groundflip/service/PixelService.java | 2 +- .../groundflip/service/RankingService.java | 24 ++----- .../service/RankingServiceTest.java | 64 +++++++++++++++---- 5 files changed, 64 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/global/BaseTimeEntity.java b/src/main/java/com/m3pro/groundflip/domain/entity/global/BaseTimeEntity.java index abac1d16..83e0bf94 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/global/BaseTimeEntity.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/global/BaseTimeEntity.java @@ -22,7 +22,11 @@ public class BaseTimeEntity { @LastModifiedDate private LocalDateTime modifiedAt; - public void updateModifiedAt() { + public void updateModifiedAtToNow() { modifiedAt = LocalDateTime.now(); } + + public void updateModifiedAt(LocalDateTime localDateTime) { + modifiedAt = localDateTime; + } } diff --git a/src/main/java/com/m3pro/groundflip/service/FcmService.java b/src/main/java/com/m3pro/groundflip/service/FcmService.java index 9bb253c2..c47c4aed 100644 --- a/src/main/java/com/m3pro/groundflip/service/FcmService.java +++ b/src/main/java/com/m3pro/groundflip/service/FcmService.java @@ -30,7 +30,7 @@ public void registerFcmToken(FcmTokenRequest fcmTokenRequest) { Optional fcmToken = fcmTokenRepository.findByUser(user); if (fcmToken.isPresent()) { - fcmToken.get().updateModifiedAt(); + fcmToken.get().updateModifiedAtToNow(); } else { fcmTokenRepository.save( FcmToken.builder() diff --git a/src/main/java/com/m3pro/groundflip/service/PixelService.java b/src/main/java/com/m3pro/groundflip/service/PixelService.java index 507add1d..7335af41 100644 --- a/src/main/java/com/m3pro/groundflip/service/PixelService.java +++ b/src/main/java/com/m3pro/groundflip/service/PixelService.java @@ -159,7 +159,7 @@ private void occupyPixel(PixelOccupyRequest pixelOccupyRequest) { private void updatePixelOwner(Pixel targetPixel, Long occupyingUserId) { if (Objects.equals(targetPixel.getUserId(), occupyingUserId)) { - targetPixel.updateModifiedAt(); + targetPixel.updateModifiedAtToNow(); } else { targetPixel.updateUserId(occupyingUserId); } diff --git a/src/main/java/com/m3pro/groundflip/service/RankingService.java b/src/main/java/com/m3pro/groundflip/service/RankingService.java index 5195211a..49822954 100644 --- a/src/main/java/com/m3pro/groundflip/service/RankingService.java +++ b/src/main/java/com/m3pro/groundflip/service/RankingService.java @@ -43,40 +43,24 @@ public void updateRanking(Pixel targetPixel, Long occupyingUserId) { if (modifiedAt.isAfter(thisWeekStart)) { return; } - increaseCurrentPixelCount(occupyingUserId); + rankingRedisRepository.increaseCurrentPixelCount(occupyingUserId); } else { if (originalOwnerUserId == null || modifiedAt.isBefore(thisWeekStart)) { - increaseCurrentPixelCount(occupyingUserId); + rankingRedisRepository.increaseCurrentPixelCount(occupyingUserId); } else { updateRankingAfterOccupy(occupyingUserId, originalOwnerUserId); } } } - /** - * 현재 픽셀의 수를 1 증가 시킨다. - * @param userId 사용자 id - */ - public void increaseCurrentPixelCount(Long userId) { - rankingRedisRepository.increaseCurrentPixelCount(userId); - } - - /** - * 현재 픽셀의 수를 1 감소 시킨다. - * @param userId 사용자 id - */ - public void decreaseCurrentPixelCount(Long userId) { - rankingRedisRepository.decreaseCurrentPixelCount(userId); - } - /** * 픽셀을 새로 차지하는 유저의 점수는 1증가, 빼앗긴 유저의 점수는 1감소 * @param occupyingUserId 픽셀을 새로 차지하는 유저 * @param deprivedUserId 픽셀을 뺴앗긴 유저 */ public void updateRankingAfterOccupy(Long occupyingUserId, Long deprivedUserId) { - increaseCurrentPixelCount(occupyingUserId); - decreaseCurrentPixelCount(deprivedUserId); + rankingRedisRepository.increaseCurrentPixelCount(occupyingUserId); + rankingRedisRepository.decreaseCurrentPixelCount(deprivedUserId); } /** diff --git a/src/test/java/com/m3pro/groundflip/service/RankingServiceTest.java b/src/test/java/com/m3pro/groundflip/service/RankingServiceTest.java index 856a3f47..5113eb7f 100644 --- a/src/test/java/com/m3pro/groundflip/service/RankingServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/RankingServiceTest.java @@ -21,6 +21,7 @@ import com.m3pro.groundflip.domain.dto.ranking.Ranking; import com.m3pro.groundflip.domain.dto.ranking.UserRankingResponse; +import com.m3pro.groundflip.domain.entity.Pixel; import com.m3pro.groundflip.domain.entity.RankingHistory; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.exception.AppException; @@ -28,6 +29,7 @@ import com.m3pro.groundflip.repository.RankingHistoryRepository; import com.m3pro.groundflip.repository.RankingRedisRepository; import com.m3pro.groundflip.repository.UserRepository; +import com.m3pro.groundflip.util.DateUtils; @ExtendWith(MockitoExtension.class) class RankingServiceTest { @@ -46,27 +48,67 @@ void init() { } @Test - @DisplayName("[increaseCurrentPixelCount] userId 에 해당하는 현재 소유 픽셀의 개수를 1 증가시킨다.") - void increaseCurrentPixelCountTest() { - Long userId = 1L; + @DisplayName("[updateRanking] 이번주에 이미 차지한 땅이라면 랭킹 업데이트 하지 않는다.") + void updateRanking_NoUpdate() { + Long occupyingUserId = 1L; + Pixel targetPixel = Pixel.builder().userId(occupyingUserId).build(); + targetPixel.updateModifiedAt(DateUtils.getThisWeekStartDate().atTime(0, 0, 0).plusDays(1)); - rankingService.increaseCurrentPixelCount(userId); + rankingService.updateRanking(targetPixel, occupyingUserId); - verify(rankingRedisRepository, times(1)).increaseCurrentPixelCount(userId); + verify(rankingRedisRepository, never()).increaseCurrentPixelCount(occupyingUserId); } @Test - @DisplayName("[decreasePixelCount] userId 에 해당하는 현재 소유 픽셀의 개수를 1 감소시킨다.") - void decreasePixelCountTest() { - Long userId = 1L; + @DisplayName("[updateRanking] 저번주에 차지한 땅이고 차지한 사람과 차지하려는 사람이 같다면 랭킹을 업데이트한다.") + void updateRanking_UpdateBeforeThisWeek() { + Long occupyingUserId = 1L; + Pixel targetPixel = Pixel.builder().userId(occupyingUserId).build(); + targetPixel.updateModifiedAt(DateUtils.getThisWeekStartDate().atTime(0, 0, 0).minusDays(3)); + + rankingService.updateRanking(targetPixel, occupyingUserId); + + verify(rankingRedisRepository, times(1)).increaseCurrentPixelCount(occupyingUserId); + } + + @Test + @DisplayName("[updateRanking] 아무도 차지 한 적이 없는 땅이라면 차지하려는 사람의 점수를 추가한다.") + void updateRanking_NeverOccupied() { + Long occupyingUserId = 1L; + Pixel targetPixel = Pixel.builder().userId(null).build(); + + rankingService.updateRanking(targetPixel, occupyingUserId); + + verify(rankingRedisRepository, times(1)).increaseCurrentPixelCount(occupyingUserId); + } - rankingService.decreaseCurrentPixelCount(userId); + @Test + @DisplayName("[updateRanking] 가장 최근에 차지한 시간이 저번주라면 지금 차지하려는 사람의 점수를 추가한다.") + void updateRanking_BeforeThisWeek() { + Long occupyingUserId = 1L; + Pixel targetPixel = Pixel.builder().userId(3L).build(); + targetPixel.updateModifiedAt(DateUtils.getThisWeekStartDate().atTime(0, 0, 0).minusDays(3)); - verify(rankingRedisRepository, times(1)).decreaseCurrentPixelCount(userId); + rankingService.updateRanking(targetPixel, occupyingUserId); + + verify(rankingRedisRepository, times(1)).increaseCurrentPixelCount(occupyingUserId); + } + + @Test + @DisplayName("[updateRanking] 가장 최근에 차지한 시간이 이번주이고 차지하려는 사람과 차지한 사람이 다르면 지금 차지하려는 사람의 점수를 추가하고 차지한 사람의 점수는 감소시킨다.") + void updateRanking_OccupyPixel() { + Long occupyingUserId = 1L; + Pixel targetPixel = Pixel.builder().userId(3L).build(); + targetPixel.updateModifiedAt(DateUtils.getThisWeekStartDate().atTime(0, 0, 0).plusDays(3)); + + rankingService.updateRanking(targetPixel, occupyingUserId); + + verify(rankingRedisRepository, times(1)).increaseCurrentPixelCount(occupyingUserId); + verify(rankingRedisRepository, times(1)).decreaseCurrentPixelCount(3L); } @Test - @DisplayName("[decreasePixelCount] occupyingUserId 에 해당하는 현재 소유 픽셀의 개수를 1 증가시키고 deprivedUserId 에 해당하는 현재 소유 픽셀의 개수를 1 감소시킨다.") + @DisplayName("[updateRankingAfterOccupy] occupyingUserId 에 해당하는 현재 소유 픽셀의 개수를 1 증가시키고 deprivedUserId 에 해당하는 현재 소유 픽셀의 개수를 1 감소시킨다.") void updateRankingAfterOccupyTest() { Long occupyingUserId = 1L; Long deprivedUserId = 2L; From b8ad42d78aa21777412a45102baeb74d059abd57 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:33:58 +0900 Subject: [PATCH 12/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20entity,=20dto=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/user/UserPlaceMarkRequest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java new file mode 100644 index 00000000..73b1f794 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java @@ -0,0 +1,25 @@ +package com.m3pro.groundflip.domain.dto.user; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(title = "사용자 즐겨찾기 정보 등록") +public class UserPlaceMarkRequest { + + @Schema(description = "즐겨찾기 장소 이름", example = "학교") + private String placeName; + + @Schema(description = "위도", example = "37.321147") + private double latitude; + + @Schema(description = "경도", example = "127.093171") + private double longitude; + +} From 298708682e1d9d0b1214ffe1f9b2bc74d1f809cb Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:35:56 +0900 Subject: [PATCH 13/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20entity,=20dto=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/user/{UserPlaceMarkRequest.java => MyPlaceRequest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/com/m3pro/groundflip/domain/dto/user/{UserPlaceMarkRequest.java => MyPlaceRequest.java} (94%) diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/user/MyPlaceRequest.java similarity index 94% rename from src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java rename to src/main/java/com/m3pro/groundflip/domain/dto/user/MyPlaceRequest.java index 73b1f794..fc373865 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/user/UserPlaceMarkRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/user/MyPlaceRequest.java @@ -11,7 +11,7 @@ @NoArgsConstructor @Builder @Schema(title = "사용자 즐겨찾기 정보 등록") -public class UserPlaceMarkRequest { +public class MyPlaceRequest { @Schema(description = "즐겨찾기 장소 이름", example = "학교") private String placeName; From 4bd9f31847228147ba43174fdfa5b3d0bcd22745 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 7 Aug 2024 01:46:08 +0900 Subject: [PATCH 14/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20put=20api=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MyPlaceController.java | 34 ++++++++++++++ .../dto/{user => myplace}/MyPlaceRequest.java | 9 +++- .../com/m3pro/groundflip/enums/Place.java | 14 ++++++ .../repository/MyPlaceRepository.java | 9 ++++ .../groundflip/service/MyPlaceService.java | 46 +++++++++++++++++++ 5 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java rename src/main/java/com/m3pro/groundflip/domain/dto/{user => myplace}/MyPlaceRequest.java (74%) create mode 100644 src/main/java/com/m3pro/groundflip/enums/Place.java create mode 100644 src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java create mode 100644 src/main/java/com/m3pro/groundflip/service/MyPlaceService.java diff --git a/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java b/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java new file mode 100644 index 00000000..a6e91ef1 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java @@ -0,0 +1,34 @@ +package com.m3pro.groundflip.controller; + +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.m3pro.groundflip.domain.dto.Response; +import com.m3pro.groundflip.domain.dto.myplace.MyPlaceRequest; +import com.m3pro.groundflip.service.MyPlaceService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/myplace") +@Tag(name = "myplace", description = "즐겨찾기 API") +public class MyPlaceController { + private final MyPlaceService myPlaceService; + + @Operation(summary = "사용자 즐겨찾기 등록", description = "장소의 좌표, 이름을 저장한다") + @PutMapping("") + public Response putMyPlace( + @Parameter(description = "즐겨찾기 저장 userId", required = true) + @RequestBody MyPlaceRequest myPlaceRequest + ) { + myPlaceService.putMyPlace(myPlaceRequest); + return Response.createSuccessWithNoData(); + } + +} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/user/MyPlaceRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceRequest.java similarity index 74% rename from src/main/java/com/m3pro/groundflip/domain/dto/user/MyPlaceRequest.java rename to src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceRequest.java index fc373865..edc195f7 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/user/MyPlaceRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceRequest.java @@ -1,4 +1,6 @@ -package com.m3pro.groundflip.domain.dto.user; +package com.m3pro.groundflip.domain.dto.myplace; + +import com.m3pro.groundflip.enums.Place; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -13,8 +15,11 @@ @Schema(title = "사용자 즐겨찾기 정보 등록") public class MyPlaceRequest { + @Schema(description = "유저 id", example = "1") + private Long userId; + @Schema(description = "즐겨찾기 장소 이름", example = "학교") - private String placeName; + private Place placeName; @Schema(description = "위도", example = "37.321147") private double latitude; diff --git a/src/main/java/com/m3pro/groundflip/enums/Place.java b/src/main/java/com/m3pro/groundflip/enums/Place.java new file mode 100644 index 00000000..4627a157 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/enums/Place.java @@ -0,0 +1,14 @@ +package com.m3pro.groundflip.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum Place { + HOME("집"), + COMPANY("회사/학교"), + ELSE("기타 장소"); + + private String place; +} diff --git a/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java b/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java new file mode 100644 index 00000000..5c703256 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java @@ -0,0 +1,9 @@ +package com.m3pro.groundflip.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.m3pro.groundflip.domain.entity.MyPlace; + +public interface MyPlaceRepository extends JpaRepository { + +} diff --git a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java new file mode 100644 index 00000000..12eacb8b --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java @@ -0,0 +1,46 @@ +package com.m3pro.groundflip.service; + +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.springframework.stereotype.Service; + +import com.m3pro.groundflip.domain.dto.myplace.MyPlaceRequest; +import com.m3pro.groundflip.domain.entity.MyPlace; +import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; +import com.m3pro.groundflip.repository.MyPlaceRepository; +import com.m3pro.groundflip.repository.UserRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class MyPlaceService { + + private final UserRepository userRepository; + private final GeometryFactory geometryFactory; + private final MyPlaceRepository myPlaceRepository; + + @Transactional + public void putMyPlace(MyPlaceRequest myPlaceRequest) { + User user = userRepository.findById(myPlaceRequest.getUserId()) + .orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND)); + double placeLongitude = myPlaceRequest.getLongitude(); + double placeLatitude = myPlaceRequest.getLatitude(); + + Point point = geometryFactory.createPoint(new Coordinate(placeLongitude, placeLatitude)); + + myPlaceRepository.save( + MyPlace.builder() + .user(user) + .placePoint(point) + .placeName(myPlaceRequest.getPlaceName()) + .build() + ); + + } + +} From c547e9699316e409138b9db95352a3f568489577 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Thu, 8 Aug 2024 03:01:57 +0900 Subject: [PATCH 15/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20get=20api=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MyPlaceController.java | 14 ++++++++ .../domain/dto/myplace/MyPlaceResponse.java | 33 +++++++++++++++++++ .../m3pro/groundflip/exception/ErrorCode.java | 1 + .../repository/MyPlaceRepository.java | 17 +++++++++- .../groundflip/service/MyPlaceService.java | 10 ++++++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java diff --git a/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java b/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java index a6e91ef1..821b6049 100644 --- a/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java +++ b/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java @@ -1,5 +1,9 @@ package com.m3pro.groundflip.controller; +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -7,6 +11,7 @@ import com.m3pro.groundflip.domain.dto.Response; import com.m3pro.groundflip.domain.dto.myplace.MyPlaceRequest; +import com.m3pro.groundflip.domain.dto.myplace.MyPlaceResponse; import com.m3pro.groundflip.service.MyPlaceService; import io.swagger.v3.oas.annotations.Operation; @@ -31,4 +36,13 @@ public Response putMyPlace( return Response.createSuccessWithNoData(); } + @Operation(summary = "사용자 즐겨찾기 get", description = "즐겨찾기 장소의 좌표, 이름을 가져온다") + @GetMapping("/{userId}") + public Response> getMyPlace( + @Parameter(description = "찾고자 하는 userId", required = true) + @PathVariable Long userId + ) { + return Response.createSuccess(myPlaceService.getMyPlace(userId)); + } + } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java new file mode 100644 index 00000000..6ff5cbbb --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java @@ -0,0 +1,33 @@ +package com.m3pro.groundflip.domain.dto.myplace; + +import org.locationtech.jts.geom.Point; + +import com.m3pro.groundflip.domain.entity.MyPlace; +import com.m3pro.groundflip.enums.Place; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(title = "사용자 즐겨찾기 정보 검색") +public class MyPlaceResponse { + + @Schema(description = "즐겨찾기 장소 이름", example = "학교") + private Place placeName; + + @Schema(description = "즐겨찾기 장소 좌표", example = "0xE6100000010100000...") + private Point placePoint; + + public static MyPlaceResponse from(MyPlace myplace) { + return MyPlaceResponse.builder() + .placeName(myplace.getPlaceName()) + .placePoint(myplace.getPlacePoint()) + .build(); + } +} diff --git a/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java b/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java index 769faf31..77fc3345 100644 --- a/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java +++ b/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java @@ -13,6 +13,7 @@ public enum ErrorCode { GROUP_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 그룹입니다."), PIXEL_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 픽셀입니다."), IMAGE_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 이미지입니다."), + PLACE_NOT_FOUND(HttpStatus.NOT_FOUND, "장소가 등록되어 있지 않습니다."), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러 입니다"), // 권한 관련 에러 diff --git a/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java b/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java index 5c703256..77be54d3 100644 --- a/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java @@ -1,9 +1,24 @@ package com.m3pro.groundflip.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import com.m3pro.groundflip.domain.entity.MyPlace; public interface MyPlaceRepository extends JpaRepository { - + + @Query(value = """ + SELECT mp.* + FROM my_place mp + JOIN ( + SELECT place_name, MAX(my_place_id) AS max_place_mark_id + FROM my_place + GROUP BY place_name + ) grouped_mp + ON mp.my_place_id = grouped_mp.max_place_mark_id + WHERE mp.user_id = :userId + """, nativeQuery = true) + List findByUserId(Long userId); } diff --git a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java index 12eacb8b..97f0bfc1 100644 --- a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java +++ b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java @@ -1,11 +1,14 @@ package com.m3pro.groundflip.service; +import java.util.List; + import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.springframework.stereotype.Service; import com.m3pro.groundflip.domain.dto.myplace.MyPlaceRequest; +import com.m3pro.groundflip.domain.dto.myplace.MyPlaceResponse; import com.m3pro.groundflip.domain.entity.MyPlace; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.exception.AppException; @@ -40,7 +43,14 @@ public void putMyPlace(MyPlaceRequest myPlaceRequest) { .placeName(myPlaceRequest.getPlaceName()) .build() ); + } + public List getMyPlace(Long userId) { + List myPlaces = myPlaceRepository.findByUserId(userId); + if (myPlaces.isEmpty()) { + throw new AppException(ErrorCode.PLACE_NOT_FOUND); + } + return myPlaces.stream().map(MyPlaceResponse::from).toList(); } } From 137bd71db37f1495af03f6fdd5b3b886afbe799f Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 03:57:39 +0900 Subject: [PATCH 16/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/domain/entity/MyPlace.java | 52 +++++++ .../service/MyPlaceServiceTest.java | 140 ++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/entity/MyPlace.java create mode 100644 src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/MyPlace.java b/src/main/java/com/m3pro/groundflip/domain/entity/MyPlace.java new file mode 100644 index 00000000..d4548167 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/entity/MyPlace.java @@ -0,0 +1,52 @@ +package com.m3pro.groundflip.domain.entity; + +import org.locationtech.jts.geom.Point; + +import com.m3pro.groundflip.enums.Place; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "my_place") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class MyPlace { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "my_place_id") + private Long id; + + @Enumerated(EnumType.STRING) + private Place placeName; + + private Point placePoint; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + public void updatePlaceName(Place placeName) { + this.placeName = placeName; + } + + public void updatePlacePoint(Point placePoint) { + this.placePoint = placePoint; + } +} diff --git a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java new file mode 100644 index 00000000..a7003385 --- /dev/null +++ b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java @@ -0,0 +1,140 @@ +package com.m3pro.groundflip.service; + +import static org.assertj.core.api.AssertionsForClassTypes.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.m3pro.groundflip.domain.dto.myplace.MyPlaceRequest; +import com.m3pro.groundflip.domain.entity.MyPlace; +import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.enums.Place; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; +import com.m3pro.groundflip.repository.MyPlaceRepository; +import com.m3pro.groundflip.repository.UserRepository; + +@ExtendWith(MockitoExtension.class) +public class MyPlaceServiceTest { + @Mock + private UserRepository userRepository; + + @Mock + private GeometryFactory geometryFactory; + + @Mock + private MyPlaceRepository myPlaceRepository; + + @InjectMocks + private MyPlaceService myPlaceService; + + private MyPlaceRequest myPlaceRequest; + + private User user; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + User user = User.builder().id(1L).nickname("test User").build(); + + } + + @Test + @DisplayName("[putMyPlace] 즐겨찾기 장소가 올바르게 업데이트 되는지") + void putMyPlaceTest() { + //Given + + myPlaceRequest = MyPlaceRequest.builder() + .userId(1L) + .placeName(Place.HOME) + .latitude(37.321147) + .longitude(127.093171) + .build(); + //When + when(userRepository.findById(myPlaceRequest.getUserId())).thenReturn(Optional.of(user)); + + myPlaceService.putMyPlace(myPlaceRequest); + //Then + verify(userRepository, times(1)).findById(myPlaceRequest.getUserId()); + + assertThat(user.getNickname()).isEqualTo("testUser"); + } + + @Test + @DisplayName("[putMyPlace] 유저가 없을때 user not found에러가 잘 나오는지") + void puyMyPlaceErrorTest() { + myPlaceRequest = MyPlaceRequest.builder() + .userId(1L) + .placeName(Place.HOME) + .latitude(37.321147) + .longitude(127.093171) + .build(); + + when(userRepository.findById(myPlaceRequest.getUserId())).thenReturn(Optional.empty()); + + AppException thrown = assertThrows(AppException.class, () -> { + myPlaceService.putMyPlace(myPlaceRequest); + }); + assertEquals(ErrorCode.USER_NOT_FOUND, thrown.getErrorCode()); + + } + + @Test + @DisplayName("[getMyPlace] 즐겨찾기 장소를 올바르게 가져오는지") + void getMyPlaceTest() { + //Given + Long userId = 1L; + double latitude1 = 37.321147; + double latitude2 = 37.123456; + double longitude1 = 127.093171; + double longitude2 = 127.123456; + + Point point1 = geometryFactory.createPoint(new Coordinate(latitude1, longitude1)); + Point point2 = geometryFactory.createPoint(new Coordinate(latitude2, longitude2)); + + List myPlaceList = Arrays.asList( + MyPlace.builder().placeName(Place.HOME).placePoint(point1).build(), + MyPlace.builder().placeName(Place.HOME).placePoint(point2).build() + ); + + //When + when(myPlaceRepository.findByUserId(userId)).thenReturn(myPlaceList); + + List myPlaces = myPlaceRepository.findByUserId(userId); + + //Then + assertEquals(2, myPlaces.size()); + assertEquals(point1, myPlaces.get(0).getPlacePoint()); + assertEquals(point2, myPlaces.get(1).getPlacePoint()); + } + + @Test + @DisplayName("[getMyPlace] 저장된 값이 없을때 에러가 잘 나오는지") + void getMyPlaceErrorTest() { + //Given + Long userId = 1L; + + //When + AppException thrown = assertThrows(AppException.class, () -> { + myPlaceService.getMyPlace(userId); + }); + + //When + assertEquals(ErrorCode.PLACE_NOT_FOUND, thrown.getErrorCode()); + } +} From e60ed3533385a5ce5c26f2254caa02ace547bf38 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 05:52:44 +0900 Subject: [PATCH 17/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=EC=82=AD=EC=A0=9C=20api=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/controller/MyPlaceController.java | 11 +++++++++++ .../domain/dto/myplace/MyPlaceResponse.java | 4 ++++ .../groundflip/repository/MyPlaceRepository.java | 3 +++ .../com/m3pro/groundflip/service/MyPlaceService.java | 9 +++++++++ 4 files changed, 27 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java b/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java index 821b6049..3627d69e 100644 --- a/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java +++ b/src/main/java/com/m3pro/groundflip/controller/MyPlaceController.java @@ -2,6 +2,7 @@ import java.util.List; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; @@ -45,4 +46,14 @@ public Response> getMyPlace( return Response.createSuccess(myPlaceService.getMyPlace(userId)); } + @Operation(summary = "사용자 즐겨찾기 delete", description = "즐겨찾기 장소를 삭제한다") + @DeleteMapping("") + public Response deleteMyPlace( + @Parameter(description = "지우고자 하는 userId", required = true) + @RequestBody MyPlaceRequest myPlaceRequest + ) { + myPlaceService.deleteMyPlace(myPlaceRequest); + return Response.createSuccessWithNoData(); + } + } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java index 6ff5cbbb..e2bfa0a6 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/myplace/MyPlaceResponse.java @@ -18,6 +18,9 @@ @Schema(title = "사용자 즐겨찾기 정보 검색") public class MyPlaceResponse { + @Schema(description = "즐겨찾기 id", example = "1") + private Long id; + @Schema(description = "즐겨찾기 장소 이름", example = "학교") private Place placeName; @@ -26,6 +29,7 @@ public class MyPlaceResponse { public static MyPlaceResponse from(MyPlace myplace) { return MyPlaceResponse.builder() + .id(myplace.getId()) .placeName(myplace.getPlaceName()) .placePoint(myplace.getPlacePoint()) .build(); diff --git a/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java b/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java index 77be54d3..af4500ce 100644 --- a/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/MyPlaceRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query; import com.m3pro.groundflip.domain.entity.MyPlace; +import com.m3pro.groundflip.enums.Place; public interface MyPlaceRepository extends JpaRepository { @@ -21,4 +22,6 @@ SELECT place_name, MAX(my_place_id) AS max_place_mark_id WHERE mp.user_id = :userId """, nativeQuery = true) List findByUserId(Long userId); + + List findByUserIdAndPlaceName(Long userId, Place placeName); } diff --git a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java index 97f0bfc1..6f901521 100644 --- a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java +++ b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java @@ -53,4 +53,13 @@ public List getMyPlace(Long userId) { return myPlaces.stream().map(MyPlaceResponse::from).toList(); } + public void deleteMyPlace(MyPlaceRequest myPlaceRequest) { + List myplaces = myPlaceRepository.findByUserIdAndPlaceName(myPlaceRequest.getUserId(), + myPlaceRequest.getPlaceName()); + if (myplaces.isEmpty()) { + throw new AppException(ErrorCode.PLACE_NOT_FOUND); + } + myPlaceRepository.deleteAll(myplaces); + } + } From 29bbcfa1510b3a98c9e3c82fff12ad222f0c73d8 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 06:02:29 +0900 Subject: [PATCH 18/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=EC=82=AD=EC=A0=9C=20service=20test?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MyPlaceServiceTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java index a7003385..e51f9edf 100644 --- a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java @@ -137,4 +137,48 @@ void getMyPlaceErrorTest() { //When assertEquals(ErrorCode.PLACE_NOT_FOUND, thrown.getErrorCode()); } + + @Test + @DisplayName("[deleteMyPlace] 즐겨찾기 삭제 동작 테스트") + void deleteMyPlaceTest() { + //Given + Long userId = 1L; + + myPlaceRequest = MyPlaceRequest.builder() + .userId(userId) + .placeName(Place.HOME) + .build(); + + List myPlaceList = Arrays.asList( + MyPlace.builder().placeName(Place.HOME).user(user).build(), + MyPlace.builder().placeName(Place.HOME).user(user).build() + ); + + //when(myPlaceRepository.findByUserIdAndPlaceName(userId, Place.HOME)).thenReturn(myPlaceList); + + myPlaceRepository.deleteAll(myPlaceList); + + verify(myPlaceRepository, times(1)).deleteAll(myPlaceList); + + } + + @Test + @DisplayName("[deleteMyPlace] 즐겨찾기 장소가 존재하지 않을 때 에러가 발생하는지") + void deleteMyPlace_NotFound() { + // Given + Long userId = 1L; + Place placeName = Place.HOME; + MyPlaceRequest myPlaceRequest = MyPlaceRequest.builder() + .userId(userId) + .placeName(placeName) + .build(); + + // When + + AppException thrown = assertThrows(AppException.class, () -> { + myPlaceService.deleteMyPlace(myPlaceRequest); + }); + + assertEquals(ErrorCode.PLACE_NOT_FOUND, thrown.getErrorCode()); + } } From 0e3f8614a0c84762bbab63a28b0c6041ddda5908 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 06:20:39 +0900 Subject: [PATCH 19/66] =?UTF-8?q?M3-212=20Feat=20:=20test=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/service/MyPlaceServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java index e51f9edf..4266557f 100644 --- a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java @@ -50,7 +50,7 @@ public class MyPlaceServiceTest { @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); - User user = User.builder().id(1L).nickname("test User").build(); + user = User.builder().id(1L).nickname("test User").build(); } From 9b8247dc21ae5f86d2f440b17376f843c0d289c6 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 06:57:27 +0900 Subject: [PATCH 20/66] =?UTF-8?q?M3-212=20Feat=20:=20test=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MyPlaceServiceTest.java | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java index 4266557f..1dcd2f84 100644 --- a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java @@ -1,12 +1,10 @@ package com.m3pro.groundflip.service; -import static org.assertj.core.api.AssertionsForClassTypes.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.List; -import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -50,30 +48,41 @@ public class MyPlaceServiceTest { @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); - user = User.builder().id(1L).nickname("test User").build(); + //user = User.builder().id(1L).nickname("testUser").build(); } - @Test - @DisplayName("[putMyPlace] 즐겨찾기 장소가 올바르게 업데이트 되는지") - void putMyPlaceTest() { - //Given - - myPlaceRequest = MyPlaceRequest.builder() - .userId(1L) - .placeName(Place.HOME) - .latitude(37.321147) - .longitude(127.093171) - .build(); - //When - when(userRepository.findById(myPlaceRequest.getUserId())).thenReturn(Optional.of(user)); - - myPlaceService.putMyPlace(myPlaceRequest); - //Then - verify(userRepository, times(1)).findById(myPlaceRequest.getUserId()); - - assertThat(user.getNickname()).isEqualTo("testUser"); - } + // @Test + // @DisplayName("[putMyPlace] 즐겨찾기 장소가 올바르게 업데이트 되는지") + // void putMyPlaceTest() { + // // Given + // User user = User.builder() + // .id(1L) + // .nickname("testUser") + // .build(); + // + // MyPlaceRequest myPlaceRequest = MyPlaceRequest.builder() + // .userId(1L) + // .placeName(Place.HOME) + // .latitude(37.321147) + // .longitude(127.093171) + // .build(); + // + // Point mockPoint = mock(Point.class); + // when(geometryFactory.createPoint(any(Coordinate.class))).thenReturn(mockPoint); + // + // when(userRepository.findById(1L)).thenReturn(Optional.of(user)); + // when(myPlaceRepository.save(any(MyPlace.class))).thenReturn(null); + // + // // When + // myPlaceService.putMyPlace(myPlaceRequest); + // + // // Then + // verify(userRepository, times(1)).findById(myPlaceRequest.getUserId()); + // verify(myPlaceRepository, times(1)).save(any(MyPlace.class)); + // + // //assertThat(user.getNickname()).isEqualTo("testUser"); + // } @Test @DisplayName("[putMyPlace] 유저가 없을때 user not found에러가 잘 나오는지") @@ -85,8 +94,6 @@ void puyMyPlaceErrorTest() { .longitude(127.093171) .build(); - when(userRepository.findById(myPlaceRequest.getUserId())).thenReturn(Optional.empty()); - AppException thrown = assertThrows(AppException.class, () -> { myPlaceService.putMyPlace(myPlaceRequest); }); From 22d3a5304f6872d17276cbcf47ac398d8e32cb46 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 17:41:32 +0900 Subject: [PATCH 21/66] =?UTF-8?q?M3-212=20Feat=20:=20=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=EC=97=86=EC=9D=84=EC=8B=9C=20=EB=B9=88=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20get?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/m3pro/groundflip/service/MyPlaceService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java index 6f901521..d9e83e58 100644 --- a/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java +++ b/src/main/java/com/m3pro/groundflip/service/MyPlaceService.java @@ -47,9 +47,6 @@ public void putMyPlace(MyPlaceRequest myPlaceRequest) { public List getMyPlace(Long userId) { List myPlaces = myPlaceRepository.findByUserId(userId); - if (myPlaces.isEmpty()) { - throw new AppException(ErrorCode.PLACE_NOT_FOUND); - } return myPlaces.stream().map(MyPlaceResponse::from).toList(); } From 259de0479dc30fff538c1d9d4787d149b9be5cf3 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Fri, 9 Aug 2024 17:56:07 +0900 Subject: [PATCH 22/66] =?UTF-8?q?M3-212=20Feat=20:=20my=20place=20test=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MyPlaceServiceTest.java | 87 ++++++------------- 1 file changed, 27 insertions(+), 60 deletions(-) diff --git a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java index 1dcd2f84..93c7f3d6 100644 --- a/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/MyPlaceServiceTest.java @@ -5,8 +5,8 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -15,7 +15,6 @@ import org.locationtech.jts.geom.Point; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; import org.mockito.junit.jupiter.MockitoExtension; import com.m3pro.groundflip.domain.dto.myplace.MyPlaceRequest; @@ -45,60 +44,43 @@ public class MyPlaceServiceTest { private User user; - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - //user = User.builder().id(1L).nickname("testUser").build(); - - } - - // @Test - // @DisplayName("[putMyPlace] 즐겨찾기 장소가 올바르게 업데이트 되는지") - // void putMyPlaceTest() { - // // Given - // User user = User.builder() - // .id(1L) - // .nickname("testUser") - // .build(); - // - // MyPlaceRequest myPlaceRequest = MyPlaceRequest.builder() - // .userId(1L) - // .placeName(Place.HOME) - // .latitude(37.321147) - // .longitude(127.093171) - // .build(); - // - // Point mockPoint = mock(Point.class); - // when(geometryFactory.createPoint(any(Coordinate.class))).thenReturn(mockPoint); - // - // when(userRepository.findById(1L)).thenReturn(Optional.of(user)); - // when(myPlaceRepository.save(any(MyPlace.class))).thenReturn(null); - // - // // When - // myPlaceService.putMyPlace(myPlaceRequest); - // - // // Then - // verify(userRepository, times(1)).findById(myPlaceRequest.getUserId()); - // verify(myPlaceRepository, times(1)).save(any(MyPlace.class)); + // @BeforeEach + // void setUp() { + // MockitoAnnotations.openMocks(this); + // //user = User.builder().id(1L).nickname("testUser").build(); // - // //assertThat(user.getNickname()).isEqualTo("testUser"); // } @Test - @DisplayName("[putMyPlace] 유저가 없을때 user not found에러가 잘 나오는지") - void puyMyPlaceErrorTest() { - myPlaceRequest = MyPlaceRequest.builder() + @DisplayName("[putMyPlace] 즐겨찾기 장소가 올바르게 업데이트 되는지") + void putMyPlaceTest() { + // Given + User user = User.builder() + .id(1L) + .nickname("testUser") + .build(); + + MyPlaceRequest myPlaceRequest = MyPlaceRequest.builder() .userId(1L) .placeName(Place.HOME) .latitude(37.321147) .longitude(127.093171) .build(); - AppException thrown = assertThrows(AppException.class, () -> { - myPlaceService.putMyPlace(myPlaceRequest); - }); - assertEquals(ErrorCode.USER_NOT_FOUND, thrown.getErrorCode()); + Point mockPoint = mock(Point.class); + when(geometryFactory.createPoint(any(Coordinate.class))).thenReturn(mockPoint); + + when(userRepository.findById(1L)).thenReturn(Optional.of(user)); + when(myPlaceRepository.save(any(MyPlace.class))).thenReturn(null); + // When + myPlaceService.putMyPlace(myPlaceRequest); + + // Then + verify(userRepository, times(1)).findById(myPlaceRequest.getUserId()); + verify(myPlaceRepository, times(1)).save(any(MyPlace.class)); + + //assertThat(user.getNickname()).isEqualTo("testUser"); } @Test @@ -130,21 +112,6 @@ void getMyPlaceTest() { assertEquals(point2, myPlaces.get(1).getPlacePoint()); } - @Test - @DisplayName("[getMyPlace] 저장된 값이 없을때 에러가 잘 나오는지") - void getMyPlaceErrorTest() { - //Given - Long userId = 1L; - - //When - AppException thrown = assertThrows(AppException.class, () -> { - myPlaceService.getMyPlace(userId); - }); - - //When - assertEquals(ErrorCode.PLACE_NOT_FOUND, thrown.getErrorCode()); - } - @Test @DisplayName("[deleteMyPlace] 즐겨찾기 삭제 동작 테스트") void deleteMyPlaceTest() { From fa9c88a879f68fbb13dca249fc91e57f7bee6a25 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Sun, 11 Aug 2024 02:06:05 +0900 Subject: [PATCH 23/66] =?UTF-8?q?M3-238=20Feat=20:=20app=20version=20post,?= =?UTF-8?q?=20get=20api=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VersionController.java | 41 +++++++++++++++++++ .../domain/dto/version/VersionRequest.java | 17 ++++++++ .../domain/dto/version/VersionResponse.java | 22 ++++++++++ .../groundflip/domain/entity/AppVersion.java | 39 ++++++++++++++++++ .../repository/AppVersionRepository.java | 17 ++++++++ .../groundflip/service/VersionService.java | 35 ++++++++++++++++ 6 files changed, 171 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/controller/VersionController.java create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java create mode 100644 src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java create mode 100644 src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java create mode 100644 src/main/java/com/m3pro/groundflip/service/VersionService.java diff --git a/src/main/java/com/m3pro/groundflip/controller/VersionController.java b/src/main/java/com/m3pro/groundflip/controller/VersionController.java new file mode 100644 index 00000000..f3d6376f --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/controller/VersionController.java @@ -0,0 +1,41 @@ +package com.m3pro.groundflip.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.m3pro.groundflip.domain.dto.Response; +import com.m3pro.groundflip.domain.dto.version.VersionRequest; +import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.service.VersionService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +@Tag(name = "version", description = "앱 버전 API") +public class VersionController { + private final VersionService versionService; + + @Operation(summary = "앱 버전 post", description = "현재 앱 버전을 등록한다.") + @PostMapping("/version") + public Response postVersion( + @Parameter(description = "버전 저장", required = true) + @RequestBody VersionRequest versionRequest + ) { + versionService.postVersion(versionRequest); + return Response.createSuccessWithNoData(); + } + + @Operation(summary = "앱 버전 get", description = "현재 앱 버전을 가져온다.") + @GetMapping("/version") + public Response getVersion() { + return Response.createSuccess(versionService.getVersion()); + } +} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java new file mode 100644 index 00000000..a3ccbc4c --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java @@ -0,0 +1,17 @@ +package com.m3pro.groundflip.domain.dto.version; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(title = "앱 버전 등록") +public class VersionRequest { + @Schema(description = "앱 버전", example = "1.0.1") + private String version; +} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java new file mode 100644 index 00000000..3e951f35 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -0,0 +1,22 @@ +package com.m3pro.groundflip.domain.dto.version; + +import java.time.LocalDateTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(title = "앱 버전 get") +public class VersionResponse { + @Schema(description = "앱 버전", example = "1.0.5") + private String version; + + @Schema(description = "생성날짜", example = "2024-08-11 01:37:22.372436") + private LocalDateTime createdDate; +} diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java new file mode 100644 index 00000000..840f1552 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java @@ -0,0 +1,39 @@ +package com.m3pro.groundflip.domain.entity; + +import java.time.LocalDateTime; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "app_version") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +@EntityListeners(AuditingEntityListener.class) +public class AppVersion { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "app_version_id") + private Long id; + + private String version; + + @CreatedDate + @Column(name = "created_date", updatable = false) + private LocalDateTime createdDate; +} diff --git a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java new file mode 100644 index 00000000..f72c6610 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java @@ -0,0 +1,17 @@ +package com.m3pro.groundflip.repository; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; + +import com.m3pro.groundflip.domain.entity.AppVersion; + +public interface AppVersionRepository extends CrudRepository { + + @Query(value = """ + SELECT av.* + FROM app_version av + ORDER BY av.created_date DESC + limit 1 + """, nativeQuery = true) + AppVersion findLaestetVersion(); +} diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java new file mode 100644 index 00000000..f0186971 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -0,0 +1,35 @@ +package com.m3pro.groundflip.service; + +import org.springframework.stereotype.Service; + +import com.m3pro.groundflip.domain.dto.version.VersionRequest; +import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.domain.entity.AppVersion; +import com.m3pro.groundflip.repository.AppVersionRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class VersionService { + private final AppVersionRepository appVersionRepository; + + @Transactional + public void postVersion(VersionRequest versionRequest) { + appVersionRepository.save( + AppVersion.builder() + .version(versionRequest.getVersion()) + .build() + ); + } + + public VersionResponse getVersion() { + AppVersion appVersion = appVersionRepository.findLaestetVersion(); + + return VersionResponse.builder() + .version(appVersion.getVersion()) + .createdDate(appVersion.getCreatedDate()) + .build(); + } +} From 8cf84c39bccad07eb1769cd311533a8a14af80a0 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Sun, 11 Aug 2024 03:43:26 +0900 Subject: [PATCH 24/66] =?UTF-8?q?M3-238=20Feat=20:=20version=20test?= =?UTF-8?q?=EC=9E=91=EC=84=B1,=20exception=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m3pro/groundflip/exception/ErrorCode.java | 1 + .../repository/AppVersionRepository.java | 4 +- .../groundflip/service/VersionService.java | 5 +- .../service/VersionServiceTest.java | 81 +++++++++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java diff --git a/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java b/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java index 77fc3345..692c3d3e 100644 --- a/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java +++ b/src/main/java/com/m3pro/groundflip/exception/ErrorCode.java @@ -15,6 +15,7 @@ public enum ErrorCode { IMAGE_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 이미지입니다."), PLACE_NOT_FOUND(HttpStatus.NOT_FOUND, "장소가 등록되어 있지 않습니다."), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러 입니다"), + VERSION_NOT_FOUND(HttpStatus.NOT_FOUND, "버전이 존재하지 않습니다."), // 권한 관련 에러 UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "권한이 없습니다"), diff --git a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java index f72c6610..b57dff69 100644 --- a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java @@ -1,5 +1,7 @@ package com.m3pro.groundflip.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; @@ -13,5 +15,5 @@ public interface AppVersionRepository extends CrudRepository { ORDER BY av.created_date DESC limit 1 """, nativeQuery = true) - AppVersion findLaestetVersion(); + Optional findLaestetVersion(); } diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index f0186971..6f7cdc65 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -5,6 +5,8 @@ import com.m3pro.groundflip.domain.dto.version.VersionRequest; import com.m3pro.groundflip.domain.dto.version.VersionResponse; import com.m3pro.groundflip.domain.entity.AppVersion; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; import com.m3pro.groundflip.repository.AppVersionRepository; import jakarta.transaction.Transactional; @@ -25,7 +27,8 @@ public void postVersion(VersionRequest versionRequest) { } public VersionResponse getVersion() { - AppVersion appVersion = appVersionRepository.findLaestetVersion(); + AppVersion appVersion = appVersionRepository.findLaestetVersion() + .orElseThrow(() -> new AppException(ErrorCode.VERSION_NOT_FOUND)); return VersionResponse.builder() .version(appVersion.getVersion()) diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java new file mode 100644 index 00000000..3d32dfe7 --- /dev/null +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -0,0 +1,81 @@ +package com.m3pro.groundflip.service; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.time.LocalDateTime; +import java.util.Optional; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.m3pro.groundflip.domain.dto.version.VersionRequest; +import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.domain.entity.AppVersion; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; +import com.m3pro.groundflip.repository.AppVersionRepository; + +@ExtendWith(MockitoExtension.class) +public class VersionServiceTest { + @Mock + private AppVersionRepository appVersionRepository; + + @InjectMocks + private VersionService versionService; + + @Test + @DisplayName("[postVersion] version이 잘 post 되는지") + void postVersionTest() { + //Given + LocalDateTime localDate = LocalDateTime.now(); + + VersionRequest versionRequest = VersionRequest.builder().version("1.0.3").build(); + //When + versionService.postVersion(versionRequest); + + //Then + verify(appVersionRepository, times(1)).save(any(AppVersion.class)); + } + + @Test + @DisplayName("[getVersion] version이 잘 get 되는지") + void getVersionTest() { + //Given + LocalDateTime localDate = LocalDateTime.now(); + AppVersion appVersion = AppVersion.builder() + .version("1.0.3") + .createdDate(localDate) + .build(); + + when(appVersionRepository.findLaestetVersion()).thenReturn(Optional.of(appVersion)); + + //When + VersionResponse versionResponse = versionService.getVersion(); + + //Then + assertThat(versionResponse).isNotNull(); + assertThat(versionResponse.getVersion()).isEqualTo("1.0.3"); + assertThat(versionResponse.getCreatedDate()).isEqualTo(localDate); + + } + + @Test + @DisplayName("[getVersion] version이 없을때 예외가 잘 나오는지") + void getVersionExceptionTest() { + //When + when(appVersionRepository.findLaestetVersion()).thenReturn(Optional.empty()); + + AppException thrown = assertThrows(AppException.class, () -> { + versionService.getVersion(); + }); + + assertEquals(thrown.getErrorCode(), ErrorCode.VERSION_NOT_FOUND); + } + +} From 8b2c095b88b6821b57b140654b0913df977f1cd3 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Sun, 11 Aug 2024 03:44:26 +0900 Subject: [PATCH 25/66] =?UTF-8?q?M3-238=20Feat=20:=20version=20test?= =?UTF-8?q?=EC=9E=91=EC=84=B1,=20exception=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/service/VersionServiceTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index 3d32dfe7..c29a1f00 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -33,8 +33,6 @@ public class VersionServiceTest { @DisplayName("[postVersion] version이 잘 post 되는지") void postVersionTest() { //Given - LocalDateTime localDate = LocalDateTime.now(); - VersionRequest versionRequest = VersionRequest.builder().version("1.0.3").build(); //When versionService.postVersion(versionRequest); From 2f4de2620b31ee8ab644e8570d6bb7dff456f435 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Mon, 12 Aug 2024 22:24:47 +0900 Subject: [PATCH 26/66] =?UTF-8?q?M3-238=20Feat=20:=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=ED=95=84=EC=9A=94=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m3pro/groundflip/controller/VersionController.java | 8 ++++++-- .../groundflip/domain/dto/version/VersionRequest.java | 3 +++ .../groundflip/domain/dto/version/VersionResponse.java | 3 +++ .../com/m3pro/groundflip/domain/entity/AppVersion.java | 2 ++ .../m3pro/groundflip/repository/AppVersionRepository.java | 2 ++ .../java/com/m3pro/groundflip/service/VersionService.java | 6 ++++-- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/controller/VersionController.java b/src/main/java/com/m3pro/groundflip/controller/VersionController.java index f3d6376f..d8219018 100644 --- a/src/main/java/com/m3pro/groundflip/controller/VersionController.java +++ b/src/main/java/com/m3pro/groundflip/controller/VersionController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.m3pro.groundflip.domain.dto.Response; @@ -35,7 +36,10 @@ public Response postVersion( @Operation(summary = "앱 버전 get", description = "현재 앱 버전을 가져온다.") @GetMapping("/version") - public Response getVersion() { - return Response.createSuccess(versionService.getVersion()); + public Response getVersion( + @Parameter(description = "버전 get", required = true) + @RequestParam String version + ) { + return Response.createSuccess(versionService.getVersion(version)); } } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java index a3ccbc4c..2568504c 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java @@ -14,4 +14,7 @@ public class VersionRequest { @Schema(description = "앱 버전", example = "1.0.1") private String version; + + @Schema(description = "업데이트 필요 여부", example = "0") + private Integer needUpdate; } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java index 3e951f35..d9837aec 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -17,6 +17,9 @@ public class VersionResponse { @Schema(description = "앱 버전", example = "1.0.5") private String version; + @Schema(description = "업데이트 필요 여부", example = "0") + private Integer needUpdate; + @Schema(description = "생성날짜", example = "2024-08-11 01:37:22.372436") private LocalDateTime createdDate; } diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java index 840f1552..e8c3bd9f 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java @@ -33,6 +33,8 @@ public class AppVersion { private String version; + private Integer needUpdate; + @CreatedDate @Column(name = "created_date", updatable = false) private LocalDateTime createdDate; diff --git a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java index b57dff69..c567de57 100644 --- a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java @@ -16,4 +16,6 @@ public interface AppVersionRepository extends CrudRepository { limit 1 """, nativeQuery = true) Optional findLaestetVersion(); + + Optional findByVersion(String version); } diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index 6f7cdc65..a9a10c5c 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -22,17 +22,19 @@ public void postVersion(VersionRequest versionRequest) { appVersionRepository.save( AppVersion.builder() .version(versionRequest.getVersion()) + .needUpdate(versionRequest.getNeedUpdate()) .build() ); } - public VersionResponse getVersion() { - AppVersion appVersion = appVersionRepository.findLaestetVersion() + public VersionResponse getVersion(String version) { + AppVersion appVersion = appVersionRepository.findByVersion(version) .orElseThrow(() -> new AppException(ErrorCode.VERSION_NOT_FOUND)); return VersionResponse.builder() .version(appVersion.getVersion()) .createdDate(appVersion.getCreatedDate()) + .needUpdate(appVersion.getNeedUpdate()) .build(); } } From 0f9c23617d82cf748010d4d7e0df0bef60e95897 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:34:16 +0900 Subject: [PATCH 27/66] =?UTF-8?q?M3-238=20Feat=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=EB=A1=9C=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd_dev.yml | 1 + .github/workflows/cd_prod.yml | 1 + .../controller/VersionController.java | 19 +-------- .../domain/dto/version/VersionResponse.java | 7 ---- .../groundflip/domain/entity/AppVersion.java | 41 ------------------ .../repository/AppVersionRepository.java | 21 ---------- .../groundflip/service/VersionService.java | 28 +++---------- src/main/resources/application-dev.yml | 2 + src/main/resources/application-local.yml | 2 + src/main/resources/application-prod.yml | 2 + .../service/VersionServiceTest.java | 42 ------------------- 11 files changed, 14 insertions(+), 152 deletions(-) delete mode 100644 src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java delete mode 100644 src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java diff --git a/.github/workflows/cd_dev.yml b/.github/workflows/cd_dev.yml index 89d7d77a..78bd6aa5 100644 --- a/.github/workflows/cd_dev.yml +++ b/.github/workflows/cd_dev.yml @@ -36,6 +36,7 @@ jobs: echo "APPLE_TEAM_ID=${{ secrets.APPLE_TEAM_ID }}" >> .env echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env + echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env echo "SPRING_PROFILES_ACTIVE=dev" >> .env diff --git a/.github/workflows/cd_prod.yml b/.github/workflows/cd_prod.yml index dd564308..b485ca3f 100644 --- a/.github/workflows/cd_prod.yml +++ b/.github/workflows/cd_prod.yml @@ -36,6 +36,7 @@ jobs: echo "APPLE_TEAM_ID=${{ secrets.APPLE_TEAM_ID }}" >> .env echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env + echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env - name: gradlew에 실행 권한 부여 run: chmod +x ./gradlew diff --git a/src/main/java/com/m3pro/groundflip/controller/VersionController.java b/src/main/java/com/m3pro/groundflip/controller/VersionController.java index d8219018..ee3f8cf5 100644 --- a/src/main/java/com/m3pro/groundflip/controller/VersionController.java +++ b/src/main/java/com/m3pro/groundflip/controller/VersionController.java @@ -1,19 +1,14 @@ package com.m3pro.groundflip.controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.m3pro.groundflip.domain.dto.Response; -import com.m3pro.groundflip.domain.dto.version.VersionRequest; import com.m3pro.groundflip.domain.dto.version.VersionResponse; import com.m3pro.groundflip.service.VersionService; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -24,22 +19,10 @@ public class VersionController { private final VersionService versionService; - @Operation(summary = "앱 버전 post", description = "현재 앱 버전을 등록한다.") - @PostMapping("/version") - public Response postVersion( - @Parameter(description = "버전 저장", required = true) - @RequestBody VersionRequest versionRequest - ) { - versionService.postVersion(versionRequest); - return Response.createSuccessWithNoData(); - } - @Operation(summary = "앱 버전 get", description = "현재 앱 버전을 가져온다.") @GetMapping("/version") public Response getVersion( - @Parameter(description = "버전 get", required = true) - @RequestParam String version ) { - return Response.createSuccess(versionService.getVersion(version)); + return Response.createSuccess(versionService.getVersion()); } } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java index d9837aec..8a4316ac 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -1,7 +1,5 @@ package com.m3pro.groundflip.domain.dto.version; -import java.time.LocalDateTime; - import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -17,9 +15,4 @@ public class VersionResponse { @Schema(description = "앱 버전", example = "1.0.5") private String version; - @Schema(description = "업데이트 필요 여부", example = "0") - private Integer needUpdate; - - @Schema(description = "생성날짜", example = "2024-08-11 01:37:22.372436") - private LocalDateTime createdDate; } diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java deleted file mode 100644 index e8c3bd9f..00000000 --- a/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.m3pro.groundflip.domain.entity; - -import java.time.LocalDateTime; - -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EntityListeners; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity -@Table(name = "app_version") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Builder -@EntityListeners(AuditingEntityListener.class) -public class AppVersion { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "app_version_id") - private Long id; - - private String version; - - private Integer needUpdate; - - @CreatedDate - @Column(name = "created_date", updatable = false) - private LocalDateTime createdDate; -} diff --git a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java deleted file mode 100644 index c567de57..00000000 --- a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.m3pro.groundflip.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; - -import com.m3pro.groundflip.domain.entity.AppVersion; - -public interface AppVersionRepository extends CrudRepository { - - @Query(value = """ - SELECT av.* - FROM app_version av - ORDER BY av.created_date DESC - limit 1 - """, nativeQuery = true) - Optional findLaestetVersion(); - - Optional findByVersion(String version); -} diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index a9a10c5c..840fb9d9 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -1,40 +1,22 @@ package com.m3pro.groundflip.service; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import com.m3pro.groundflip.domain.dto.version.VersionRequest; import com.m3pro.groundflip.domain.dto.version.VersionResponse; -import com.m3pro.groundflip.domain.entity.AppVersion; -import com.m3pro.groundflip.exception.AppException; -import com.m3pro.groundflip.exception.ErrorCode; -import com.m3pro.groundflip.repository.AppVersionRepository; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class VersionService { - private final AppVersionRepository appVersionRepository; - @Transactional - public void postVersion(VersionRequest versionRequest) { - appVersionRepository.save( - AppVersion.builder() - .version(versionRequest.getVersion()) - .needUpdate(versionRequest.getNeedUpdate()) - .build() - ); - } - - public VersionResponse getVersion(String version) { - AppVersion appVersion = appVersionRepository.findByVersion(version) - .orElseThrow(() -> new AppException(ErrorCode.VERSION_NOT_FOUND)); + @Value("${version.update}") + private String value; + public VersionResponse getVersion() { return VersionResponse.builder() - .version(appVersion.getVersion()) - .createdDate(appVersion.getCreatedDate()) - .needUpdate(appVersion.getNeedUpdate()) + .version(value) .build(); } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index a52eed2b..ba072738 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -85,5 +85,7 @@ cloud: s3: bucket: ${AWS_S3_BUCKET} +version: + update: ${NEED_UPDATE_VERSION} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index ff715e68..f683e0e5 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -85,4 +85,6 @@ cloud: s3: bucket: ${AWS_S3_BUCKET} +version: + update: ${NEED_UPDATE_VERSION} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index f168e6ab..e85cfea7 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -83,5 +83,7 @@ cloud: s3: bucket: ${AWS_S3_BUCKET} +version: + update: ${NEED_UPDATE_VERSION} diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index c29a1f00..14e81d2f 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -1,57 +1,28 @@ package com.m3pro.groundflip.service; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; import java.time.LocalDateTime; -import java.util.Optional; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import com.m3pro.groundflip.domain.dto.version.VersionRequest; import com.m3pro.groundflip.domain.dto.version.VersionResponse; -import com.m3pro.groundflip.domain.entity.AppVersion; -import com.m3pro.groundflip.exception.AppException; -import com.m3pro.groundflip.exception.ErrorCode; -import com.m3pro.groundflip.repository.AppVersionRepository; @ExtendWith(MockitoExtension.class) public class VersionServiceTest { - @Mock - private AppVersionRepository appVersionRepository; @InjectMocks private VersionService versionService; - @Test - @DisplayName("[postVersion] version이 잘 post 되는지") - void postVersionTest() { - //Given - VersionRequest versionRequest = VersionRequest.builder().version("1.0.3").build(); - //When - versionService.postVersion(versionRequest); - - //Then - verify(appVersionRepository, times(1)).save(any(AppVersion.class)); - } - @Test @DisplayName("[getVersion] version이 잘 get 되는지") void getVersionTest() { //Given LocalDateTime localDate = LocalDateTime.now(); - AppVersion appVersion = AppVersion.builder() - .version("1.0.3") - .createdDate(localDate) - .build(); - - when(appVersionRepository.findLaestetVersion()).thenReturn(Optional.of(appVersion)); //When VersionResponse versionResponse = versionService.getVersion(); @@ -63,17 +34,4 @@ void getVersionTest() { } - @Test - @DisplayName("[getVersion] version이 없을때 예외가 잘 나오는지") - void getVersionExceptionTest() { - //When - when(appVersionRepository.findLaestetVersion()).thenReturn(Optional.empty()); - - AppException thrown = assertThrows(AppException.class, () -> { - versionService.getVersion(); - }); - - assertEquals(thrown.getErrorCode(), ErrorCode.VERSION_NOT_FOUND); - } - } From 853a0fa1328aa72e80bb007438ef486d7eecf50f Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:38:33 +0900 Subject: [PATCH 28/66] =?UTF-8?q?M3-238=20Feat=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=EB=A1=9C=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/version/VersionRequest.java | 20 ------------------- .../domain/dto/version/VersionResponse.java | 1 - .../service/VersionServiceTest.java | 1 - 3 files changed, 22 deletions(-) delete mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java deleted file mode 100644 index 2568504c..00000000 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.m3pro.groundflip.domain.dto.version; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Schema(title = "앱 버전 등록") -public class VersionRequest { - @Schema(description = "앱 버전", example = "1.0.1") - private String version; - - @Schema(description = "업데이트 필요 여부", example = "0") - private Integer needUpdate; -} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java index 8a4316ac..73aa45e5 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -14,5 +14,4 @@ public class VersionResponse { @Schema(description = "앱 버전", example = "1.0.5") private String version; - } diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index 14e81d2f..786e5609 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -30,7 +30,6 @@ void getVersionTest() { //Then assertThat(versionResponse).isNotNull(); assertThat(versionResponse.getVersion()).isEqualTo("1.0.3"); - assertThat(versionResponse.getCreatedDate()).isEqualTo(localDate); } From f7f8420cdc77485f797cbcb6f3a4e1febd9aec70 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:42:49 +0900 Subject: [PATCH 29/66] =?UTF-8?q?Revert=20"M3-238=20Feat=20:=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 853a0fa1328aa72e80bb007438ef486d7eecf50f. --- .../domain/dto/version/VersionRequest.java | 20 +++++++++++++++++++ .../domain/dto/version/VersionResponse.java | 1 + .../service/VersionServiceTest.java | 1 + 3 files changed, 22 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java new file mode 100644 index 00000000..2568504c --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java @@ -0,0 +1,20 @@ +package com.m3pro.groundflip.domain.dto.version; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(title = "앱 버전 등록") +public class VersionRequest { + @Schema(description = "앱 버전", example = "1.0.1") + private String version; + + @Schema(description = "업데이트 필요 여부", example = "0") + private Integer needUpdate; +} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java index 73aa45e5..8a4316ac 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -14,4 +14,5 @@ public class VersionResponse { @Schema(description = "앱 버전", example = "1.0.5") private String version; + } diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index 786e5609..14e81d2f 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -30,6 +30,7 @@ void getVersionTest() { //Then assertThat(versionResponse).isNotNull(); assertThat(versionResponse.getVersion()).isEqualTo("1.0.3"); + assertThat(versionResponse.getCreatedDate()).isEqualTo(localDate); } From 5f5c76d2a50b845bf62a9804cac31e5af9ce546c Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:11:40 +0900 Subject: [PATCH 30/66] =?UTF-8?q?M3-238=20Feat=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=EB=A1=9C=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/controller/VersionController.java | 6 +++++- .../domain/dto/version/VersionRequest.java | 4 +--- .../domain/dto/version/VersionResponse.java | 3 +++ .../m3pro/groundflip/service/VersionService.java | 15 ++++++++++++--- .../groundflip/service/VersionServiceTest.java | 7 ++----- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/controller/VersionController.java b/src/main/java/com/m3pro/groundflip/controller/VersionController.java index ee3f8cf5..0d4b5a22 100644 --- a/src/main/java/com/m3pro/groundflip/controller/VersionController.java +++ b/src/main/java/com/m3pro/groundflip/controller/VersionController.java @@ -2,6 +2,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.m3pro.groundflip.domain.dto.Response; @@ -9,6 +10,7 @@ import com.m3pro.groundflip.service.VersionService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -22,7 +24,9 @@ public class VersionController { @Operation(summary = "앱 버전 get", description = "현재 앱 버전을 가져온다.") @GetMapping("/version") public Response getVersion( + @Parameter(description = "버전 get", required = true) + @RequestParam String currentVersion ) { - return Response.createSuccess(versionService.getVersion()); + return Response.createSuccess(versionService.getVersion(currentVersion)); } } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java index 2568504c..ea04d7a3 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java @@ -14,7 +14,5 @@ public class VersionRequest { @Schema(description = "앱 버전", example = "1.0.1") private String version; - - @Schema(description = "업데이트 필요 여부", example = "0") - private Integer needUpdate; + } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java index 8a4316ac..6b843c46 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -15,4 +15,7 @@ public class VersionResponse { @Schema(description = "앱 버전", example = "1.0.5") private String version; + @Schema(description = "앱 버전", example = "1.0.5") + private Integer needUpdate; + } diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index 840fb9d9..c0769eba 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -12,11 +12,20 @@ public class VersionService { @Value("${version.update}") - private String value; + private String lastestVersion; + + private int needUpdate; + + public VersionResponse getVersion(String currentVersion) { + if (!lastestVersion.equals(currentVersion)) { + needUpdate = 1; + } else { + needUpdate = 0; + } - public VersionResponse getVersion() { return VersionResponse.builder() - .version(value) + .version(lastestVersion) + .needUpdate(needUpdate) .build(); } } diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index 14e81d2f..51ec3035 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -2,8 +2,6 @@ import static org.assertj.core.api.Assertions.*; -import java.time.LocalDateTime; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,15 +20,14 @@ public class VersionServiceTest { @DisplayName("[getVersion] version이 잘 get 되는지") void getVersionTest() { //Given - LocalDateTime localDate = LocalDateTime.now(); + String currentVersion = "1.0.3"; //When - VersionResponse versionResponse = versionService.getVersion(); + VersionResponse versionResponse = versionService.getVersion(currentVersion); //Then assertThat(versionResponse).isNotNull(); assertThat(versionResponse.getVersion()).isEqualTo("1.0.3"); - assertThat(versionResponse.getCreatedDate()).isEqualTo(localDate); } From 1d24b91d00c2dd50a77cf8409900331236fc763c Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:35:49 +0900 Subject: [PATCH 31/66] =?UTF-8?q?M3-238=20Feat=20:=20enum=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=8F=99=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VersionController.java | 4 ++-- .../domain/dto/version/VersionRequest.java | 18 ------------------ .../domain/dto/version/VersionResponse.java | 4 +++- .../java/com/m3pro/groundflip/enums/Place.java | 2 +- .../com/m3pro/groundflip/enums/Version.java | 14 ++++++++++++++ .../groundflip/service/VersionService.java | 7 ++++--- .../groundflip/service/VersionServiceTest.java | 7 +++++++ src/test/resources/application-test.yml | 3 +++ 8 files changed, 34 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java create mode 100644 src/main/java/com/m3pro/groundflip/enums/Version.java diff --git a/src/main/java/com/m3pro/groundflip/controller/VersionController.java b/src/main/java/com/m3pro/groundflip/controller/VersionController.java index 0d4b5a22..86726b87 100644 --- a/src/main/java/com/m3pro/groundflip/controller/VersionController.java +++ b/src/main/java/com/m3pro/groundflip/controller/VersionController.java @@ -21,10 +21,10 @@ public class VersionController { private final VersionService versionService; - @Operation(summary = "앱 버전 get", description = "현재 앱 버전을 가져온다.") + @Operation(summary = "버전 업데이트 필요 여부 확인", description = "현재 앱 버전 업데이트가 필요한지 판별") @GetMapping("/version") public Response getVersion( - @Parameter(description = "버전 get", required = true) + @Parameter(description = "현재 버전", required = true) @RequestParam String currentVersion ) { return Response.createSuccess(versionService.getVersion(currentVersion)); diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java deleted file mode 100644 index ea04d7a3..00000000 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.m3pro.groundflip.domain.dto.version; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Schema(title = "앱 버전 등록") -public class VersionRequest { - @Schema(description = "앱 버전", example = "1.0.1") - private String version; - -} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java index 6b843c46..a889fbd3 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -1,5 +1,7 @@ package com.m3pro.groundflip.domain.dto.version; +import com.m3pro.groundflip.enums.Version; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,6 +18,6 @@ public class VersionResponse { private String version; @Schema(description = "앱 버전", example = "1.0.5") - private Integer needUpdate; + private Version needUpdate; } diff --git a/src/main/java/com/m3pro/groundflip/enums/Place.java b/src/main/java/com/m3pro/groundflip/enums/Place.java index 4627a157..d60ecfe9 100644 --- a/src/main/java/com/m3pro/groundflip/enums/Place.java +++ b/src/main/java/com/m3pro/groundflip/enums/Place.java @@ -10,5 +10,5 @@ public enum Place { COMPANY("회사/학교"), ELSE("기타 장소"); - private String place; + private final String place; } diff --git a/src/main/java/com/m3pro/groundflip/enums/Version.java b/src/main/java/com/m3pro/groundflip/enums/Version.java new file mode 100644 index 00000000..a4b6b812 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/enums/Version.java @@ -0,0 +1,14 @@ +package com.m3pro.groundflip.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum Version { + OK("업데이트 불필요"), + NEED("업데이트 필요"), + FORCE("강제 업데이트"); + + private final String update; +} diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index c0769eba..a7ee3493 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.enums.Version; import lombok.RequiredArgsConstructor; @@ -14,13 +15,13 @@ public class VersionService { @Value("${version.update}") private String lastestVersion; - private int needUpdate; + private Version needUpdate; public VersionResponse getVersion(String currentVersion) { if (!lastestVersion.equals(currentVersion)) { - needUpdate = 1; + needUpdate = Version.NEED; } else { - needUpdate = 0; + needUpdate = Version.OK; } return VersionResponse.builder() diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index 51ec3035..beea8794 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -2,11 +2,13 @@ import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; import com.m3pro.groundflip.domain.dto.version.VersionResponse; @@ -16,6 +18,11 @@ public class VersionServiceTest { @InjectMocks private VersionService versionService; + @BeforeEach + void setUp() { + ReflectionTestUtils.setField(versionService, "lastestVersion", "1.0.3"); + } + @Test @DisplayName("[getVersion] version이 잘 get 되는지") void getVersionTest() { diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 6d43d30d..f4828ac3 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -80,3 +80,6 @@ cloud: secret-key: test-value s3: bucket: test-value + +version: + update: ${NEED_UPDATE_VERSION} \ No newline at end of file From 2baad342e79c31967d47b56425a269269a5d112a Mon Sep 17 00:00:00 2001 From: Koo Min Date: Tue, 13 Aug 2024 12:50:50 +0900 Subject: [PATCH 32/66] =?UTF-8?q?M3-238=20Test=20:=20application-test.yml?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index f4828ac3..05a8502c 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -82,4 +82,4 @@ cloud: bucket: test-value version: - update: ${NEED_UPDATE_VERSION} \ No newline at end of file + update: 1.0.3 \ No newline at end of file From 3db311a8344ae11899acd41fcab9e44cd03de7cc Mon Sep 17 00:00:00 2001 From: MinUk Date: Tue, 13 Aug 2024 14:51:16 +0900 Subject: [PATCH 33/66] =?UTF-8?q?Refactor=20:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=83=88=ED=87=B4=20=EC=8B=9C=20=EB=9E=AD=ED=82=B9=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=82=AD=EC=A0=9C=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/repository/RankingRedisRepository.java | 10 +++++++++- .../java/com/m3pro/groundflip/service/UserService.java | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/repository/RankingRedisRepository.java b/src/main/java/com/m3pro/groundflip/repository/RankingRedisRepository.java index 0b8f4a12..98d71868 100644 --- a/src/main/java/com/m3pro/groundflip/repository/RankingRedisRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/RankingRedisRepository.java @@ -39,7 +39,7 @@ public void decreaseCurrentPixelCount(Long userId) { } } - public void saveUserInRedis(Long userId) { + public void saveUserInRanking(Long userId) { Double score = zSetOperations.score(RANKING_KEY, userId.toString()); if (score == null) { @@ -47,6 +47,14 @@ public void saveUserInRedis(Long userId) { } } + public void deleteUserInRanking(Long userId) { + Double score = zSetOperations.score(RANKING_KEY, userId.toString()); + + if (score != null) { + zSetOperations.remove(RANKING_KEY, userId.toString()); + } + } + public List getRankingsWithCurrentPixelCount() { Set> typedTuples = zSetOperations.reverseRangeWithScores(RANKING_KEY, RANKING_START_INDEX, RANKING_END_INDEX); diff --git a/src/main/java/com/m3pro/groundflip/service/UserService.java b/src/main/java/com/m3pro/groundflip/service/UserService.java index a6d88e7e..7d17ba78 100644 --- a/src/main/java/com/m3pro/groundflip/service/UserService.java +++ b/src/main/java/com/m3pro/groundflip/service/UserService.java @@ -99,7 +99,7 @@ public void putUserInfo(Long userId, UserInfoRequest userInfoRequest, MultipartF user.updateStatus(UserStatus.COMPLETE); user.updateProfileImage(fileS3Url); userRepository.save(user); - rankingRedisRepository.saveUserInRedis(user.getId()); + rankingRedisRepository.saveUserInRanking(user.getId()); } private Date convertToDate(int year) { @@ -133,6 +133,8 @@ public void deleteUser(Long userId, UserDeleteRequest userDeleteRequest) { jwtProvider.expireToken(userDeleteRequest.getAccessToken()); jwtProvider.expireToken(userDeleteRequest.getRefreshToken()); + + rankingRedisRepository.deleteUserInRanking(userId); } private void revokeAppleToken(Long userId) { From 8d1ff5e4370ee4c758a2400787c7b1c144813460 Mon Sep 17 00:00:00 2001 From: MinUk Date: Tue, 13 Aug 2024 14:51:31 +0900 Subject: [PATCH 34/66] =?UTF-8?q?Feat=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RankingRedisRepositoryTest.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/m3pro/groundflip/repository/RankingRedisRepositoryTest.java b/src/test/java/com/m3pro/groundflip/repository/RankingRedisRepositoryTest.java index 2293f495..533a1e66 100644 --- a/src/test/java/com/m3pro/groundflip/repository/RankingRedisRepositoryTest.java +++ b/src/test/java/com/m3pro/groundflip/repository/RankingRedisRepositoryTest.java @@ -40,7 +40,7 @@ void increaseCurrentPixelCountTest() { //Given ZSetOperations zSetOperations = redisTemplate.opsForZSet(); Long userId = 1L; - rankingRedisRepository.saveUserInRedis(userId); + rankingRedisRepository.saveUserInRanking(userId); // When rankingRedisRepository.increaseCurrentPixelCount(userId); @@ -71,7 +71,7 @@ void decreaseCurrentPixelCountTest() { //Given ZSetOperations zSetOperations = redisTemplate.opsForZSet(); Long userId = 1L; - rankingRedisRepository.saveUserInRedis(userId); + rankingRedisRepository.saveUserInRanking(userId); rankingRedisRepository.increaseCurrentPixelCount(userId); rankingRedisRepository.increaseCurrentPixelCount(userId); @@ -89,7 +89,7 @@ void decreaseCurrentPixelCountTestCaseZero() { //Given ZSetOperations zSetOperations = redisTemplate.opsForZSet(); Long userId = 1L; - rankingRedisRepository.saveUserInRedis(userId); + rankingRedisRepository.saveUserInRanking(userId); // When rankingRedisRepository.decreaseCurrentPixelCount(userId); @@ -101,19 +101,34 @@ void decreaseCurrentPixelCountTestCaseZero() { @Test @DisplayName("[save] userId 를 넣으면 0으로 초기화 한다.") - void saveUserInRedisTest() { + void saveUserInRankingTest() { //Given ZSetOperations zSetOperations = redisTemplate.opsForZSet(); Long userId = 1L; // When - rankingRedisRepository.saveUserInRedis(userId); + rankingRedisRepository.saveUserInRanking(userId); // Then Double score = zSetOperations.score(RANKING_KEY, userId.toString()); assertThat(score).isEqualTo(0); } + @Test + @DisplayName("[delete] userId를 레디스에서 지울 수 있다.") + void deleteUserInRankingTest() { + //Given + ZSetOperations zSetOperations = redisTemplate.opsForZSet(); + Long userId = 1L; + + // When + rankingRedisRepository.deleteUserInRanking(userId); + + // Then + Double score = zSetOperations.score(RANKING_KEY, userId.toString()); + assertThat(score).isEqualTo(null); + } + @Test @DisplayName("[getRankingsWithScore] 점수 순으로 내림차순으로 30개가 리스트에 반환된다. 30개가 되지 않는다면 채워진 개수만 반환한다.") void getRankingsWithScoreTest() { @@ -199,9 +214,9 @@ void getUserCurrentPixelCountTestNull() { } private void setRanking(Long userId1, Long userId2, Long userId3) { - rankingRedisRepository.saveUserInRedis(userId1); - rankingRedisRepository.saveUserInRedis(userId2); - rankingRedisRepository.saveUserInRedis(userId3); + rankingRedisRepository.saveUserInRanking(userId1); + rankingRedisRepository.saveUserInRanking(userId2); + rankingRedisRepository.saveUserInRanking(userId3); rankingRedisRepository.increaseCurrentPixelCount(userId1); rankingRedisRepository.increaseCurrentPixelCount(userId1); From 6c9c371c099011e08db6af5ef6146e3afb7f5ec5 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 11:32:13 +0900 Subject: [PATCH 35/66] =?UTF-8?q?M3-293=20Feat=20:=20UserPreference=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/UserPreference.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java b/src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java new file mode 100644 index 00000000..daf8c2bf --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java @@ -0,0 +1,41 @@ +package com.m3pro.groundflip.domain.entity; + +import com.m3pro.groundflip.domain.entity.global.BaseTimeEntity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "user_preference") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class UserPreference extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_preference_id") + private Long id; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Column(name = "push_notifications_enabled", nullable = false) + private Boolean serviceNotificationsEnabled; + + @Column(name = "email_notifications_enabled", nullable = false) + private Boolean marketingNotificationsEnabled; +} From 23da3d6013e8333b35703a0759e98e21cb93d507 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 11:33:26 +0900 Subject: [PATCH 36/66] =?UTF-8?q?M3-293=20Feat=20:=20UserPreferenceReposit?= =?UTF-8?q?ory=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/repository/UserPreferenceRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java diff --git a/src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java b/src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java new file mode 100644 index 00000000..4b7651c4 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java @@ -0,0 +1,8 @@ +package com.m3pro.groundflip.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.m3pro.groundflip.domain.entity.UserPreference; + +public interface UserPreferenceRepository extends JpaRepository { +} From b96ceffff319c2724d63c04595e26af82ef7bd13 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 11:38:25 +0900 Subject: [PATCH 37/66] =?UTF-8?q?M3-293=20Feat=20:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=EC=8B=9C=20=EC=9C=A0=EC=A0=80=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/m3pro/groundflip/service/AuthService.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/service/AuthService.java b/src/main/java/com/m3pro/groundflip/service/AuthService.java index 08929e84..1970e977 100644 --- a/src/main/java/com/m3pro/groundflip/service/AuthService.java +++ b/src/main/java/com/m3pro/groundflip/service/AuthService.java @@ -12,10 +12,12 @@ import com.m3pro.groundflip.domain.dto.auth.ReissueReponse; import com.m3pro.groundflip.domain.entity.AppleRefreshToken; import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.domain.entity.UserPreference; import com.m3pro.groundflip.enums.Provider; import com.m3pro.groundflip.enums.UserStatus; import com.m3pro.groundflip.jwt.JwtProvider; import com.m3pro.groundflip.repository.AppleRefreshTokenRepository; +import com.m3pro.groundflip.repository.UserPreferenceRepository; import com.m3pro.groundflip.repository.UserRepository; import com.m3pro.groundflip.service.oauth.OauthService; @@ -29,6 +31,8 @@ public class AuthService { private final JwtProvider jwtProvider; private final UserRepository userRepository; private final AppleRefreshTokenRepository appleRefreshTokenRepository; + private final UserPreference userPreference; + private final UserPreferenceRepository userPreferenceRepository; /** * Oauth Provider를 사용해 로그인을 진행한다. @@ -68,12 +72,17 @@ public LoginResponse login(Provider provider, LoginRequest loginRequest) { * @author 김민욱 */ private User registerUser(Provider provider, String email) { - User newUser = User.builder() + User newUser = userRepository.save(User.builder() .email(email) .provider(provider) .status(UserStatus.PENDING) - .build(); - return userRepository.save(newUser); + .build()); + userPreferenceRepository.save(UserPreference.builder() + .user(newUser) + .serviceNotificationsEnabled(false) + .marketingNotificationsEnabled(false) + .build()); + return newUser; } /** From 28a84f5c60997f1760678fb88c98bd59e71a5cc4 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 12:00:53 +0900 Subject: [PATCH 38/66] =?UTF-8?q?M3-293=20Feat=20:=20Preference=20update?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{UserPreference.java => Preference.java} | 14 +++++++++++--- .../repository/PreferenceRepository.java | 12 ++++++++++++ .../repository/UserPreferenceRepository.java | 8 -------- .../com/m3pro/groundflip/service/AuthService.java | 9 ++++----- 4 files changed, 27 insertions(+), 16 deletions(-) rename src/main/java/com/m3pro/groundflip/domain/entity/{UserPreference.java => Preference.java} (75%) create mode 100644 src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java delete mode 100644 src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java b/src/main/java/com/m3pro/groundflip/domain/entity/Preference.java similarity index 75% rename from src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java rename to src/main/java/com/m3pro/groundflip/domain/entity/Preference.java index daf8c2bf..3bcf1f64 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/UserPreference.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/Preference.java @@ -23,7 +23,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder -public class UserPreference extends BaseTimeEntity { +public class Preference extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_preference_id") @@ -33,9 +33,17 @@ public class UserPreference extends BaseTimeEntity { @JoinColumn(name = "user_id", nullable = false) private User user; - @Column(name = "push_notifications_enabled", nullable = false) + @Column(nullable = false) private Boolean serviceNotificationsEnabled; - @Column(name = "email_notifications_enabled", nullable = false) + @Column(nullable = false) private Boolean marketingNotificationsEnabled; + + public void updateServiceNotificationsEnabled(boolean enabled) { + serviceNotificationsEnabled = enabled; + } + + public void updateMarketingNotificationsEnabled(boolean enabled) { + marketingNotificationsEnabled = enabled; + } } diff --git a/src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java b/src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java new file mode 100644 index 00000000..bb846825 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java @@ -0,0 +1,12 @@ +package com.m3pro.groundflip.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.m3pro.groundflip.domain.entity.Preference; +import com.m3pro.groundflip.domain.entity.User; + +public interface PreferenceRepository extends JpaRepository { + Optional findByUser(User user); +} diff --git a/src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java b/src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java deleted file mode 100644 index 4b7651c4..00000000 --- a/src/main/java/com/m3pro/groundflip/repository/UserPreferenceRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.m3pro.groundflip.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import com.m3pro.groundflip.domain.entity.UserPreference; - -public interface UserPreferenceRepository extends JpaRepository { -} diff --git a/src/main/java/com/m3pro/groundflip/service/AuthService.java b/src/main/java/com/m3pro/groundflip/service/AuthService.java index 1970e977..b0dad8ec 100644 --- a/src/main/java/com/m3pro/groundflip/service/AuthService.java +++ b/src/main/java/com/m3pro/groundflip/service/AuthService.java @@ -11,13 +11,13 @@ import com.m3pro.groundflip.domain.dto.auth.OauthUserInfoResponse; import com.m3pro.groundflip.domain.dto.auth.ReissueReponse; import com.m3pro.groundflip.domain.entity.AppleRefreshToken; +import com.m3pro.groundflip.domain.entity.Preference; import com.m3pro.groundflip.domain.entity.User; -import com.m3pro.groundflip.domain.entity.UserPreference; import com.m3pro.groundflip.enums.Provider; import com.m3pro.groundflip.enums.UserStatus; import com.m3pro.groundflip.jwt.JwtProvider; import com.m3pro.groundflip.repository.AppleRefreshTokenRepository; -import com.m3pro.groundflip.repository.UserPreferenceRepository; +import com.m3pro.groundflip.repository.PreferenceRepository; import com.m3pro.groundflip.repository.UserRepository; import com.m3pro.groundflip.service.oauth.OauthService; @@ -31,8 +31,7 @@ public class AuthService { private final JwtProvider jwtProvider; private final UserRepository userRepository; private final AppleRefreshTokenRepository appleRefreshTokenRepository; - private final UserPreference userPreference; - private final UserPreferenceRepository userPreferenceRepository; + private final PreferenceRepository preferenceRepository; /** * Oauth Provider를 사용해 로그인을 진행한다. @@ -77,7 +76,7 @@ private User registerUser(Provider provider, String email) { .provider(provider) .status(UserStatus.PENDING) .build()); - userPreferenceRepository.save(UserPreference.builder() + preferenceRepository.save(Preference.builder() .user(newUser) .serviceNotificationsEnabled(false) .marketingNotificationsEnabled(false) From 2173fdfe3f9b4097dbea932f1c612032c7284e55 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 12:01:07 +0900 Subject: [PATCH 39/66] =?UTF-8?q?M3-293=20Feat=20:=20PreferenceRequest=20D?= =?UTF-8?q?to=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/preference/PreferenceRequest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java new file mode 100644 index 00000000..30ad6421 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java @@ -0,0 +1,21 @@ +package com.m3pro.groundflip.domain.dto.preference; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +@Schema(title = "권한 동의 Body") +public class PreferenceRequest { + @Schema(description = "사용자 ID", example = "5") + private Long userId; + + @Schema(description = "권한 동의 여부", example = "true") + private boolean isEnabled; + +} From cf28897211f084d49d72b6c35979186ad9d8b722 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 12:04:26 +0900 Subject: [PATCH 40/66] =?UTF-8?q?M3-293=20Feat=20:=20=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/service/PreferenceService.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/service/PreferenceService.java diff --git a/src/main/java/com/m3pro/groundflip/service/PreferenceService.java b/src/main/java/com/m3pro/groundflip/service/PreferenceService.java new file mode 100644 index 00000000..77ceeec3 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/service/PreferenceService.java @@ -0,0 +1,41 @@ +package com.m3pro.groundflip.service; + +import org.springframework.stereotype.Service; + +import com.m3pro.groundflip.domain.dto.preference.PreferenceRequest; +import com.m3pro.groundflip.domain.entity.Preference; +import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.exception.AppException; +import com.m3pro.groundflip.exception.ErrorCode; +import com.m3pro.groundflip.repository.PreferenceRepository; +import com.m3pro.groundflip.repository.UserRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PreferenceService { + private final UserRepository userRepository; + private final PreferenceRepository preferenceRepository; + + @Transactional + public void updateServiceNotificationsPreference(PreferenceRequest preferenceRequest) { + User user = userRepository.findById(preferenceRequest.getUserId()).orElseThrow(() -> new AppException( + ErrorCode.USER_NOT_FOUND)); + Preference preference = preferenceRepository.findByUser(user) + .orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR)); + preference.updateServiceNotificationsEnabled(preferenceRequest.isEnabled()); + } + + @Transactional + public void updateMarketingNotificationsPreference(PreferenceRequest preferenceRequest) { + User user = userRepository.findById(preferenceRequest.getUserId()).orElseThrow(() -> new AppException( + ErrorCode.USER_NOT_FOUND)); + Preference preference = preferenceRepository.findByUser(user) + .orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR)); + preference.updateMarketingNotificationsEnabled(preferenceRequest.isEnabled()); + } +} From 7557442208e664eb4ebb09e49a59038fec33f533 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:07:20 +0900 Subject: [PATCH 41/66] =?UTF-8?q?M3-293=20Refactor=20:=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EA=B4=80=EB=A0=A8=EC=9D=98=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=EC=9D=84=20permission=20=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PermissionController.java | 40 +++++++++++++++++++ .../{Preference.java => Permission.java} | 6 +-- ...ository.java => PermissionRepository.java} | 6 +-- .../m3pro/groundflip/service/AuthService.java | 8 ++-- .../groundflip/service/PreferenceService.java | 14 +++---- 5 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/m3pro/groundflip/controller/PermissionController.java rename src/main/java/com/m3pro/groundflip/domain/entity/{Preference.java => Permission.java} (91%) rename src/main/java/com/m3pro/groundflip/repository/{PreferenceRepository.java => PermissionRepository.java} (50%) diff --git a/src/main/java/com/m3pro/groundflip/controller/PermissionController.java b/src/main/java/com/m3pro/groundflip/controller/PermissionController.java new file mode 100644 index 00000000..24f11a01 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/controller/PermissionController.java @@ -0,0 +1,40 @@ +package com.m3pro.groundflip.controller; + +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.m3pro.groundflip.domain.dto.Response; +import com.m3pro.groundflip.domain.dto.preference.PreferenceRequest; +import com.m3pro.groundflip.service.PreferenceService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequiredArgsConstructor +@Slf4j +@RequestMapping("/api/permission") +@Tag(name = "permission", description = "권한 동의 API") +@SecurityRequirement(name = "Authorization") +public class PermissionController { + private final PreferenceService preferenceService; + + @Operation(summary = "서비스 알림 권한 동의", description = "서비스 푸시 알림을 받을지 받지 않을지 선택하는 api 이다.") + @PutMapping("/service-notification") + public Response updateServiceNotification(@RequestBody PreferenceRequest preferenceRequest) { + preferenceService.updateServiceNotificationsPreference(preferenceRequest); + return Response.createSuccessWithNoData(); + } + + @Operation(summary = "마케팅 알림 권한 동의", description = "마케팅 푸시 알림을 받을지 받지 않을지 선택하는 api 이다.") + @PutMapping("/marketing-notification") + public Response updateMarketingNotification(@RequestBody PreferenceRequest preferenceRequest) { + preferenceService.updateMarketingNotificationsPreference(preferenceRequest); + return Response.createSuccessWithNoData(); + } +} diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/Preference.java b/src/main/java/com/m3pro/groundflip/domain/entity/Permission.java similarity index 91% rename from src/main/java/com/m3pro/groundflip/domain/entity/Preference.java rename to src/main/java/com/m3pro/groundflip/domain/entity/Permission.java index 3bcf1f64..e10fc113 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/Preference.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/Permission.java @@ -19,14 +19,14 @@ @Getter @Entity -@Table(name = "user_preference") +@Table(name = "permission") @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder -public class Preference extends BaseTimeEntity { +public class Permission extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "user_preference_id") + @Column(name = "permission_id") private Long id; @OneToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java b/src/main/java/com/m3pro/groundflip/repository/PermissionRepository.java similarity index 50% rename from src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java rename to src/main/java/com/m3pro/groundflip/repository/PermissionRepository.java index bb846825..44ec03a3 100644 --- a/src/main/java/com/m3pro/groundflip/repository/PreferenceRepository.java +++ b/src/main/java/com/m3pro/groundflip/repository/PermissionRepository.java @@ -4,9 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; -import com.m3pro.groundflip.domain.entity.Preference; +import com.m3pro.groundflip.domain.entity.Permission; import com.m3pro.groundflip.domain.entity.User; -public interface PreferenceRepository extends JpaRepository { - Optional findByUser(User user); +public interface PermissionRepository extends JpaRepository { + Optional findByUser(User user); } diff --git a/src/main/java/com/m3pro/groundflip/service/AuthService.java b/src/main/java/com/m3pro/groundflip/service/AuthService.java index b0dad8ec..39cf2773 100644 --- a/src/main/java/com/m3pro/groundflip/service/AuthService.java +++ b/src/main/java/com/m3pro/groundflip/service/AuthService.java @@ -11,13 +11,13 @@ import com.m3pro.groundflip.domain.dto.auth.OauthUserInfoResponse; import com.m3pro.groundflip.domain.dto.auth.ReissueReponse; import com.m3pro.groundflip.domain.entity.AppleRefreshToken; -import com.m3pro.groundflip.domain.entity.Preference; +import com.m3pro.groundflip.domain.entity.Permission; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.enums.Provider; import com.m3pro.groundflip.enums.UserStatus; import com.m3pro.groundflip.jwt.JwtProvider; import com.m3pro.groundflip.repository.AppleRefreshTokenRepository; -import com.m3pro.groundflip.repository.PreferenceRepository; +import com.m3pro.groundflip.repository.PermissionRepository; import com.m3pro.groundflip.repository.UserRepository; import com.m3pro.groundflip.service.oauth.OauthService; @@ -31,7 +31,7 @@ public class AuthService { private final JwtProvider jwtProvider; private final UserRepository userRepository; private final AppleRefreshTokenRepository appleRefreshTokenRepository; - private final PreferenceRepository preferenceRepository; + private final PermissionRepository permissionRepository; /** * Oauth Provider를 사용해 로그인을 진행한다. @@ -76,7 +76,7 @@ private User registerUser(Provider provider, String email) { .provider(provider) .status(UserStatus.PENDING) .build()); - preferenceRepository.save(Preference.builder() + permissionRepository.save(Permission.builder() .user(newUser) .serviceNotificationsEnabled(false) .marketingNotificationsEnabled(false) diff --git a/src/main/java/com/m3pro/groundflip/service/PreferenceService.java b/src/main/java/com/m3pro/groundflip/service/PreferenceService.java index 77ceeec3..65ac0396 100644 --- a/src/main/java/com/m3pro/groundflip/service/PreferenceService.java +++ b/src/main/java/com/m3pro/groundflip/service/PreferenceService.java @@ -3,11 +3,11 @@ import org.springframework.stereotype.Service; import com.m3pro.groundflip.domain.dto.preference.PreferenceRequest; -import com.m3pro.groundflip.domain.entity.Preference; +import com.m3pro.groundflip.domain.entity.Permission; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.exception.AppException; import com.m3pro.groundflip.exception.ErrorCode; -import com.m3pro.groundflip.repository.PreferenceRepository; +import com.m3pro.groundflip.repository.PermissionRepository; import com.m3pro.groundflip.repository.UserRepository; import jakarta.transaction.Transactional; @@ -19,23 +19,23 @@ @Slf4j public class PreferenceService { private final UserRepository userRepository; - private final PreferenceRepository preferenceRepository; + private final PermissionRepository permissionRepository; @Transactional public void updateServiceNotificationsPreference(PreferenceRequest preferenceRequest) { User user = userRepository.findById(preferenceRequest.getUserId()).orElseThrow(() -> new AppException( ErrorCode.USER_NOT_FOUND)); - Preference preference = preferenceRepository.findByUser(user) + Permission permission = permissionRepository.findByUser(user) .orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR)); - preference.updateServiceNotificationsEnabled(preferenceRequest.isEnabled()); + permission.updateServiceNotificationsEnabled(preferenceRequest.isEnabled()); } @Transactional public void updateMarketingNotificationsPreference(PreferenceRequest preferenceRequest) { User user = userRepository.findById(preferenceRequest.getUserId()).orElseThrow(() -> new AppException( ErrorCode.USER_NOT_FOUND)); - Preference preference = preferenceRepository.findByUser(user) + Permission permission = permissionRepository.findByUser(user) .orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR)); - preference.updateMarketingNotificationsEnabled(preferenceRequest.isEnabled()); + permission.updateMarketingNotificationsEnabled(preferenceRequest.isEnabled()); } } From 31c5ab1aa3e88749891792f9445f3bdaf88ef925 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:13:28 +0900 Subject: [PATCH 42/66] =?UTF-8?q?M3-293=20Chore=20:=20=EA=B6=8C=ED=95=9C?= =?UTF-8?q?=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EC=9C=A0=EC=A0=80=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=B4=20permission=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=A5=BC=20=EB=84=A3=EB=8A=94=20sql=20=EB=AC=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/permission_insert.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/resources/static/permission_insert.sql diff --git a/src/main/resources/static/permission_insert.sql b/src/main/resources/static/permission_insert.sql new file mode 100644 index 00000000..0e33a29c --- /dev/null +++ b/src/main/resources/static/permission_insert.sql @@ -0,0 +1,6 @@ +INSERT INTO permission (user_id, marketing_notifications_enabled, service_notifications_enabled, created_at, + modified_at) +SELECT u.user_id, FALSE, FALSE, NOW(), NOW() +FROM user u + LEFT JOIN permission p ON u.user_id = p.user_id +WHERE p.user_id IS NULL; \ No newline at end of file From 0722e4eca89a6db2fd485d2b8ac14a3bcf5b21db Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:23:04 +0900 Subject: [PATCH 43/66] =?UTF-8?q?M3-293=20Refactor=20:=20Permission=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PermissionController.java | 14 +++++++------- .../PermissionRequest.java} | 4 ++-- ...erenceService.java => PermissionService.java} | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/com/m3pro/groundflip/domain/dto/{preference/PreferenceRequest.java => permission/PermissionRequest.java} (83%) rename src/main/java/com/m3pro/groundflip/service/{PreferenceService.java => PermissionService.java} (68%) diff --git a/src/main/java/com/m3pro/groundflip/controller/PermissionController.java b/src/main/java/com/m3pro/groundflip/controller/PermissionController.java index 24f11a01..be6b9a4e 100644 --- a/src/main/java/com/m3pro/groundflip/controller/PermissionController.java +++ b/src/main/java/com/m3pro/groundflip/controller/PermissionController.java @@ -6,8 +6,8 @@ import org.springframework.web.bind.annotation.RestController; import com.m3pro.groundflip.domain.dto.Response; -import com.m3pro.groundflip.domain.dto.preference.PreferenceRequest; -import com.m3pro.groundflip.service.PreferenceService; +import com.m3pro.groundflip.domain.dto.permission.PermissionRequest; +import com.m3pro.groundflip.service.PermissionService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -22,19 +22,19 @@ @Tag(name = "permission", description = "권한 동의 API") @SecurityRequirement(name = "Authorization") public class PermissionController { - private final PreferenceService preferenceService; + private final PermissionService permissionService; @Operation(summary = "서비스 알림 권한 동의", description = "서비스 푸시 알림을 받을지 받지 않을지 선택하는 api 이다.") @PutMapping("/service-notification") - public Response updateServiceNotification(@RequestBody PreferenceRequest preferenceRequest) { - preferenceService.updateServiceNotificationsPreference(preferenceRequest); + public Response updateServiceNotification(@RequestBody PermissionRequest permissionRequest) { + permissionService.updateServiceNotificationsPreference(permissionRequest); return Response.createSuccessWithNoData(); } @Operation(summary = "마케팅 알림 권한 동의", description = "마케팅 푸시 알림을 받을지 받지 않을지 선택하는 api 이다.") @PutMapping("/marketing-notification") - public Response updateMarketingNotification(@RequestBody PreferenceRequest preferenceRequest) { - preferenceService.updateMarketingNotificationsPreference(preferenceRequest); + public Response updateMarketingNotification(@RequestBody PermissionRequest permissionRequest) { + permissionService.updateMarketingNotificationsPreference(permissionRequest); return Response.createSuccessWithNoData(); } } diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java similarity index 83% rename from src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java rename to src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java index 30ad6421..ea5b6a94 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/preference/PreferenceRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java @@ -1,4 +1,4 @@ -package com.m3pro.groundflip.domain.dto.preference; +package com.m3pro.groundflip.domain.dto.permission; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -11,7 +11,7 @@ @Data @Builder @Schema(title = "권한 동의 Body") -public class PreferenceRequest { +public class PermissionRequest { @Schema(description = "사용자 ID", example = "5") private Long userId; diff --git a/src/main/java/com/m3pro/groundflip/service/PreferenceService.java b/src/main/java/com/m3pro/groundflip/service/PermissionService.java similarity index 68% rename from src/main/java/com/m3pro/groundflip/service/PreferenceService.java rename to src/main/java/com/m3pro/groundflip/service/PermissionService.java index 65ac0396..d9cf1d33 100644 --- a/src/main/java/com/m3pro/groundflip/service/PreferenceService.java +++ b/src/main/java/com/m3pro/groundflip/service/PermissionService.java @@ -2,7 +2,7 @@ import org.springframework.stereotype.Service; -import com.m3pro.groundflip.domain.dto.preference.PreferenceRequest; +import com.m3pro.groundflip.domain.dto.permission.PermissionRequest; import com.m3pro.groundflip.domain.entity.Permission; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.exception.AppException; @@ -17,25 +17,25 @@ @Service @RequiredArgsConstructor @Slf4j -public class PreferenceService { +public class PermissionService { private final UserRepository userRepository; private final PermissionRepository permissionRepository; @Transactional - public void updateServiceNotificationsPreference(PreferenceRequest preferenceRequest) { - User user = userRepository.findById(preferenceRequest.getUserId()).orElseThrow(() -> new AppException( + public void updateServiceNotificationsPreference(PermissionRequest permissionRequest) { + User user = userRepository.findById(permissionRequest.getUserId()).orElseThrow(() -> new AppException( ErrorCode.USER_NOT_FOUND)); Permission permission = permissionRepository.findByUser(user) .orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR)); - permission.updateServiceNotificationsEnabled(preferenceRequest.isEnabled()); + permission.updateServiceNotificationsEnabled(permissionRequest.isEnabled()); } @Transactional - public void updateMarketingNotificationsPreference(PreferenceRequest preferenceRequest) { - User user = userRepository.findById(preferenceRequest.getUserId()).orElseThrow(() -> new AppException( + public void updateMarketingNotificationsPreference(PermissionRequest permissionRequest) { + User user = userRepository.findById(permissionRequest.getUserId()).orElseThrow(() -> new AppException( ErrorCode.USER_NOT_FOUND)); Permission permission = permissionRepository.findByUser(user) .orElseThrow(() -> new AppException(ErrorCode.INTERNAL_SERVER_ERROR)); - permission.updateMarketingNotificationsEnabled(preferenceRequest.isEnabled()); + permission.updateMarketingNotificationsEnabled(permissionRequest.isEnabled()); } } From 5bf8475ecc57b7c895904587815ce22647867b52 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:23:39 +0900 Subject: [PATCH 44/66] =?UTF-8?q?M3-293=20Feat=20:=20PermissionResponse=20?= =?UTF-8?q?dto=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/permission/PermissionResponse.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionResponse.java diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionResponse.java new file mode 100644 index 00000000..e302a409 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionResponse.java @@ -0,0 +1,20 @@ +package com.m3pro.groundflip.domain.dto.permission; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +@Schema(title = "권한 정보 body") +public class PermissionResponse { + @Schema(description = "서비스 알림 동의 여부", example = "true") + private boolean isServiceNotificationEnabled; + + @Schema(description = "마케팅 알림 동의 여부", example = "true") + private boolean isMarketingNotificationEnabled; +} From f049d0a844baf96545c37d49494d28f789457388 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:42:50 +0900 Subject: [PATCH 45/66] =?UTF-8?q?M3-293=20Feat=20:=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EC=9D=98=20=EA=B6=8C=ED=95=9C=EC=9D=84=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m3pro/groundflip/service/PermissionService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/service/PermissionService.java b/src/main/java/com/m3pro/groundflip/service/PermissionService.java index d9cf1d33..c19f2160 100644 --- a/src/main/java/com/m3pro/groundflip/service/PermissionService.java +++ b/src/main/java/com/m3pro/groundflip/service/PermissionService.java @@ -3,6 +3,7 @@ import org.springframework.stereotype.Service; import com.m3pro.groundflip.domain.dto.permission.PermissionRequest; +import com.m3pro.groundflip.domain.dto.permission.PermissionResponse; import com.m3pro.groundflip.domain.entity.Permission; import com.m3pro.groundflip.domain.entity.User; import com.m3pro.groundflip.exception.AppException; @@ -21,6 +22,16 @@ public class PermissionService { private final UserRepository userRepository; private final PermissionRepository permissionRepository; + public PermissionResponse getAllPermissions(Long userId) { + User user = userRepository.getReferenceById(userId); + Permission permission = permissionRepository.findByUser(user) + .orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND)); + return new PermissionResponse( + permission.getServiceNotificationsEnabled(), + permission.getMarketingNotificationsEnabled() + ); + } + @Transactional public void updateServiceNotificationsPreference(PermissionRequest permissionRequest) { User user = userRepository.findById(permissionRequest.getUserId()).orElseThrow(() -> new AppException( From 5733e05d4180dfc9850ae786bc67fd88f745081b Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:43:06 +0900 Subject: [PATCH 46/66] =?UTF-8?q?M3-293=20Feat=20:=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=9D=98=20=EA=B6=8C=ED=95=9C=EC=9D=84=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/controller/PermissionController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/controller/PermissionController.java b/src/main/java/com/m3pro/groundflip/controller/PermissionController.java index be6b9a4e..4d2e2f03 100644 --- a/src/main/java/com/m3pro/groundflip/controller/PermissionController.java +++ b/src/main/java/com/m3pro/groundflip/controller/PermissionController.java @@ -1,5 +1,7 @@ package com.m3pro.groundflip.controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -7,6 +9,7 @@ import com.m3pro.groundflip.domain.dto.Response; import com.m3pro.groundflip.domain.dto.permission.PermissionRequest; +import com.m3pro.groundflip.domain.dto.permission.PermissionResponse; import com.m3pro.groundflip.service.PermissionService; import io.swagger.v3.oas.annotations.Operation; @@ -24,6 +27,12 @@ public class PermissionController { private final PermissionService permissionService; + @Operation(summary = "유저가 동의한 권한 조회", description = "유저가 동의한 권한을 조회하여 응답한다.") + @GetMapping("/{userId}") + public Response getPermission(@PathVariable("userId") Long userId) { + return Response.createSuccess(permissionService.getAllPermissions(userId)); + } + @Operation(summary = "서비스 알림 권한 동의", description = "서비스 푸시 알림을 받을지 받지 않을지 선택하는 api 이다.") @PutMapping("/service-notification") public Response updateServiceNotification(@RequestBody PermissionRequest permissionRequest) { @@ -37,4 +46,5 @@ public Response updateMarketingNotification(@RequestBody PermissionRequest pe permissionService.updateMarketingNotificationsPreference(permissionRequest); return Response.createSuccessWithNoData(); } + } From f76594fe931bfee617a91ace6d2d6020aef4e887 Mon Sep 17 00:00:00 2001 From: MinUk Date: Wed, 14 Aug 2024 13:54:06 +0900 Subject: [PATCH 47/66] =?UTF-8?q?Feat=20:=20=EB=AC=B4=EC=A4=91=EB=8B=A8=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 70 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/deploy.sh b/deploy.sh index 2bb4465e..55223964 100644 --- a/deploy.sh +++ b/deploy.sh @@ -3,24 +3,64 @@ APP_NAME="ground_flip" REPOSITORY=/home/ubuntu/ground_flip -echo "> Check the currently running container" -CONTAINER_ID=$(docker ps -aqf "name=$APP_NAME") -pwd -ls -if [ -z "$CONTAINER_ID" ]; -then - echo "> No such container is running." -else - echo "> Stop and remove container: $CONTAINER_ID" - docker stop "$CONTAINER_ID" - docker rm "$CONTAINER_ID" -fi - echo "> Remove previous Docker image" docker rmi "$APP_NAME" echo "> Build Docker image" docker build -t "$APP_NAME" "$REPOSITORY" -echo "> Run the Docker container" -docker run -d -p 8080:8080 --env-file /home/ubuntu/ground_flip/.env -e TZ=Asia/Seoul -v /home/ubuntu/logs:/logs --name "$APP_NAME" "$APP_NAME" +TARGET_PORT=0 +CURRENT_PORT=$(sudo docker ps --filter "name=$APP_NAME" --format "{{.Ports}}" | cut -d: -f2 | cut -d- -f1) +echo "> CURRENT_PORT = $CURRENT_PORT" + +if [ "$CURRENT_PORT" == "8081" ]; then + TARGET_PORT=8082 +else + TARGET_PORT=8081 +fi +echo "> TARGET_PORT = $TARGET_PORT" + + +NEW_CONTAINER_NAME="$APP_NAME-$TARGET_PORT" +OLD_CONTAINER_NAME="$APP_NAME-$CURRENT_PORT" + +echo "> Check the currently running container" +CONTAINER_ID=$(sudo docker ps -aqf "name=$NEW_CONTAINER_NAME") + +if [ -n "$CONTAINER_ID" ]; then + echo "> Stopping and removing container: $CONTAINER_ID" + sudo docker stop "$CONTAINER_ID" + sudo docker rm "$CONTAINER_ID" +fi + +echo "> Run the Docker container on port $TARGET_PORT" +sudo docker run -d -p $TARGET_PORT:8080 --env-file /home/ubuntu/ground_flip/.env -e TZ=Asia/Seoul -v /home/ubuntu/logs:/logs --name "$NEW_CONTAINER_NAME" "$APP_NAME" + +for cnt in {1..10} # 10번 실행 +do + echo "check server start.." + + RESPONSE=$(curl -s http://127.0.0.1:${TARGET_PORT}/check) + SUCCESS=$(echo $RESPONSE | grep '"result":"success"') + if [ -z "$SUCCESS" ] # 실행되었다면 break + then + echo "server not start.." + else + break + fi + + echo "wait 10 seconds" # 10 초간 대기 + sleep 10 +done + +echo "> Update NGINX configuration to route traffic to the new container" +NGINX_CONF="/etc/nginx/nginx.conf" +sudo sed -i "s/$CURRENT_PORT/$TARGET_PORT/g" "$NGINX_CONF" + +echo "> Reload NGINX to apply the new configuration" +sudo nginx -s reload + +sudo docker rm -f $OLD_CONTAINER_NAME + +echo "> Deployment to port $TARGET_PORT completed successfully." + From ab00ddcf648006a1a026a4b07a7c25f905ee139a Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 14 Aug 2024 13:55:36 +0900 Subject: [PATCH 48/66] =?UTF-8?q?M3-293=20Test=20:=20permissionService=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/service/AuthServiceTest.java | 3 + .../service/PermissionServiceTest.java | 93 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/test/java/com/m3pro/groundflip/service/PermissionServiceTest.java diff --git a/src/test/java/com/m3pro/groundflip/service/AuthServiceTest.java b/src/test/java/com/m3pro/groundflip/service/AuthServiceTest.java index dfd15ed1..29fae43f 100644 --- a/src/test/java/com/m3pro/groundflip/service/AuthServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/AuthServiceTest.java @@ -25,6 +25,7 @@ import com.m3pro.groundflip.enums.UserStatus; import com.m3pro.groundflip.jwt.JwtProvider; import com.m3pro.groundflip.repository.AppleRefreshTokenRepository; +import com.m3pro.groundflip.repository.PermissionRepository; import com.m3pro.groundflip.repository.RankingRedisRepository; import com.m3pro.groundflip.repository.UserRepository; import com.m3pro.groundflip.service.oauth.OauthService; @@ -41,6 +42,8 @@ class AuthServiceTest { private RankingRedisRepository rankingRedisRepository; @Mock private AppleRefreshTokenRepository appleRefreshTokenRepository; + @Mock + private PermissionRepository permissionRepository; @InjectMocks private AuthService authService; diff --git a/src/test/java/com/m3pro/groundflip/service/PermissionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/PermissionServiceTest.java new file mode 100644 index 00000000..568e771d --- /dev/null +++ b/src/test/java/com/m3pro/groundflip/service/PermissionServiceTest.java @@ -0,0 +1,93 @@ +package com.m3pro.groundflip.service; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.m3pro.groundflip.domain.dto.permission.PermissionRequest; +import com.m3pro.groundflip.domain.dto.permission.PermissionResponse; +import com.m3pro.groundflip.domain.entity.Permission; +import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.repository.PermissionRepository; +import com.m3pro.groundflip.repository.UserRepository; + +@ExtendWith(MockitoExtension.class) +class PermissionServiceTest { + @Mock + private UserRepository userRepository; + + @Mock + private PermissionRepository permissionRepository; + + @InjectMocks + private PermissionService permissionService; + + private User mockUser; + private Permission mockPermission; + + @BeforeEach + void setUp() { + mockUser = User.builder() + .id(1L) + .nickname("testUser") + .build(); + + mockPermission = Permission.builder() + .serviceNotificationsEnabled(true) + .marketingNotificationsEnabled(true) + .user(mockUser) + .build(); + } + + @Test + @DisplayName("[getAllPermissions] userId에 해당하는 권한의 정보를 가져온다.") + void testGetAllPermissions() { + when(userRepository.getReferenceById(anyLong())).thenReturn(mockUser); + when(permissionRepository.findByUser(any(User.class))).thenReturn(Optional.of(mockPermission)); + + PermissionResponse response = permissionService.getAllPermissions(1L); + + assertTrue(response.isServiceNotificationEnabled()); + assertTrue(response.isMarketingNotificationEnabled()); + + verify(userRepository, times(1)).getReferenceById(1L); + verify(permissionRepository, times(1)).findByUser(mockUser); + } + + @Test + @DisplayName("[updateServiceNotificationsPreference] service 권한을 정상적으로 변경한다.") + void testUpdateServiceNotificationsPreference() { + PermissionRequest request = new PermissionRequest(1L, false); + + when(userRepository.findById(anyLong())).thenReturn(Optional.of(mockUser)); + when(permissionRepository.findByUser(any(User.class))).thenReturn(Optional.of(mockPermission)); + + permissionService.updateServiceNotificationsPreference(request); + + verify(permissionRepository, times(1)).findByUser(mockUser); + assertEquals(false, mockPermission.getServiceNotificationsEnabled()); + } + + @Test + @DisplayName("[updateMarketingNotificationsPreference] marketing 권한을 정상적으로 변경한다.") + void testUpdateMarketingNotificationsPreference() { + PermissionRequest request = new PermissionRequest(1L, false); + + when(userRepository.findById(anyLong())).thenReturn(Optional.of(mockUser)); + when(permissionRepository.findByUser(any(User.class))).thenReturn(Optional.of(mockPermission)); + + permissionService.updateMarketingNotificationsPreference(request); + + verify(permissionRepository, times(1)).findByUser(mockUser); + assertEquals(false, mockPermission.getMarketingNotificationsEnabled()); + } +} \ No newline at end of file From 10f8a334ba0fe33acc8c0c21c07a4ccdb44d5b20 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 15 Aug 2024 17:21:45 +0900 Subject: [PATCH 49/66] =?UTF-8?q?M3-293=20Feat=20:=20fcmToken=EC=9D=98=20t?= =?UTF-8?q?oken=20=EA=B0=92=EC=9D=84=20=ED=95=AD=EC=83=81=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/domain/entity/FcmToken.java | 4 ++++ src/main/java/com/m3pro/groundflip/service/FcmService.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java index b0dd472a..1b4a3ea4 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java @@ -34,4 +34,8 @@ public class FcmToken extends BaseTimeEntity { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; + + public void updateToken(String token) { + this.token = token; + } } diff --git a/src/main/java/com/m3pro/groundflip/service/FcmService.java b/src/main/java/com/m3pro/groundflip/service/FcmService.java index c47c4aed..92c3f4dd 100644 --- a/src/main/java/com/m3pro/groundflip/service/FcmService.java +++ b/src/main/java/com/m3pro/groundflip/service/FcmService.java @@ -31,6 +31,7 @@ public void registerFcmToken(FcmTokenRequest fcmTokenRequest) { if (fcmToken.isPresent()) { fcmToken.get().updateModifiedAtToNow(); + fcmToken.get().updateToken(fcmTokenRequest.getFcmToken()); } else { fcmTokenRepository.save( FcmToken.builder() From 1f33b60ef01ef518b62eb1b241eae74f6b0982bb Mon Sep 17 00:00:00 2001 From: MinUk Date: Mon, 19 Aug 2024 00:03:44 +0900 Subject: [PATCH 50/66] =?UTF-8?q?Fix=20:=20=EB=AC=B4=EC=A4=91=EB=8B=A8=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/deploy.sh b/deploy.sh index 55223964..ca9567ab 100644 --- a/deploy.sh +++ b/deploy.sh @@ -24,15 +24,6 @@ echo "> TARGET_PORT = $TARGET_PORT" NEW_CONTAINER_NAME="$APP_NAME-$TARGET_PORT" OLD_CONTAINER_NAME="$APP_NAME-$CURRENT_PORT" -echo "> Check the currently running container" -CONTAINER_ID=$(sudo docker ps -aqf "name=$NEW_CONTAINER_NAME") - -if [ -n "$CONTAINER_ID" ]; then - echo "> Stopping and removing container: $CONTAINER_ID" - sudo docker stop "$CONTAINER_ID" - sudo docker rm "$CONTAINER_ID" -fi - echo "> Run the Docker container on port $TARGET_PORT" sudo docker run -d -p $TARGET_PORT:8080 --env-file /home/ubuntu/ground_flip/.env -e TZ=Asia/Seoul -v /home/ubuntu/logs:/logs --name "$NEW_CONTAINER_NAME" "$APP_NAME" From 3cbf768457a50f381faa44342ffbcb36fb7a96ad Mon Sep 17 00:00:00 2001 From: MinUk Date: Mon, 19 Aug 2024 00:54:34 +0900 Subject: [PATCH 51/66] =?UTF-8?q?Fix=20:=20deploy.sh=EC=97=90=20sudo=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=97=AC?= =?UTF-8?q?=EC=8A=A4=EC=B2=B4=ED=81=AC=20=EB=A1=9C=EC=A7=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/deploy.sh b/deploy.sh index ca9567ab..0ea633b0 100644 --- a/deploy.sh +++ b/deploy.sh @@ -3,11 +3,8 @@ APP_NAME="ground_flip" REPOSITORY=/home/ubuntu/ground_flip -echo "> Remove previous Docker image" -docker rmi "$APP_NAME" - echo "> Build Docker image" -docker build -t "$APP_NAME" "$REPOSITORY" +sudo docker build -t "$APP_NAME" "$REPOSITORY" TARGET_PORT=0 CURRENT_PORT=$(sudo docker ps --filter "name=$APP_NAME" --format "{{.Ports}}" | cut -d: -f2 | cut -d- -f1) @@ -31,13 +28,13 @@ for cnt in {1..10} # 10번 실행 do echo "check server start.." - RESPONSE=$(curl -s http://127.0.0.1:${TARGET_PORT}/check) - SUCCESS=$(echo $RESPONSE | grep '"result":"success"') - if [ -z "$SUCCESS" ] # 실행되었다면 break - then - echo "server not start.." + RESPONSE=$(curl -s http://127.0.0.1:$TARGET_PORT/check) + + if echo "$RESPONSE" | grep -q "success"; then + echo "Container Started" + break; else - break + echo "server not start.." fi echo "wait 10 seconds" # 10 초간 대기 @@ -51,7 +48,11 @@ sudo sed -i "s/$CURRENT_PORT/$TARGET_PORT/g" "$NGINX_CONF" echo "> Reload NGINX to apply the new configuration" sudo nginx -s reload +echo "> Remove Old Container" sudo docker rm -f $OLD_CONTAINER_NAME +echo "> Remove previous Docker image" +sudo docker image prune -f + echo "> Deployment to port $TARGET_PORT completed successfully." From f6d802d668694192afa0a659cb751a27291a0e44 Mon Sep 17 00:00:00 2001 From: Kim Min Uk <62949434+qjvk2880@users.noreply.github.com> Date: Mon, 19 Aug 2024 19:35:05 +0900 Subject: [PATCH 52/66] =?UTF-8?q?Chore=20:=20Readme.md=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..b64d5702 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ + +## GroundFlip - 땅따먹기 게임 기반 걷기 앱 +image + +### 👀 프로젝트 소개 +내가 가는 길이 내 것이 되는 즐거움, 그라운드 플립!
+운동이 재미가 없어 꾸준히 하기 어려웠다구요? + +그라운드 플립과 함께 걸어봐요! + +그라운드 플립은 땅따먹기 게임에서 아이디어를 얻어 현대인들의 운동 부족을 해결하기 위해 제작되었습니다.
+사용자는 지도 상에 존재하는 수많은 픽셀들을 걸어나가며 차지할 수 있습니다.
+실시간 랭킹, 그룹 기능을 제공합니다.
+ +--- +### 개발 환경 +- Java 17 +- Spring Boot 3.3.0 + +--- + +### 기술 세부 스택 +- Spring Boot + +- Spring Data JPA +- Spring Data Redis +- Spring Security +그 외 + +--- + +### 📚 기능 소개
+BE Architecture
+image + +ERD
+image From 9cd3b3f7fcfe13a24b637f3e9ab2e7e53df37295 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Wed, 21 Aug 2024 14:18:35 +0900 Subject: [PATCH 53/66] =?UTF-8?q?Fix=20:=20isEnabled=20=EC=97=AD=EC=A7=81?= =?UTF-8?q?=EB=A0=AC=ED=99=94=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../groundflip/domain/dto/permission/PermissionRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java index ea5b6a94..406f61a0 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/permission/PermissionRequest.java @@ -1,5 +1,7 @@ package com.m3pro.groundflip.domain.dto.permission; +import com.fasterxml.jackson.annotation.JsonProperty; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,6 +18,7 @@ public class PermissionRequest { private Long userId; @Schema(description = "권한 동의 여부", example = "true") + @JsonProperty("isEnabled") private boolean isEnabled; } From 00866277de59ebd527417b1a17c27fdb1342aa26 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:03:56 +0900 Subject: [PATCH 54/66] =?UTF-8?q?M3-318=20Feat=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd_dev.yml | 1 + .github/workflows/cd_prod.yml | 1 + .../groundflip/service/VersionService.java | 32 +++++++++++++++++-- src/main/resources/application-dev.yml | 2 ++ src/main/resources/application-local.yml | 1 + src/main/resources/application-prod.yml | 1 + 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd_dev.yml b/.github/workflows/cd_dev.yml index 78bd6aa5..0a7aebd8 100644 --- a/.github/workflows/cd_dev.yml +++ b/.github/workflows/cd_dev.yml @@ -37,6 +37,7 @@ jobs: echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env + echo "RECOMMAND_UPDATE=${{ secrets.RECOMMAND_UPDATE }}" >> .env echo "SPRING_PROFILES_ACTIVE=dev" >> .env diff --git a/.github/workflows/cd_prod.yml b/.github/workflows/cd_prod.yml index b485ca3f..4484fb96 100644 --- a/.github/workflows/cd_prod.yml +++ b/.github/workflows/cd_prod.yml @@ -37,6 +37,7 @@ jobs: echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env + echo "RECOMMAND_UPDATE=${{ secrets.RECOMMAND_UPDATE }}" >> .env - name: gradlew에 실행 권한 부여 run: chmod +x ./gradlew diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index a7ee3493..52f2af7b 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -15,12 +15,20 @@ public class VersionService { @Value("${version.update}") private String lastestVersion; + @Value("${version.recommand}") + private String recommandUpdate; + private Version needUpdate; public VersionResponse getVersion(String currentVersion) { - if (!lastestVersion.equals(currentVersion)) { + if (compareVersions(currentVersion, recommandUpdate) == -1) { + needUpdate = Version.FORCE; + } + if (compareVersions(currentVersion, recommandUpdate) == 1 + && compareVersions(currentVersion, lastestVersion) == -1) { needUpdate = Version.NEED; - } else { + } + if (compareVersions(currentVersion, lastestVersion) == 1) { needUpdate = Version.OK; } @@ -29,4 +37,24 @@ public VersionResponse getVersion(String currentVersion) { .needUpdate(needUpdate) .build(); } + + private static int compareVersions(String version1, String version2) { + String[] v1Parts = version1.split("\\."); + String[] v2Parts = version2.split("\\."); + + int length = Math.max(v1Parts.length, v2Parts.length); + + for (int i = 0; i < length; i++) { + int v1 = i < v1Parts.length ? Integer.parseInt(v1Parts[i]) : 0; + int v2 = i < v2Parts.length ? Integer.parseInt(v2Parts[i]) : 0; + + if (v1 < v2) { + return -1; + } + if (v1 > v2) { + return 1; + } + } + return 1; + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index ba072738..8ffec010 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -87,5 +87,7 @@ cloud: version: update: ${NEED_UPDATE_VERSION} + recommand: ${RECOMMAND_UPDATE} + diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index f683e0e5..a77cff79 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -87,4 +87,5 @@ cloud: version: update: ${NEED_UPDATE_VERSION} + recommand: ${RECOMMAND_UPDATE} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index e85cfea7..92b409cd 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -85,5 +85,6 @@ cloud: version: update: ${NEED_UPDATE_VERSION} + recommand: ${RECOMMAND_UPDATE} From 40ed2d5c0fcd5801a815c7e337a7f81c3c41b61a Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:17:32 +0900 Subject: [PATCH 55/66] =?UTF-8?q?M3-318=20Feat=20:=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/service/VersionServiceTest.java | 1 + src/test/resources/application-test.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index beea8794..6bc9aa91 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -21,6 +21,7 @@ public class VersionServiceTest { @BeforeEach void setUp() { ReflectionTestUtils.setField(versionService, "lastestVersion", "1.0.3"); + ReflectionTestUtils.setField(versionService, "recommandUpdate", "1.0.0"); } @Test diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 05a8502c..ddd9da99 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -82,4 +82,5 @@ cloud: bucket: test-value version: - update: 1.0.3 \ No newline at end of file + update: 1.0.3 + recommand: 1.0.0 \ No newline at end of file From 42415a3adab2f09661d57c7fafd4bf986a1a67ea Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:39:55 +0900 Subject: [PATCH 56/66] =?UTF-8?q?M3-318=20Feat=20:=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=95=8C=EB=A6=BC=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EB=8F=99=EC=9D=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/m3pro/groundflip/service/AuthService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/m3pro/groundflip/service/AuthService.java b/src/main/java/com/m3pro/groundflip/service/AuthService.java index 39cf2773..143f3f4a 100644 --- a/src/main/java/com/m3pro/groundflip/service/AuthService.java +++ b/src/main/java/com/m3pro/groundflip/service/AuthService.java @@ -78,7 +78,7 @@ private User registerUser(Provider provider, String email) { .build()); permissionRepository.save(Permission.builder() .user(newUser) - .serviceNotificationsEnabled(false) + .serviceNotificationsEnabled(true) .marketingNotificationsEnabled(false) .build()); return newUser; From e7f99c23a62dce5fe867247a2400aad1e60ce3a6 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:49:54 +0900 Subject: [PATCH 57/66] =?UTF-8?q?M3-318=20Feat=20:=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd_dev.yml | 2 +- .github/workflows/cd_prod.yml | 2 +- .../groundflip/service/VersionService.java | 20 +++++++++---------- src/main/resources/application-dev.yml | 2 +- src/main/resources/application-local.yml | 2 +- src/main/resources/application-prod.yml | 2 +- .../service/VersionServiceTest.java | 18 ++++++++++++++--- src/test/resources/application-test.yml | 2 +- 8 files changed, 31 insertions(+), 19 deletions(-) diff --git a/.github/workflows/cd_dev.yml b/.github/workflows/cd_dev.yml index 0a7aebd8..6b04f311 100644 --- a/.github/workflows/cd_dev.yml +++ b/.github/workflows/cd_dev.yml @@ -37,7 +37,7 @@ jobs: echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env - echo "RECOMMAND_UPDATE=${{ secrets.RECOMMAND_UPDATE }}" >> .env + echo "RECOMMEND_UPDATE=${{ secrets.RECOMMEND_UPDATE }}" >> .env echo "SPRING_PROFILES_ACTIVE=dev" >> .env diff --git a/.github/workflows/cd_prod.yml b/.github/workflows/cd_prod.yml index 4484fb96..9fbe8d62 100644 --- a/.github/workflows/cd_prod.yml +++ b/.github/workflows/cd_prod.yml @@ -37,7 +37,7 @@ jobs: echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env - echo "RECOMMAND_UPDATE=${{ secrets.RECOMMAND_UPDATE }}" >> .env + echo "RECOMMEND_UPDATE=${{ secrets.RECOMMEND_UPDATE }}" >> .env - name: gradlew에 실행 권한 부여 run: chmod +x ./gradlew diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index 52f2af7b..5a675c91 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -13,27 +13,27 @@ public class VersionService { @Value("${version.update}") - private String lastestVersion; + private String latest; - @Value("${version.recommand}") - private String recommandUpdate; - - private Version needUpdate; + @Value("${version.recommend}") + private String recommendUpdate; public VersionResponse getVersion(String currentVersion) { - if (compareVersions(currentVersion, recommandUpdate) == -1) { + Version needUpdate = Version.OK; + + if (compareVersions(currentVersion, recommendUpdate) == -1) { needUpdate = Version.FORCE; } - if (compareVersions(currentVersion, recommandUpdate) == 1 - && compareVersions(currentVersion, lastestVersion) == -1) { + if (compareVersions(currentVersion, recommendUpdate) == 1 + && compareVersions(currentVersion, latest) == -1) { needUpdate = Version.NEED; } - if (compareVersions(currentVersion, lastestVersion) == 1) { + if (compareVersions(currentVersion, latest) == 1) { needUpdate = Version.OK; } return VersionResponse.builder() - .version(lastestVersion) + .version(latest) .needUpdate(needUpdate) .build(); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8ffec010..c66e7638 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -87,7 +87,7 @@ cloud: version: update: ${NEED_UPDATE_VERSION} - recommand: ${RECOMMAND_UPDATE} + recommend: ${RECOMMAND_UPDATE} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index a77cff79..b0bdc1ea 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -87,5 +87,5 @@ cloud: version: update: ${NEED_UPDATE_VERSION} - recommand: ${RECOMMAND_UPDATE} + recommend: ${RECOMMAND_UPDATE} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 92b409cd..3cfa3c7e 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -85,6 +85,6 @@ cloud: version: update: ${NEED_UPDATE_VERSION} - recommand: ${RECOMMAND_UPDATE} + recommend: ${RECOMMAND_UPDATE} diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index 6bc9aa91..dbcc5425 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -11,6 +11,7 @@ import org.springframework.test.util.ReflectionTestUtils; import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.enums.Version; @ExtendWith(MockitoExtension.class) public class VersionServiceTest { @@ -20,8 +21,8 @@ public class VersionServiceTest { @BeforeEach void setUp() { - ReflectionTestUtils.setField(versionService, "lastestVersion", "1.0.3"); - ReflectionTestUtils.setField(versionService, "recommandUpdate", "1.0.0"); + ReflectionTestUtils.setField(versionService, "lastestVersion", "2.0.3"); + ReflectionTestUtils.setField(versionService, "recommandUpdate", "1.0.5"); } @Test @@ -29,13 +30,24 @@ void setUp() { void getVersionTest() { //Given String currentVersion = "1.0.3"; + String currentVersion2 = "2.0.1"; + String currentVersion3 = "2.0.4"; //When VersionResponse versionResponse = versionService.getVersion(currentVersion); + VersionResponse versionResponse2 = versionService.getVersion(currentVersion2); + VersionResponse versionResponse3 = versionService.getVersion(currentVersion3); //Then assertThat(versionResponse).isNotNull(); - assertThat(versionResponse.getVersion()).isEqualTo("1.0.3"); + assertThat(versionResponse.getVersion()).isEqualTo("2.0.3"); + assertThat(versionResponse.getNeedUpdate()).isEqualTo(Version.FORCE); + + assertThat(versionResponse2.getVersion()).isEqualTo("2.0.3"); + assertThat(versionResponse2.getNeedUpdate()).isEqualTo(Version.NEED); + + assertThat(versionResponse3.getVersion()).isEqualTo("2.0.3"); + assertThat(versionResponse3.getNeedUpdate()).isEqualTo(Version.OK); } diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index ddd9da99..98be1973 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -83,4 +83,4 @@ cloud: version: update: 1.0.3 - recommand: 1.0.0 \ No newline at end of file + recommend: 1.0.0 \ No newline at end of file From d3b42d2979356285d345c6204735e31c546e4575 Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:58:00 +0900 Subject: [PATCH 58/66] =?UTF-8?q?M3-318=20Feat=20:=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 2 +- src/main/resources/application-local.yml | 2 +- src/main/resources/application-prod.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index c66e7638..26561bd2 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -87,7 +87,7 @@ cloud: version: update: ${NEED_UPDATE_VERSION} - recommend: ${RECOMMAND_UPDATE} + recommend: ${RECOMMEND_UPDATE} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index b0bdc1ea..025a91f1 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -87,5 +87,5 @@ cloud: version: update: ${NEED_UPDATE_VERSION} - recommend: ${RECOMMAND_UPDATE} + recommend: ${RECOMMEND_UPDATE} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 3cfa3c7e..7750a4f0 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -85,6 +85,6 @@ cloud: version: update: ${NEED_UPDATE_VERSION} - recommend: ${RECOMMAND_UPDATE} + recommend: ${RECOMMEND_UPDATE} From 6ffddc35f25754edc742fcf0fdb11a1b692db99c Mon Sep 17 00:00:00 2001 From: cha-imag <100341870+tkdals802@users.noreply.github.com> Date: Wed, 21 Aug 2024 16:01:19 +0900 Subject: [PATCH 59/66] =?UTF-8?q?M3-318=20Feat=20:=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/service/VersionService.java | 8 ++++---- .../com/m3pro/groundflip/service/VersionServiceTest.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java index 5a675c91..ddca2cd4 100644 --- a/src/main/java/com/m3pro/groundflip/service/VersionService.java +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -13,7 +13,7 @@ public class VersionService { @Value("${version.update}") - private String latest; + private String latestVersion; @Value("${version.recommend}") private String recommendUpdate; @@ -25,15 +25,15 @@ public VersionResponse getVersion(String currentVersion) { needUpdate = Version.FORCE; } if (compareVersions(currentVersion, recommendUpdate) == 1 - && compareVersions(currentVersion, latest) == -1) { + && compareVersions(currentVersion, latestVersion) == -1) { needUpdate = Version.NEED; } - if (compareVersions(currentVersion, latest) == 1) { + if (compareVersions(currentVersion, latestVersion) == 1) { needUpdate = Version.OK; } return VersionResponse.builder() - .version(latest) + .version(latestVersion) .needUpdate(needUpdate) .build(); } diff --git a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java index dbcc5425..5af741c6 100644 --- a/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/VersionServiceTest.java @@ -21,8 +21,8 @@ public class VersionServiceTest { @BeforeEach void setUp() { - ReflectionTestUtils.setField(versionService, "lastestVersion", "2.0.3"); - ReflectionTestUtils.setField(versionService, "recommandUpdate", "1.0.5"); + ReflectionTestUtils.setField(versionService, "latestVersion", "2.0.3"); + ReflectionTestUtils.setField(versionService, "recommendUpdate", "1.0.5"); } @Test From c9b8aa36eabffaefcee05af9f35e7c056852902d Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 22 Aug 2024 13:00:07 +0900 Subject: [PATCH 60/66] =?UTF-8?q?M3-299=20Feat=20:=20Device=20enum=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/enums/Device.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/m3pro/groundflip/enums/Device.java diff --git a/src/main/java/com/m3pro/groundflip/enums/Device.java b/src/main/java/com/m3pro/groundflip/enums/Device.java new file mode 100644 index 00000000..0ff56f9e --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/enums/Device.java @@ -0,0 +1,13 @@ +package com.m3pro.groundflip.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum Device { + IOS("iOS"), + ANDROID("Android"); + + private final String device; +} From 3f2d4addd0fbb0111e62b11736b1b107cc5c880b Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 22 Aug 2024 13:00:33 +0900 Subject: [PATCH 61/66] =?UTF-8?q?M3-299=20Feat=20:=20FcmToken=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=97=90=20Device=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/m3pro/groundflip/domain/entity/FcmToken.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java index 1b4a3ea4..f9bf0485 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java @@ -1,6 +1,7 @@ package com.m3pro.groundflip.domain.entity; import com.m3pro.groundflip.domain.entity.global.BaseTimeEntity; +import com.m3pro.groundflip.enums.Device; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -31,6 +32,8 @@ public class FcmToken extends BaseTimeEntity { private String token; + private Device device; + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; @@ -38,4 +41,8 @@ public class FcmToken extends BaseTimeEntity { public void updateToken(String token) { this.token = token; } + + public void updateDevice(Device device) { + this.device = device; + } } From 38300ff3ada3d9e3122a091f7046e12929be1d50 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 22 Aug 2024 13:01:03 +0900 Subject: [PATCH 62/66] =?UTF-8?q?M3-299=20Feat=20:=20FcmToken=20=EC=9D=84?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=ED=95=A0=20=EB=95=8C=20=EA=B8=B0?= =?UTF-8?q?=EA=B8=B0=EB=8F=84=20=EB=B3=80=EA=B2=BD=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m3pro/groundflip/domain/dto/user/FcmTokenRequest.java | 5 +++++ src/main/java/com/m3pro/groundflip/service/FcmService.java | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java index 17dab09f..ce6d2375 100644 --- a/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java +++ b/src/main/java/com/m3pro/groundflip/domain/dto/user/FcmTokenRequest.java @@ -1,5 +1,7 @@ package com.m3pro.groundflip.domain.dto.user; +import com.m3pro.groundflip.enums.Device; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -17,4 +19,7 @@ public class FcmTokenRequest { @Schema(description = "사용자 fcm token", example = "sdfghweredasdvasdfq/weqwefs;dvsdghrthwdffevdrer") private String fcmToken; + + @Schema(description = "사용자 기기 종류 (iOS, Android)", example = "iOS") + private Device device; } diff --git a/src/main/java/com/m3pro/groundflip/service/FcmService.java b/src/main/java/com/m3pro/groundflip/service/FcmService.java index 92c3f4dd..3788710e 100644 --- a/src/main/java/com/m3pro/groundflip/service/FcmService.java +++ b/src/main/java/com/m3pro/groundflip/service/FcmService.java @@ -32,11 +32,13 @@ public void registerFcmToken(FcmTokenRequest fcmTokenRequest) { if (fcmToken.isPresent()) { fcmToken.get().updateModifiedAtToNow(); fcmToken.get().updateToken(fcmTokenRequest.getFcmToken()); + fcmToken.get().updateDevice(fcmTokenRequest.getDevice()); } else { fcmTokenRepository.save( FcmToken.builder() .user(user) .token(fcmTokenRequest.getFcmToken()) + .device(fcmTokenRequest.getDevice()) .build() ); } From 2eeff4a3b60d294c3cfb9f4cd137f41b0249863a Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 22 Aug 2024 13:16:57 +0900 Subject: [PATCH 63/66] =?UTF-8?q?M3-299=20Feat=20:=20device=EC=9D=98=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=ED=83=80=EC=9E=85=EC=9D=84=20enum=20?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java index f9bf0485..32118164 100644 --- a/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java +++ b/src/main/java/com/m3pro/groundflip/domain/entity/FcmToken.java @@ -5,6 +5,8 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -32,6 +34,7 @@ public class FcmToken extends BaseTimeEntity { private String token; + @Enumerated(EnumType.STRING) private Device device; @OneToOne(fetch = FetchType.LAZY) From 5994eee66c56ce444150bd57a41cee29066a1336 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 22 Aug 2024 13:33:28 +0900 Subject: [PATCH 64/66] =?UTF-8?q?M3-299=20Test=20:=20fcmToken=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java b/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java index 96ce4b4b..74818d62 100644 --- a/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java +++ b/src/test/java/com/m3pro/groundflip/service/FcmServiceTest.java @@ -17,6 +17,7 @@ import com.m3pro.groundflip.domain.dto.user.FcmTokenRequest; import com.m3pro.groundflip.domain.entity.FcmToken; import com.m3pro.groundflip.domain.entity.User; +import com.m3pro.groundflip.enums.Device; import com.m3pro.groundflip.exception.AppException; import com.m3pro.groundflip.exception.ErrorCode; import com.m3pro.groundflip.repository.FcmTokenRepository; @@ -36,7 +37,7 @@ class FcmServiceTest { @BeforeAll static void beforeAll() { - fcmTokenRequest = new FcmTokenRequest(testUserId, testFcmToken); + fcmTokenRequest = new FcmTokenRequest(testUserId, testFcmToken, Device.IOS); } @Test From 1a6c7665c88172f83960af7e8053647853330d43 Mon Sep 17 00:00:00 2001 From: Koo Min Date: Thu, 22 Aug 2024 14:46:11 +0900 Subject: [PATCH 65/66] =?UTF-8?q?Fix=20:=20version=20controller=20?= =?UTF-8?q?=EC=8B=9C=ED=81=90=EB=A6=AC=ED=8B=B0=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/m3pro/groundflip/config/SecurityConfig.java | 1 + .../java/com/m3pro/groundflip/jwt/JwtAuthorizationFilter.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/m3pro/groundflip/config/SecurityConfig.java b/src/main/java/com/m3pro/groundflip/config/SecurityConfig.java index f2c582a8..ff318841 100644 --- a/src/main/java/com/m3pro/groundflip/config/SecurityConfig.java +++ b/src/main/java/com/m3pro/groundflip/config/SecurityConfig.java @@ -31,6 +31,7 @@ protected SecurityFilterChain configure(HttpSecurity httpSecurity) throws Except .authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers("/api/auth/**").permitAll() + .requestMatchers("/api/version").permitAll() .requestMatchers("/v3/api-docs/**").permitAll() .requestMatchers("/api/swagger-ui/**").permitAll() .requestMatchers("/api/docs/**").permitAll() diff --git a/src/main/java/com/m3pro/groundflip/jwt/JwtAuthorizationFilter.java b/src/main/java/com/m3pro/groundflip/jwt/JwtAuthorizationFilter.java index 08a482ad..131b0ae1 100644 --- a/src/main/java/com/m3pro/groundflip/jwt/JwtAuthorizationFilter.java +++ b/src/main/java/com/m3pro/groundflip/jwt/JwtAuthorizationFilter.java @@ -24,7 +24,8 @@ public class JwtAuthorizationFilter extends OncePerRequestFilter { "/api/docs", "/v3/api-docs", "/api/swagger-ui", - "/check" + "/check", + "/api/version" ); private static final List WHITE_LIST_TMP = List.of( "/api", From 9b4d18295b793ddf49460d661a704576f83f48da Mon Sep 17 00:00:00 2001 From: MinUk Date: Thu, 22 Aug 2024 15:59:55 +0900 Subject: [PATCH 66/66] =?UTF-8?q?Chore=20:=20=ED=94=84=EB=A1=9C=EB=8D=95?= =?UTF-8?q?=EC=85=98=EC=9A=A9=20version=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cd_prod.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd_prod.yml b/.github/workflows/cd_prod.yml index 9fbe8d62..2c73f61c 100644 --- a/.github/workflows/cd_prod.yml +++ b/.github/workflows/cd_prod.yml @@ -36,8 +36,8 @@ jobs: echo "APPLE_TEAM_ID=${{ secrets.APPLE_TEAM_ID }}" >> .env echo "APPLE_KEY_ID=${{ secrets.APPLE_KEY_ID }}" >> .env echo "APPLE_PRIVATE_KEY=${{ secrets.APPLE_PRIVATE_KEY }}" >> .env - echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION }}" >> .env - echo "RECOMMEND_UPDATE=${{ secrets.RECOMMEND_UPDATE }}" >> .env + echo "NEED_UPDATE_VERSION=${{ secrets.NEED_UPDATE_VERSION_PROD }}" >> .env + echo "RECOMMEND_UPDATE=${{ secrets.RECOMMEND_UPDATE_VERSION_PROD }}" >> .env - name: gradlew에 실행 권한 부여 run: chmod +x ./gradlew