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
95 changes: 83 additions & 12 deletions src/main/java/com/retrip/crew/application/in/CrewService.java
Original file line number Diff line number Diff line change
@@ -1,52 +1,73 @@
package com.retrip.crew.application.in;

import com.retrip.crew.application.in.request.IntroductionCreateRequest;
import com.retrip.crew.application.in.request.IntroductionDeleteRequest;
import com.retrip.crew.application.in.request.IntroductionUpdateRequest;
import com.retrip.crew.application.in.request.crew.CrewCreateRequest;
import com.retrip.crew.application.in.request.crew.CrewOrder;
import com.retrip.crew.application.in.request.crew.CrewUpdateRequest;
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.IntroductionCreateResponse;
import com.retrip.crew.application.in.response.IntroductionDetailResponse;
import com.retrip.crew.application.in.response.IntroductionListResponse;
import com.retrip.crew.application.in.response.IntroductionUpdateResponse;
import com.retrip.crew.application.in.response.crew.CrewCreateResponse;
import com.retrip.crew.application.in.response.crew.CrewDetailResponse;
import com.retrip.crew.application.in.response.crew.CrewListResponse;
import com.retrip.crew.application.in.response.crew.CrewUpdateResponse;
import com.retrip.crew.application.in.response.demand.*;
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.GetCrewUseCase;
import com.retrip.crew.application.in.usecase.ManageCrewUseCase;
import com.retrip.crew.application.in.usecase.ManageDemandUseCase;
import com.retrip.crew.application.in.usecase.ManageIntroductionUseCase;
import com.retrip.crew.application.in.usecase.UpdateRecruitmentUseCase;
import com.retrip.crew.application.out.repository.CrewDemandRepository;
import com.retrip.crew.application.out.repository.CrewMemberRepository;
import com.retrip.crew.application.out.repository.CrewQueryRepository;
import com.retrip.crew.application.out.repository.CrewRepository;
import com.retrip.crew.application.out.repository.IntroductionQueryRepository;
import com.retrip.crew.application.out.repository.IntroductionRepository;
import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.Demand;
import com.retrip.crew.domain.entity.Introduction;
import com.retrip.crew.domain.entity.Recruitment;
import com.retrip.crew.domain.exception.CrewNotFoundException;
import com.retrip.crew.domain.exception.IntroductionNotFoundException;
import com.retrip.crew.domain.exception.NotCrewLeaderException;
import com.retrip.crew.domain.exception.common.BusinessException;
import com.retrip.crew.domain.exception.common.EntityNotFoundException;
import com.retrip.crew.domain.vo.CrewDescription;
import com.retrip.crew.domain.vo.CrewTitle;
import com.retrip.crew.domain.vo.DemandStatus;
import com.retrip.crew.domain.vo.IntroductionContent;
import com.retrip.crew.domain.vo.IntroductionTitle;
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.Page;
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
public class CrewService implements ManageCrewUseCase, UpdateRecruitmentUseCase, ManageDemandUseCase, GetCrewUseCase {
public class CrewService implements ManageCrewUseCase, UpdateRecruitmentUseCase, ManageDemandUseCase, GetCrewUseCase, ManageIntroductionUseCase{

private final CrewRepository crewRepository;
private final CrewMemberRepository crewMemberRepository;
private final CrewQueryRepository crewQueryRepository;
private final CrewDemandRepository demandRepository;
private final IntroductionRepository introductionRepository;
private final IntroductionQueryRepository introductionQueryRepository;

@Override
public CrewCreateResponse createCrew(CrewCreateRequest request) {
Expand All @@ -56,7 +77,7 @@ public CrewCreateResponse createCrew(CrewCreateRequest request) {

@Override
public CrewUpdateResponse updateCrew(UUID crewId, CrewUpdateRequest request) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
CrewTitle title = new CrewTitle(request.title());
CrewDescription description = new CrewDescription(request.description());
Recruitment recruitment = crew.getRecruitment();
Expand All @@ -68,29 +89,29 @@ public CrewUpdateResponse updateCrew(UUID crewId, CrewUpdateRequest request) {

@Override
public ChangeRecruitmentStatusResponse startRecruitment(UUID crewId) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
crew.startRecruitment();
return ChangeRecruitmentStatusResponse.of(crew);
}

@Override
public ChangeRecruitmentStatusResponse stopRecruitment(UUID crewId) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
crew.stopRecruitment();
return ChangeRecruitmentStatusResponse.of(crew);
}

@Override
public CreateDemandResponse createDemand(UUID crewId, CreateDemandRequest request) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
Demand demand = crew.demand(request.memberId());
return CreateDemandResponse.of(crew.getId(), demand);
}

@Override
public Page<DemandsResponse> getDemands(
UUID crewId, UUID memberId, String status, Pageable pageable, DemandOrder order, String sort) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
throwIfNotLeader(crew, memberId, new NotCrewLeaderException());
Page<Demand> demands = demandRepository.findByCrewIdAndStatus(
crewId, DemandStatus.valueOf(status), PaginationUtils.createPageRequest(pageable, order.getField(), sort));
Expand All @@ -100,7 +121,7 @@ public Page<DemandsResponse> getDemands(
@Override
public Page<CrewsOfDemandResponse> getCrewsOfDemand(
UUID crewId, UUID demandId, UUID memberId, Pageable pageable, CrewOrder order, String sort) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
throwIfNotLeader(crew, memberId, new NotCrewLeaderException());
Demand demand = findDemandByIdAndCrewId(demandId, crewId);
return crewQueryRepository.findAllContainsMember(pageable, demand.getMemberId());
Expand Down Expand Up @@ -152,13 +173,63 @@ public ScrollPageResponse<CrewListResponse> getCrews(Pageable pageable, String k
@Override
@Transactional(readOnly = true)
public CrewDetailResponse getCrewDetail(UUID crewId) {
Crew crew = findById(crewId);
Crew crew = findCrewById(crewId);
int memberCount = crewMemberRepository.countByCrewId(crewId);
return CrewDetailResponse.of(crew, memberCount);
}

private Crew findById(UUID crewId){
@Override
public IntroductionCreateResponse createIntroduction(UUID crewId, IntroductionCreateRequest request) {
Crew crew = findCrewById(crewId);
Introduction introduction = request.to(crew);
crew.addIntroduction(introduction);
return IntroductionCreateResponse.of(introduction);
}

@Override
public IntroductionUpdateResponse updateIntroduction(UUID crewId, UUID introductionId, IntroductionUpdateRequest request) {
Introduction introduction = findIntroductionByIdAndCrewId(introductionId, crewId);
introduction.update(
new IntroductionTitle(request.title()),
new IntroductionContent(request.content()),
request.loginMemberId()
);
return IntroductionUpdateResponse.from(introduction);
}

@Override
public void deleteIntroduction(UUID crewId, UUID introductionId, IntroductionDeleteRequest request) {
Crew crew = findCrewById(crewId);
Introduction introduction = findIntroductionById(introductionId);
introduction.delete(request.loginMemberId(), crew);
}

@Override
public IntroductionDetailResponse getIntroduction(UUID crewId, UUID introductionId) {
Introduction introduction = findIntroductionByIdAndCrewId(introductionId, crewId);
return IntroductionDetailResponse.of(introduction);
}

@Override
public ScrollPageResponse<IntroductionListResponse> getIntroductions(UUID crewId, Pageable pageable) {
findCrewById(crewId);
Slice<IntroductionListResponse> result = introductionQueryRepository.getIntroductions(crewId, pageable);
Long totalCount = introductionQueryRepository.getIntroductionCount(crewId);
return ScrollPageResponse.of(totalCount, result.hasNext(), result.getContent());
}

public Crew findCrewById(UUID crewId){
return crewRepository.findById(crewId)
.orElseThrow(CrewNotFoundException::new);
}

public Introduction findIntroductionById(UUID introductionId){
return introductionRepository.findById(introductionId)
.orElseThrow(IntroductionNotFoundException::new);
}

public Introduction findIntroductionByIdAndCrewId(UUID introductionId, UUID crewId) {
return introductionRepository.findByIdAndCrewId(introductionId, crewId)
.orElseThrow(IntroductionNotFoundException::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.retrip.crew.application.in.request;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.Introduction;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.UUID;

@Schema(description = "크루 자기소개 등록 Request")
public record IntroductionCreateRequest(

@Schema(description = "로그인한 사용자 - 임시 방편")
UUID loginMemberId,
@Schema(description = "자기소개 제목")
String title,
@Schema(description = "자기소개 본문")
String content
) {
public Introduction to(Crew crew){
return Introduction.create(this.loginMemberId, this.title, this.content, crew);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.retrip.crew.application.in.request;

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

@Schema(description = "크루 자기소개 삭제 Request")
public record IntroductionDeleteRequest(

@Schema(description = "로그인한 사용자 - 임시 방편")
UUID loginMemberId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.retrip.crew.application.in.request;

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

@Schema(description = "크루 자기소개 수정 Request")
public record IntroductionUpdateRequest(

@Schema(description = "로그인한 사용자 - 임시 방편")
UUID loginMemberId,
@Schema(description = "자기소개 제목")
String title,
@Schema(description = "자기소개 본문")
String content
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Introduction;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.UUID;

@Schema(description = "크루 자기소개 등록 Response")
public record IntroductionCreateResponse(

@Schema(description = "크루 ID")
UUID crewId,
@Schema(description = "자기소개 ID")
UUID introductionId,
@Schema(description = "자기소개 제목")
String title,
@Schema(description = "자기소개 본문")
String content
) {
public static IntroductionCreateResponse of(Introduction introduction){
return new IntroductionCreateResponse(
introduction.getCrew().getId(),
introduction.getId(),
introduction.getTitle(),
introduction.getContent()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Introduction;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.UUID;
import lombok.Builder;

@Builder
@Schema(description = "크루 자기소개 상세 Response")
public record IntroductionDetailResponse(

@Schema(description = "크루 ID")
UUID crewId,
@Schema(description = "자기소개 ID")
UUID introductionId,
@Schema(description = "자기소개 등록한 사용자 ID")
UUID memberId,
@Schema(description = "자기소개 제목")
String title,
@Schema(description = "자기소개 본문")
String content
) {
public static IntroductionDetailResponse of(Introduction introduction){
return IntroductionDetailResponse.builder()
.crewId(introduction.getCrew().getId())
.introductionId(introduction.getId())
.memberId(introduction.getMemberId())
.title(introduction.getTitle())
.content(introduction.getContent())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
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")
public record IntroductionListResponse(

@Schema(description = "크루 ID")
UUID crewId,
@Schema(description = "자기소개 ID")
UUID introductionId,
@Schema(description = "자기소개 제목")
String title,
@Schema(description = "자기소개 등록일자")
LocalDateTime createdAt,
@Schema(description = "자기소개 수정일자")
LocalDateTime editedAt
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Introduction;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.UUID;

@Schema(description = "크루 자기소개 수정 Response")
public record IntroductionUpdateResponse(

@Schema(description = "크루 ID")
UUID crewId,
@Schema(description = "자기소개 ID")
UUID introductionId,
@Schema(description = "자기소개 제목")
String title,
@Schema(description = "자기소개 본문")
String content
) {
public static IntroductionUpdateResponse from(Introduction introduction){
return new IntroductionUpdateResponse(
introduction.getCrew().getId(),
introduction.getId(),
introduction.getTitle(),
introduction.getContent()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ public interface ManageCrewUseCase {
CrewCreateResponse createCrew(CrewCreateRequest request);

CrewUpdateResponse updateCrew(UUID crewId, CrewUpdateRequest request);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.retrip.crew.application.in.usecase;

import com.retrip.crew.application.in.request.IntroductionCreateRequest;
import com.retrip.crew.application.in.request.IntroductionDeleteRequest;
import com.retrip.crew.application.in.request.IntroductionUpdateRequest;
import com.retrip.crew.application.in.response.IntroductionCreateResponse;
import com.retrip.crew.application.in.response.IntroductionDetailResponse;
import com.retrip.crew.application.in.response.IntroductionListResponse;
import com.retrip.crew.application.in.response.IntroductionUpdateResponse;
import com.retrip.crew.infra.adapter.in.presentation.rest.common.ScrollPageResponse;
import java.util.UUID;
import org.springframework.data.domain.Pageable;

public interface ManageIntroductionUseCase {
IntroductionCreateResponse createIntroduction(UUID crewId, IntroductionCreateRequest request);

IntroductionUpdateResponse updateIntroduction(UUID crewId, UUID introductionId, IntroductionUpdateRequest request);

void deleteIntroduction(UUID crewId, UUID introductionId, IntroductionDeleteRequest request);

IntroductionDetailResponse getIntroduction(UUID crewId, UUID introductionId);

ScrollPageResponse<IntroductionListResponse> getIntroductions(UUID crewId, Pageable pageable);
}
Loading