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
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/internal-api/model")
@RequestMapping("${service-api.ai}")
public class AiInternalController {
private final AiInternalService aiInternalService;
private final MemberRepository memberRepository;
Expand Down Expand Up @@ -75,7 +75,6 @@ public ResponseEntity<ApiResponse<String>> saveRecommendations(@RequestBody Map<
recommendationService.save(dto);
return ApiResponse.success(HttpStatus.OK, "예측 결과를 성공적으로 저장했습니다.");
} catch (CustomException e) {
log.error("커스텀 예외 발생: {}", e.getMessage(), e);
return ResponseEntity
.status(e.getHttpStatus())
.body(ApiResponse.fail(e));
Expand Down Expand Up @@ -115,35 +114,4 @@ private Map<String, String> encryptPredictionData(List<AiPredictionRequestDto> d
return null;
}
}

// TODO : 암/복호화 API 연결 이후 아래 코드 삭제
// @PostMapping("/prediction")
// public ResponseEntity<List<AiPredictionRequestDto>> sendAllUsersPredictionData() {
// try {
// List<Member> members = memberRepository.findAllByIsDeletedFalse();
//
// List<AiPredictionRequestDto> allDtos = members.stream()
// .filter(member -> member.getCloset() != null)
// .map(aiInternalService::makePredictRequest)
// .collect(Collectors.toList());
//
// return ResponseEntity.ok(allDtos);
// } catch (Exception e) {
// log.error(e.getMessage());
// }
// return null;
// }
//
// @PostMapping("/recommendation")
// public ResponseEntity<ApiResponse<String>> saveRecommendations(@RequestBody ModelClothingRecommendationDto dto) {
// recommendationService.save(dto);
// return ApiResponse.success(HttpStatus.OK, "예측 결과를 성공적으로 저장했습니다.");
// }
//
// @PostMapping("/history")
// public ResponseEntity<ApiResponse<List<RecordForModelDto>>> getSimilarHistory(@RequestBody HistoryRequestDto dto) {
// dto.validate();
// List<RecordForModelDto> result = recordCalendarService.getMemberHistory(dto);
// return ApiResponse.success(HttpStatus.OK, result);
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,51 +40,6 @@ public class ModelSchedular {
@Value("${ai.server.url}")
private String aiServerUrl;

/**
* 매일 새벽 5시에 모델 서버로 예측에 필요한 데이터를 평문 형태로 전송합니다.
*/
// @Transactional
// @Scheduled(cron = "0 0 5 * * *")
// public void pushPredictionDataToAiServer() {
// try {
// List<Member> members = memberRepository.findAllByIsDeletedFalse();
//
// List<AiPredictionRequestDto> allDtos = members.stream()
// .filter(member -> member.getCloset() != null)
// .map(member -> {
// try {
// return aiInternalService.makePredictRequest(member);
// } catch (Exception e) {
// log.error("멤버 {} 예측 데이터 생성 실패: {}", member.getId(), e.getMessage());
// return null;
// }
// })
// .filter(Objects::nonNull)
// .collect(Collectors.toList());
//
// if (allDtos.isEmpty()) {
// log.info("AI 서버로 전송할 데이터가 없습니다.");
// return;
// }
//
// HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.APPLICATION_JSON);
//
// HttpEntity<List<AiPredictionRequestDto>> requestEntity = new HttpEntity<>(allDtos, headers);
// ResponseEntity<String> response = restTemplate.postForEntity(aiServerUrl, requestEntity, String.class);
//
// if (response.getStatusCode().is2xxSuccessful()) {
// log.info("AI 서버에 예측 데이터 전송 완료. 응답: {}", response.getStatusCode());
// } else {
// log.warn("AI 서버 응답 실패. 상태코드: {}, 응답본문: {}", response.getStatusCode(), response.getBody());
// }
//
// } catch (Exception e) {
// log.error("AI 서버 전송 실패", e);
// }
// }


/**
* 매일 새벽 5시에 모델 서버로 예측에 필요한 데이터를 암호화된 형태로 전송합니다.
*/
Expand Down Expand Up @@ -113,7 +68,6 @@ public void pushPredictionAESDataToAiServer() {
}

Map<String, String> encrypted = encryptPredictionData(allDtos);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(encrypted, headers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ private RecommendPredictDto makeResultForPredict(Closet closet, ClothingRecommen
throw new CustomException(ErrorCode.UNKNOWN_ERROR, "예측 데이터를 변환하는 중 오류가 발생하였습니다: " + e.getMessage());
}
}
// TODO : AI 학습 이후 사용자가 대량으로 의상을 삭제해서 추천할 의상이 없어져버리는 경우에 대한 고민이 필요해보임.

private List<Integer> makeOuterList(Closet closet, List<Integer> outers) {
if (outers.isEmpty()) return new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.howWeather.howWeather_backend.domain.closet.api;

import com.howWeather.howWeather_backend.domain.closet.service.ClothService;
import com.howWeather.howWeather_backend.domain.closet.service.ClothImageService;
import com.howWeather.howWeather_backend.domain.member.entity.Member;
import com.howWeather.howWeather_backend.global.Response.ApiResponse;
import com.howWeather.howWeather_backend.global.jwt.CheckAuthenticatedUser;
Expand All @@ -16,14 +16,14 @@
@RequiredArgsConstructor
@RequestMapping("/api/cloth")
public class ClothController {
private final ClothService clothService;
private final ClothImageService clothImageService;

@GetMapping("/upper-image/{clothType}")
@CheckAuthenticatedUser
public ResponseEntity<ApiResponse<String>> upperImage(@RequestHeader("Authorization") String accessTokenHeader,
@AuthenticationPrincipal Member member,
@PathVariable("clothType") int clothType) {
String url = clothService.getUpperImage(clothType);
String url = clothImageService.getUpperImage(clothType);
return ApiResponse.success(HttpStatus.OK, url);
}

Expand All @@ -32,7 +32,7 @@ public ResponseEntity<ApiResponse<String>> upperImage(@RequestHeader("Authorizat
public ResponseEntity<ApiResponse<String>> outerImage(@RequestHeader("Authorization") String accessTokenHeader,
@AuthenticationPrincipal Member member,
@PathVariable("clothType") int clothType) {
String url = clothService.getOuterImage(clothType);
String url = clothImageService.getOuterImage(clothType);
return ApiResponse.success(HttpStatus.OK, url);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ public class ClosetService {
private static final Long MAX_UPPER_ID = 9L;
private static final String UPPER = "uppers";
private static final String OUTER = "outers";
private final List<Long> layerFlexibleUpper = new ArrayList<>(List.of(9L)); // 아우터로 할 수 있는 상의
private final List<Long> layerFlexibleOuter = new ArrayList<>(List.of(3L)); // 상의로 할 수 있는 아우터


@Transactional
Expand Down Expand Up @@ -71,14 +69,11 @@ private void addUpperClothes(Closet closet, List<ClothRegisterDto> uppers) {
for (ClothRegisterDto c : uppers) {
validateClothDto(c, UPPER);

boolean isLayerFlexible = layerFlexibleUpper.contains(c.getClothType());

Upper newUpper = Upper.builder()
.upperType(c.getClothType())
.color(c.getColor())
.thickness(c.getThickness())
.isActive(true)
.isLayerFlexible(isLayerFlexible)
.build();

boolean isDuplicate = closet.getUpperList().stream()
Expand All @@ -94,14 +89,11 @@ private void addOuterClothes(Closet closet, List<ClothRegisterDto> outers) {
for (ClothRegisterDto c : outers) {
validateClothDto(c, OUTER);

boolean isLayerFlexible = layerFlexibleOuter.contains(c.getClothType());

Outer newOuter = Outer.builder()
.outerType(c.getClothType())
.color(c.getColor())
.thickness(c.getThickness())
.isActive(true)
.isLayerFlexible(isLayerFlexible)
.build();

boolean isDuplicate = closet.getOuterList().stream()
Expand Down Expand Up @@ -205,7 +197,6 @@ public ClothListDto getUppers(Member member) {
} catch (Exception e) {
throw new CustomException(ErrorCode.UNKNOWN_ERROR, "아우터 조회 중 서버 오류가 발생했습니다.");
}

}

@Transactional(readOnly = true)
Expand All @@ -219,34 +210,6 @@ public ClothListDto getOuters(Member member) {
}
}

@Transactional(readOnly = true)
public ClothListDto findLayerFlexibleOuters(Member member) { // 상의가 될 수 있는 아우터
Closet closet = getCloset(member);

return findLayerFlexibleClothes(
OUTER,
closet.getOuterList(),
layerFlexibleOuter,
Outer::isActive,
Outer::getOuterType,
this::mapOuterToDto
);
}

@Transactional(readOnly = true)
public ClothListDto findLayerFlexibleUppers(Member member) { // 아우터가 될 수 있는 상의
Closet closet = getCloset(member);

return findLayerFlexibleClothes(
UPPER,
closet.getUpperList(),
layerFlexibleUpper,
Upper::isActive,
Upper::getUpperType,
this::mapUpperToDto
);
}

@Transactional
public void updateUpper(Long clothId, UpdateClothDto updateDto, Member member) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
@Service
@Slf4j
@AllArgsConstructor
public class ClothService {
public class ClothImageService {
private final ClothRepository clothRepository;

@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
import com.howWeather.howWeather_backend.domain.member.dto.ProfileDto;
import com.howWeather.howWeather_backend.domain.member.dto.RegionDto;
import com.howWeather.howWeather_backend.domain.member.entity.Member;
import com.howWeather.howWeather_backend.domain.member.repository.MemberRepository;
import com.howWeather.howWeather_backend.domain.member.service.AuthService;
import com.howWeather.howWeather_backend.domain.member.service.MyAccountService;
import com.howWeather.howWeather_backend.global.Response.ApiResponse;
import com.howWeather.howWeather_backend.global.jwt.CheckAuthenticatedUser;
import lombok.RequiredArgsConstructor;
Expand All @@ -23,13 +22,13 @@
@RequiredArgsConstructor
@RequestMapping("/api/mypage")
public class MyAccountController {
private final AuthService authService;
private final MyAccountService myAccountService;

@GetMapping("/profile")
@CheckAuthenticatedUser
public ResponseEntity<ProfileDto> getProfile(@RequestHeader("Authorization") String accessTokenHeader,
@AuthenticationPrincipal Member member) {
ProfileDto profile = authService.getProfile(member);
ProfileDto profile = myAccountService.getProfile(member);
return ResponseEntity.ok(profile);
}

Expand All @@ -38,7 +37,7 @@ public ResponseEntity<ProfileDto> getProfile(@RequestHeader("Authorization") Str
public ResponseEntity<ApiResponse<String>> updateGender(@RequestHeader("Authorization") String accessTokenHeader,
@RequestBody ProfileChangeIntDto profileChangeDto,
@AuthenticationPrincipal Member member) {
authService.updateGender(member, profileChangeDto);
myAccountService.updateGender(member, profileChangeDto);
return ApiResponse.success(HttpStatus.OK, "성별을 성공적으로 수정하였습니다.");
}

Expand All @@ -47,7 +46,7 @@ public ResponseEntity<ApiResponse<String>> updateGender(@RequestHeader("Authoriz
public ResponseEntity<ApiResponse<String>> updateAgeGroup(@RequestHeader("Authorization") String accessTokenHeader,
@RequestBody ProfileChangeIntDto profileChangeDto,
@AuthenticationPrincipal Member member) {
authService.updateAgeGroup(member, profileChangeDto);
myAccountService.updateAgeGroup(member, profileChangeDto);
return ApiResponse.success(HttpStatus.OK, "연령대를 성공적으로 수정하였습니다.");
}

Expand All @@ -56,7 +55,7 @@ public ResponseEntity<ApiResponse<String>> updateAgeGroup(@RequestHeader("Author
public ResponseEntity<ApiResponse<String>> updateNickname(@RequestHeader("Authorization") String accessTokenHeader,
@Valid @RequestBody NicknameDto nicknameDto,
@AuthenticationPrincipal Member member) {
authService.updateNickname(member,nicknameDto);
myAccountService.updateNickname(member,nicknameDto);
return ApiResponse.success(HttpStatus.OK, "닉네임을 성공적으로 수정하였습니다.");
}

Expand All @@ -65,15 +64,15 @@ public ResponseEntity<ApiResponse<String>> updateNickname(@RequestHeader("Author
public ResponseEntity<ApiResponse<String>> updateConstitution(@RequestHeader("Authorization") String accessTokenHeader,
@Valid @RequestBody ProfileChangeIntDto profileChangeDto,
@AuthenticationPrincipal Member member) {
authService.updateConstitution(member, profileChangeDto);
myAccountService.updateConstitution(member, profileChangeDto);
return ApiResponse.success(HttpStatus.OK, "체질을 성공적으로 수정하였습니다.");
}

@GetMapping("/location")
@CheckAuthenticatedUser
public ResponseEntity<ApiResponse<String>> getLocation(@RequestHeader("Authorization") String accessTokenHeader,
@AuthenticationPrincipal Member member) {
String location = authService.getLoccation(member);
String location = myAccountService.getLoccation(member);
return ApiResponse.success(HttpStatus.OK, location);
}

Expand All @@ -82,7 +81,7 @@ public ResponseEntity<ApiResponse<String>> getLocation(@RequestHeader("Authoriza
public ResponseEntity<ApiResponse<String>> updateLocation(@RequestHeader("Authorization") String accessTokenHeader,
@Valid @RequestBody RegionDto regionDto,
@AuthenticationPrincipal Member member) {
authService.updateLocation(member, regionDto);
myAccountService.updateLocation(member, regionDto);
return ApiResponse.success(HttpStatus.OK, "지역을 성공적으로 수정하였습니다.");
}
}
Loading
Loading