From bf27c4d4361628d00c96654f8725037395fe435b Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 00:51:28 +0900 Subject: [PATCH 1/7] =?UTF-8?q?hotfix(profile):=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=94=BC=EB=B6=80=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=B0=8F=20=EC=B5=9C=EA=B7=BC=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=EC=9D=BC=20=EC=9D=91=EB=8B=B5=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberService.java | 30 +++++++++++++++++++ .../commonmodule/dto/member/MemberRes.java | 2 ++ 2 files changed, 32 insertions(+) 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/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, From fda4f332b675b6b2992d03ffef69fece89492cca Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 01:08:27 +0900 Subject: [PATCH 2/7] =?UTF-8?q?hotfix(survey):=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=EC=A1=B0=EC=82=AC=20=EC=A0=9C=EC=B6=9C=20=EC=8B=9C=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=9D=98=20=ED=94=BC=EB=B6=80=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../triple/apimodule/application/survey/SurveyService.java | 1 + 1 file changed, 1 insertion(+) 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() From 70fb3251abd2db9d9cc2da470a24368cfdd407c0 Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 01:30:32 +0900 Subject: [PATCH 3/7] =?UTF-8?q?hotfix(analysis):=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=EC=9D=BC=20=EC=8B=9C=EA=B0=84=20=EC=9D=91=EB=8B=B5=EA=B0=92=20?= =?UTF-8?q?=EB=B0=8F=20=EC=8B=9C=EA=B0=84=20=ED=8F=AC=EB=A7=B7=ED=8C=85=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/analysis/AnalysisService.java | 18 ++++++++++++++++++ .../commonmodule/dto/analysis/AnalysisRes.java | 1 + 2 files changed, 19 insertions(+) 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..ec57c2b 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(), @@ -223,6 +230,7 @@ public AnalysisRes getLogDetail(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(), @@ -232,4 +240,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/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, From 47951774a10c09f9c7fcb2224923892e3255c45e Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 01:50:51 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat(analysis):=20=EA=B3=B5=EA=B0=9C=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=EA=B2=B0=EC=A0=95=20API=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/analysis/AnalysisService.java | 26 +++++++++++++++++++ .../analysis/AnalysisController.java | 8 ++++++ .../dto/analysis/AnalysisReq.java | 5 +++- .../domain/analysis/Analysis.java | 3 +++ 4 files changed, 41 insertions(+), 1 deletion(-) 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 ec57c2b..f374e78 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 @@ -241,6 +241,32 @@ public AnalysisRes getLogDetail(Long analysisId) { ); } + @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(), + AcneType.valueOf(analysis.getAcneType()).getCareMethod(), + AcneType.valueOf(analysis.getAcneType()).getGuide(), + analysis.getVideoData(), + analysis.getProductData() + ); + } + private String formatted(LocalDateTime time) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); return time.format(formatter); 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..c806323 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,13 @@ public ApplicationResponse getLogDetail(@PathVariable Long analysisId) { return ApplicationResponse.ok(analysisService.getLogDetail(analysisId)); } + @PatchMapping("/public") + 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/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/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, From fc5532ba9ee740dec9cc4ed35b2efd12b9933a76 Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 02:00:27 +0900 Subject: [PATCH 5/7] =?UTF-8?q?hotfix(analysis):=20=ED=94=BC=ED=94=8C?= =?UTF-8?q?=EC=A6=88=EB=A1=9C=EA=B7=B8=20=EA=B0=9C=EB=B3=84=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=9C=A0=EC=A0=80=EB=AA=85,=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=ED=94=BC=EB=B6=80=ED=83=80=EC=9E=85=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/analysis/AnalysisService.java | 8 ++++++-- .../dto/analysis/AnalysisLogRes.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 common-module/src/main/java/hongik/triple/commonmodule/dto/analysis/AnalysisLogRes.java 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 f374e78..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 @@ -221,15 +221,19 @@ 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 AnalysisRes( + return new AnalysisLogRes( analysis.getAnalysisId(), s3Client.getImage(analysis.getImageUrl()), + member.getName(), + member.getSkinType(), formattedWithTime(analysis.getCreatedAt()), analysis.getIsPublic(), AcneType.valueOf(analysis.getAcneType()).name(), 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 +) { +} From fb3a6691acd46b4e6618f35921ae59857e70b1ce Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 20:37:55 +0900 Subject: [PATCH 6/7] =?UTF-8?q?chore(analysis):=20=EC=8A=A4=EC=9B=A8?= =?UTF-8?q?=EA=B1=B0=20description=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apimodule/presentation/analysis/AnalysisController.java | 1 + 1 file changed, 1 insertion(+) 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 c806323..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 @@ -85,6 +85,7 @@ public ApplicationResponse getLogDetail(@PathVariable Long analysisId) { } @PatchMapping("/public") + @Operation(summary = "진단 기록의 공개 여부 변경", description = "자신의 진단 기록에 대한 공개 여부를 변경합니다.") public ApplicationResponse updateIsPublic( @AuthenticationPrincipal PrincipalDetails principalDetails, @RequestBody AnalysisReq req) { From 80b6ececf010a1286809046aeff6d5820dad8d0a Mon Sep 17 00:00:00 2001 From: sseuldev Date: Sun, 23 Nov 2025 20:42:52 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix(analysis):=20=EC=97=AC=EB=93=9C?= =?UTF-8?q?=EB=A6=84=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EA=B0=92=20=EB=8C=80=EB=AC=B8=EC=9E=90=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../triple/commonmodule/dto/analysis/MainLogRes.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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) {