Skip to content

Commit fbcb25e

Browse files
authored
Release 1.0.2 (#10)
## 📝 작업 내용 - feature: 메뉴 옵션 그룹 생성 시 메뉴 옵션 그룹 내 중복 옵션 이름이 있는지 검사 - feature: 매장의 전체 카테고리 & 메뉴 조회 시 숨김(HIDE) 상태의 메뉴는 조회되지 않도록 수정 - feature: 주문 결제 도메인 KSCAT 현금 영수증 결제 지원 (승인 번호, 거래 일시, 거래 고유 번호) - feature: 개발 서버 디버그 로그 `notification` 패키지 -> 전체 패키지 출력하도록 변경 - fix: 토큰 갱신 시 분산락이 적용되지 않는 현상 수정 - fix: sse 이벤트 데이터 중 id값 문자열로 변환하여 이벤트 전송 (프론트엔드 bigint 편의) - docs: swagger 개발 서버 도메인 추가 - docs: 주문 결제 도메인 모델 문서 업데이트 ## 📷 스크린샷 (선택) ## 💬 리뷰 요구사항(선택)
2 parents 3a3aa0a + b53f106 commit fbcb25e

25 files changed

+184
-54
lines changed

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ services:
22
everyonewaiter-api:
33
container_name: everyonewaiter-api
44
build: .
5-
image: everyonewaiter-api:1.0.1
5+
image: everyonewaiter-api:1.0.2
66
ports:
77
- "8081:8081"
88
volumes:

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Artifact
22
appGroup=com.everyonewaiter
3-
appVersion=1.0.1
3+
appVersion=1.0.2
44

55
# Plugin
66
springBoot=3.5.4

src/main/java/com/everyonewaiter/adapter/web/api/device/MenuApiSpecification.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
interface MenuApiSpecification {
1414

1515
@SecurityRequirements
16-
@Operation(summary = "매장 메뉴 카테고리 및 메뉴 목록 조회", description = "매장 메뉴 카테고리 및 메뉴 목록 조회 API")
16+
@Operation(
17+
summary = "매장 메뉴 카테고리 및 메뉴 목록 조회",
18+
description = "매장 메뉴 카테고리 및 메뉴 목록 조회 API<br/><br/>" +
19+
"숨김(HIDE) 상태의 메뉴는 조회되지 않습니다."
20+
)
1721
@ApiResponse(responseCode = "200", description = "매장 메뉴 카테고리 및 메뉴 목록 조회 성공")
1822
@ApiErrorResponse(
1923
summary = "매장 메뉴 카테고리 및 메뉴 목록 조회 실패",

src/main/java/com/everyonewaiter/adapter/web/config/AuthenticationDeviceResolver.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static com.everyonewaiter.adapter.web.HttpRequestParser.parseRequestUri;
44
import static java.util.Arrays.stream;
55
import static java.util.Objects.requireNonNull;
6+
import static org.slf4j.LoggerFactory.getLogger;
67

78
import com.everyonewaiter.application.auth.required.SignatureEncoder;
89
import com.everyonewaiter.application.device.provided.DeviceFinder;
@@ -12,9 +13,11 @@
1213
import com.everyonewaiter.domain.shared.AuthenticationException;
1314
import jakarta.servlet.http.HttpServletRequest;
1415
import java.time.Duration;
16+
import java.util.Arrays;
1517
import lombok.Data;
1618
import lombok.NonNull;
1719
import lombok.RequiredArgsConstructor;
20+
import org.slf4j.Logger;
1821
import org.springframework.core.MethodParameter;
1922
import org.springframework.http.HttpMethod;
2023
import org.springframework.stereotype.Component;
@@ -27,6 +30,8 @@
2730
@RequiredArgsConstructor
2831
class AuthenticationDeviceResolver implements HandlerMethodArgumentResolver {
2932

33+
private static final Logger LOGGER = getLogger(AuthenticationDeviceResolver.class);
34+
3035
private static final String ACCESS_KEY = "x-ew-access-key";
3136
private static final String SIGNATURE = "x-ew-signature";
3237
private static final String TIMESTAMP = "x-ew-timestamp";
@@ -61,6 +66,8 @@ public Device resolveArgument(
6166
);
6267

6368
if (!device.isActive() || stream(annotation.purpose()).noneMatch(device::hasPurpose)) {
69+
LOGGER.debug("Device not have require purpose. have: {}, required: {}",
70+
device.getPurpose(), Arrays.toString(annotation.purpose()));
6471
throw new AccessDeniedException();
6572
}
6673

@@ -74,6 +81,7 @@ private void validateSignature(Device device, RequestSignature requestSignature)
7481
String plainText = requestSignature.plainText(device);
7582

7683
if (!signatureEncoder.matches(signature, plainText, device.getSecretKey())) {
84+
LOGGER.debug("Device signature not match. plain: {}, signature: {}", plainText, signature);
7785
throw new AuthenticationException();
7886
}
7987
}
@@ -98,11 +106,14 @@ public RequestSignature(HttpServletRequest request) {
98106
throw new AuthenticationException();
99107
}
100108

109+
long validDuration = Duration.ofMinutes(5).toMillis();
101110
long currentTime = System.currentTimeMillis();
102-
long maxTime = currentTime + Duration.ofMinutes(5).toMillis();
103-
long minTime = currentTime - Duration.ofMinutes(5).toMillis();
111+
long maxTime = currentTime + validDuration;
112+
long minTime = currentTime - validDuration;
104113

105114
if (timestamp < minTime || timestamp > maxTime) {
115+
LOGGER.debug("Device timestamp duration is invalid. timestamp: {}, max: {}, min: {}",
116+
timestamp, maxTime, minTime);
106117
throw new AuthenticationException();
107118
}
108119
}

src/main/java/com/everyonewaiter/adapter/web/docs/SwaggerConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ private Info info() {
164164

165165
private List<Server> servers() {
166166
return List.of(
167+
new Server().url("https://devapi.everyonewaiter.com").description("Development"),
167168
new Server().url("http://localhost:8081").description("Local")
168169
);
169170
}

src/main/java/com/everyonewaiter/application/auth/SignInTokenService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public SignInToken createToken(Long accountId) {
4141
}
4242

4343
@Override
44-
@DistributedLock(key = "#refreshToken")
44+
@DistributedLock(key = "#signInTokenRenewRequest.refreshToken")
4545
public Optional<SignInToken> renewToken(SignInTokenRenewRequest signInTokenRenewRequest) {
4646
JwtPayload payload = jwtProvider.decode(signInTokenRenewRequest.refreshToken())
4747
.orElseThrow(AuthenticationException::new);

src/main/java/com/everyonewaiter/application/menu/MenuModifyService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void deleteAll(Long storeId, MenuDeleteRequest deleteRequest) {
141141
menuRepository.deleteAll(menus);
142142

143143
var event1 = new MenuImageDeleteEvent(menus.stream().map(Menu::getImage).toList());
144-
var event2 = new SseEvent(storeId, MENU, DELETE, deleteRequest.menuIds());
144+
var event2 = new SseEvent(storeId, MENU, DELETE, deleteRequest.getStringMenuIds());
145145

146146
applicationEventPublisher.publishEvent(event1);
147147
applicationEventPublisher.publishEvent(event2);

src/main/java/com/everyonewaiter/application/sse/SseSendEventHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class SseSendEventHandler {
1616
@Async("eventTaskExecutor")
1717
@TransactionalEventListener
1818
public void handle(SseEvent event) {
19-
sseSender.send(event.storeId().toString(), event);
19+
sseSender.send(event.storeId(), event);
2020
}
2121

2222
}

src/main/java/com/everyonewaiter/domain/AggregateRootEntity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ void markNotNew() {
4747
this.isNew = false;
4848
}
4949

50+
protected String getStringId() {
51+
return String.valueOf(getId());
52+
}
53+
5054
@Override
5155
@SuppressWarnings("java:S2097") // Add a type test to this method.
5256
public final boolean equals(Object o) {

src/main/java/com/everyonewaiter/domain/device/Device.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ private void update(
136136
this.tableNo = tableNo;
137137
this.paymentType = requireNonNull(paymentType);
138138

139-
registerEvent(new SseEvent(store.getId(), DEVICE, UPDATE, getId()));
139+
registerEvent(new SseEvent(getStoreId(), DEVICE, UPDATE, getStringId()));
140140
}
141141

142142
public void delete() {
143-
registerEvent(new SseEvent(store.getId(), DEVICE, DELETE, getId()));
143+
registerEvent(new SseEvent(getStoreId(), DEVICE, DELETE, getStringId()));
144144
}
145145

146146
public Long getStoreId() {

0 commit comments

Comments
 (0)