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
59 changes: 55 additions & 4 deletions src/main/java/com/retrip/crew/application/in/DemandService.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,54 @@
package com.retrip.crew.application.in;

import com.retrip.crew.application.in.request.CreateRecruitmentQuestionRequest;
import com.retrip.crew.application.in.request.UpdateRecruitmentQuestionRequest;
import com.retrip.crew.application.in.request.crew.CrewOrder;
import com.retrip.crew.application.in.request.demand.CreateDemandRequest;
import com.retrip.crew.application.in.request.demand.DemandOrder;
import com.retrip.crew.application.in.response.demand.*;
import com.retrip.crew.application.in.response.CreateRecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.RecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.UpdateRecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.demand.ApproveDemandResponse;
import com.retrip.crew.application.in.response.demand.ChangeRecruitmentStatusResponse;
import com.retrip.crew.application.in.response.demand.CreateDemandResponse;
import com.retrip.crew.application.in.response.demand.CrewsOfDemandResponse;
import com.retrip.crew.application.in.response.demand.DemandsResponse;
import com.retrip.crew.application.in.response.demand.RejectDemandResponse;
import com.retrip.crew.application.in.usecase.ManageDemandUseCase;
import com.retrip.crew.application.in.usecase.ManageRecruitmentQuestionUseCase;
import com.retrip.crew.application.in.usecase.UpdateRecruitmentUseCase;
import com.retrip.crew.application.out.repository.CrewDemandRepository;
import com.retrip.crew.application.out.repository.CrewQueryRepository;
import com.retrip.crew.application.out.repository.CrewRepository;
import com.retrip.crew.application.out.repository.RecruitmentQuestionQueryRepository;
import com.retrip.crew.application.out.repository.RecruitmentQuestionRepository;
import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.Demand;
import com.retrip.crew.domain.entity.RecruitmentQuestion;
import com.retrip.crew.domain.exception.CrewNotFoundException;
import com.retrip.crew.domain.exception.NotCrewLeaderException;
import com.retrip.crew.domain.exception.QuestionNotFoundException;
import com.retrip.crew.domain.exception.common.BusinessException;
import com.retrip.crew.domain.exception.common.EntityNotFoundException;
import com.retrip.crew.domain.vo.DemandStatus;
import com.retrip.crew.infra.util.PaginationUtils;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@Service
@Transactional
@RequiredArgsConstructor
public class DemandService implements UpdateRecruitmentUseCase, ManageDemandUseCase {
public class DemandService implements UpdateRecruitmentUseCase, ManageDemandUseCase, ManageRecruitmentQuestionUseCase {
private final CrewRepository crewRepository;
private final CrewDemandRepository demandRepository;
private final CrewQueryRepository crewQueryRepository;
private final RecruitmentQuestionRepository recruitmentQuestionRepository;
private final RecruitmentQuestionQueryRepository recruitmentQuestionQueryRepository;

@Override
public ChangeRecruitmentStatusResponse startRecruitment(UUID crewId) {
Expand Down Expand Up @@ -111,4 +128,38 @@ private Crew findById(UUID crewId){
return crewRepository.findById(crewId)
.orElseThrow(CrewNotFoundException::new);
}

@Override
public CreateRecruitmentQuestionResponse createRecruitmentQuestion(UUID memberId, UUID crewId, CreateRecruitmentQuestionRequest request) {
Crew crew = findById(crewId);
RecruitmentQuestion question = RecruitmentQuestion.create(request.content(), crew);
crew.addRecruitmentQuestion(memberId, question);

return CreateRecruitmentQuestionResponse.of(question);
}

@Override
public UpdateRecruitmentQuestionResponse updateRecruitmentQuestion(UUID memberId, UUID crewId, UUID questionId, UpdateRecruitmentQuestionRequest request) {
RecruitmentQuestion savedQuestion = findRecruitmentQuestionByIdAndCrewId(questionId, crewId);
savedQuestion.update(request.content(), memberId);
return UpdateRecruitmentQuestionResponse.of(savedQuestion);
}

@Override
public void deleteRecruitmentQuestion(UUID memberId, UUID crewId, UUID questionId) {
Crew crew = findById(crewId);
RecruitmentQuestion savedQuestion = findRecruitmentQuestionByIdAndCrewId(questionId, crewId);
crew.deleteRecruitmentQuestion(memberId, savedQuestion);
}

@Override
@Transactional(readOnly = true)
public List<RecruitmentQuestionResponse> getRecruitmentQuestions(UUID memberId, UUID crewId) {
return recruitmentQuestionQueryRepository.findRecruitmentQuestions(crewId);
}

private RecruitmentQuestion findRecruitmentQuestionByIdAndCrewId(UUID questionId, UUID crewId) {
return recruitmentQuestionRepository.findByIdAndCrewId(questionId, crewId)
.orElseThrow(QuestionNotFoundException::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.retrip.crew.application.in.request.PostOrder;
import com.retrip.crew.application.in.request.UpdatePostRequest;
import com.retrip.crew.application.in.response.CreatePostResponse;
import com.retrip.crew.application.in.response.DeletePostResponse;
import com.retrip.crew.application.in.response.PostResponse;
import com.retrip.crew.application.in.response.UpdatePostResponse;
import com.retrip.crew.application.in.usecase.GetPostUseCase;
Expand All @@ -16,20 +15,16 @@
import com.retrip.crew.domain.entity.CrewMember;
import com.retrip.crew.domain.entity.Post;
import com.retrip.crew.domain.exception.CrewMemberNotFoundException;

import com.retrip.crew.domain.exception.CrewNotFoundException;
import com.retrip.crew.infra.adapter.in.presentation.rest.common.ScrollPageResponse;
import com.retrip.crew.infra.util.PaginationUtils;

import java.util.UUID;
import lombok.RequiredArgsConstructor;

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@Service
@Transactional
@RequiredArgsConstructor
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,8 @@

@Schema(description = "참여요청질문 생성 Request")
public record CreateRecruitmentQuestionRequest(

@Schema(description = "질문 내용")
@NotNull
@Size(min = 1, max = 100)
String content,
@Schema(description = "작성자")
@NotNull
UUID memberId
String content
) {}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,8 @@

@Schema(description = "참여요청질문 수정 Request")
public record UpdateRecruitmentQuestionRequest(

@Schema(description = "질문 내용")
@NotNull
@Size(min = 1, max = 100)
String content,
@Schema(description = "수정자")
@NotNull
UUID memberId
String content
) {}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.retrip.crew.application.in.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDateTime;
import java.util.UUID;

@Schema(description = "참여요청질문 Response")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@

@Schema(description = "참여요청질문 수정 Response")
public record UpdateRecruitmentQuestionResponse(
@Schema(description = "질문 ID") UUID id,
@Schema(description = "질문 내용") String content
@Schema(description = "질문 ID")
UUID id,
@Schema(description = "질문 내용")
String content
) {
public static UpdateRecruitmentQuestionResponse of(RecruitmentQuestion question) {
return new UpdateRecruitmentQuestionResponse(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@
import com.retrip.crew.application.in.request.CreateRecruitmentQuestionRequest;
import com.retrip.crew.application.in.request.UpdateRecruitmentQuestionRequest;
import com.retrip.crew.application.in.response.CreateRecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.RecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.UpdateRecruitmentQuestionResponse;

import java.util.List;
import java.util.UUID;

public interface ManageRecruitmentQuestionUseCase {
CreateRecruitmentQuestionResponse createRecruitmentQuestion(UUID crewId, CreateRecruitmentQuestionRequest request);
UpdateRecruitmentQuestionResponse updateRecruitmentQuestion(UUID crewId, UUID questionId, UpdateRecruitmentQuestionRequest request);
void deleteRecruitmentQuestion(UUID crewId, UUID questionId, UUID memberId);
CreateRecruitmentQuestionResponse createRecruitmentQuestion(UUID memberId, UUID crewId, CreateRecruitmentQuestionRequest request);

UpdateRecruitmentQuestionResponse updateRecruitmentQuestion(UUID memberId, UUID crewId, UUID questionId, UpdateRecruitmentQuestionRequest request);

void deleteRecruitmentQuestion(UUID memberId, UUID crewId, UUID questionId);

List<RecruitmentQuestionResponse> getRecruitmentQuestions(UUID crewId, UUID memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,5 @@ public interface CrewQueryRepository {
Slice<CrewListResponse> getCrews(Pageable pageable, String keyword);
Long getCrewCount(String keyword);
Optional<Crew> findByIdWithPosts(UUID id);
Optional<Crew> findByIdWithRecruitment(UUID crewId);
Page<CrewsOfDemandResponse> findAllContainsMember(Pageable pageable, UUID memberId);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.retrip.crew.application.out.repository;

import com.retrip.crew.application.in.response.RecruitmentQuestionResponse;
import com.retrip.crew.domain.entity.RecruitmentQuestion;

import java.util.List;
import java.util.UUID;

public interface RecruitmentQuestionQueryRepository {
List<RecruitmentQuestionResponse> findRecruitmentQuestions(UUID crewId);
RecruitmentQuestion findByIdOrElseThrow(UUID questionId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.retrip.crew.application.out.repository;

import com.retrip.crew.domain.entity.CrewMember;
import com.retrip.crew.domain.entity.RecruitmentQuestion;
import java.util.Optional;
import java.util.UUID;
import org.springframework.data.jpa.repository.Query;

public interface RecruitmentQuestionRepository extends ReadRepository<RecruitmentQuestion, UUID> {

@Query("""
select rq
from RecruitmentQuestion rq
join fetch rq.crew c
where rq.id = :questionId and c.id = :crewId
""")
Optional<RecruitmentQuestion> findByIdAndCrewId(UUID questionId, UUID crewId);
}
13 changes: 11 additions & 2 deletions src/main/java/com/retrip/crew/domain/entity/Crew.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.retrip.crew.domain.entity;

import com.retrip.crew.domain.exception.NotCrewLeaderException;
import com.retrip.crew.domain.exception.common.BusinessException;
import com.retrip.crew.domain.vo.CrewDescription;
import com.retrip.crew.domain.vo.CrewTitle;

Expand Down Expand Up @@ -112,9 +111,19 @@ public void softDelete(UUID loginMemberId) {
this.isDeleted = true;
}

private void validateCrewLeader(UUID loginMemberId) {
public void validateCrewLeader(UUID loginMemberId) {
if(!this.getCrewMembers().isLeader(loginMemberId)){
throw new NotCrewLeaderException();
}
}

public void addRecruitmentQuestion(UUID memberId, RecruitmentQuestion question) {
validateCrewLeader(memberId);
recruitment.addRecruitmentQuestion(question);
}

public void deleteRecruitmentQuestion(UUID memberId, RecruitmentQuestion savedQuestion) {
validateCrewLeader(memberId);
recruitment.deleteRecruitmentQuestion(savedQuestion);
}
}
Loading