Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(),
Expand All @@ -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(),
Expand All @@ -110,6 +114,7 @@ public MainLogRes getAnalysisListForMainPage() {
List<AnalysisRes> 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(),
Expand Down Expand Up @@ -154,6 +159,7 @@ public Page<AnalysisRes> 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(),
Expand Down Expand Up @@ -201,6 +207,7 @@ public Page<AnalysisRes> 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(),
Expand All @@ -214,15 +221,46 @@ public Page<AnalysisRes> 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(),
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,30 @@
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;
import hongik.triple.inframodule.oauth.kakao.KakaoClient;
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;
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -99,4 +117,16 @@ public MemberRes register(String email, String nickname, MemberType memberType)
.accessToken(accessToken)
.build();
}

private String getLatestSurvey(Member member) {
Page<Survey> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public SurveyRes registerSurvey(SurveyReq request) {
.build();

Survey savedSurvey = surveyRepository.save(survey);
member.updateSkinType(skinType.name()); // 유저 피부타입 세팅

// Response
return SurveyRes.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<YoutubeVideoDto> videoList,
List<NaverProductDto> productList
) {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
package hongik.triple.commonmodule.dto.analysis;

public record AnalysisReq() {
public record AnalysisReq(
Long analysisId,
Boolean isPublic
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
public record AnalysisRes(
Long analysisId,
String imageUrl,
String createdAt,
Boolean isPublic,
String acneType,
String description,
Expand Down
Original file line number Diff line number Diff line change
@@ -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> analysisRes
) {
public static MainLogRes from(int comedones, int pustules, int papules, int follicultis, List<AnalysisRes> analysisRes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ public record MemberRes(
Long id,
String email,
String name,
String skinType,
String surveyTime,
String profileImageUrl,
String thumbnailImageUrl,
String nickname,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ public class Analysis extends BaseTimeEntity {
@Column(name = "product_data", columnDefinition = "json")
private List<NaverProductDto> productData;

public void updateIsPublic(Boolean isPublic) {
this.isPublic = isPublic;
}

@Builder
public Analysis(Member member,
Expand Down