Skip to content

Commit

Permalink
Merge pull request #431 from team-yello/develop
Browse files Browse the repository at this point in the history
[deploy] staging
  • Loading branch information
euije authored Jan 31, 2024
2 parents 5bd6f0f + 1d6f2f0 commit 5ac3e80
Show file tree
Hide file tree
Showing 87 changed files with 1,144 additions and 693 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
36 changes: 6 additions & 30 deletions src/docs/asciidoc/edit-user.adoc
Original file line number Diff line number Diff line change
@@ -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": "[email protected]",
"profileImageUrl": "test image",
"groupId": 30000,
"groupAdmissionYear" : 20
}
----
include::{snippets}/api/v1/user/update/http-request.adoc[]

*필드 타입*

Expand All @@ -35,27 +20,18 @@ 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[]

*필드 타입*

=== NOTE

- 포인트 / 구독정보 / 로그인 정보와 같이 user-pure하지 않은 정보는 수정할 수 없도록 설계하였습니다.
* 해당 정보 수정API는 도메인 별로 만들 예정입니다.
- 비즈니스 로직인 **'1년에 1회 수정 가능하다'**라는 조건과 상관없이 여러번 호출하여 유저 정보 수정이 가능합니다.
* 해당 비즈니스 로직을 만족하기 위해서 link:user-data-get.html[프로필 수정 가능 여부 조회]를 같이 사용해주세요.

=== CHANGELOG

- 2024.01.31 릴리즈
- 2024.01.09 명세 작성
6 changes: 3 additions & 3 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down
44 changes: 11 additions & 33 deletions src/docs/asciidoc/user-data-get.adoc
Original file line number Diff line number Diff line change
@@ -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 명세 작성
35 changes: 9 additions & 26 deletions src/docs/asciidoc/user-data-post.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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 명세 작성
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,15 @@ public String convertToDatabaseColumn(AdminConfigurationType type) {
if (type == null) {
return null;
}
return type.getIntial();
return type.name();
}

@Override
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<UserData> 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);

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,15 @@ public String convertToDatabaseColumn(UserGroupDataTag userGroupType) {
if (userGroupType == null) {
return null;
}
return userGroupType.getIntial();
return userGroupType.name();
}

@Override
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);
}
}
Loading

0 comments on commit 5ac3e80

Please sign in to comment.