Skip to content
Merged
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
2 changes: 1 addition & 1 deletion common/src/main/java/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class User {
private String nickname;

@Column(nullable = true)
private String location = "창천동";
private String location = "서울특별시 서대문구 창천동";

@Column(nullable = true)
private double latitude = 37.55348;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public enum ErrorCode {
NOT_FOUND_HOUSE(40401, "존재하지 않는 매물 ID 입니다."),
HOUSE_NOT_FOUND(40402, "존재하지 않는 매물입니다."),
ROOM_NOT_FOUND(40403, "존재하지 않는 방입니다."),
USER_NOT_FOUND(40404, "존재하지 않는 유저입니다."),

//405 Method Not Allowed
METHOD_NOT_ALLOWED(40500, "해당 요청은 지원되지 않습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import server.producer.domain.dto.response.*;
import server.producer.domain.service.UserService;
import server.producer.security.jwt.JwtTokenProvider;
import server.producer.security.jwt.RefreshTokenRepository;

import java.security.InvalidParameterException;

Expand All @@ -20,13 +21,17 @@
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
private final JwtTokenProvider jwtTokenProvider;
private final RefreshTokenRepository refreshTokenRepository;

@GetMapping("/home")
public ApiResponseDto<HomeInfoResponseDto> getUserHomeInfo(HttpServletRequest request) {
try {
Long userId = SecurityUtil.getCurrentUserId();
HomeInfoResponseDto userHomeInfo = userService.getUserInfoAndRecentlyViewedHouse(userId);
return ApiResponseDto.success(SuccessCode.MAIN_PAGE_GET_SUCCESS, userHomeInfo);
} catch (EntityNotFoundException e) {
return ApiResponseDto.fail(ErrorCode.USER_NOT_FOUND);
} catch (InvalidParameterException e) {
return ApiResponseDto.fail(ErrorCode.INVALID_PARAMETER); // userId가 유효하지 않은 경우
} catch (Exception e) {
Expand Down Expand Up @@ -131,10 +136,30 @@ public ApiResponseDto<GenderUpdateResponseDto> updateGender(@RequestBody GenderU
}

@DeleteMapping("/delete")
public ApiResponseDto<Void> deleteUser() {
public ApiResponseDto<Void> deleteUser(@RequestHeader("Authorization") String refreshTokenHeader) {
try {
Long userId = SecurityUtil.getCurrentUserId();
if (refreshTokenHeader == null || !refreshTokenHeader.startsWith("Bearer ")) {
return ApiResponseDto.fail(ErrorCode.MISSING_REQUIRED_HEADER);
}
String refreshToken = refreshTokenHeader.substring(7);

// 1. 토큰 유효성 검사
if (!jwtTokenProvider.validateToken(refreshToken)) {
return ApiResponseDto.fail(ErrorCode.INVALID_REFRESH_TOKEN);
}

// 2. 토큰 저장소에서 userId 조회
Long userId = refreshTokenRepository.findUserIdByToken(refreshToken).orElse(null);
if (userId == null) {
return ApiResponseDto.fail(ErrorCode.INVALID_REFRESH_TOKEN);
}

// 3. 토큰 삭제
refreshTokenRepository.deleteByToken(refreshToken);

// 4. 유저 삭제
userService.deleteUser(userId);

return ApiResponseDto.success(SuccessCode.USER_DELETE_SUCCESS, null);
} catch (EntityNotFoundException e) {
return ApiResponseDto.fail(ErrorCode.INVALID_PARAMETER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public SocialLoginResponseDto loginOrSignup(String provider, String accessToken)
.socialType(userInfo.getProvider())
.email(userInfo.getEmail())
.nickname(userInfo.getNickname())
.location("서울특별시 서대문구 창천동")
.build();
return userRepository.save(created);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import entity.*;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;
Expand All @@ -22,6 +24,7 @@
import java.util.stream.Collectors;

@Service
@Slf4j
@RequiredArgsConstructor
public class UserService {

Expand All @@ -44,22 +47,31 @@ public HomeInfoResponseDto getUserInfoAndRecentlyViewedHouse(Long userId) {

for (RecentlyViewedHouse rvh : houses) {
House house = rvh.getHouse();
final boolean isPinned = house.getPins().stream()
.anyMatch(pin -> pin.getUser().getId().equals(userId));
HomeInfoResponseDto.RecentlyViewedHouseDto dto = new HomeInfoResponseDto.RecentlyViewedHouseDto(
house.getId(),
house.calculateMonthlyRent(),
house.calculateDeposit(),
house.calculateOccupancyType(),
house.getLocation(),
house.getGenderPolicy().toString(),
house.getLocationDescription(),
isPinned,
house.getMoodTag(),
house.getContractTerm(),
house.getMainImgUrl()
);
recentlyViewedHouseDtos.add(dto);
if (house == null) {
log.warn("RecentlyViewedHouse 변환 중 예외 발생: {}", "house is null");
continue;
}
try {
final boolean isPinned = house.getPins() != null && house.getPins().stream()
.anyMatch(pin -> pin.getUser() != null && pin.getUser().getId().equals(userId));
HomeInfoResponseDto.RecentlyViewedHouseDto dto = new HomeInfoResponseDto.RecentlyViewedHouseDto(
house.getId(),
house.calculateMonthlyRent(),
house.calculateDeposit(),
house.calculateOccupancyType(),
house.getLocation(),
house.getGenderPolicy() != null ? house.getGenderPolicy().toString() : null,
house.getLocationDescription(),
isPinned,
house.getMoodTag(),
house.getContractTerm(),
house.getMainImgUrl()
);
recentlyViewedHouseDtos.add(dto);
} catch (Exception e) {
log.warn("RecentlyViewedHouse 변환 중 예외 발생: {}", e.getMessage());
continue;
}
}
return new HomeInfoResponseDto(nickname, location, recentlyViewedHouseDtos);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,17 @@ public Long getUserId(String token) {
.parseClaimsJws(token)
.getBody();

return claims.get("userId", Long.class);
Object userId = claims.get("userId");
if (userId instanceof Integer) {
return ((Integer) userId).longValue();
}
if (userId instanceof Long) {
return (Long) userId;
}
if (userId instanceof String) {
return Long.parseLong((String) userId);
}
throw new RuntimeException("userId 타입이 올바르지 않습니다: " + userId.getClass());
}

private String createToken(User user, long validity) {
Expand Down