diff --git a/src/docs/asciidoc/edit-user.adoc b/src/docs/asciidoc/edit-user.adoc index a827902a..1abc26c0 100644 --- a/src/docs/asciidoc/edit-user.adoc +++ b/src/docs/asciidoc/edit-user.adoc @@ -30,8 +30,10 @@ include::{snippets}/api/v1/user/update/http-response.adoc[] * 해당 정보 수정API는 도메인 별로 만들 예정입니다. - 비즈니스 로직인 **'1년에 1회 수정 가능하다'**라는 조건과 상관없이 여러번 호출하여 유저 정보 수정이 가능합니다. * 해당 비즈니스 로직을 만족하기 위해서 link:user-data-get.html[프로필 수정 가능 여부 조회]를 같이 사용해주세요. +** UserGroup(`groupId`, `groupAdmissionYear`)에 대한 정보가 유저의 기존 정보와 달라졌을때**만** `프로필 수정 가능 여부` 가 갱신됩니다. === CHANGELOG +- 2024.02.02 groupId, groupAdmissionYear 변경에 따른 제약조건 추가 - 2024.01.31 릴리즈 - 2024.01.09 명세 작성 \ No newline at end of file diff --git a/src/docs/asciidoc/find-notice.adoc b/src/docs/asciidoc/find-notice.adoc index 3fc5611a..55ea9d28 100644 --- a/src/docs/asciidoc/find-notice.adoc +++ b/src/docs/asciidoc/find-notice.adoc @@ -15,7 +15,11 @@ include::{snippets}/api/v1/notice/http-response.adoc[] *path variable* -- tag(ENUM 값) -> "NOTICE" | "BANNER" +- tag(ENUM 값) -> "NOTICE" | "BANNER | "PROFILE-BANNER" + +* NOTICE : 진입시 공지 +* BANNER : 내 쪽지 배너 +* PROFILE-BANNER : 프로필 배너 === 주의 diff --git a/src/main/java/com/yello/server/domain/notice/controller/NoticeController.java b/src/main/java/com/yello/server/domain/notice/controller/NoticeController.java index 7a64134b..5911f6e5 100644 --- a/src/main/java/com/yello/server/domain/notice/controller/NoticeController.java +++ b/src/main/java/com/yello/server/domain/notice/controller/NoticeController.java @@ -24,7 +24,7 @@ public class NoticeController { private final NoticeService noticeService; @GetMapping("/notice/{tag}") - public BaseResponse findNotice(@AccessTokenUser User user, @PathVariable NoticeType tag) { + public BaseResponse findNotice(@AccessTokenUser User user, @PathVariable String tag) { val data = noticeService.findNotice(user.getId(), tag); return BaseResponse.success(READ_NOTICE_SUCCESS, data); } diff --git a/src/main/java/com/yello/server/domain/notice/entity/NoticeType.java b/src/main/java/com/yello/server/domain/notice/entity/NoticeType.java index 77f62666..1634e588 100644 --- a/src/main/java/com/yello/server/domain/notice/entity/NoticeType.java +++ b/src/main/java/com/yello/server/domain/notice/entity/NoticeType.java @@ -11,7 +11,8 @@ @RequiredArgsConstructor public enum NoticeType { NOTICE("NOTICE"), - BANNER("BANNER"); + BANNER("BANNER"), + PROFILE_BANNER("PROFILE-BANNER"); private final String initial; diff --git a/src/main/java/com/yello/server/domain/notice/service/NoticeService.java b/src/main/java/com/yello/server/domain/notice/service/NoticeService.java index 10ca7a2b..9829c94e 100644 --- a/src/main/java/com/yello/server/domain/notice/service/NoticeService.java +++ b/src/main/java/com/yello/server/domain/notice/service/NoticeService.java @@ -23,13 +23,14 @@ public class NoticeService { private final NoticeRepository noticeRepository; private final UserRepository userRepository; - public NoticeDataResponse findNotice(Long userId, NoticeType tag) { + public NoticeDataResponse findNotice(Long userId, String tag) { ZoneId zoneId = ZoneId.of("Asia/Seoul"); ZonedDateTime now = ZonedDateTime.now(zoneId); userRepository.findById(userId); Notice noticeData = - noticeRepository.findTopNotice(tag).orElseGet( - () -> Notice.builder().imageUrl("").redirectUrl("").title("").tag(tag).endDate(now) + noticeRepository.findTopNotice(NoticeType.fromCode(tag)).orElseGet( + () -> Notice.builder().imageUrl("").redirectUrl("").title("").tag( + NoticeType.fromCode(tag)).endDate(now) .startDate(now).isAvailable(false).build()); return NoticeDataResponse.of(noticeData, compareNowAndEndData(noticeData.getEndDate()) && noticeData.getIsAvailable()); diff --git a/src/main/java/com/yello/server/domain/user/dto/request/UserUpdateRequest.java b/src/main/java/com/yello/server/domain/user/dto/request/UserUpdateRequest.java index 678a5e15..33a5fc94 100644 --- a/src/main/java/com/yello/server/domain/user/dto/request/UserUpdateRequest.java +++ b/src/main/java/com/yello/server/domain/user/dto/request/UserUpdateRequest.java @@ -1,5 +1,6 @@ package com.yello.server.domain.user.dto.request; +import com.yello.server.domain.user.entity.User; import lombok.Builder; @Builder @@ -13,4 +14,8 @@ public record UserUpdateRequest( Integer groupAdmissionYear ) { + public boolean groupInfoEquals(User user) { + return groupId.equals(user.getGroup().getId()) && + groupAdmissionYear.equals(user.getGroupAdmissionYear()); + } } diff --git a/src/main/java/com/yello/server/domain/user/service/UserService.java b/src/main/java/com/yello/server/domain/user/service/UserService.java index 972456a7..508c8413 100644 --- a/src/main/java/com/yello/server/domain/user/service/UserService.java +++ b/src/main/java/com/yello/server/domain/user/service/UserService.java @@ -143,20 +143,22 @@ public void updateUserProfile(Long userId, UserUpdateRequest request) { final Optional userData = userDataRepository.findByUserIdAndTag(userId, UserDataType.ACCOUNT_UPDATED_AT); - if (userData.isPresent()) { - userData.get().setValue( - ZonedDateTime.now(ConstantUtil.GlobalZoneId).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) - ); - } else { - userDataRepository.save(UserData.of( - ACCOUNT_UPDATED_AT, - ZonedDateTime.now(ConstantUtil.GlobalZoneId).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME), - user - )); - } - // logic user.update(request, gender, userGroup); + + if (!request.groupInfoEquals(user)) { + if (userData.isPresent()) { + userData.get().setValue( + ZonedDateTime.now(ConstantUtil.GlobalZoneId).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME) + ); + } else { + userDataRepository.save(UserData.of( + ACCOUNT_UPDATED_AT, + ZonedDateTime.now(ConstantUtil.GlobalZoneId).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME), + user + )); + } + } } public UserDataResponse readUserData(Long userId, UserDataType tag) { diff --git a/src/main/resources/static/docs/edit-user.html b/src/main/resources/static/docs/edit-user.html index bbb4e25e..383a8307 100644 --- a/src/main/resources/static/docs/edit-user.html +++ b/src/main/resources/static/docs/edit-user.html @@ -447,7 +447,7 @@

유저 프로필 수정

요청

-
DELETE /api/v1/user HTTP/1.1
+
POST /api/v1/user HTTP/1.1
 Content-Type: application/json;charset=UTF-8
 Authorization: Bearer your-access-token
 Content-Length: 195
@@ -521,7 +521,7 @@ 

응답

{ "status" : 200, - "message" : "유저 탈퇴에 성공했습니다." + "message" : "유저 상세 정보 수정에 성공하였습니다." }
@@ -549,6 +549,13 @@

NOTE

  • 해당 비즈니스 로직을 만족하기 위해서 프로필 수정 가능 여부 조회를 같이 사용해주세요.

    +
    +
      +
    • +

      UserGroup(groupId, groupAdmissionYear)에 대한 정보가 유저의 기존 정보와 달라졌을때 프로필 수정 가능 여부 가 갱신됩니다.

      +
    • +
    +
@@ -561,6 +568,9 @@

CHANGELOG

  • +

    2024.02.02 groupId, groupAdmissionYear 변경에 따른 제약조건 추가

    +
  • +
  • 2024.01.31 릴리즈

  • diff --git a/src/main/resources/static/docs/find-notice.html b/src/main/resources/static/docs/find-notice.html index 43079625..a7ef2d7a 100644 --- a/src/main/resources/static/docs/find-notice.html +++ b/src/main/resources/static/docs/find-notice.html @@ -505,7 +505,20 @@

    응답

    • -

      tag(ENUM 값) → "NOTICE" | "BANNER"

      +

      tag(ENUM 값) → "NOTICE" | "BANNER | "PROFILE-BANNER"

      +
      +
        +
      • +

        NOTICE : 진입시 공지

        +
      • +
      • +

        BANNER : 내 쪽지 배너

        +
      • +
      • +

        PROFILE-BANNER : 프로필 배너

        +
      • +
      +
    diff --git a/src/main/resources/static/docs/purchase-info.html b/src/main/resources/static/docs/purchase-info.html index 26801234..20ace5d8 100644 --- a/src/main/resources/static/docs/purchase-info.html +++ b/src/main/resources/static/docs/purchase-info.html @@ -468,7 +468,7 @@

    응답

    "data" : { "id" : 1, "subscribe" : "normal", - "expiredDate" : "2024-02-07" + "expiredDate" : "2024-01-08" } }
diff --git a/src/test/java/com/yello/server/domain/notice/medium/NoticeControllerTest.java b/src/test/java/com/yello/server/domain/notice/medium/NoticeControllerTest.java index 1377c4b1..cbed3d47 100644 --- a/src/test/java/com/yello/server/domain/notice/medium/NoticeControllerTest.java +++ b/src/test/java/com/yello/server/domain/notice/medium/NoticeControllerTest.java @@ -94,7 +94,7 @@ void init() { // given final NoticeDataResponse noticeDataResponse = NoticeDataResponse.of(notice, false); NoticeType tag = NoticeType.NOTICE; - given(noticeService.findNotice(anyLong(), eq(tag))) + given(noticeService.findNotice(anyLong(), String.valueOf(eq(tag.getInitial())))) .willReturn(noticeDataResponse); // when diff --git a/src/test/java/com/yello/server/domain/notice/small/NoticeServiceTest.java b/src/test/java/com/yello/server/domain/notice/small/NoticeServiceTest.java index f94564b5..ffd9b923 100644 --- a/src/test/java/com/yello/server/domain/notice/small/NoticeServiceTest.java +++ b/src/test/java/com/yello/server/domain/notice/small/NoticeServiceTest.java @@ -101,7 +101,8 @@ void init() { final ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul")); // when - final NoticeDataResponse noticeResponse = noticeService.findNotice(userId, tag); + final NoticeDataResponse noticeResponse = noticeService.findNotice(userId, + tag.getInitial()); // then assertThat(noticeResponse.isAvailable()).isTrue(); diff --git a/src/test/java/com/yello/server/domain/user/medium/UserControllerTest.java b/src/test/java/com/yello/server/domain/user/medium/UserControllerTest.java index 5688e881..f6e3769d 100644 --- a/src/test/java/com/yello/server/domain/user/medium/UserControllerTest.java +++ b/src/test/java/com/yello/server/domain/user/medium/UserControllerTest.java @@ -36,6 +36,7 @@ import com.yello.server.util.TestDataEntityUtil; import com.yello.server.util.TestDataUtil; import com.yello.server.util.WithAccessTokenUser; +import java.time.LocalDateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayNameGeneration; @@ -234,9 +235,9 @@ void init() { @Test void 유저_구독_정보_조회에_성공합니다() throws Exception { // given - + LocalDateTime now = LocalDateTime.of(2024, 1, 1, 0, 0, 0); UserSubscribeDetailResponse userSubscribeDetailResponse = - UserSubscribeDetailResponse.of(testDataUtil.generatePurchase(1L, user)); + UserSubscribeDetailResponse.of(testDataUtil.generatePurchase(1L, user, now)); // when given(userService.getUserSubscribe(anyLong())) .willReturn(userSubscribeDetailResponse); diff --git a/src/test/java/com/yello/server/domain/user/small/UserServiceTest.java b/src/test/java/com/yello/server/domain/user/small/UserServiceTest.java index f3dcb1a7..aff5313f 100644 --- a/src/test/java/com/yello/server/domain/user/small/UserServiceTest.java +++ b/src/test/java/com/yello/server/domain/user/small/UserServiceTest.java @@ -89,6 +89,7 @@ void init() { .userDataRepository(userDataRepository) .build(); + LocalDateTime now = LocalDateTime.of(2024, 1, 1, 0, 0, 0); final UserGroup userGroup = testDataUtil.generateGroup(1L, UserGroupType.UNIVERSITY); final UserGroup userGroup2 = testDataUtil.generateGroup(2L, UserGroupType.UNIVERSITY); for (int i = 1; i <= 2; i++) { @@ -96,7 +97,7 @@ void init() { user.setSubscribe(Subscribe.ACTIVE); } final User user = userRepository.getById(1L); - testDataUtil.generatePurchase(1L, user); + testDataUtil.generatePurchase(1L, user, now); } @Test diff --git a/src/test/java/com/yello/server/util/TestDataEntityUtil.java b/src/test/java/com/yello/server/util/TestDataEntityUtil.java index 6e96ba78..1becbbcc 100644 --- a/src/test/java/com/yello/server/util/TestDataEntityUtil.java +++ b/src/test/java/com/yello/server/util/TestDataEntityUtil.java @@ -100,7 +100,7 @@ public QuestionGroupType generateQuestionGroupType(long index, Question question } @Override - public Purchase generatePurchase(long index, User user) { + public Purchase generatePurchase(long index, User user, LocalDateTime createdAt) { return Purchase.builder() .id(index) .gateway(Gateway.APPLE) @@ -109,8 +109,8 @@ public Purchase generatePurchase(long index, User user) { .user(user) .transactionId("111") .state(PurchaseState.ACTIVE) - .createdAt(LocalDateTime.now()) - .updatedAt(LocalDateTime.now()) + .createdAt(createdAt) + .updatedAt(createdAt) .build(); } diff --git a/src/test/java/com/yello/server/util/TestDataRepositoryUtil.java b/src/test/java/com/yello/server/util/TestDataRepositoryUtil.java index 46417892..6637f873 100644 --- a/src/test/java/com/yello/server/util/TestDataRepositoryUtil.java +++ b/src/test/java/com/yello/server/util/TestDataRepositoryUtil.java @@ -19,6 +19,7 @@ import com.yello.server.domain.user.repository.UserRepository; import com.yello.server.domain.vote.entity.Vote; import com.yello.server.domain.vote.repository.VoteRepository; +import java.time.LocalDateTime; import java.time.ZonedDateTime; public class TestDataRepositoryUtil implements TestDataUtil { @@ -87,8 +88,8 @@ public QuestionGroupType generateQuestionGroupType(long index, Question question } @Override - public Purchase generatePurchase(long index, User user) { - return purchaseRepository.save(testDataEntityUtil.generatePurchase(index, user)); + public Purchase generatePurchase(long index, User user, LocalDateTime createdAt) { + return purchaseRepository.save(testDataEntityUtil.generatePurchase(index, user, createdAt)); } @Override diff --git a/src/test/java/com/yello/server/util/TestDataUtil.java b/src/test/java/com/yello/server/util/TestDataUtil.java index eaec3e8a..fdc48de0 100644 --- a/src/test/java/com/yello/server/util/TestDataUtil.java +++ b/src/test/java/com/yello/server/util/TestDataUtil.java @@ -10,6 +10,7 @@ import com.yello.server.domain.question.entity.QuestionGroupType; import com.yello.server.domain.user.entity.User; import com.yello.server.domain.vote.entity.Vote; +import java.time.LocalDateTime; import java.time.ZonedDateTime; public interface TestDataUtil { @@ -28,7 +29,7 @@ public interface TestDataUtil { QuestionGroupType generateQuestionGroupType(long index, Question question); - Purchase generatePurchase(long index, User user); + Purchase generatePurchase(long index, User user, LocalDateTime createdAt); Notice generateNotice(long index, NoticeType noticeType, ZonedDateTime createdAt); }