From 17f9ad0e64c6c8697c264fc39cc68ca8c83f34b1 Mon Sep 17 00:00:00 2001 From: JIN-076 <57834671+JIN-076@users.noreply.github.com> Date: Thu, 22 Feb 2024 01:38:57 +0900 Subject: [PATCH] =?UTF-8?q?[REFACT]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=9D=BC=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC,=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC,=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80=20(#132)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [REFACT] 프로젝트 카드 생성일에 대한 유효성 검사 로직 구현 * [REFACT] 대기중에만 요청이 생성되도록 프로젝트 카드 상태에 대한 유효성 검사 추가 * [REFACT] 대기중에만 요청이 생성되도록 프로젝트 카드 상태에 대한 유효성 검사 추가 * [REFACT] 프로젝트 상태 추가 * [REFACT] queryDsl 로직 수정, 프로젝트 상태 매핑 추가 --- .../ProjectRepositoryCustomImpl.java | 12 +++++++- .../ProjectJoinRequestService.java | 9 ++++++ ...rojectJoinRequestRepositoryCustomImpl.java | 30 +++++++++---------- .../res/ProjectJoinRequestDetailAPIRes.java | 16 ++++++---- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/main/java/io/oeid/mogakgo/domain/project/infrastructure/ProjectRepositoryCustomImpl.java b/src/main/java/io/oeid/mogakgo/domain/project/infrastructure/ProjectRepositoryCustomImpl.java index 15ae2fe5..1bee6f56 100644 --- a/src/main/java/io/oeid/mogakgo/domain/project/infrastructure/ProjectRepositoryCustomImpl.java +++ b/src/main/java/io/oeid/mogakgo/domain/project/infrastructure/ProjectRepositoryCustomImpl.java @@ -16,6 +16,7 @@ import io.oeid.mogakgo.domain.user.domain.UserDevelopLanguageTag; import io.oeid.mogakgo.domain.user.domain.UserWantedJobTag; import io.oeid.mogakgo.domain.user.presentation.dto.res.UserPublicApiResponse; +import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -30,6 +31,8 @@ public class ProjectRepositoryCustomImpl implements ProjectRepositoryCustom { public CursorPaginationResult findByConditionWithPagination( Long userId, Region region, ProjectStatus projectStatus, CursorPaginationInfoReq pageable ) { + LocalDate today = LocalDate.now(); + List entities = jpaQueryFactory.selectFrom(project) .innerJoin(project.creator, user) .on(project.creator.id.eq(user.id)) @@ -38,7 +41,8 @@ public CursorPaginationResult findByConditionWithPagination cursorIdCondition(pageable.getCursorId()), userIdEq(userId), regionEq(region), - projectStatusEq(projectStatus) + projectStatusEq(projectStatus), + createdAtEq(today) ) .limit(pageable.getPageSize() + 1) .fetch(); @@ -100,4 +104,10 @@ private BooleanExpression regionEq(Region region) { private BooleanExpression projectStatusEq(ProjectStatus projectStatus) { return projectStatus != null ? project.projectStatus.eq(projectStatus) : null; } + + private BooleanExpression createdAtEq(LocalDate today) { + return project.createdAt.year().eq(today.getYear()) + .and(project.createdAt.month().eq(today.getMonthValue())) + .and(project.createdAt.dayOfMonth().eq(today.getDayOfMonth())); + } } diff --git a/src/main/java/io/oeid/mogakgo/domain/project_join_req/application/ProjectJoinRequestService.java b/src/main/java/io/oeid/mogakgo/domain/project_join_req/application/ProjectJoinRequestService.java index 3469cd1d..12c8c875 100644 --- a/src/main/java/io/oeid/mogakgo/domain/project_join_req/application/ProjectJoinRequestService.java +++ b/src/main/java/io/oeid/mogakgo/domain/project_join_req/application/ProjectJoinRequestService.java @@ -16,6 +16,7 @@ import io.oeid.mogakgo.domain.matching.application.MatchingService; import io.oeid.mogakgo.domain.matching.application.UserMatchingService; import io.oeid.mogakgo.domain.project.domain.entity.Project; +import io.oeid.mogakgo.domain.project.domain.entity.enums.ProjectStatus; import io.oeid.mogakgo.domain.project.exception.ProjectException; import io.oeid.mogakgo.domain.project.infrastructure.ProjectJpaRepository; import io.oeid.mogakgo.domain.project_join_req.application.dto.req.ProjectJoinCreateReq; @@ -27,6 +28,7 @@ import io.oeid.mogakgo.domain.user.domain.User; import io.oeid.mogakgo.domain.user.exception.UserException; import io.oeid.mogakgo.domain.user.infrastructure.UserJpaRepository; +import io.oeid.mogakgo.exception.code.ErrorCode400; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -49,6 +51,7 @@ public Long create(Long userId, ProjectJoinCreateReq request) { User tokenUser = validateToken(userId); validateSender(tokenUser, request.getSenderId()); Project project = validateProjectExist(request.getProjectId()); + validateProjectStatus(project.getProjectStatus()); // 요청을 보내려는 프로젝트가 대기중이 맞는지 검사 validateProjectCreator(project, userId); validateUserCertRegion(project, tokenUser); validateAlreadyExistRequest(userId, project.getId()); @@ -141,6 +144,12 @@ private Project validateProjectExist(Long projectId) { .orElseThrow(() -> new ProjectException(PROJECT_NOT_FOUND)); } + private void validateProjectStatus(ProjectStatus projectStatus) { + if (!projectStatus.equals(ProjectStatus.PENDING)) { + throw new ProjectJoinRequestException(ErrorCode400.INVALID_PROJECT_STATUS_TO_ACCEPT); + } + } + private void validateProjectCreator(Project project, Long userId) { if (project.getCreator().getId().equals(userId)) { throw new ProjectJoinRequestException(INVALID_CREATOR_PROJECT_JOIN_REQUEST); diff --git a/src/main/java/io/oeid/mogakgo/domain/project_join_req/infrastructure/ProjectJoinRequestRepositoryCustomImpl.java b/src/main/java/io/oeid/mogakgo/domain/project_join_req/infrastructure/ProjectJoinRequestRepositoryCustomImpl.java index 22e68265..96630477 100644 --- a/src/main/java/io/oeid/mogakgo/domain/project_join_req/infrastructure/ProjectJoinRequestRepositoryCustomImpl.java +++ b/src/main/java/io/oeid/mogakgo/domain/project_join_req/infrastructure/ProjectJoinRequestRepositoryCustomImpl.java @@ -1,9 +1,7 @@ package io.oeid.mogakgo.domain.project_join_req.infrastructure; -import static io.oeid.mogakgo.domain.project.domain.entity.QProject.project; import static io.oeid.mogakgo.domain.project_join_req.domain.entity.QProjectJoinRequest.projectJoinRequest; -import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import io.oeid.mogakgo.common.base.CursorPaginationInfoReq; @@ -82,20 +80,7 @@ public boolean existsByProjectId(Long projectId) { public CursorPaginationResult getBySenderIdWithPagination( Long senderId, Long projectId, RequestStatus requestStatus, CursorPaginationInfoReq pageable ) { - List result = jpaQueryFactory.select( - Projections.constructor( - ProjectJoinRequestDetailAPIRes.class, - projectJoinRequest.project.id, - projectJoinRequest.project.creator.avatarUrl, - Projections.constructor( - MeetingInfoResponse.class, - projectJoinRequest.project.meetingInfo.meetStartTime, - projectJoinRequest.project.meetingInfo.meetEndTime, - projectJoinRequest.project.meetingInfo.meetDetail - )) - ) - .from(projectJoinRequest) - .innerJoin(project).on(projectJoinRequest.project.id.eq(projectId)) + List entities = jpaQueryFactory.selectFrom(projectJoinRequest) .where( cursorIdCondition(pageable.getCursorId()), senderIdEq(senderId), @@ -105,6 +90,19 @@ public CursorPaginationResult getBySenderIdWithP .limit(pageable.getPageSize() + 1) .fetch(); + List result = entities.stream().map( + projectJoinRequest -> new ProjectJoinRequestDetailAPIRes( + projectJoinRequest.getProject().getId(), + projectJoinRequest.getProject().getProjectStatus(), + projectJoinRequest.getProject().getCreator().getAvatarUrl(), + new MeetingInfoResponse( + projectJoinRequest.getProject().getMeetingInfo().getMeetStartTime(), + projectJoinRequest.getProject().getMeetingInfo().getMeetEndTime(), + projectJoinRequest.getProject().getMeetingInfo().getMeetDetail() + ) + ) + ).toList(); + return CursorPaginationResult.fromDataWithExtraItemForNextCheck( result, pageable.getPageSize() ); diff --git a/src/main/java/io/oeid/mogakgo/domain/project_join_req/presentation/dto/res/ProjectJoinRequestDetailAPIRes.java b/src/main/java/io/oeid/mogakgo/domain/project_join_req/presentation/dto/res/ProjectJoinRequestDetailAPIRes.java index 7e7aa916..6867bc94 100644 --- a/src/main/java/io/oeid/mogakgo/domain/project_join_req/presentation/dto/res/ProjectJoinRequestDetailAPIRes.java +++ b/src/main/java/io/oeid/mogakgo/domain/project_join_req/presentation/dto/res/ProjectJoinRequestDetailAPIRes.java @@ -1,5 +1,6 @@ package io.oeid.mogakgo.domain.project_join_req.presentation.dto.res; +import io.oeid.mogakgo.domain.project.domain.entity.enums.ProjectStatus; import io.oeid.mogakgo.domain.project.presentation.dto.res.MeetingInfoResponse; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; @@ -13,24 +14,29 @@ public class ProjectJoinRequestDetailAPIRes { @NotNull private final Long projectId; + @Schema(description = "프로젝트 상태", example = "PENDING", implementation = ProjectStatus.class) + @NotNull + private final ProjectStatus projectStatus; + @Schema(description = "프로젝트 생성자 아바타 URL", example = "https://avatars.githubusercontent.com/u/85854384?v=4") private final String creatorAvatorUrl; @Schema(description = "프로젝트 만남 장ㅔ") private final MeetingInfoResponse meetingInfo; - public ProjectJoinRequestDetailAPIRes( - Long projectId, String creatorAvatorUrl, MeetingInfoResponse meetingInfo + public ProjectJoinRequestDetailAPIRes(Long projectId, ProjectStatus projectStatus, + String creatorAvatorUrl, MeetingInfoResponse meetingInfo ) { this.projectId = projectId; + this.projectStatus = projectStatus; this.creatorAvatorUrl = creatorAvatorUrl; this.meetingInfo = meetingInfo; } - public static ProjectJoinRequestDetailAPIRes from( - Long projectId, String creatorAvatorUrl, MeetingInfoResponse meetingInfo + public static ProjectJoinRequestDetailAPIRes from(Long projectId, ProjectStatus projectStatus, + String creatorAvatorUrl, MeetingInfoResponse meetingInfo ) { - return new ProjectJoinRequestDetailAPIRes(projectId, creatorAvatorUrl, meetingInfo); + return new ProjectJoinRequestDetailAPIRes(projectId, projectStatus, creatorAvatorUrl, meetingInfo); } }