diff --git a/api-module/src/main/java/hongik/triple/apimodule/application/analysis/AnalysisService.java b/api-module/src/main/java/hongik/triple/apimodule/application/analysis/AnalysisService.java index 002bc4b..68c0445 100644 --- a/api-module/src/main/java/hongik/triple/apimodule/application/analysis/AnalysisService.java +++ b/api-module/src/main/java/hongik/triple/apimodule/application/analysis/AnalysisService.java @@ -16,6 +16,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; @Service @@ -65,6 +67,7 @@ public AnalysisRes performAnalysis(Member member, MultipartFile multipartFile) { return new AnalysisRes( saveAnalysis.getAnalysisId(), s3Client.getImage(saveAnalysis.getImageUrl()), + formatted(saveAnalysis.getCreatedAt()), saveAnalysis.getIsPublic(), AcneType.valueOf(saveAnalysis.getAcneType()).name(), AcneType.valueOf(saveAnalysis.getAcneType()).getDescription(), @@ -88,6 +91,7 @@ public AnalysisRes getAnalysisDetail(Member member, Long analysisId) { return new AnalysisRes( analysis.getAnalysisId(), s3Client.getImage(analysis.getImageUrl()), + formattedWithTime(analysis.getCreatedAt()), analysis.getIsPublic(), AcneType.valueOf(analysis.getAcneType()).name(), AcneType.valueOf(analysis.getAcneType()).getDescription(), @@ -110,6 +114,7 @@ public MainLogRes getAnalysisListForMainPage() { List analysisList = analyses.stream().map(analysis -> new AnalysisRes( analysis.getAnalysisId(), s3Client.getImage(analysis.getImageUrl()), + formatted(analysis.getCreatedAt()), analysis.getIsPublic(), AcneType.valueOf(analysis.getAcneType()).name(), AcneType.valueOf(analysis.getAcneType()).getDescription(), @@ -154,6 +159,7 @@ public Page getAnalysisPaginationForLogPage(String acneType, Pageab return analysisPage.map(analysis -> new AnalysisRes( analysis.getAnalysisId(), s3Client.getImage(analysis.getImageUrl()), + formatted(analysis.getCreatedAt()), analysis.getIsPublic(), AcneType.valueOf(analysis.getAcneType()).name(), AcneType.valueOf(analysis.getAcneType()).getDescription(), @@ -201,6 +207,7 @@ public Page getAnalysisListForMyPage(Member member, String acneType return analysisPage.map(analysis -> new AnalysisRes( analysis.getAnalysisId(), s3Client.getImage(analysis.getImageUrl()), + formatted(analysis.getCreatedAt()), analysis.getIsPublic(), AcneType.valueOf(analysis.getAcneType()).name(), AcneType.valueOf(analysis.getAcneType()).getDescription(), @@ -214,15 +221,46 @@ public Page getAnalysisListForMyPage(Member member, String acneType /* 피플즈 로그 개별 화면 조회 */ - public AnalysisRes getLogDetail(Long analysisId) { + public AnalysisLogRes getLogDetail(Long analysisId) { // Validation Analysis analysis = analysisRepository.findById(analysisId) .orElseThrow(() -> new IllegalArgumentException("Analysis not found with id: " + analysisId)); + Member member = analysis.getMember(); + // Response + return new AnalysisLogRes( + analysis.getAnalysisId(), + s3Client.getImage(analysis.getImageUrl()), + member.getName(), + member.getSkinType(), + formattedWithTime(analysis.getCreatedAt()), + analysis.getIsPublic(), + AcneType.valueOf(analysis.getAcneType()).name(), + AcneType.valueOf(analysis.getAcneType()).getDescription(), + AcneType.valueOf(analysis.getAcneType()).getCareMethod(), + AcneType.valueOf(analysis.getAcneType()).getGuide(), + analysis.getVideoData(), + analysis.getProductData() + ); + } + + @Transactional + public AnalysisRes updateIsPublic(Member member, AnalysisReq req) { + // Validation + Analysis analysis = analysisRepository.findById(req.analysisId()) + .orElseThrow(() -> new IllegalArgumentException("Analysis not found with id: " + req.analysisId())); + // Analysis가 요청한 사용자의 분석 결과인지 확인 + if(!analysis.getMember().getMemberId().equals(member.getMemberId())) { + throw new IllegalArgumentException("Unauthorized access to analysis with id: " + req.analysisId()); + } + + analysis.updateIsPublic(req.isPublic()); + return new AnalysisRes( analysis.getAnalysisId(), s3Client.getImage(analysis.getImageUrl()), + formattedWithTime(analysis.getCreatedAt()), analysis.getIsPublic(), AcneType.valueOf(analysis.getAcneType()).name(), AcneType.valueOf(analysis.getAcneType()).getDescription(), @@ -232,4 +270,14 @@ public AnalysisRes getLogDetail(Long analysisId) { analysis.getProductData() ); } + + private String formatted(LocalDateTime time) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + return time.format(formatter); + } + + private String formattedWithTime(LocalDateTime time) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + return time.format(formatter); + } } diff --git a/api-module/src/main/java/hongik/triple/apimodule/application/member/MemberService.java b/api-module/src/main/java/hongik/triple/apimodule/application/member/MemberService.java index 8c8c42a..03dd106 100644 --- a/api-module/src/main/java/hongik/triple/apimodule/application/member/MemberService.java +++ b/api-module/src/main/java/hongik/triple/apimodule/application/member/MemberService.java @@ -6,6 +6,8 @@ import hongik.triple.commonmodule.enumerate.MemberType; import hongik.triple.domainmodule.domain.member.Member; import hongik.triple.domainmodule.domain.member.repository.MemberRepository; +import hongik.triple.domainmodule.domain.survey.Survey; +import hongik.triple.domainmodule.domain.survey.repository.SurveyRepository; import hongik.triple.inframodule.oauth.google.GoogleClient; import hongik.triple.inframodule.oauth.google.GoogleProfile; import hongik.triple.inframodule.oauth.google.GoogleToken; @@ -13,15 +15,21 @@ import hongik.triple.inframodule.oauth.kakao.KakaoProfile; import hongik.triple.inframodule.oauth.kakao.KakaoToken; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; + private final SurveyRepository surveyRepository; private final KakaoClient kakaoClient; private final GoogleClient googleClient; private final TokenProvider tokenProvider; @@ -55,6 +63,16 @@ public void logout() { } public MemberRes getProfile(Member member) { + if (member.getSkinType() != null) { + return MemberRes.builder() + .id(member.getMemberId()) + .email(member.getEmail()) + .name(member.getName()) + .skinType(member.getSkinType()) + .surveyTime(getLatestSurvey(member)) + .build(); + } + return MemberRes.builder() .id(member.getMemberId()) .email(member.getEmail()) @@ -99,4 +117,16 @@ public MemberRes register(String email, String nickname, MemberType memberType) .accessToken(accessToken) .build(); } + + private String getLatestSurvey(Member member) { + Page page = surveyRepository + .findByMember_MemberIdOrderByCreatedAtDesc(member.getMemberId(), PageRequest.of(0, 1)); + + return page.hasContent() ? formattedTime(page.getContent().get(0).getCreatedAt()) : null; + } + + private String formattedTime(LocalDateTime time) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + return time.format(formatter); + } } \ No newline at end of file diff --git a/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java b/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java index 2b46476..0523fda 100644 --- a/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java +++ b/api-module/src/main/java/hongik/triple/apimodule/application/survey/SurveyService.java @@ -47,6 +47,7 @@ public SurveyRes registerSurvey(SurveyReq request) { .build(); Survey savedSurvey = surveyRepository.save(survey); + member.updateSkinType(skinType.name()); // 유저 피부타입 세팅 // Response return SurveyRes.builder() diff --git a/api-module/src/main/java/hongik/triple/apimodule/presentation/analysis/AnalysisController.java b/api-module/src/main/java/hongik/triple/apimodule/presentation/analysis/AnalysisController.java index 4d729ff..8b800ba 100644 --- a/api-module/src/main/java/hongik/triple/apimodule/presentation/analysis/AnalysisController.java +++ b/api-module/src/main/java/hongik/triple/apimodule/presentation/analysis/AnalysisController.java @@ -3,6 +3,7 @@ import hongik.triple.apimodule.application.analysis.AnalysisService; import hongik.triple.apimodule.global.common.ApplicationResponse; import hongik.triple.apimodule.global.security.PrincipalDetails; +import hongik.triple.commonmodule.dto.analysis.AnalysisReq; import hongik.triple.commonmodule.dto.analysis.AnalysisRes; import hongik.triple.commonmodule.dto.survey.SurveyRes; import hongik.triple.inframodule.s3.S3Client; @@ -83,6 +84,14 @@ public ApplicationResponse getLogDetail(@PathVariable Long analysisId) { return ApplicationResponse.ok(analysisService.getLogDetail(analysisId)); } + @PatchMapping("/public") + @Operation(summary = "진단 기록의 공개 여부 변경", description = "자신의 진단 기록에 대한 공개 여부를 변경합니다.") + public ApplicationResponse updateIsPublic( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @RequestBody AnalysisReq req) { + return ApplicationResponse.ok(analysisService.updateIsPublic(principalDetails.getMember(), req)); + } + @PostMapping("/image") @Operation(summary = "이미지 업로드", description = "S3에 이미지를 업로드하는 API 입니다. (어드민용)") public ApplicationResponse upload(@RequestPart MultipartFile file, @RequestParam(name = "dir") String dir) { diff --git a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisLogRes.java b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisLogRes.java new file mode 100644 index 0000000..81e489a --- /dev/null +++ b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisLogRes.java @@ -0,0 +1,19 @@ +package hongik.triple.commonmodule.dto.analysis; + +import java.util.List; + +public record AnalysisLogRes( + Long analysisId, + String imageUrl, + String userName, + String userSkinType, + String createdAt, + Boolean isPublic, + String acneType, + String description, + String careMethod, + String guide, + List videoList, + List productList +) { +} diff --git a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisReq.java b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisReq.java index bb40fad..842249e 100644 --- a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisReq.java +++ b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisReq.java @@ -1,4 +1,7 @@ package hongik.triple.commonmodule.dto.analysis; -public record AnalysisReq() { +public record AnalysisReq( + Long analysisId, + Boolean isPublic +) { } diff --git a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisRes.java b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisRes.java index 489a31c..799b2ed 100644 --- a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisRes.java +++ b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisRes.java @@ -5,6 +5,7 @@ public record AnalysisRes( Long analysisId, String imageUrl, + String createdAt, Boolean isPublic, String acneType, String description, diff --git a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/MainLogRes.java b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/MainLogRes.java index ac40632..ed716e6 100644 --- a/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/MainLogRes.java +++ b/common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/MainLogRes.java @@ -1,12 +1,14 @@ package hongik.triple.commonmodule.dto.analysis; +import com.fasterxml.jackson.annotation.JsonProperty; + import java.util.List; public record MainLogRes( - int comedones, - int pustules, - int papules, - int follicultis, + @JsonProperty("COMEDONES") int comedones, + @JsonProperty("PUSTULES") int pustules, + @JsonProperty("PAPULES") int papules, + @JsonProperty("FOLLICULITIS") int follicultis, List analysisRes ) { public static MainLogRes from(int comedones, int pustules, int papules, int follicultis, List analysisRes) { diff --git a/common-module/src/main/java/hongik/triple/commonmodule/dto/member/MemberRes.java b/common-module/src/main/java/hongik/triple/commonmodule/dto/member/MemberRes.java index a1886d9..d8a2322 100644 --- a/common-module/src/main/java/hongik/triple/commonmodule/dto/member/MemberRes.java +++ b/common-module/src/main/java/hongik/triple/commonmodule/dto/member/MemberRes.java @@ -9,6 +9,8 @@ public record MemberRes( Long id, String email, String name, + String skinType, + String surveyTime, String profileImageUrl, String thumbnailImageUrl, String nickname, diff --git a/domain-module/src/main/java/hongik/triple/domainmodule/domain/analysis/Analysis.java b/domain-module/src/main/java/hongik/triple/domainmodule/domain/analysis/Analysis.java index f9b6d00..284ddc8 100644 --- a/domain-module/src/main/java/hongik/triple/domainmodule/domain/analysis/Analysis.java +++ b/domain-module/src/main/java/hongik/triple/domainmodule/domain/analysis/Analysis.java @@ -50,6 +50,9 @@ public class Analysis extends BaseTimeEntity { @Column(name = "product_data", columnDefinition = "json") private List productData; + public void updateIsPublic(Boolean isPublic) { + this.isPublic = isPublic; + } @Builder public Analysis(Member member,