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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation "org.springdoc:springdoc-openapi-starter-webmvc-api:2.8.5"
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5"
implementation 'mysql:mysql-connector-java:8.0.33'


compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
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.response.CreateRecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.RecruitmentQuestionResponse;
import com.retrip.crew.application.in.response.UpdateRecruitmentQuestionResponse;
import com.retrip.crew.application.in.usecase.GetRecruitmentQuestionUseCase;
import com.retrip.crew.application.in.usecase.ManageRecruitmentQuestionUseCase;
import com.retrip.crew.application.out.repository.CrewMemberQueryRepository;
import com.retrip.crew.application.out.repository.CrewQueryRepository;
import com.retrip.crew.application.out.repository.RecruitmentQuestionQueryRepository;
import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.CrewMember;
import com.retrip.crew.domain.entity.RecruitmentQuestion;
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 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.List;
import java.util.UUID;

@Service
@Transactional
@RequiredArgsConstructor
public class RecruitmentQuestionService implements ManageRecruitmentQuestionUseCase, GetRecruitmentQuestionUseCase {

private final CrewQueryRepository crewQueryRepository;
private final CrewMemberQueryRepository crewMemberQueryRepository;
private final RecruitmentQuestionQueryRepository recruitmentQuestionQueryRepository;

@Override
public CreateRecruitmentQuestionResponse createRecruitmentQuestion(UUID crewId, CreateRecruitmentQuestionRequest request) {
Crew crew = crewQueryRepository
.findByIdWithRecruitment(crewId)
.orElseThrow(CrewNotFoundException::new);

RecruitmentQuestion question = RecruitmentQuestion.create(request.content(), crew);
crew.getRecruitment().addQuestion(question);

return CreateRecruitmentQuestionResponse.of(question);
}

@Override
public UpdateRecruitmentQuestionResponse updateRecruitmentQuestion(UUID crewId, UUID questionId, UpdateRecruitmentQuestionRequest request) {
Crew crew = crewQueryRepository
.findByIdWithRecruitment(crewId)
.orElseThrow(CrewNotFoundException::new);

RecruitmentQuestion question = crew.getRecruitment()
.getRecruitmentQuestions()
.updateQuestion(questionId, request.content(), request.memberId());

return UpdateRecruitmentQuestionResponse.of(question);
}

@Override
public void deleteRecruitmentQuestion(UUID crewId, UUID questionId, UUID memberId) {
Crew crew = crewQueryRepository
.findByIdWithRecruitment(crewId)
.orElseThrow(CrewNotFoundException::new);

CrewMember crewMember = findCrewMemberByMemberId(crewId, memberId);

// crew.getRecruitment()
// .getRecruitmentQuestions()
// .deleteQuestion(questionId, crewMember);
}

private CrewMember findCrewMemberByMemberId(UUID crewId, UUID memberId) {
return crewMemberQueryRepository
.findCrewMemberByMemberId(crewId, memberId)
.orElseThrow(CrewMemberNotFoundException::new);
}

@Override
@Transactional(readOnly = true)
public List<RecruitmentQuestionResponse> getRecruitmentQuestions(UUID crewId) {
return recruitmentQuestionQueryRepository.findRecruitmentQuestions(crewId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.retrip.crew.application.in.request;

import java.util.UUID;

public record CreateDemandRequest(
UUID memberId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.retrip.crew.application.in.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.util.UUID;

@Schema(description = "참여요청질문 생성 Request")
public record CreateRecruitmentQuestionRequest(
@Schema(description = "질문 내용")
@NotNull
@Size(min = 1, max = 100)
String content,
@Schema(description = "작성자")
@NotNull
UUID memberId
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.retrip.crew.application.in.request;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum CrewOrder {
DATE("createdAt");

private final String field;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.retrip.crew.application.in.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;

@Schema(description = "크루 정보 수정 Request")
public record CrewUpdateRequest(
@Schema(description = "크루 타이틀")
@Size(min = 1, max = 30)
String title,

@Schema(description = "크루 설명")
@Size(min = 1, max = 500)
String description,

@Schema(description = "크루 최대 인원수")
@Size(min = 5, max = 1000)
int maxMembers
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.retrip.crew.application.in.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.util.UUID;

@Schema(description = "참여요청질문 수정 Request")
public record UpdateRecruitmentQuestionRequest(
@Schema(description = "질문 내용")
@NotNull
@Size(min = 1, max = 100)
String content,
@Schema(description = "수정자")
@NotNull
UUID memberId
) {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;

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

@Schema(description = "크루 생성 Request")
Expand All @@ -21,10 +22,14 @@ public record CrewCreateRequest(

@Schema(description = "크루 최대 인원수")
@Size(min = 5, max = 1000)
int maxMembers
int maxMembers,

@Schema(description = "크루 질문 목록")
@Size(min = 1, max = 5)
List<String> questions
){

public Crew to(UUID leader) {
return Crew.create(this.title, this.description, this.maxMembers, leader);
return Crew.create(this.title, this.description, this.maxMembers, leader,this.questions);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.vo.RecruitmentStatus;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

public record ChangeRecruitmentStatusResponse(
@Schema(description = "크루 ID")
UUID id,

@Schema(description = "모집 상태")
RecruitmentStatus status
) {
public static ChangeRecruitmentStatusResponse of(Crew crew) {
return new ChangeRecruitmentStatusResponse(crew.getId(), crew.getRecruitment().getStatus());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Demand;

import java.util.UUID;

public record CreateDemandResponse(
UUID crewId,
UUID memberId
) {
public static CreateDemandResponse of(UUID crewId, Demand demand) {
return new CreateDemandResponse(crewId, demand.getMemberId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.RecruitmentQuestion;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

@Schema(description = "참여요청질문 생성 Response")
public record CreateRecruitmentQuestionResponse(
@Schema(description = "질문 ID") UUID id,
@Schema(description = "질문 내용") String content
) {
public static CreateRecruitmentQuestionResponse of(RecruitmentQuestion question) {
return new CreateRecruitmentQuestionResponse(
question.getId(),
question.getContent().getValue()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.entity.CrewMember;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

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

@Schema
@Builder
public record CrewDetailResponse(
@Schema(description = "크루 ID")
UUID id,

@Schema(description = "크루 타이틀")
String title,

@Schema(description = "크루 설명")
String description,

@Schema(description = "크루 리더 ID")
UUID leaderId,

@Schema(description = "크루원 현재 인원수")
Integer memberCount,

@Schema(description = "크루원 수용가능한 최대 인원수")
Integer maxMemberCount,

@Schema(description = "크루원 리스트")
List<CrewMemberResponse> members
) {

public static CrewDetailResponse of(Crew crew, int memberCount){
return CrewDetailResponse.builder()
.id(crew.getId())
.title(crew.getTitle().getValue())
.description(crew.getDescription())
.leaderId(crew.getLeader().getMemberId())
.memberCount(memberCount)
.maxMemberCount(crew.getRecruitment().getMaxMembers())
.members(toList(crew.getCrewMembers().getValues()))
.build();
}

public static List<CrewMemberResponse> toList(List<CrewMember> crewMembers){
return crewMembers.stream()
.map(CrewMemberResponse::from)
.toList();
}

@Schema
public record CrewMemberResponse(

@Schema(description = "크루 멤버 고유 ID")
UUID id,

@Schema(description = "크루원 ID")
UUID memberId,

@Schema(description = "크루원 역할코드")
String roleCode,

@Schema(description = "크루원 역할명")
String roleName
){
public static CrewMemberResponse from(CrewMember crewMember){
return new CrewMemberResponse(
crewMember.getId(),
crewMember.getMemberId(),
crewMember.getCrewMemberRole().getCode(),
crewMember.getCrewMemberRole().getViewName()
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.retrip.crew.application.in.response;

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

@Schema(description = "크루 리스트 조회 Response")
public record CrewListResponse(
@Schema(description = "크루 ID")
UUID id,

@Schema(description = "크루 타이틀")
String title,

@Schema(description = "크루 리더 ID")
UUID leaderId,

@Schema(description = "크루원 현재 인원수")
Long memberCount,

@Schema(description = "크루원 수용가능한 최대 인원수")
Integer maxMemberCount
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.retrip.crew.application.in.response;

import com.retrip.crew.domain.entity.Crew;
import com.retrip.crew.domain.vo.RecruitmentStatus;
import io.swagger.v3.oas.annotations.media.Schema;

import java.util.UUID;

public record CrewUpdateResponse(
@Schema(description = "크루 ID")
UUID id,

@Schema(description = "크루 타이틀")
String title,

@Schema(description = "크루 설명")
String description,

@Schema(description = "리더 ID")
UUID leaderId,

@Schema(description = "크루 최대 인원수")
int maxMembers,

@Schema(description = "모집 상태")
RecruitmentStatus status
) {
public static CrewUpdateResponse of(Crew crew) {
return new CrewUpdateResponse(
crew.getId(),
crew.getTitle().getValue(),
crew.getDescription(),
crew.getLeader().getId(),
crew.getRecruitment().getMaxMembers(),
crew.getRecruitment().getStatus()
);
}
}
Loading