Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import umc.th.juinjang.api.limjang.controller.parameter.LimjangSortOptions;
import umc.th.juinjang.api.limjang.controller.request.NoteInitRequest;
import umc.th.juinjang.api.limjang.controller.request.NotePatchRequest;
import umc.th.juinjang.api.limjang.controller.request.NotePatchRequestV2;
import umc.th.juinjang.api.limjang.controller.request.NotePostRequest;
import umc.th.juinjang.api.limjang.service.NoteCommandServiceV2;
import umc.th.juinjang.api.limjang.service.NoteQueryServiceV2;
Expand Down Expand Up @@ -71,9 +72,9 @@ public ApiResponse<Void> updateNote(@PathVariable(name = "noteId") Long noteId,
@Operation(summary = "์ž„์žฅ ์ˆ˜์ • API V2 - UI/UX ๋ฆฌํŒฉํ† ๋ง")
@PatchMapping("/notes/init/{noteId}")
public ApiResponse<Void> updateNoteV2(@PathVariable(name = "noteId") Long noteId,
@RequestBody @Valid NotePatchRequest request,
@RequestBody @Valid NotePatchRequestV2 request,
@AuthenticationPrincipal Member member) {
noteCommandService.updateNoteV2(noteId, request);
noteCommandService.updateNoteInitV2(noteId, request);
return ApiResponse.onSuccess(null);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package umc.th.juinjang.api.limjang.controller.request;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import umc.th.juinjang.domain.limjang.model.Address;
import umc.th.juinjang.domain.limjang.model.LimjangPrice;
import umc.th.juinjang.domain.limjang.model.LimjangPriceType;
import umc.th.juinjang.domain.limjang.model.LimjangPurpose;
import umc.th.juinjang.domain.limjang.repository.NotePriceFactory;

public record NotePatchRequestV2(
@NotNull
LimjangPriceType priceType,

@Pattern(regexp = "^[0-9]+$", message = "๊ฐ€๊ฒฉ์€ ์ˆซ์ž๋งŒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
String price,
@Pattern(regexp = "^[0-9]+$", message = "๊ฐ€๊ฒฉ์€ ์ˆซ์ž๋งŒ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.")
String monthlyRent,

String roadAddress,
String addressDetail,

String bcode,

String nickname,

String floor,
Integer pyong, //null ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Integer๋กœ ๋ณ€๊ฒฝ
String sido,
String sigungu,
String bname1,
String bname2
) {

public LimjangPrice toUpdatedPrice(LimjangPurpose purpose) {
if (price == null && monthlyRent == null) {
return LimjangPrice.empty();
}
return NotePriceFactory.create(purpose, priceType, price, monthlyRent);
}

public Address toUpdatedAddress() {
if (isAddressAllEmpty()) {
return Address.empty();
}
return Address.create(roadAddress, addressDetail, bcode, sido, sigungu, bname1, bname2);
}

private boolean isAddressAllEmpty() {
return isBlank(roadAddress)
&& isBlank(addressDetail)
&& isBlank(bcode)
&& isBlank(sido)
&& isBlank(sigungu)
&& isBlank(bname1)
&& isBlank(bname2);
}

private boolean isBlank(String s) {
return s == null || s.isBlank();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import umc.th.juinjang.api.address.service.AddressUpdater;
import umc.th.juinjang.api.limjang.controller.request.NoteInitRequest;
import umc.th.juinjang.api.limjang.controller.request.NotePatchRequest;
import umc.th.juinjang.api.limjang.controller.request.NotePatchRequestV2;
import umc.th.juinjang.api.limjang.controller.request.NotePostRequest;
import umc.th.juinjang.api.limjang.service.response.NotePostResponse;
import umc.th.juinjang.common.code.status.ErrorStatus;
Expand Down Expand Up @@ -74,6 +75,37 @@ public void updateNoteV2(Long noteId, NotePatchRequest request) {
note.updateNote(request.nickname(), request.priceType(), request.floor(), request.pyong());
}

@Transactional
public void updateNoteInitV2(Long noteId, NotePatchRequestV2 request) {
try {
Limjang note = noteFinder.getNoteByIdWhereDeletedIsFalse(noteId);

validatePriceType(note.getPurpose(), request.priceType());

LimjangPrice newPrice = request.toUpdatedPrice(note.getPurpose());
Address newAddress = request.toUpdatedAddress();

Address currentAddress = note.getAddressEntity();
if (newAddress.isEmpty()) {
if (currentAddress != null) {
note.setAddressEntity(null);
}
} else {
if (currentAddress != null) {
currentAddress.update(newAddress);
} else {
addressUpdater.save(newAddress);
note.setAddressEntity(newAddress);
}
}

note.getLimjangPrice().updateLimjangPrice(newPrice);
note.updateNote(request.nickname(), request.priceType(), request.floor(), request.pyong());
} catch (Exception e) {
e.printStackTrace();
}
}

private void validatePriceType(LimjangPurpose purposeType, LimjangPriceType priceType) {
if (
(purposeType == LimjangPurpose.RESIDENTIAL_PURPOSE && priceType == LimjangPriceType.MARKET_PRICE) ||
Expand Down
91 changes: 46 additions & 45 deletions src/main/java/umc/th/juinjang/auth/jwt/JwtExceptionFilter.java
Original file line number Diff line number Diff line change
@@ -1,67 +1,68 @@
package umc.th.juinjang.auth.jwt;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import io.jsonwebtoken.ExpiredJwtException;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import umc.th.juinjang.common.ExceptionHandler;
import umc.th.juinjang.common.code.status.ErrorStatus;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
@RequiredArgsConstructor
public class JwtExceptionFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try{
log.info("exception filter");
doFilter(request,response,filterChain);
log.info("jwt success");
} catch (NullPointerException e) {
final Map<String, Object> body = new HashMap<>();
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // ์˜ˆ์™ธ์— ๋งž๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •
response.setContentType("application/json");
body.put("timestamp", LocalDateTime.now());
body.put("code", ErrorStatus.TOKEN_EMPTY.getCode());
body.put("error", "Bad Request");
body.put("message", ErrorStatus.TOKEN_EMPTY.getMessage()); // ์˜ˆ์™ธ์— ๋งž๋Š” ๋ฉ”์‹œ์ง€ ์„ค์ •
body.put("path", request.getRequestURI());
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
try {
log.info("exception filter");
filterChain.doFilter(request, response);
log.info("jwt success");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ•ด๋‹น ๋ถ€๋ถ„์ด 500์—๋Ÿฌ ๋‚ด๋ฟœ๋Š” ๋ถ€๋ถ„ ์ˆ˜์ •ํ•˜์‹  ๊ฑธ๊นŒ์š”? ํ˜น์‹œ ์™œ ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  , ์–ด๋–ป๊ฒŒ ๊ณ ์นœ๊ฑด์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์•ผ๊ธฐ ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

} catch (NullPointerException e) {
final Map<String, Object> body = new HashMap<>();
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // ์˜ˆ์™ธ์— ๋งž๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ ์„ค์ •
response.setContentType("application/json");
body.put("timestamp", LocalDateTime.now());
body.put("code", ErrorStatus.TOKEN_EMPTY.getCode());
body.put("error", "Bad Request");
body.put("message", ErrorStatus.TOKEN_EMPTY.getMessage()); // ์˜ˆ์™ธ์— ๋งž๋Š” ๋ฉ”์‹œ์ง€ ์„ค์ •
body.put("path", request.getRequestURI());

mapper.writeValue(response.getOutputStream(), body);
logger.info("jwt exception nullpointer");
throw new ExceptionHandler(ErrorStatus.TOKEN_EMPTY);
}
catch (ExpiredJwtException e) {
final Map<String, Object> body = new HashMap<>();
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
response.setStatus(419);
response.setContentType("application/json");
body.put("timestamp", LocalDateTime.now());
body.put("code", ErrorStatus.TOKEN_UNAUTHORIZED.getCode());
body.put("error", "Unauthorized");
body.put("message", ErrorStatus.TOKEN_UNAUTHORIZED.getMessage());
body.put("path", request.getRequestURI());
mapper.writeValue(response.getOutputStream(), body);
logger.info("jwt exception nullpointer");
// throw new ExceptionHandler(ErrorStatus.TOKEN_EMPTY);
} catch (ExpiredJwtException e) {
final Map<String, Object> body = new HashMap<>();
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
response.setStatus(419);
response.setContentType("application/json");
body.put("timestamp", LocalDateTime.now());
body.put("code", ErrorStatus.TOKEN_UNAUTHORIZED.getCode());
body.put("error", "Unauthorized");
body.put("message", ErrorStatus.TOKEN_UNAUTHORIZED.getMessage());
body.put("path", request.getRequestURI());

mapper.writeValue(response.getOutputStream(), body);
}
}
mapper.writeValue(response.getOutputStream(), body);
}
}
}
19 changes: 18 additions & 1 deletion src/main/java/umc/th/juinjang/domain/limjang/model/Address.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package umc.th.juinjang.domain.limjang.model;

import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -87,4 +86,22 @@ public void update(Address newAddress) {
public String getFullAddress() {
return this.roadAddress + " " + this.getAddressDetail();
}

public static Address empty() {
return Address.builder().build(); // ๋ชจ๋“  ํ•„๋“œ null
}

public boolean isEmpty() {
return isBlank(roadAddress)
&& isBlank(addressDetail)
&& isBlank(bcode)
&& isBlank(sido)
&& isBlank(sigungo)
&& isBlank(bname1)
&& isBlank(bname2);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. isEmpty() ์กฐ๊ฑด์ด ๋ชจ๋‘ && ์—ฐ์‚ฐ์ž๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๋ฐ, ํ”„๋ก ํŠธ์—์„œ , addressDetail ๋งŒ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์—๋Š” ์ €์žฅ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ์š”?? ํ”„๋ก ํŠธ์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฒ˜๋ฆฌํ•ด์„œ addressDetail ๋งŒ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒฝ์šฐ๋Š” ์—†์ง€ ์•Š์„๊นŒ ํ•˜๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒ...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ .. ์ด ๋ถ€๋ถ„ ๋‹น์—ฐํžˆ ์ƒ์„ธ ์ฃผ์†Œ๋งŒ ์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์—†์„๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ์ €๋Ÿฐ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„ PMํŒ€์—๊ฒŒ ํ•œ๋ฒˆ ์—ฌ์ญค๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :) ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. (์ถ”๊ฐ€๋กœ ์ƒ์„ธ ์ฃผ์†Œ๋งŒ null๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋„ ์—ฌ์ญค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.)

}

private boolean isBlank(String s) {
return s == null || s.isBlank();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,10 @@ public static Limjang initNote(Member member, LimjangPrice price, LimjangPurpose
.build();
}

public void updateNote(String nickname, LimjangPriceType limjangPriceType, String floor, int pyong) {
this.nickname = nickname;
public void updateNote(String nickname, LimjangPriceType limjangPriceType, String floor, Integer pyong) {
if (nickname != null) {
this.nickname = nickname;
}
this.priceType = limjangPriceType;
this.floor = floor;
this.pyong = pyong;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package umc.th.juinjang.domain.limjang.model;

import java.util.ArrayList;
import java.util.List;

import jakarta.persistence.*;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -57,4 +60,8 @@ public String getPrice(LimjangPriceType priceType, LimjangPurpose purpose) {
}
return null;
}

public static LimjangPrice empty() {
return LimjangPrice.builder().build(); // ๋ชจ๋“  price ํ•„๋“œ null
}
}