Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GETP-209 refactor: like 컴포넌트의 persistence adapter 모듈 분리 #142

Merged
merged 7 commits into from
Sep 5, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import es.princip.getp.api.controller.common.dto.ApiResponse;
import es.princip.getp.api.controller.common.dto.ApiResponse.ApiSuccessResult;
import es.princip.getp.api.security.details.PrincipalDetails;
import es.princip.getp.domain.like.command.application.PeopleLikeService;
import es.princip.getp.application.like.people.port.in.LikePeopleUseCase;
import es.princip.getp.application.like.people.port.in.UnlikePeopleUseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand All @@ -16,7 +17,8 @@
@RequiredArgsConstructor
public class PeopleLikeController {

private final PeopleLikeService peopleLikeService;
private final LikePeopleUseCase likePeopleUseCase;
private final UnlikePeopleUseCase unlikePeopleUseCase;

/**
* 피플 좋아요
Expand All @@ -31,7 +33,7 @@ public ResponseEntity<ApiSuccessResult<?>> like(
@AuthenticationPrincipal final PrincipalDetails principalDetails
) {
final Long memberId = principalDetails.getMember().getMemberId();
peopleLikeService.like(memberId, peopleId);
likePeopleUseCase.like(memberId, peopleId);
return ApiResponse.success(HttpStatus.CREATED);
}

Expand All @@ -48,7 +50,7 @@ public ResponseEntity<ApiSuccessResult<?>> unlike(
@AuthenticationPrincipal final PrincipalDetails principalDetails
) {
final Long memberId = principalDetails.getMember().getMemberId();
peopleLikeService.unlike(memberId, peopleId);
unlikePeopleUseCase.unlike(memberId, peopleId);
return ApiResponse.success(HttpStatus.NO_CONTENT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import es.princip.getp.api.controller.common.dto.ApiResponse;
import es.princip.getp.api.controller.common.dto.ApiResponse.ApiSuccessResult;
import es.princip.getp.api.security.details.PrincipalDetails;
import es.princip.getp.domain.like.command.application.ProjectLikeService;
import es.princip.getp.application.like.project.port.in.LikeProjectUseCase;
import es.princip.getp.application.like.project.port.in.UnlikeProjectUseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand All @@ -16,7 +17,8 @@
@RequiredArgsConstructor
public class ProjectLikeController {

private final ProjectLikeService projectLikeService;
private final LikeProjectUseCase likeProjectUseCase;
private final UnlikeProjectUseCase unlikeProjectUseCase;

/**
* 프로젝트 좋아요
Expand All @@ -31,7 +33,7 @@ public ResponseEntity<ApiSuccessResult<?>> likeProject(
@AuthenticationPrincipal final PrincipalDetails principalDetails
) {
final Long memberId = principalDetails.getMember().getMemberId();
projectLikeService.like(projectId, memberId);
likeProjectUseCase.like(projectId, memberId);
return ApiResponse.success(HttpStatus.CREATED);
}

Expand All @@ -48,7 +50,7 @@ public ResponseEntity<ApiSuccessResult<?>> unlikeProject(
@AuthenticationPrincipal final PrincipalDetails principalDetails
) {
final Long memberId = principalDetails.getMember().getMemberId();
projectLikeService.unlike(projectId, memberId);
unlikeProjectUseCase.unlike(projectId, memberId);
return ApiResponse.success(HttpStatus.NO_CONTENT);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.like.exception;
package es.princip.getp.application.like.exception;

import es.princip.getp.common.exception.BusinessLogicException;
import es.princip.getp.common.exception.ErrorDescription;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.princip.getp.domain.like.exception;
package es.princip.getp.application.like.exception;

import es.princip.getp.common.exception.BusinessLogicException;
import es.princip.getp.common.exception.ErrorDescription;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package es.princip.getp.application.like.people.port.in;

public interface LikePeopleUseCase {

void like(Long memberId, Long peopleId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package es.princip.getp.application.like.people.port.in;

public interface UnlikePeopleUseCase {

void unlike(Long memberId, Long peopleId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package es.princip.getp.application.like.people.port.out;

public interface CheckPeopleLikePort {

boolean existsBy(Long clientId, Long peopleId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package es.princip.getp.application.like.people.port.out;

import java.util.Map;

public interface CountPeopleLikePort {

Long countBy(Long peopleId);

Map<Long, Long> countBy(Long... peopleIds);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.getp.application.like.people.port.out;

import es.princip.getp.domain.like.people.model.PeopleLike;

public interface DeletePeopleLikePort {

void delete(PeopleLike peopleLike);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.getp.application.like.people.port.out;

import es.princip.getp.domain.like.people.model.PeopleLike;

public interface LoadPeopleLikePort {

PeopleLike loadBy(Long clientId, Long peopleId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.getp.application.like.people.port.out;

import es.princip.getp.domain.like.people.model.PeopleLike;

public interface SavePeopleLikePort {

void save(PeopleLike like);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package es.princip.getp.application.like.people.service;

import es.princip.getp.application.client.port.out.LoadClientPort;
import es.princip.getp.application.like.exception.AlreadyLikedException;
import es.princip.getp.application.like.people.port.out.CheckPeopleLikePort;
import es.princip.getp.application.like.people.port.out.SavePeopleLikePort;
import es.princip.getp.application.people.port.out.LoadPeoplePort;
import es.princip.getp.domain.client.model.Client;
import es.princip.getp.domain.like.people.model.PeopleLike;
import es.princip.getp.domain.people.model.People;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
class LikePeopleService implements es.princip.getp.application.like.people.port.in.LikePeopleUseCase {

private final LoadClientPort loadClientPort;
private final LoadPeoplePort loadPeoplePort;
private final CheckPeopleLikePort checkPeopleLikePort;
private final SavePeopleLikePort savePeopleLikePort;

@Transactional
public void like(final Long memberId, final Long peopleId) {
final Client client = loadClientPort.loadBy(memberId);
// TODO: 조회 성능 개선 필요
final People people = loadPeoplePort.loadByPeopleId(peopleId);
checkAlreadyLiked(client.getClientId(), peopleId);
final PeopleLike peopleLike = buildPeopleLike(client.getClientId(), peopleId);
savePeopleLikePort.save(peopleLike);
}

private void checkAlreadyLiked(final Long clientId, final Long peopleId) {
if (checkPeopleLikePort.existsBy(clientId, peopleId)) {
throw new AlreadyLikedException();
}
}

private PeopleLike buildPeopleLike(final Long clientId, final Long peopleId) {
return PeopleLike.builder()
.clientId(clientId)
.peopleId(peopleId)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package es.princip.getp.application.like.people.service;

import es.princip.getp.application.client.port.out.LoadClientPort;
import es.princip.getp.application.like.exception.NeverLikedException;
import es.princip.getp.application.like.people.port.in.UnlikePeopleUseCase;
import es.princip.getp.application.like.people.port.out.CheckPeopleLikePort;
import es.princip.getp.application.like.people.port.out.DeletePeopleLikePort;
import es.princip.getp.application.like.people.port.out.LoadPeopleLikePort;
import es.princip.getp.application.people.port.out.LoadPeoplePort;
import es.princip.getp.domain.client.model.Client;
import es.princip.getp.domain.like.people.model.PeopleLike;
import es.princip.getp.domain.people.model.People;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
class UnlikePeopleService implements UnlikePeopleUseCase {

private final LoadClientPort loadClientPort;
private final LoadPeoplePort loadPeoplePort;
private final LoadPeopleLikePort loadPeopleLikePort;
private final CheckPeopleLikePort checkPeopleLikePort;
private final DeletePeopleLikePort deletePeopleLikePort;

@Transactional
public void unlike(final Long memberId, final Long peopleId) {
final Client client = loadClientPort.loadBy(memberId);
// TODO: 조회 성능 개선 필요
final People people = loadPeoplePort.loadByPeopleId(peopleId);
final PeopleLike peopleLike = loadPeopleLikePort.loadBy(client.getClientId(), peopleId);
checkNeverLiked(client.getClientId(), peopleId);
deletePeopleLikePort.delete(peopleLike);
}

private void checkNeverLiked(final Long clientId, final Long peopleId) {
if (!checkPeopleLikePort.existsBy(clientId, peopleId)) {
throw new NeverLikedException();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package es.princip.getp.application.like.project.port.in;

public interface LikeProjectUseCase {

void like(Long memberId, Long peopleId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package es.princip.getp.application.like.project.port.in;

public interface UnlikeProjectUseCase {

void unlike(Long memberId, Long peopleId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package es.princip.getp.application.like.project.port.out;

public interface CheckProjectLikePort {

boolean existsBy(Long peopleId, Long projectId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package es.princip.getp.application.like.project.port.out;

import java.util.Map;

public interface CountProjectLikePort {

Long countBy(Long projectId);

Map<Long, Long> countBy(Long... projectIds);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.getp.application.like.project.port.out;

import es.princip.getp.domain.like.project.model.ProjectLike;

public interface DeleteProjectLikePort {

void delete(ProjectLike projectLike);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.getp.application.like.project.port.out;

import es.princip.getp.domain.like.project.model.ProjectLike;

public interface LoadProjectLikePort {

ProjectLike loadBy(Long peopleId, Long projectId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package es.princip.getp.application.like.project.port.out;

import es.princip.getp.domain.like.project.model.ProjectLike;

public interface SaveProjectLikePort {

void save(ProjectLike like);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package es.princip.getp.application.like.project.service;

import es.princip.getp.application.like.exception.AlreadyLikedException;
import es.princip.getp.application.like.project.port.in.LikeProjectUseCase;
import es.princip.getp.application.like.project.port.out.CheckProjectLikePort;
import es.princip.getp.application.like.project.port.out.SaveProjectLikePort;
import es.princip.getp.application.people.port.out.LoadPeoplePort;
import es.princip.getp.application.project.commission.port.out.LoadProjectPort;
import es.princip.getp.domain.like.project.model.ProjectLike;
import es.princip.getp.domain.people.model.People;
import es.princip.getp.domain.project.commission.model.Project;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
class LikeProjectService implements LikeProjectUseCase {

private final LoadProjectPort loadProjectPort;
private final LoadPeoplePort loadPeoplePort;
private final CheckProjectLikePort checkProjectLikePort;
private final SaveProjectLikePort saveProjectLikePort;

/**
* 프로젝트 좋아요
*
* @param memberId 좋아요를 누를 피플의 사용자 ID
* @param projectId 좋아요를 누를 프로젝트 ID
*/
@Transactional
public void like(final Long memberId, final Long projectId) {
final People people = loadPeoplePort.loadBy(memberId);
// TODO: 조회 성능 개선 필요
final Project project = loadProjectPort.loadBy(projectId);
checkAlreadyLiked(people.getId(), projectId);
final ProjectLike projectLike = buildProjectLike(people.getId(), projectId);
saveProjectLikePort.save(projectLike);
}

private void checkAlreadyLiked(final Long peopleId, final Long projectId) {
if (checkProjectLikePort.existsBy(peopleId, projectId)) {
throw new AlreadyLikedException();
}
}

private ProjectLike buildProjectLike(final Long peopleId, final Long projectId) {
return ProjectLike.builder()
.peopleId(peopleId)
.projectId(projectId)
.build();
}
}
Loading