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 @@ -51,7 +51,7 @@

@Service
@Transactional(readOnly = true)
public class GuestPickService extends PickCommonService implements PickService {
public class GuestPickService extends PickCommonService implements PickServiceV1 {

public static final String INVALID_ANONYMOUS_CAN_NOT_USE_THIS_FUNCTION_MESSAGE = "비회원은 현재 해당 기능을 이용할 수 없습니다.";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.dreamypatisiel.devdevdev.domain.service.pick;

import com.dreamypatisiel.devdevdev.domain.policy.PickBestCommentsPolicy;
import com.dreamypatisiel.devdevdev.domain.policy.PickPopularScorePolicy;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickCommentRecommendRepository;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickCommentRepository;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickRepository;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickSort;
import com.dreamypatisiel.devdevdev.global.common.TimeProvider;
import com.dreamypatisiel.devdevdev.openai.embeddings.EmbeddingsService;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickDetailResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickMainResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.SimilarPickResponse;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
public class GuestPickServiceV2 extends PickCommonService implements PickServiceV2 {
public GuestPickServiceV2(EmbeddingsService embeddingsService,
PickBestCommentsPolicy pickBestCommentsPolicy,
PickPopularScorePolicy pickPopularScorePolicy,
TimeProvider timeProvider,
PickRepository pickRepository,
PickCommentRepository pickCommentRepository,
PickCommentRecommendRepository pickCommentRecommendRepository) {
super(embeddingsService, pickBestCommentsPolicy, pickPopularScorePolicy, timeProvider, pickRepository,
pickCommentRepository, pickCommentRecommendRepository);
}

@Override
public Slice<PickMainResponse> findPicksMain(Pageable pageable, Long pickId, PickSort pickSort, String anonymousMemberId, Authentication authentication) {
return null;
}

@Override
public PickDetailResponse findPickDetail(Long pickId, String anonymousMemberId, Authentication authentication) {
return null;
}

@Override
public List<SimilarPickResponse> findTop3SimilarPicks(Long pickId) {
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@

@Service
@Transactional(readOnly = true)
public class MemberPickService extends PickCommonService implements PickService {
public class MemberPickService extends PickCommonService implements PickServiceV1 {

public static final String FIRST_PICK_OPTION_IMAGE = "firstPickOptionImage";
public static final String SECOND_PICK_OPTION_IMAGE = "secondPickOptionImage";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.dreamypatisiel.devdevdev.domain.service.pick;

import com.dreamypatisiel.devdevdev.domain.policy.PickBestCommentsPolicy;
import com.dreamypatisiel.devdevdev.domain.policy.PickPopularScorePolicy;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickCommentRecommendRepository;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickCommentRepository;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickRepository;
import com.dreamypatisiel.devdevdev.domain.repository.pick.PickSort;
import com.dreamypatisiel.devdevdev.global.common.TimeProvider;
import com.dreamypatisiel.devdevdev.openai.embeddings.EmbeddingsService;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickDetailResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickMainResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.SimilarPickResponse;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
public class MemberPickServiceV2 extends PickCommonService implements PickServiceV2 {

public MemberPickServiceV2(EmbeddingsService embeddingsService,
PickBestCommentsPolicy pickBestCommentsPolicy,
PickPopularScorePolicy pickPopularScorePolicy,
TimeProvider timeProvider,
PickRepository pickRepository,
PickCommentRepository pickCommentRepository,
PickCommentRecommendRepository pickCommentRecommendRepository) {
super(embeddingsService, pickBestCommentsPolicy, pickPopularScorePolicy, timeProvider, pickRepository,
pickCommentRepository, pickCommentRecommendRepository);
}

@Override
public Slice<PickMainResponse> findPicksMain(Pageable pageable, Long pickId, PickSort pickSort, String anonymousMemberId, Authentication authentication) {
return null;
}

@Override
public PickDetailResponse findPickDetail(Long pickId, String anonymousMemberId, Authentication authentication) {
return null;
}

@Override
public List<SimilarPickResponse> findTop3SimilarPicks(Long pickId) {
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
@RequiredArgsConstructor
public class PickFacadeService {

private PickService pickService;
private PickServiceV1 pickService;
private final EmbeddingsService embeddingsService;

@Transactional
Expand Down Expand Up @@ -54,12 +54,12 @@ public PickModifyResponse modifyPickAndSaveEmbedding(Long pickId,
return response;
}

public void injectPickService(PickService pickService) {
public void injectPickService(PickServiceV1 pickService) {
validatePickService(pickService);
this.pickService = pickService;
}

private void validatePickService(PickService pickService) {
private void validatePickService(PickServiceV1 pickService) {
if (ObjectUtils.isEmpty(pickService)) {
throw new IllegalStateException("Pick service cannot be empty");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,8 @@
package com.dreamypatisiel.devdevdev.domain.service.pick;

import com.dreamypatisiel.devdevdev.domain.repository.pick.PickSort;
import com.dreamypatisiel.devdevdev.domain.service.pick.dto.VotePickOptionDto;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.ModifyPickRequest;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.RegisterPickRequest;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickDetailResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickMainResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickModifyResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickRegisterResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickUploadImageResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.SimilarPickResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.VotePickResponse;
import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.Authentication;
import org.springframework.web.multipart.MultipartFile;

/**
* PickService의 공통 인터페이스
* 각 버전별 인터페이스에서 상속받아 사용
*/
public interface PickService {
Slice<PickMainResponse> findPicksMain(Pageable pageable, Long pickId, PickSort pickSort, String anonymousMemberId,
Authentication authentication);

PickUploadImageResponse uploadImages(String name, List<MultipartFile> images);

void deleteImage(Long pickOptionImageId);

PickRegisterResponse registerPick(RegisterPickRequest registerPickRequest, Authentication authentication);

PickModifyResponse modifyPick(Long pickId, ModifyPickRequest modifyPickRequest, Authentication authentication);

PickDetailResponse findPickDetail(Long pickId, String anonymousMemberId, Authentication authentication);

VotePickResponse votePickOption(VotePickOptionDto votePickOptionDto, Authentication authentication);

void deletePick(Long pickId, Authentication authentication);

List<SimilarPickResponse> findTop3SimilarPicks(Long pickId);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.dreamypatisiel.devdevdev.domain.service.pick;

import com.dreamypatisiel.devdevdev.global.utils.AuthenticationMemberUtils;
import com.dreamypatisiel.devdevdev.web.controller.ApiVersion;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
Expand All @@ -11,11 +12,15 @@ public class PickServiceStrategy {

private final ApplicationContext applicationContext;

public PickService getPickService() {
if (AuthenticationMemberUtils.isAnonymous()) {
return applicationContext.getBean(GuestPickService.class);
}
return applicationContext.getBean(MemberPickService.class);
public PickService getPickService(ApiVersion apiVersion) {
return switch (apiVersion) {
case V1 -> AuthenticationMemberUtils.isAnonymous()
? applicationContext.getBean(GuestPickService.class)
: applicationContext.getBean(MemberPickService.class);
case V2 -> AuthenticationMemberUtils.isAnonymous()
? applicationContext.getBean(GuestPickServiceV2.class)
: applicationContext.getBean(MemberPickServiceV2.class);
};
}

public PickCommentService pickCommentService() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.dreamypatisiel.devdevdev.domain.service.pick;

import com.dreamypatisiel.devdevdev.domain.repository.pick.PickSort;
import com.dreamypatisiel.devdevdev.domain.service.pick.dto.VotePickOptionDto;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.ModifyPickRequest;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.RegisterPickRequest;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickDetailResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickMainResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickModifyResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickRegisterResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickUploadImageResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.SimilarPickResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.VotePickResponse;
import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.Authentication;
import org.springframework.web.multipart.MultipartFile;

public interface PickServiceV1 extends PickService {
Slice<PickMainResponse> findPicksMain(Pageable pageable, Long pickId, PickSort pickSort, String anonymousMemberId,
Authentication authentication);

PickUploadImageResponse uploadImages(String name, List<MultipartFile> images);

void deleteImage(Long pickOptionImageId);

PickRegisterResponse registerPick(RegisterPickRequest registerPickRequest, Authentication authentication);

PickModifyResponse modifyPick(Long pickId, ModifyPickRequest modifyPickRequest, Authentication authentication);

PickDetailResponse findPickDetail(Long pickId, String anonymousMemberId, Authentication authentication);

VotePickResponse votePickOption(VotePickOptionDto votePickOptionDto, Authentication authentication);

void deletePick(Long pickId, Authentication authentication);

List<SimilarPickResponse> findTop3SimilarPicks(Long pickId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.dreamypatisiel.devdevdev.domain.service.pick;

import com.dreamypatisiel.devdevdev.domain.repository.pick.PickSort;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickDetailResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.PickMainResponse;
import com.dreamypatisiel.devdevdev.web.dto.response.pick.SimilarPickResponse;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.Authentication;

import java.util.List;

public interface PickServiceV2 extends PickService {
Slice<PickMainResponse> findPicksMain(Pageable pageable, Long pickId, PickSort pickSort, String anonymousMemberId,
Authentication authentication);

PickDetailResponse findPickDetail(Long pickId, String anonymousMemberId, Authentication authentication);

List<SimilarPickResponse> findTop3SimilarPicks(Long pickId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dreamypatisiel.devdevdev.web.controller;

public enum ApiVersion {
V1,
V2
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@

import com.dreamypatisiel.devdevdev.domain.repository.pick.PickSort;
import com.dreamypatisiel.devdevdev.domain.service.pick.PickFacadeService;
import com.dreamypatisiel.devdevdev.domain.service.pick.PickService;
import com.dreamypatisiel.devdevdev.domain.service.pick.PickServiceStrategy;
import com.dreamypatisiel.devdevdev.domain.service.pick.PickServiceV1;
import com.dreamypatisiel.devdevdev.domain.service.pick.dto.VotePickOptionDto;
import com.dreamypatisiel.devdevdev.global.utils.AuthenticationMemberUtils;
import com.dreamypatisiel.devdevdev.global.utils.HttpRequestUtils;
import com.dreamypatisiel.devdevdev.openai.data.request.EmbeddingRequest;
import com.dreamypatisiel.devdevdev.openai.data.response.Embedding;
import com.dreamypatisiel.devdevdev.openai.data.response.OpenAIResponse;
import com.dreamypatisiel.devdevdev.openai.embeddings.EmbeddingRequestHandler;
import com.dreamypatisiel.devdevdev.web.controller.ApiVersion;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.ModifyPickRequest;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.RegisterPickRequest;
import com.dreamypatisiel.devdevdev.web.dto.request.pick.VotePickOptionRequest;
Expand Down Expand Up @@ -69,7 +70,7 @@ public ResponseEntity<BasicResponse<Slice<PickMainResponse>>> getPicksMain(
Authentication authentication = AuthenticationMemberUtils.getAuthentication();
String anonymousMemberId = HttpRequestUtils.getHeaderValue(HEADER_ANONYMOUS_MEMBER_ID);

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);
Slice<PickMainResponse> response = pickService.findPicksMain(pageable, pickId, pickSort, anonymousMemberId,
authentication);

Expand All @@ -83,7 +84,7 @@ public ResponseEntity<BasicResponse<PickUploadImageResponse>> uploadPickOptionIm
@RequestParam String name,
@RequestPart List<MultipartFile> pickOptionImages) {

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);
PickUploadImageResponse pickUploadImageResponse = pickService.uploadImages(name, pickOptionImages);

return ResponseEntity.ok(BasicResponse.success(pickUploadImageResponse));
Expand All @@ -93,7 +94,7 @@ public ResponseEntity<BasicResponse<PickUploadImageResponse>> uploadPickOptionIm
@DeleteMapping("/picks/image/{pickOptionImageId}")
public ResponseEntity<BasicResponse<Void>> deletePickImage(@PathVariable Long pickOptionImageId) {

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);
pickService.deleteImage(pickOptionImageId);

return ResponseEntity.ok(BasicResponse.success());
Expand All @@ -110,7 +111,7 @@ public ResponseEntity<BasicResponse<PickRegisterResponse>> registerPick(
OpenAIResponse<Embedding> embeddingOpenAIResponse = embeddingRequestHandler.postEmbeddings(
EmbeddingRequest.createTextEmbedding3Small(registerPickRequest.getPickTitle()));

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);

pickFacadeService.injectPickService(pickService);

Expand All @@ -133,7 +134,7 @@ public ResponseEntity<BasicResponse<PickModifyResponse>> modifyPick(
OpenAIResponse<Embedding> embeddingOpenAIResponse = embeddingRequestHandler.postEmbeddings(
EmbeddingRequest.createTextEmbedding3Small(modifyPickRequest.getPickTitle()));

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);

pickFacadeService.injectPickService(pickService);

Expand All @@ -150,7 +151,7 @@ public ResponseEntity<BasicResponse<PickDetailResponse>> getPickDetail(@PathVari
@RequestHeader(value = HEADER_ANONYMOUS_MEMBER_ID, required = false) String anonymousMemberId) {
Authentication authentication = AuthenticationMemberUtils.getAuthentication();

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);
PickDetailResponse response = pickService.findPickDetail(pickId, anonymousMemberId, authentication);

return ResponseEntity.ok(BasicResponse.success(response));
Expand All @@ -164,7 +165,7 @@ public ResponseEntity<BasicResponse<VotePickResponse>> votePickOption(
Authentication authentication = AuthenticationMemberUtils.getAuthentication();
String anonymousMemberId = HttpRequestUtils.getHeaderValue(HEADER_ANONYMOUS_MEMBER_ID);

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);

VotePickOptionDto votePickOptionDto = VotePickOptionDto.of(votePickOptionRequest, anonymousMemberId);
VotePickResponse response = pickService.votePickOption(votePickOptionDto, authentication);
Expand All @@ -177,7 +178,7 @@ public ResponseEntity<BasicResponse<VotePickResponse>> votePickOption(
public ResponseEntity<BasicResponse<Void>> deletePick(@PathVariable Long pickId) {
Authentication authentication = AuthenticationMemberUtils.getAuthentication();

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);
pickService.deletePick(pickId, authentication);

return ResponseEntity.ok(BasicResponse.success());
Expand All @@ -187,7 +188,7 @@ public ResponseEntity<BasicResponse<Void>> deletePick(@PathVariable Long pickId)
@GetMapping("picks/{pickId}/similarties")
public ResponseEntity<BasicResponse<SimilarPickResponse>> getSimilarPicks(@PathVariable Long pickId) {

PickService pickService = pickServiceStrategy.getPickService();
PickServiceV1 pickService = (PickServiceV1) pickServiceStrategy.getPickService(ApiVersion.V1);
List<SimilarPickResponse> response = pickService.findTop3SimilarPicks(pickId);

return ResponseEntity.ok(BasicResponse.success(response));
Expand Down
Loading