diff --git a/build.gradle b/build.gradle index 1208194c..267afcb6 100644 --- a/build.gradle +++ b/build.gradle @@ -85,6 +85,7 @@ dependencies { asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.mockito:mockito-inline' // jwt decode implementation 'org.bouncycastle:bcprov-jdk15on:1.69' diff --git a/src/docs/asciidoc/edit-user.adoc b/src/docs/asciidoc/edit-user.adoc index 0df4ee5d..a827902a 100644 --- a/src/docs/asciidoc/edit-user.adoc +++ b/src/docs/asciidoc/edit-user.adoc @@ -1,24 +1,9 @@ :reproducible: -== 유저 프로필 수정 (명세) +== 유저 프로필 수정 === 요청 -[http,json] ----- -POST /api/v1/user HTTP/1.1 -Authorization: Bearer your-access-token -Content-Type: application/json - -{ - "name": "name1", - "yelloId": "yelloId1", - "gender": "M", - "email": "test1@test.com", - "profileImageUrl": "test image", - "groupId": 30000, - "groupAdmissionYear" : 20 -} ----- +include::{snippets}/api/v1/user/update/http-request.adoc[] *필드 타입* @@ -35,19 +20,7 @@ Content-Type: application/json === 응답 -[http,json] ----- -HTTP/1.1 200 OK -Vary: Origin -Vary: Access-Control-Request-Method -Vary: Access-Control-Request-Headers -Content-Type: application/json - -{ - "status" : 200, - "message" : "유저 프로필 조회에 성공하였습니다." -} ----- +include::{snippets}/api/v1/user/update/http-response.adoc[] *필드 타입* @@ -55,7 +28,10 @@ Content-Type: application/json - 포인트 / 구독정보 / 로그인 정보와 같이 user-pure하지 않은 정보는 수정할 수 없도록 설계하였습니다. * 해당 정보 수정API는 도메인 별로 만들 예정입니다. +- 비즈니스 로직인 **'1년에 1회 수정 가능하다'**라는 조건과 상관없이 여러번 호출하여 유저 정보 수정이 가능합니다. +* 해당 비즈니스 로직을 만족하기 위해서 link:user-data-get.html[프로필 수정 가능 여부 조회]를 같이 사용해주세요. === CHANGELOG +- 2024.01.31 릴리즈 - 2024.01.09 명세 작성 \ No newline at end of file diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 0eb3544a..41ca7251 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -35,11 +35,11 @@ * 🆕 link:check-user-v2.html[내 정보 조회하기 V2, 2024-01-30] -* 🆕 link:edit-user.html[유저 정보 수정 (명세), 2024-01-09] +* 🆕 link:edit-user.html[유저 정보 수정, 2024-01-31] -* 🆕 link:user-data-get.html[프로필 수정 가능 여부 조회 (명세), 2024-01-09] +* 🆕 link:user-data-get.html[프로필 수정 가능 여부 조회, 2024-01-31] -* 🆕 link:user-data-post.html[유저 기타 정보 저장 (명세), 2024-01-30] +* 🆕 link:user-data-post.html[유저 기타 정보 저장, 2024-01-31] * 🆕 link:purchase-info.html[유저 구독 정보, 2024-01-25] diff --git a/src/docs/asciidoc/user-data-get.adoc b/src/docs/asciidoc/user-data-get.adoc index 3fdeb43c..56386f3b 100644 --- a/src/docs/asciidoc/user-data-get.adoc +++ b/src/docs/asciidoc/user-data-get.adoc @@ -1,54 +1,32 @@ :reproducible: -== 프로필 수정 가능 여부 조회 (명세) +== 프로필 수정 가능 여부 조회 === 요청 -[http] ----- -GET /api/v1/user/data/account-update-at HTTP/1.1 -Authorization: Bearer your-access-token -Content-Type: application-json ----- +include::{snippets}/api/v1/user/data/read/http-request.adoc[] *필드 타입* -- "tag": "account-update-at" -* account-update-at 자리가 ENUM으로 대체될 예정입니다. +- "TAG": "account-updated-at" | "recommended" | "withdraw-reason" === 응답 -[http,json] ----- -HTTP/1.1 200 OK -Vary: Origin -Vary: Access-Control-Request-Method -Vary: Access-Control-Request-Headers -Content-Type: application/json - -{ - "status" : 200, - "message" : "프로필 수정 가능 여부 조회에 성공하였습니다.", - "data": { - "tag": "ACCOUNT_UPDATE_AT", - "value": "false|2024-01-09|2023-10-20" - } -} ----- +include::{snippets}/api/v1/user/data/read/http-response.adoc[] *필드 타입* -- "tag": "ACCOUNT_UPDATE_AT" +- "tag": "ACCOUNT_UPDATED_AT" | "RECOMMENDED" | "WITHDRAW_REASON" - "value": String -* ACCOUNT_UPDATE_AT의 경우 `{boolean}|{updated_at}|{created_at}` 를 반환합니다. -* boolean 및 updated_at 값을 parse하여 사용해주세요. -* 날짜의 경우 YYYY-MM-DD (ISO-8601) +* ACCOUNT_UPDATED_AT일 때, `{boolean}|{updated_at}|{created_at}` 를 반환합니다. +** boolean 및 updated_at 값을 parse하여 사용해주세요. +** 예시) **"false|2024-01-31|2024-01-31"** === NOTE -- AccessToken에 해당하는 User의 프로필 수정 가능 여부 조회를 조회하는 API입니다. -- User의 다양한 정보를 조회하는 API로 범용적인 확장할 예정입니다. -* 차후에 tag에 들어갈 수 있는 ENUM의 종류를 다양화 할 예정입니다. +- User의 다양한 정보를 조회하는 범용적인 API입니다. +- `account-updated-at` 을 통해 AccessToken에 해당하는 User의 프로필 수정 가능 여부 조회를 조회하세요. === CHANGELOG +- 2024.01.30 릴리즈 - 2024.01.09 명세 작성 \ No newline at end of file diff --git a/src/docs/asciidoc/user-data-post.adoc b/src/docs/asciidoc/user-data-post.adoc index 39db165b..7c1cba39 100644 --- a/src/docs/asciidoc/user-data-post.adoc +++ b/src/docs/asciidoc/user-data-post.adoc @@ -3,45 +3,28 @@ === 요청 -[http] ----- -POST /api/v1/user/data/recommended HTTP/1.1 -Authorization: Bearer your-access-token -Content-Type: application-json - -{ - "value": "true" -} ----- +include::{snippets}/api/v1/user/data/update/http-request.adoc[] *필드 타입* -- "tag": "withdraw-reason" | "account-update-at" | "recommended" -* withdraw-reason 자리가 ENUM으로 대체될 예정입니다. +- "TAG": "withdraw-reason" | "account-update-at" | "recommended" - "value": String +* `withdraw-reason` 일 때, 255byte 이내의 string +* `account-update-at` 또는 `recommended` 일 때, ISO-8601 + ZoneInfo +** 예시) `2011-12-03T10:15:30+01:00` === 응답 -[http,json] ----- -HTTP/1.1 200 OK -Vary: Origin -Vary: Access-Control-Request-Method -Vary: Access-Control-Request-Headers -Content-Type: application/json - -{ - "status" : 200, - "message" : "탈퇴 사유 정보 저장에 성공하였습니다." -} ----- +include::{snippets}/api/v1/user/data/update/http-response.adoc[] === NOTE +- `account-update-at` 및 `recommended` 기능은 link:edit-user.html[유저 정보 수정] 및 link:signup.html[회원가입]에 통합되어있습니다 +* 정말 필요에 의해 값을 수정해야하는 경우만 사용해주세요. - User의 다양한 정보를 저장하는 API로 범용적인 확장할 예정입니다. -* 차후에 tag에 들어갈 수 있는 ENUM의 종류를 다양화 할 예정입니다. === CHANGELOG +- 2024.01.31 릴리즈 - 2024.01.30 탈퇴 v2 분리로 인한 명세 업데이트 - 2024.01.09 명세 작성 \ No newline at end of file diff --git a/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationType.java b/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationType.java index 4b6b9d6c..2e9d7927 100644 --- a/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationType.java +++ b/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationType.java @@ -1,6 +1,8 @@ package com.yello.server.domain.admin.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -12,17 +14,19 @@ public enum AdminConfigurationType { REFRESH_TOKEN_TIME("REFRESH_TOKEN_TIME"), ADMIN_SITE_PASSWORD("ADMIN_SITE_PASSWORD"); - private final String intial; + private final String initial; public static AdminConfigurationType fromCode(String dbData) { return Arrays.stream(AdminConfigurationType.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 태그입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static AdminConfigurationType fromName(String name) { + return Arrays.stream(AdminConfigurationType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } } diff --git a/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationTypeConverter.java b/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationTypeConverter.java index a2889a5e..413c65fa 100644 --- a/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationTypeConverter.java +++ b/src/main/java/com/yello/server/domain/admin/entity/AdminConfigurationTypeConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(AdminConfigurationType type) { if (type == null) { return null; } - return type.getIntial(); + return type.name(); } @Override @@ -21,11 +21,7 @@ public AdminConfigurationType convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return AdminConfigurationType.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return AdminConfigurationType.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/authorization/service/AuthService.java b/src/main/java/com/yello/server/domain/authorization/service/AuthService.java index 556c1149..82bf43bd 100644 --- a/src/main/java/com/yello/server/domain/authorization/service/AuthService.java +++ b/src/main/java/com/yello/server/domain/authorization/service/AuthService.java @@ -3,7 +3,9 @@ import static com.yello.server.global.common.ErrorCode.TOKEN_ALL_EXPIRED_AUTH_EXCEPTION; import static com.yello.server.global.common.ErrorCode.TOKEN_NOT_EXPIRED_AUTH_EXCEPTION; import static com.yello.server.global.common.ErrorCode.YELLOID_REQUIRED_EXCEPTION; +import static com.yello.server.global.common.util.ConstantUtil.GlobalZoneId; import static com.yello.server.global.common.util.ConstantUtil.RECOMMEND_POINT; +import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; import com.yello.server.domain.authorization.dto.ServiceTokenVO; import com.yello.server.domain.authorization.dto.kakao.KakaoTokenInfo; @@ -27,12 +29,16 @@ import com.yello.server.domain.group.entity.UserGroupType; import com.yello.server.domain.group.repository.UserGroupRepository; import com.yello.server.domain.user.entity.User; +import com.yello.server.domain.user.entity.UserData; +import com.yello.server.domain.user.entity.UserDataType; +import com.yello.server.domain.user.repository.UserDataRepository; import com.yello.server.domain.user.repository.UserRepository; import com.yello.server.domain.vote.service.VoteManager; import com.yello.server.global.common.factory.PaginationFactory; import com.yello.server.global.common.manager.ConnectionManager; import com.yello.server.infrastructure.firebase.service.NotificationService; import com.yello.server.infrastructure.rabbitmq.repository.MessageQueueRepository; +import java.time.ZonedDateTime; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -58,6 +64,7 @@ public class AuthService { private final FriendRepository friendRepository; private final MessageQueueRepository messageQueueRepository; private final NotificationService notificationService; + private final UserDataRepository userDataRepository; private final UserGroupRepository userGroupRepository; private final UserRepository userRepository; private final VoteManager voteManager; @@ -106,10 +113,21 @@ public void recommendUser(String recommendYelloId, String userYelloId) { if (recommendYelloId != null && !recommendYelloId.isEmpty()) { User recommendedUser = userRepository.getByYelloId(recommendYelloId); User user = userRepository.getByYelloId(userYelloId); + final Optional recommended = userDataRepository.findByUserIdAndTag(recommendedUser.getId(), + UserDataType.RECOMMENDED); recommendedUser.addRecommendCount(1L); recommendedUser.addPoint(RECOMMEND_POINT); user.addPoint(RECOMMEND_POINT); + if (recommended.isEmpty()) { + recommendedUser.addTicketCount(1); + + userDataRepository.save(UserData.of( + UserDataType.RECOMMENDED, + ZonedDateTime.now(GlobalZoneId).format(ISO_OFFSET_DATE_TIME), + recommendedUser + )); + } notificationService.sendRecommendNotification(user, recommendedUser); diff --git a/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTag.java b/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTag.java index ddb3a8b8..239eddf1 100644 --- a/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTag.java +++ b/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTag.java @@ -1,6 +1,8 @@ package com.yello.server.domain.group.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,17 +13,19 @@ public enum UserGroupDataTag { ADDRESS("ADDRESS"), POPULATION("POPULATION"); - private final String intial; + private final String initial; public static UserGroupDataTag fromCode(String dbData) { return Arrays.stream(UserGroupDataTag.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 그룹 정보 key 타입 입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static UserGroupDataTag fromName(String name) { + return Arrays.stream(UserGroupDataTag.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } } diff --git a/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTagConterver.java b/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTagConterver.java index ed3239eb..d8facf03 100644 --- a/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTagConterver.java +++ b/src/main/java/com/yello/server/domain/group/entity/UserGroupDataTagConterver.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(UserGroupDataTag userGroupType) { if (userGroupType == null) { return null; } - return userGroupType.getIntial(); + return userGroupType.name(); } @Override @@ -21,11 +21,7 @@ public UserGroupDataTag convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return UserGroupDataTag.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return UserGroupDataTag.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/group/entity/UserGroupType.java b/src/main/java/com/yello/server/domain/group/entity/UserGroupType.java index 6bb26723..0b782406 100644 --- a/src/main/java/com/yello/server/domain/group/entity/UserGroupType.java +++ b/src/main/java/com/yello/server/domain/group/entity/UserGroupType.java @@ -1,6 +1,8 @@ package com.yello.server.domain.group.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,18 +15,19 @@ public enum UserGroupType { MIDDLE_SCHOOL("MIDDLE_SCHOOL"), SOPT("SOPT"); - private final String intial; + private final String initial; public static UserGroupType fromCode(String dbData) { return Arrays.stream(UserGroupType.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 그룹 타입 입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static UserGroupType fromName(String name) { + return Arrays.stream(UserGroupType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - } diff --git a/src/main/java/com/yello/server/domain/group/entity/UserGroupTypeConverter.java b/src/main/java/com/yello/server/domain/group/entity/UserGroupTypeConverter.java index 09527fc0..5382169b 100644 --- a/src/main/java/com/yello/server/domain/group/entity/UserGroupTypeConverter.java +++ b/src/main/java/com/yello/server/domain/group/entity/UserGroupTypeConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(UserGroupType userGroupType) { if (userGroupType == null) { return null; } - return userGroupType.getIntial(); + return userGroupType.name(); } @Override @@ -21,11 +21,7 @@ public UserGroupType convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return UserGroupType.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return UserGroupType.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/notice/dto/NoticeDataResponse.java b/src/main/java/com/yello/server/domain/notice/dto/NoticeDataResponse.java index e18a567a..70d38374 100644 --- a/src/main/java/com/yello/server/domain/notice/dto/NoticeDataResponse.java +++ b/src/main/java/com/yello/server/domain/notice/dto/NoticeDataResponse.java @@ -23,7 +23,7 @@ public static NoticeDataResponse of(Notice notice, Boolean isAvailable) { .startDate(toYearAndMonthFormattedString(notice.getStartDate().toLocalDateTime())) .endDate(toYearAndMonthFormattedString(notice.getEndDate().toLocalDateTime())) .isAvailable(isAvailable) - .type(notice.getTag().getIntial()) + .type(notice.getTag().getInitial()) .title(notice.getTitle()) .build(); } 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 3d229b62..77f62666 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 @@ -1,6 +1,8 @@ package com.yello.server.domain.notice.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,18 +13,19 @@ public enum NoticeType { NOTICE("NOTICE"), BANNER("BANNER"); - private final String intial; + private final String initial; public static NoticeType fromCode(String dbData) { return Arrays.stream(NoticeType.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 소셜입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static NoticeType fromName(String name) { + return Arrays.stream(NoticeType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - } diff --git a/src/main/java/com/yello/server/domain/notice/entity/NoticeTypeConverter.java b/src/main/java/com/yello/server/domain/notice/entity/NoticeTypeConverter.java index 39cc2ce1..c84cffc1 100644 --- a/src/main/java/com/yello/server/domain/notice/entity/NoticeTypeConverter.java +++ b/src/main/java/com/yello/server/domain/notice/entity/NoticeTypeConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(NoticeType type) { if (type == null) { return null; } - return type.getIntial(); + return type.name(); } @Override @@ -21,11 +21,7 @@ public NoticeType convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return NoticeType.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return NoticeType.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/purchase/entity/Gateway.java b/src/main/java/com/yello/server/domain/purchase/entity/Gateway.java index 59e77f88..7b1c9030 100644 --- a/src/main/java/com/yello/server/domain/purchase/entity/Gateway.java +++ b/src/main/java/com/yello/server/domain/purchase/entity/Gateway.java @@ -1,6 +1,8 @@ package com.yello.server.domain.purchase.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,18 +13,19 @@ public enum Gateway { GOOGLE("google"), APPLE("apple"); - private final String intial; + private final String initial; public static Gateway fromCode(String dbData) { return Arrays.stream(Gateway.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 게이트웨이입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static Gateway fromName(String name) { + return Arrays.stream(Gateway.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - } diff --git a/src/main/java/com/yello/server/domain/purchase/entity/GatewayConverter.java b/src/main/java/com/yello/server/domain/purchase/entity/GatewayConverter.java index e0612836..433c11fa 100644 --- a/src/main/java/com/yello/server/domain/purchase/entity/GatewayConverter.java +++ b/src/main/java/com/yello/server/domain/purchase/entity/GatewayConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(Gateway gateway) { if (gateway == null) { return null; } - return gateway.getIntial(); + return gateway.name(); } @Override @@ -21,11 +21,7 @@ public Gateway convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return Gateway.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return Gateway.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/purchase/entity/ProductType.java b/src/main/java/com/yello/server/domain/purchase/entity/ProductType.java index a8e9f81d..cccccf99 100644 --- a/src/main/java/com/yello/server/domain/purchase/entity/ProductType.java +++ b/src/main/java/com/yello/server/domain/purchase/entity/ProductType.java @@ -1,5 +1,6 @@ package com.yello.server.domain.purchase.entity; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; import static com.yello.server.global.common.util.ConstantUtil.FIVE_TICKET_ID; import static com.yello.server.global.common.util.ConstantUtil.GOOGLE_FIVE_TICKET_ID; import static com.yello.server.global.common.util.ConstantUtil.GOOGLE_ONE_TICKET_ID; @@ -9,7 +10,7 @@ import static com.yello.server.global.common.util.ConstantUtil.TWO_TICKET_ID; import static com.yello.server.global.common.util.ConstantUtil.YELLO_PLUS_ID; -import java.text.MessageFormat; +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -23,14 +24,20 @@ public enum ProductType { FIVE_TICKET("five_ticket"), TEST("test"); - private final String intial; + private final String initial; public static ProductType fromCode(String dbData) { return Arrays.stream(ProductType.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 상품타입입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); + } + + public static ProductType fromName(String name) { + return Arrays.stream(ProductType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } public static ProductType getProductType(String productId) { @@ -51,8 +58,4 @@ public static Integer getTicketAmount(ProductType productType) { default -> null; }; } - - public String intial() { - return intial; - } } diff --git a/src/main/java/com/yello/server/domain/purchase/entity/ProductTypeConverter.java b/src/main/java/com/yello/server/domain/purchase/entity/ProductTypeConverter.java index 9f9788b2..752fbffa 100644 --- a/src/main/java/com/yello/server/domain/purchase/entity/ProductTypeConverter.java +++ b/src/main/java/com/yello/server/domain/purchase/entity/ProductTypeConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(ProductType productType) { if (productType == null) { return null; } - return productType.getIntial(); + return productType.name(); } @Override @@ -21,11 +21,7 @@ public ProductType convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return ProductType.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return ProductType.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/purchase/entity/PurchaseState.java b/src/main/java/com/yello/server/domain/purchase/entity/PurchaseState.java index 9c97a1f5..8b7c6837 100644 --- a/src/main/java/com/yello/server/domain/purchase/entity/PurchaseState.java +++ b/src/main/java/com/yello/server/domain/purchase/entity/PurchaseState.java @@ -1,6 +1,8 @@ package com.yello.server.domain.purchase.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,17 +15,19 @@ public enum PurchaseState { PAUSED("PAUSED"), INACTIVE("INACTIVE"); - private final String intial; + private final String initial; public static PurchaseState fromCode(String dbData) { return Arrays.stream(PurchaseState.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 결제 상태입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static PurchaseState fromName(String name) { + return Arrays.stream(PurchaseState.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } } diff --git a/src/main/java/com/yello/server/domain/purchase/entity/PurchaseStateConverter.java b/src/main/java/com/yello/server/domain/purchase/entity/PurchaseStateConverter.java index d27759a6..35280400 100644 --- a/src/main/java/com/yello/server/domain/purchase/entity/PurchaseStateConverter.java +++ b/src/main/java/com/yello/server/domain/purchase/entity/PurchaseStateConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(PurchaseState purchaseState) { if (purchaseState == null) { return null; } - return purchaseState.getIntial(); + return purchaseState.name(); } @Override @@ -21,12 +21,7 @@ public PurchaseState convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return PurchaseState.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } - } + return PurchaseState.fromName(dbData); + } } diff --git a/src/main/java/com/yello/server/domain/user/controller/UserController.java b/src/main/java/com/yello/server/domain/user/controller/UserController.java index 4c324fd2..d3705f9d 100644 --- a/src/main/java/com/yello/server/domain/user/controller/UserController.java +++ b/src/main/java/com/yello/server/domain/user/controller/UserController.java @@ -1,17 +1,24 @@ package com.yello.server.domain.user.controller; import static com.yello.server.global.common.SuccessCode.DELETE_USER_SUCCESS; +import static com.yello.server.global.common.SuccessCode.READ_USER_DATA_SUCCESS; import static com.yello.server.global.common.SuccessCode.READ_USER_SUBSCRIBE_SUCCESS; import static com.yello.server.global.common.SuccessCode.READ_USER_SUCCESS; import static com.yello.server.global.common.SuccessCode.UPDATE_DEVICE_TOKEN_USER_SUCCESS; +import static com.yello.server.global.common.SuccessCode.UPDATE_USER_DATA_SUCCESS; +import static com.yello.server.global.common.SuccessCode.UPDATE_USER_DETAIL_SUCCESS; +import com.yello.server.domain.user.dto.request.UserDataUpdateRequest; import com.yello.server.domain.user.dto.request.UserDeleteReasonRequest; import com.yello.server.domain.user.dto.request.UserDeviceTokenRequest; +import com.yello.server.domain.user.dto.request.UserUpdateRequest; +import com.yello.server.domain.user.dto.response.UserDataResponse; import com.yello.server.domain.user.dto.response.UserDetailResponse; import com.yello.server.domain.user.dto.response.UserDetailV2Response; import com.yello.server.domain.user.dto.response.UserResponse; import com.yello.server.domain.user.dto.response.UserSubscribeDetailResponse; import com.yello.server.domain.user.entity.User; +import com.yello.server.domain.user.entity.UserDataType; import com.yello.server.domain.user.service.UserService; import com.yello.server.global.common.annotation.AccessTokenUser; import com.yello.server.global.common.dto.BaseResponse; @@ -21,6 +28,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; @@ -72,10 +80,29 @@ public BaseResponse getUserSubscribe(@AccessTokenUs return BaseResponse.success(READ_USER_SUBSCRIBE_SUCCESS, data); } + @PostMapping("/v1/user") + public BaseResponse postUser(@AccessTokenUser User user, @RequestBody UserUpdateRequest request) { + userService.updateUserProfile(user.getId(), request); + return BaseResponse.success(UPDATE_USER_DETAIL_SUCCESS); + } + @DeleteMapping("/v2/user") public BaseResponse deleteUserWithReason(@AccessTokenUser User user, @RequestBody UserDeleteReasonRequest request) { userService.deleteUserWithReason(user.getId(), request); return BaseResponse.success(DELETE_USER_SUCCESS); } + + @GetMapping("/v1/user/data/{tag}") + public BaseResponse getUserData(@AccessTokenUser User user, @PathVariable("tag") String tag) { + val data = userService.readUserData(user.getId(), UserDataType.fromCode(tag)); + return BaseResponse.success(READ_USER_DATA_SUCCESS, data); + } + + @PostMapping("/v1/user/data/{tag}") + public BaseResponse updateUserData(@AccessTokenUser User user, @PathVariable("tag") String tag, + @RequestBody UserDataUpdateRequest request) { + userService.updateUserData(user.getId(), UserDataType.fromCode(tag), request); + return BaseResponse.success(UPDATE_USER_DATA_SUCCESS); + } } diff --git a/src/main/java/com/yello/server/domain/user/dto/request/UserDataUpdateRequest.java b/src/main/java/com/yello/server/domain/user/dto/request/UserDataUpdateRequest.java new file mode 100644 index 00000000..e119a168 --- /dev/null +++ b/src/main/java/com/yello/server/domain/user/dto/request/UserDataUpdateRequest.java @@ -0,0 +1,10 @@ +package com.yello.server.domain.user.dto.request; + +import lombok.Builder; + +@Builder +public record UserDataUpdateRequest( + String value +) { + +} 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 new file mode 100644 index 00000000..678a5e15 --- /dev/null +++ b/src/main/java/com/yello/server/domain/user/dto/request/UserUpdateRequest.java @@ -0,0 +1,16 @@ +package com.yello.server.domain.user.dto.request; + +import lombok.Builder; + +@Builder +public record UserUpdateRequest( + String name, + String yelloId, + String gender, + String email, + String profileImageUrl, + Long groupId, + Integer groupAdmissionYear +) { + +} diff --git a/src/main/java/com/yello/server/domain/user/dto/response/UserDataResponse.java b/src/main/java/com/yello/server/domain/user/dto/response/UserDataResponse.java new file mode 100644 index 00000000..1e3af6f9 --- /dev/null +++ b/src/main/java/com/yello/server/domain/user/dto/response/UserDataResponse.java @@ -0,0 +1,56 @@ +package com.yello.server.domain.user.dto.response; + +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; +import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; + +import com.yello.server.domain.user.entity.User; +import com.yello.server.domain.user.entity.UserDataType; +import com.yello.server.global.common.util.ConstantUtil; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; +import javax.annotation.Nullable; +import lombok.Builder; + +@Builder +public record UserDataResponse( + String tag, + String value +) { + + public static UserDataResponse of(User user, UserDataType tag, @Nullable String value) + throws DateTimeParseException { + String resultValue = ""; + + switch (tag) { + case ACCOUNT_UPDATED_AT -> { + if (value == null) { + resultValue = String.format( + "%s|%s|%s", + true, + null, + user.getCreatedAt().format(ISO_LOCAL_DATE) + ); + } else { + final ZonedDateTime current = ZonedDateTime.now(ConstantUtil.GlobalZoneId); + final ZonedDateTime updatedAt = ZonedDateTime.parse(value, ISO_OFFSET_DATE_TIME); + boolean isUpdatable = current.getYear() - updatedAt.getYear() >= 1; + + resultValue = String.format( + "%s|%s|%s", + isUpdatable, + updatedAt.format(ISO_LOCAL_DATE), + user.getCreatedAt().format(ISO_LOCAL_DATE) + ); + } + } + case RECOMMENDED, WITHDRAW_REASON -> { + resultValue = value; + } + } + + return UserDataResponse.builder() + .tag(tag.name()) + .value(resultValue) + .build(); + } +} diff --git a/src/main/java/com/yello/server/domain/user/dto/response/UserDetailV2Response.java b/src/main/java/com/yello/server/domain/user/dto/response/UserDetailV2Response.java index 67c3a5a5..4104b114 100644 --- a/src/main/java/com/yello/server/domain/user/dto/response/UserDetailV2Response.java +++ b/src/main/java/com/yello/server/domain/user/dto/response/UserDetailV2Response.java @@ -38,7 +38,7 @@ public static UserDetailV2Response of(User user, UserGroup userGroup, Integer ye .userId(user.getId()) .name(user.getName()) .yelloId(user.getYelloId()) - .gender(user.getGender().getIntial()) + .gender(user.getGender().getInitial()) .email(user.getEmail()) .profileImageUrl(user.getProfileImage()) .social(user.getSocial().toString()) @@ -46,14 +46,14 @@ public static UserDetailV2Response of(User user, UserGroup userGroup, Integer ye .deviceToken(user.getDeviceToken()) .groupId(userGroup.getId()) .group(user.toGroupString()) - .groupType(userGroup.getUserGroupType().getIntial()) + .groupType(userGroup.getUserGroupType().getInitial()) .groupName(userGroup.getGroupName()) .subGroupName(userGroup.getSubGroupName()) .groupAdmissionYear(user.getGroupAdmissionYear()) .recommendCount(user.getRecommendCount()) .ticketCount(user.getTicketCount()) .point(user.getPoint()) - .subscribe(user.getSubscribe().getIntial()) + .subscribe(user.getSubscribe().getInitial()) .yelloCount(yelloCount) .friendCount(friendCount) .build(); diff --git a/src/main/java/com/yello/server/domain/user/dto/response/UserSubscribeDetailResponse.java b/src/main/java/com/yello/server/domain/user/dto/response/UserSubscribeDetailResponse.java index 03dbf109..41372b47 100644 --- a/src/main/java/com/yello/server/domain/user/dto/response/UserSubscribeDetailResponse.java +++ b/src/main/java/com/yello/server/domain/user/dto/response/UserSubscribeDetailResponse.java @@ -16,7 +16,7 @@ public record UserSubscribeDetailResponse( public static UserSubscribeDetailResponse of(Purchase purchase) { return UserSubscribeDetailResponse.builder() .id(purchase.getUser().getId()) - .subscribe(purchase.getUser().getSubscribe().getIntial()) + .subscribe(purchase.getUser().getSubscribe().getInitial()) .expiredDate( toYearAndMonthFormattedString(purchase.getUpdatedAt().plusDays(SUBSCRIBE_DAYS))) .build(); diff --git a/src/main/java/com/yello/server/domain/user/entity/Gender.java b/src/main/java/com/yello/server/domain/user/entity/Gender.java index 4737b737..19605d74 100644 --- a/src/main/java/com/yello/server/domain/user/entity/Gender.java +++ b/src/main/java/com/yello/server/domain/user/entity/Gender.java @@ -1,6 +1,8 @@ package com.yello.server.domain.user.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,21 +13,23 @@ public enum Gender { MALE("M"), FEMALE("F"); - private final String intial; + private final String initial; public static Gender fromCode(String dbData) { return Arrays.stream(Gender.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 성별입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static Gender fromName(String name) { + return Arrays.stream(Gender.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } public Gender reverse() { - return "M".equals(this.intial) ? FEMALE : MALE; + return "M".equals(this.initial) ? FEMALE : MALE; } } diff --git a/src/main/java/com/yello/server/domain/user/entity/GenderConverter.java b/src/main/java/com/yello/server/domain/user/entity/GenderConverter.java index 1c0b2b63..7039df74 100644 --- a/src/main/java/com/yello/server/domain/user/entity/GenderConverter.java +++ b/src/main/java/com/yello/server/domain/user/entity/GenderConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(Gender gender) { if (gender == null) { return null; } - return gender.getIntial(); + return gender.name(); } @Override @@ -21,11 +21,7 @@ public Gender convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return Gender.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return Gender.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/user/entity/Social.java b/src/main/java/com/yello/server/domain/user/entity/Social.java index 709574f6..85154977 100644 --- a/src/main/java/com/yello/server/domain/user/entity/Social.java +++ b/src/main/java/com/yello/server/domain/user/entity/Social.java @@ -1,6 +1,8 @@ package com.yello.server.domain.user.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,18 +13,19 @@ public enum Social { KAKAO("Kakao"), APPLE("Apple"); - private final String intial; + private final String initial; public static Social fromCode(String dbData) { return Arrays.stream(Social.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 소셜입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static Social fromName(String name) { + return Arrays.stream(Social.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - } diff --git a/src/main/java/com/yello/server/domain/user/entity/SocialConverter.java b/src/main/java/com/yello/server/domain/user/entity/SocialConverter.java index d1671424..c03ad1ba 100644 --- a/src/main/java/com/yello/server/domain/user/entity/SocialConverter.java +++ b/src/main/java/com/yello/server/domain/user/entity/SocialConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(Social social) { if (social == null) { return null; } - return social.getIntial(); + return social.name(); } @Override @@ -21,11 +21,7 @@ public Social convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return Social.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return Social.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/user/entity/Subscribe.java b/src/main/java/com/yello/server/domain/user/entity/Subscribe.java index 11fa3cd8..a9e3d2c8 100644 --- a/src/main/java/com/yello/server/domain/user/entity/Subscribe.java +++ b/src/main/java/com/yello/server/domain/user/entity/Subscribe.java @@ -1,6 +1,8 @@ package com.yello.server.domain.user.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -12,18 +14,19 @@ public enum Subscribe { ACTIVE("active"), CANCELED("canceled"); - private final String intial; + private final String initial; public static Subscribe fromCode(String dbData) { return Arrays.stream(Subscribe.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("잘못된 구독입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static Subscribe fromName(String name) { + return Arrays.stream(Subscribe.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - } diff --git a/src/main/java/com/yello/server/domain/user/entity/SubscribeConverter.java b/src/main/java/com/yello/server/domain/user/entity/SubscribeConverter.java index 97e83cb2..2a7080dc 100644 --- a/src/main/java/com/yello/server/domain/user/entity/SubscribeConverter.java +++ b/src/main/java/com/yello/server/domain/user/entity/SubscribeConverter.java @@ -13,7 +13,7 @@ public String convertToDatabaseColumn(Subscribe subscribe) { if (subscribe == null) { return null; } - return subscribe.getIntial(); + return subscribe.name(); } @Override @@ -21,11 +21,7 @@ public Subscribe convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return Subscribe.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return Subscribe.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/domain/user/entity/User.java b/src/main/java/com/yello/server/domain/user/entity/User.java index cb7bdd9d..4bcc7ff4 100644 --- a/src/main/java/com/yello/server/domain/user/entity/User.java +++ b/src/main/java/com/yello/server/domain/user/entity/User.java @@ -3,6 +3,7 @@ import com.yello.server.domain.admin.dto.request.AdminUserDetailRequest; import com.yello.server.domain.authorization.dto.request.SignUpRequest; import com.yello.server.domain.group.entity.UserGroup; +import com.yello.server.domain.user.dto.request.UserUpdateRequest; import com.yello.server.global.common.dto.AuditingTimeEntity; import java.time.LocalDateTime; import java.util.Objects; @@ -128,16 +129,6 @@ public static User of(SignUpRequest signUpRequest, UserGroup group) { .build(); } - public void delete() { - this.deletedAt = LocalDateTime.now(); - this.point = 0; - this.deviceToken = null; - } - - public void renew() { - this.deletedAt = null; - } - public void update(AdminUserDetailRequest request) { this.recommendCount = request.recommendCount(); this.name = request.name(); @@ -154,6 +145,27 @@ public void update(AdminUserDetailRequest request) { this.subscribe = request.subscribe(); } + public void update(UserUpdateRequest request, Gender gender, UserGroup userGroup) { + this.name = request.name(); + this.yelloId = request.yelloId(); + this.gender = gender; + this.email = request.email(); + this.profileImage = request.profileImageUrl(); + this.group = userGroup; + this.groupAdmissionYear = request.groupAdmissionYear(); + } + + public void delete() { + this.deletedAt = LocalDateTime.now(); + this.point = 0; + this.deviceToken = null; + } + + public void renew() { + this.deletedAt = null; + } + + public void addPoint(Integer point) { if (this.getSubscribe() == Subscribe.NORMAL) { this.point += point; diff --git a/src/main/java/com/yello/server/domain/user/entity/UserData.java b/src/main/java/com/yello/server/domain/user/entity/UserData.java index 7d54bf04..208f7958 100644 --- a/src/main/java/com/yello/server/domain/user/entity/UserData.java +++ b/src/main/java/com/yello/server/domain/user/entity/UserData.java @@ -44,4 +44,8 @@ public static UserData of(UserDataType tag, String value, User user) { .value(value) .build(); } + + public void setValue(String value) { + this.value = value; + } } diff --git a/src/main/java/com/yello/server/domain/user/entity/UserDataType.java b/src/main/java/com/yello/server/domain/user/entity/UserDataType.java index 28fd385b..3edcb9f9 100644 --- a/src/main/java/com/yello/server/domain/user/entity/UserDataType.java +++ b/src/main/java/com/yello/server/domain/user/entity/UserDataType.java @@ -1,6 +1,9 @@ package com.yello.server.domain.user.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; +import java.time.ZonedDateTime; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -8,21 +11,27 @@ @Getter @RequiredArgsConstructor public enum UserDataType { - WITHDRAW_REASON("WITHDRAW_REASON"), - ACCOUNT_UPDATED_AT("ACCOUNT_UPDATED_AT"), - RECOMMENDED("RECOMMENDED"); - - private final String intial; + /** + * ACCOUNT_UPDATE_AT, RECOMMENDED DotaTimeFormatter.ISO_OFFSET_DATE_TIME 으로 저장해주세요 + */ + WITHDRAW_REASON(String.class, "withdraw-reason"), + ACCOUNT_UPDATED_AT(ZonedDateTime.class, "account-updated-at"), + RECOMMENDED(ZonedDateTime.class, "recommended"); + + private final Class classType; + private final String initial; public static UserDataType fromCode(String dbData) { return Arrays.stream(UserDataType.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(dbData)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 유저데이터 타입입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static UserDataType fromName(String name) { + return Arrays.stream(UserDataType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } } diff --git a/src/main/java/com/yello/server/domain/user/entity/UserDataTypeConverter.java b/src/main/java/com/yello/server/domain/user/entity/UserDataTypeConverter.java index 2a87a8cc..2931a976 100644 --- a/src/main/java/com/yello/server/domain/user/entity/UserDataTypeConverter.java +++ b/src/main/java/com/yello/server/domain/user/entity/UserDataTypeConverter.java @@ -11,7 +11,7 @@ public String convertToDatabaseColumn(UserDataType userData) { if (userData == null) { return null; } - return userData.getIntial(); + return userData.name(); } @Override @@ -19,12 +19,7 @@ public UserDataType convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return UserDataType.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } - } + return UserDataType.fromName(dbData); + } } diff --git a/src/main/java/com/yello/server/domain/user/exception/UserDataNotFoundException.java b/src/main/java/com/yello/server/domain/user/exception/UserDataNotFoundException.java new file mode 100644 index 00000000..afed4757 --- /dev/null +++ b/src/main/java/com/yello/server/domain/user/exception/UserDataNotFoundException.java @@ -0,0 +1,13 @@ +package com.yello.server.domain.user.exception; + +import com.yello.server.global.common.ErrorCode; +import com.yello.server.global.exception.CustomException; +import lombok.Getter; + +@Getter +public class UserDataNotFoundException extends CustomException { + + public UserDataNotFoundException(ErrorCode error) { + super(error, "[UserDataNotFoundException] " + error.getMessage()); + } +} diff --git a/src/main/java/com/yello/server/domain/user/repository/UserDataRepository.java b/src/main/java/com/yello/server/domain/user/repository/UserDataRepository.java index a443c3ed..9543b160 100644 --- a/src/main/java/com/yello/server/domain/user/repository/UserDataRepository.java +++ b/src/main/java/com/yello/server/domain/user/repository/UserDataRepository.java @@ -1,9 +1,16 @@ package com.yello.server.domain.user.repository; import com.yello.server.domain.user.entity.UserData; +import com.yello.server.domain.user.entity.UserDataType; +import java.util.Optional; public interface UserDataRepository { UserData save(UserData userData); + void update(Long userId, UserDataType tag, String value); + + UserData getByUserIdAndTag(Long userId, UserDataType tag); + + Optional findByUserIdAndTag(Long userId, UserDataType tag); } diff --git a/src/main/java/com/yello/server/domain/user/repository/UserDataRepositoryImpl.java b/src/main/java/com/yello/server/domain/user/repository/UserDataRepositoryImpl.java index e67fb051..f24e9658 100644 --- a/src/main/java/com/yello/server/domain/user/repository/UserDataRepositoryImpl.java +++ b/src/main/java/com/yello/server/domain/user/repository/UserDataRepositoryImpl.java @@ -1,8 +1,14 @@ package com.yello.server.domain.user.repository; +import static com.yello.server.domain.user.entity.QUserData.userData; +import static com.yello.server.global.common.ErrorCode.USER_DATA_NOT_FOUND_EXCEPTION; + import com.querydsl.jpa.impl.JPAQueryFactory; import com.yello.server.domain.user.entity.UserData; +import com.yello.server.domain.user.entity.UserDataType; +import com.yello.server.domain.user.exception.UserDataNotFoundException; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -10,12 +16,44 @@ @Repository @RequiredArgsConstructor @Transactional(readOnly = true) -public class UserDataRepositoryImpl implements UserDataRepository{ +public class UserDataRepositoryImpl implements UserDataRepository { - private final UserDataJpaRepository userDataJpaRepository; private final JPAQueryFactory jpaQueryFactory; + private final UserDataJpaRepository userDataJpaRepository; + @Override public UserData save(UserData userData) { return userDataJpaRepository.save(userData); } + + @Override + public void update(Long userId, UserDataType tag, String value) { + jpaQueryFactory.update(userData) + .set(userData.value, value) + .where(userData.user.id.eq(userId)) + .where(userData.tag.eq(tag)) + .execute(); + } + + @Override + public UserData getByUserIdAndTag(Long userId, UserDataType tag) { + final Optional data = Optional.ofNullable(jpaQueryFactory.selectFrom(userData) + .where(userData.user.id.eq(userId)) + .where(userData.tag.eq(tag)) + .fetchFirst()); + + if (data.isEmpty()) { + throw new UserDataNotFoundException(USER_DATA_NOT_FOUND_EXCEPTION); + } + + return data.get(); + } + + @Override + public Optional findByUserIdAndTag(Long userId, UserDataType tag) { + return Optional.ofNullable(jpaQueryFactory.selectFrom(userData) + .where(userData.user.id.eq(userId)) + .where(userData.tag.eq(tag)) + .fetchFirst()); + } } diff --git a/src/main/java/com/yello/server/domain/user/service/UserManagerImpl.java b/src/main/java/com/yello/server/domain/user/service/UserManagerImpl.java index 766febe1..84d6c587 100644 --- a/src/main/java/com/yello/server/domain/user/service/UserManagerImpl.java +++ b/src/main/java/com/yello/server/domain/user/service/UserManagerImpl.java @@ -23,7 +23,7 @@ public class UserManagerImpl implements UserManager { @Override public User getOfficialUser(Gender gender) { final String uuid = - "M".equals(gender.getIntial()) ? OFFICIAL_FEMALE_ID : OFFICIAL_MALE_ID; + "M".equals(gender.getInitial()) ? OFFICIAL_FEMALE_ID : OFFICIAL_MALE_ID; return userRepository.findByUuid(uuid) .orElseGet(() -> userRepository.save(makeOfficialUser(OFFICIAL_NAME, uuid, gender.reverse())) 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 60ad70f7..972456a7 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 @@ -1,29 +1,43 @@ package com.yello.server.domain.user.service; +import static com.yello.server.domain.user.entity.UserDataType.ACCOUNT_UPDATED_AT; import static com.yello.server.domain.user.entity.UserDataType.WITHDRAW_REASON; import static com.yello.server.global.common.ErrorCode.DEVICE_TOKEN_CONFLICT_USER_EXCEPTION; +import static com.yello.server.global.common.ErrorCode.USER_DATA_INVALID_ARGUMENT_EXCEPTION; import com.yello.server.domain.admin.repository.UserAdminRepository; import com.yello.server.domain.cooldown.entity.Cooldown; import com.yello.server.domain.cooldown.repository.CooldownRepository; import com.yello.server.domain.friend.entity.Friend; import com.yello.server.domain.friend.repository.FriendRepository; +import com.yello.server.domain.group.entity.UserGroup; import com.yello.server.domain.group.repository.UserGroupRepository; import com.yello.server.domain.purchase.entity.Purchase; import com.yello.server.domain.purchase.repository.PurchaseRepository; +import com.yello.server.domain.user.dto.request.UserDataUpdateRequest; import com.yello.server.domain.user.dto.request.UserDeleteReasonRequest; import com.yello.server.domain.user.dto.request.UserDeviceTokenRequest; +import com.yello.server.domain.user.dto.request.UserUpdateRequest; +import com.yello.server.domain.user.dto.response.UserDataResponse; import com.yello.server.domain.user.dto.response.UserDetailResponse; import com.yello.server.domain.user.dto.response.UserDetailV2Response; import com.yello.server.domain.user.dto.response.UserResponse; import com.yello.server.domain.user.dto.response.UserSubscribeDetailResponse; +import com.yello.server.domain.user.entity.Gender; import com.yello.server.domain.user.entity.User; import com.yello.server.domain.user.entity.UserData; +import com.yello.server.domain.user.entity.UserDataType; import com.yello.server.domain.user.exception.UserConflictException; +import com.yello.server.domain.user.exception.UserException; import com.yello.server.domain.user.repository.UserDataRepository; import com.yello.server.domain.user.repository.UserRepository; import com.yello.server.domain.vote.repository.VoteRepository; import com.yello.server.global.common.dto.EmptyObject; +import com.yello.server.global.common.util.ConstantUtil; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Optional; import lombok.Builder; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -119,4 +133,64 @@ public void deleteUserWithReason(Long userId, UserDeleteReasonRequest request) { userDataRepository.save(UserData.of(WITHDRAW_REASON, request.value(), target)); } + + @Transactional + public void updateUserProfile(Long userId, UserUpdateRequest request) { + // exception + final User user = userRepository.getById(userId); + final UserGroup userGroup = userGroupRepository.getById(request.groupId()); + final Gender gender = Gender.fromCode(request.gender()); + 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); + } + + public UserDataResponse readUserData(Long userId, UserDataType tag) { + // exception + final User user = userRepository.getById(userId); + final Optional userData = userDataRepository.findByUserIdAndTag(userId, tag); + + return UserDataResponse.of(user, tag, userData.isPresent() ? userData.get().getValue() : null); + } + + @Transactional + public void updateUserData(Long userId, UserDataType tag, UserDataUpdateRequest request) { + // exception + final User user = userRepository.getById(userId); + final Optional userData = userDataRepository.findByUserIdAndTag(userId, tag); + final DateTimeFormatter zonedDateFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + String savedValue = null; + + if (tag.getClassType().equals(String.class)) { + savedValue = request.value(); + } else if (tag.getClassType().equals(ZonedDateTime.class)) { + try { + savedValue = ZonedDateTime + .parse(request.value(), zonedDateFormatter) + .format(zonedDateFormatter); + } catch (DateTimeParseException exception) { + throw new UserException(USER_DATA_INVALID_ARGUMENT_EXCEPTION); + } + } + + if (userData.isPresent()) { + userDataRepository.update(userId, tag, savedValue); + } else { + userDataRepository.save(UserData.of(tag, savedValue, user)); + } + } } diff --git a/src/main/java/com/yello/server/domain/vote/entity/VoteType.java b/src/main/java/com/yello/server/domain/vote/entity/VoteType.java index 6ba96e40..59b095e7 100644 --- a/src/main/java/com/yello/server/domain/vote/entity/VoteType.java +++ b/src/main/java/com/yello/server/domain/vote/entity/VoteType.java @@ -1,6 +1,8 @@ package com.yello.server.domain.vote.entity; -import java.text.MessageFormat; +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; import java.util.Arrays; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -10,18 +12,19 @@ public enum VoteType { SEND("send"); - private final String intial; + private final String initial; - public static VoteType fromCode(String dbData) { + public static VoteType fromCode(String value) { return Arrays.stream(VoteType.values()) - .filter(v -> v.getIntial().equals(dbData)) + .filter(v -> v.getInitial().equals(value)) .findAny() - .orElseThrow(() -> new IllegalArgumentException( - MessageFormat.format("존재하지 않는 투표 타입입니다. {0}", dbData))); + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - public String intial() { - return intial; + public static VoteType fromName(String name) { + return Arrays.stream(VoteType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); } - } diff --git a/src/main/java/com/yello/server/domain/vote/entity/VoteTypeConverter.java b/src/main/java/com/yello/server/domain/vote/entity/VoteTypeConverter.java index b125eb5a..f1f9df85 100644 --- a/src/main/java/com/yello/server/domain/vote/entity/VoteTypeConverter.java +++ b/src/main/java/com/yello/server/domain/vote/entity/VoteTypeConverter.java @@ -1,6 +1,5 @@ package com.yello.server.domain.vote.entity; -import com.yello.server.domain.user.entity.Social; import javax.persistence.AttributeConverter; import javax.persistence.Converter; import lombok.extern.log4j.Log4j2; @@ -14,7 +13,7 @@ public String convertToDatabaseColumn(VoteType voteType) { if (voteType == null) { return null; } - return voteType.getIntial(); + return voteType.name(); } @Override @@ -22,11 +21,7 @@ public VoteType convertToEntityAttribute(String dbData) { if (dbData == null) { return null; } - try { - return VoteType.fromCode(dbData); - } catch (IllegalArgumentException exception) { - log.error("failure to convert cause unexpected code" + dbData + exception); - throw exception; - } + + return VoteType.fromName(dbData); } } diff --git a/src/main/java/com/yello/server/global/common/ErrorCode.java b/src/main/java/com/yello/server/global/common/ErrorCode.java index b4b7ee82..3f77b767 100644 --- a/src/main/java/com/yello/server/global/common/ErrorCode.java +++ b/src/main/java/com/yello/server/global/common/ErrorCode.java @@ -37,6 +37,8 @@ public enum ErrorCode { APPLE_IN_APP_BAD_REQUEST_EXCEPTION(BAD_REQUEST, "존재하지 않는 영수증입니다."), METHOD_ARGUMENT_TYPE_MISMATCH_EXCEPTION(BAD_REQUEST, "입력한 값의 타입이 올바르지 않습니다."), USER_ADMIN_BAD_REQUEST_EXCEPTION(BAD_REQUEST, "검색 필드가 없습니다."), + USER_DATA_INVALID_ARGUMENT_EXCEPTION(BAD_REQUEST, "입력한 유저 데이터의 값이 올바르지 않습니다."), + ENUM_BAD_REQUEST_EXCEPTION(BAD_REQUEST, "존재하지 않는 열거형 타입입니다."), /** * 401 UNAUTHORIZED @@ -93,6 +95,7 @@ public enum ErrorCode { NOT_FOUND_USER_SUBSCRIBE_EXCEPTION(NOT_FOUND, "유저의 구독정보가 존재하지 않습니다."), NOT_FOUND_NOTICE_EXCEPTION(NOT_FOUND, "공지가 존재하지 않습니다."), ADMIN_CONFIGURATION_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 설정이 존재하지 않습니다."), + USER_DATA_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 유저 데이터가 존재하지 않습니다."), /** * 409 CONFLICT diff --git a/src/main/java/com/yello/server/global/common/SuccessCode.java b/src/main/java/com/yello/server/global/common/SuccessCode.java index d169cdb8..524ecb24 100644 --- a/src/main/java/com/yello/server/global/common/SuccessCode.java +++ b/src/main/java/com/yello/server/global/common/SuccessCode.java @@ -37,7 +37,10 @@ public enum SuccessCode { VERIFY_RECEIPT_SUCCESS(OK, "인앱결제 검증에 성공했습니다."), READ_USER_ADMIN_SUCCESS(OK, "어드민 페이지 유저 조회에 성공하였습니다."), READ_USER_DETAIL_ADMIN_SUCCESS(OK, "어드민 페이지 유저 상세 조회에 성공하였습니다."), + READ_USER_DATA_SUCCESS(OK, "유저 데이터 조회에 성공하였습니다."), UPDATE_USER_DETAIL_ADMIN_SUCCESS(OK, "어드민 페이지 유저 상세 정보 수정에 성공하였습니다."), + UPDATE_USER_DETAIL_SUCCESS(OK, "유저 상세 정보 수정에 성공하였습니다."), + UPDATE_USER_DATA_SUCCESS(OK, "유저 데이터 수정에 성공하였습니다."), READ_COOLDOWN_ADMIN_SUCCESS(OK, "어드민 페이지 쿨다운 조회에 성공하였습니다."), DELETE_USER_ADMIN_SUCCESS(OK, "어드민 권한으로 유저 삭제에 성공하였습니다."), DELETE_COOLDOWN_ADMIN_SUCCESS(OK, "어드민 권한으로 쿨다운 삭제에 성공하였습니다."), diff --git a/src/main/java/com/yello/server/global/common/factory/TimeFactory.java b/src/main/java/com/yello/server/global/common/factory/TimeFactory.java index a860a13e..93102ccc 100644 --- a/src/main/java/com/yello/server/global/common/factory/TimeFactory.java +++ b/src/main/java/com/yello/server/global/common/factory/TimeFactory.java @@ -66,7 +66,6 @@ public static Boolean compareNowAndEndData(ZonedDateTime zonedDateTime) { ZoneId zoneId = ZoneId.of("Asia/Seoul"); ZonedDateTime now = ZonedDateTime.now(zoneId); - System.out.println(now + " sfsdfsd"); return now.isBefore(zonedDateTime); } diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index 8e515274..f99143ad 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -1,7 +1,10 @@ package com.yello.server.global.common.util; +import java.time.ZoneId; + public class ConstantUtil { + public static final ZoneId GlobalZoneId = ZoneId.of("Asia/Seoul"); public static final int RANDOM_COUNT = 4; public static final int VOTE_COUNT = 8; public static final long TIMER_TIME = 2400L; diff --git a/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java b/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java index 22e6c4d1..dc47dd57 100644 --- a/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java +++ b/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java @@ -84,25 +84,6 @@ void handleException(HttpServletRequest request, Exception exception) throws Exc throw exception; } - /** - * 400 BAD REQUEST - */ - @ExceptionHandler({ - FriendException.class, - UserException.class, - AuthBadRequestException.class, - UserBadRequestException.class, - QuestionException.class, - PurchaseException.class, - GoogleBadRequestException.class, - AppleBadRequestException.class, - UserAdminBadRequestException.class - }) - public ResponseEntity BadRequestException(CustomException exception) { - return ResponseEntity.status(BAD_REQUEST) - .body(BaseResponse.error(exception.getError(), exception.getMessage())); - } - @ExceptionHandler({ // @Valid 오류 Catch MethodArgumentNotValidException.class @@ -146,6 +127,28 @@ public ResponseEntity BadRequestException( METHOD_ARGUMENT_TYPE_MISMATCH_EXCEPTION.getMessage())); } + /** + * 400 BAD REQUEST + */ + @ExceptionHandler({ + FriendException.class, + UserException.class, + AuthBadRequestException.class, + UserBadRequestException.class, + QuestionException.class, + PurchaseException.class, + GoogleBadRequestException.class, + AppleBadRequestException.class, + UserAdminBadRequestException.class, + EnumIllegalArgumentException.class, + IllegalArgumentException.class + }) + public ResponseEntity BadRequestException(CustomException exception) { + return ResponseEntity.status(BAD_REQUEST) + .body(BaseResponse.error(exception.getError(), exception.getMessage())); + } + + /** * 401 UNAUTHORIZED */ diff --git a/src/main/java/com/yello/server/global/exception/EnumIllegalArgumentException.java b/src/main/java/com/yello/server/global/exception/EnumIllegalArgumentException.java new file mode 100644 index 00000000..4d76a603 --- /dev/null +++ b/src/main/java/com/yello/server/global/exception/EnumIllegalArgumentException.java @@ -0,0 +1,12 @@ +package com.yello.server.global.exception; + +import com.yello.server.global.common.ErrorCode; +import lombok.Getter; + +@Getter +public class EnumIllegalArgumentException extends CustomException { + + public EnumIllegalArgumentException(ErrorCode error) { + super(error, "[EnumIllegalArgumentException] " + error.getMessage()); + } +} diff --git a/src/main/java/com/yello/server/infrastructure/firebase/dto/request/NotificationMessage.java b/src/main/java/com/yello/server/infrastructure/firebase/dto/request/NotificationMessage.java index 07fb6d61..f452069b 100644 --- a/src/main/java/com/yello/server/infrastructure/firebase/dto/request/NotificationMessage.java +++ b/src/main/java/com/yello/server/infrastructure/firebase/dto/request/NotificationMessage.java @@ -44,7 +44,7 @@ public static NotificationMessage toYelloNotificationContent(Vote vote) { final User sender = vote.getSender(); final String target = - Gender.MALE.getIntial().equals(sender.getGender().getIntial()) ? "남학생" : "여학생"; + Gender.MALE.getInitial().equals(sender.getGender().getInitial()) ? "남학생" : "여학생"; return NotificationMessage.builder() .title(MessageFormat.format("{0}이 쪽지를 보냈어요!", target)) .message(vote.getQuestion().toNotificationSentence()) diff --git a/src/main/resources/static/docs/check-user-v2.html b/src/main/resources/static/docs/check-user-v2.html index bea6d570..6f92c3bc 100644 --- a/src/main/resources/static/docs/check-user-v2.html +++ b/src/main/resources/static/docs/check-user-v2.html @@ -476,10 +476,10 @@

응답

"uuid" : "1", "deviceToken" : "deviceToken#1", "groupId" : 1, - "group" : "테스트 대학교 1 테스트 학과 1 20학번", + "group" : "테스트 그룹 1 테스트 하위 그룹 1 20학번", "groupType" : "UNIVERSITY", - "groupName" : "테스트 대학교 1", - "subGroupName" : "테스트 학과 1", + "groupName" : "테스트 그룹 1", + "subGroupName" : "테스트 하위 그룹 1", "groupAdmissionYear" : 20, "recommendCount" : 0, "ticketCount" : 0, diff --git a/src/main/resources/static/docs/check-vote-available.html b/src/main/resources/static/docs/check-vote-available.html index 4e4a1754..4f0d7485 100644 --- a/src/main/resources/static/docs/check-vote-available.html +++ b/src/main/resources/static/docs/check-vote-available.html @@ -466,9 +466,9 @@

응답

"status" : 200, "message" : "투표 시작하기에 성공했습니다.", "data" : { - "isPossible" : false, + "isPossible" : true, "point" : 200, - "createdAt" : "2024-01-28 18:55:18", + "createdAt" : "2024-01-01 12:00:00", "friendStatus" : 1 } } diff --git a/src/main/resources/static/docs/edit-user.html b/src/main/resources/static/docs/edit-user.html index 410ecc37..bbb4e25e 100644 --- a/src/main/resources/static/docs/edit-user.html +++ b/src/main/resources/static/docs/edit-user.html @@ -5,7 +5,7 @@ -유저 프로필 수정 (명세) +유저 프로필 수정