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
7 changes: 5 additions & 2 deletions src/main/java/Devroup/hidaddy/controller/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import Devroup.hidaddy.dto.auth.LogoutRequest;
import Devroup.hidaddy.dto.auth.RefreshTokenRequest;
import Devroup.hidaddy.repository.auth.RefreshTokenRepository;
import Devroup.hidaddy.repository.user.UserRepository;
import Devroup.hidaddy.security.UserDetailsImpl;
import Devroup.hidaddy.service.AuthService;
import Devroup.hidaddy.service.UserService;
Expand Down Expand Up @@ -38,6 +39,7 @@ public class AuthController {
private final RefreshTokenRepository refreshTokenRepository;
private final UserService userService;
private final AuthService authService;
private final UserRepository userRepository;

@Operation(
summary = "Access Token μž¬λ°œκΈ‰",
Expand All @@ -55,7 +57,7 @@ public ResponseEntity<?> refreshAccessToken(
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("μœ νš¨ν•˜μ§€ μ•Šκ±°λ‚˜ 만료된 λ¦¬ν”„λ ˆμ‹œ 토큰");
}

User user = foundToken.getUser();
User user = userRepository.findById(foundToken.getUser().getId()).orElseThrow();
String newAccessToken = jwtUtil.createAccessToken(user);

return ResponseEntity.ok(Map.of(
Expand Down Expand Up @@ -88,13 +90,14 @@ public ResponseEntity<?> oauth2Callback(
? authService.getNaverEmail(accessToken)
: JwtUtil.decodeClaim(idToken, "email");

Map<String, String> tokens = userService.saveOrLoginUser(
Map<String, Object> tokens = userService.saveOrLoginUser(
null, email, null, null, provider.toUpperCase(), socialId
);

return ResponseEntity.ok(Map.of(
"accessToken", tokens.get("accessToken"),
"refreshToken", tokens.get("refreshToken"),
"signed", !(Boolean) tokens.get("isNewUser"), // κΈ°μ‘΄ μœ μ €λ©΄ true
"message", "둜그인 성곡"
));
} catch (Exception e) {
Expand Down
21 changes: 6 additions & 15 deletions src/main/java/Devroup/hidaddy/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package Devroup.hidaddy.controller;

import Devroup.hidaddy.dto.user.*;
import Devroup.hidaddy.entity.Baby;
import Devroup.hidaddy.entity.User;
import Devroup.hidaddy.security.UserDetailsImpl;
import Devroup.hidaddy.service.BabyService;
import Devroup.hidaddy.service.UserService;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation;
Expand All @@ -18,7 +15,6 @@
import org.springframework.web.bind.annotation.*;
import io.swagger.v3.oas.annotations.tags.Tag;

import java.time.LocalDate;
import java.util.List;

@Tag(
Expand Down Expand Up @@ -136,28 +132,23 @@ public ResponseEntity<BabyResponse> getBaby(
}

// μ•„κΈ° μˆ˜μ • (이름, λ‚ μ§œ, 이미지)
@PatchMapping(value = "/baby/{babyId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "μ•„κΈ° 정보 μˆ˜μ • (JSON + 이미지 Multipart)", description = "μ§€μ •λœ μ•„κΈ°μ˜ 이름, μΆœμ‚° μ˜ˆμ •μΌ, ν”„λ‘œν•„ 이미지 등을 μˆ˜μ •ν•©λ‹ˆλ‹€.")
@PatchMapping("/baby/{babyId}")
@Operation(summary = "μ•„κΈ° 정보 μˆ˜μ •", description = "μ§€μ •λœ μ•„κΈ°μ˜ 이름, μΆœμ‚° μ˜ˆμ •μΌ 등을 μˆ˜μ •ν•©λ‹ˆλ‹€.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "μˆ˜μ • 성곡"),
@ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­")
@ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­"),
@ApiResponse(responseCode = "401", description = "μΈμ¦λ˜μ§€ μ•Šμ€ μ‚¬μš©μž (둜그인 ν•„μš”)")
})
public ResponseEntity<BabyResponse> updateBaby(
@PathVariable Long babyId,
@RequestParam("name") String name,
@RequestParam("dueDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate dueDate,
@RequestPart(value = "image", required = false) MultipartFile image,
@RequestBody BabyUpdateRequest dto,
@AuthenticationPrincipal UserDetailsImpl userDetails
) {
if (userDetails == null) {
return ResponseEntity.status(401).build();
}

BabyUpdateRequest dto = new BabyUpdateRequest();
dto.setName(name);
dto.setDueDate(dueDate);

BabyResponse response = babyService.updateBaby(userDetails.getUser(), babyId, dto, image);
BabyResponse response = babyService.updateBaby(userDetails.getUser(), babyId, dto);
return ResponseEntity.ok(response);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package Devroup.hidaddy.dto.user;

import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.time.LocalDateTime;
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/Devroup/hidaddy/dto/user/BabyResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@ public class BabyResponse {
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") // λ‚ μ§œ 포맷 μ§€μ •
private LocalDate dueDate;
private String profileImage;

public BabyResponse(Baby baby) {
this.id = baby.getId();
this.name = baby.getName();
this.dueDate = baby.getDueDate().toLocalDate();
this.profileImage = baby.getBabyImageUrl(); // 있으면 κ°€μ Έμ˜€κΈ°
}
}
21 changes: 4 additions & 17 deletions src/main/java/Devroup/hidaddy/service/BabyService.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public BabyResponse getBaby(User user, Long babyId) {

// μ•„κΈ° μˆ˜μ •
@Transactional
public BabyResponse updateBaby(User user, Long babyId, BabyUpdateRequest dto, MultipartFile image) {
public BabyResponse updateBaby(User user, Long babyId, BabyUpdateRequest dto) {
Baby baby = babyRepository.findById(babyId)
.orElseThrow(() -> new IllegalArgumentException("ν•΄λ‹Ή μ•„κΈ°λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."));

Expand All @@ -58,19 +58,6 @@ public BabyResponse updateBaby(User user, Long babyId, BabyUpdateRequest dto, Mu
if (dto.getName() != null) baby.setName(dto.getName());
if (dto.getDueDate() != null) baby.setDueDate(dto.getDueDate().atStartOfDay());

if (image != null && !image.isEmpty()) {
// κΈ°μ‘΄ 이미지 μ‚­μ œ
if (baby.getBabyImageUrl() != null && !baby.getBabyImageUrl().isEmpty()) {
String imageKey = baby.getBabyImageUrl().replace(cloudFrontDomain + "/", "");
s3Uploader.delete(imageKey);
}

// μƒˆ 이미지 μ—…λ‘œλ“œ
String imageUrl = s3Uploader.upload(image, "baby-profile");
imageUrl = cloudFrontDomain + "/" + imageUrl;
baby.setBabyImageUrl(imageUrl);
}

return new BabyResponse(babyRepository.save(baby));
}

Expand All @@ -85,11 +72,11 @@ public void deleteBaby(User user, Long babyId) {
}

@Transactional
public BabyResponse registerBabyBasic(BabyBasicRegisterRequest request, User user) {
public BabyResponse registerBabyBasic(BabyBasicRegisterRequest dto, User user) {
// μ•„κΈ° 생성
Baby baby = Baby.builder()
.name(request.getBabyName())
.dueDate(request.getParsedDueDate())
.name(dto.getBabyName())
.dueDate(dto.getParsedDueDate())
.user(user)
.build();

Expand Down
33 changes: 18 additions & 15 deletions src/main/java/Devroup/hidaddy/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

@Service
@RequiredArgsConstructor
Expand All @@ -30,22 +31,19 @@ public class UserService {
private String cloudFrontDomain;

public void registerBaby(BabyRegisterRequest dto, User user) {
// 1. μœ μ € 이름 μ—…λ°μ΄νŠΈ
// μœ μ € 이름 μ—…λ°μ΄νŠΈ
user.setName(dto.getUserName());

// 2. dueDate νŒŒμ‹±
LocalDateTime dueDate = dto.getParsedDueDate();

// 3. μ•„κΈ° 생성
// μ•„κΈ° 생성
Baby baby = Baby.builder()
.name(dto.getBabyName())
.dueDate(dueDate)
.dueDate(dto.getParsedDueDate())
.user(user)
.build();

babyRepository.save(baby);

// 4. μ„ νƒλœ μ•„κΈ° ID μ„€μ •
// μ„ νƒλœ μ•„κΈ° ID μ„€μ •
user.setSelectedBabyId(baby.getId());
userRepository.save(user);
}
Expand Down Expand Up @@ -76,9 +74,11 @@ public void changeUserName(User user, String userName) {
private final RefreshTokenRepository refreshTokenRepository;
private final JwtUtil jwtUtil;

public Map<String, String> saveOrLoginUser(String name, String email, String phone,
public Map<String, Object> saveOrLoginUser(String name, String email, String phone,
String partnerPhone, String loginType, String socialId) {

AtomicBoolean isNewUser = new AtomicBoolean(false);

// μœ μ € 쑰회 λ˜λŠ” 생성
User user = userRepository.findBySocialIdAndLoginType(socialId, loginType)
.orElseGet(() -> {
Expand All @@ -89,7 +89,8 @@ public Map<String, String> saveOrLoginUser(String name, String email, String pho
newUser.setPartnerPhone(partnerPhone);
newUser.setLoginType(loginType);
newUser.setSocialId(socialId);
newUser.setProfileImageUrl(cloudFrontDomain + "/profile/default_image.svg"); // κΈ°λ³Έ ν”„λ‘œν•„ 이미지 URL μ„€μ •
newUser.setProfileImageUrl(cloudFrontDomain + "/profile/default_image.svg");
isNewUser.set(true);
return userRepository.save(newUser);
});

Expand All @@ -98,7 +99,7 @@ public Map<String, String> saveOrLoginUser(String name, String email, String pho
String refreshTokenStr = jwtUtil.createRefreshToken();
LocalDateTime expiredAt = LocalDateTime.now().plusDays(365);

// RefreshToken DB에 μ €μž₯ (κΈ°μ‘΄ 쑴재 여뢀에 따라 λΆ„κΈ°)
// RefreshToken DB μ €μž₯ λ˜λŠ” κ°±μ‹ 
RefreshToken existing = refreshTokenRepository.findByUser(user).orElse(null);
if (existing != null) {
existing.updateToken(refreshTokenStr, expiredAt);
Expand All @@ -108,11 +109,13 @@ public Map<String, String> saveOrLoginUser(String name, String email, String pho
refreshTokenRepository.save(refreshToken);
}

// μ‘λ‹΅μœΌλ‘œ 전달할 토큰듀
Map<String, String> tokens = new HashMap<>();
tokens.put("accessToken", accessToken);
tokens.put("refreshToken", refreshTokenStr);
return tokens;
// 응닡 데이터 ꡬ성
Map<String, Object> response = new HashMap<>();
response.put("accessToken", accessToken);
response.put("refreshToken", refreshTokenStr);
response.put("isNewUser", isNewUser.get()); // true = 처음 κ°€μž…ν•œ μœ μ €

return response;
}

@Transactional
Expand Down