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
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ bin/

### IntelliJ IDEA ###
application.properties
application.yml
.env
.idea
*.iws
*.iml
Expand All @@ -38,4 +36,4 @@ out/
/.nb-gradle/

### VS Code ###
.vscode/
.vscode/
7 changes: 2 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

testImplementation 'org.springframework.security:spring-security-test'

Expand All @@ -53,9 +53,6 @@ dependencies {
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
implementation 'org.postgresql:postgresql'


}

tasks.named('test') {
Expand All @@ -68,4 +65,4 @@ jar {

clean {
delete file('src/main/generated')
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,4 @@ public static void main(String[] args) {
SpringApplication.run(SemtleWebServerSpringApplication.class, args);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto;

public interface ApplyProjectService {
ApplyProjectResponseDto applyProject(ApplyProjectRequestDto applyProjectRequestDto) throws Exception;
ApplyProjectResponseDto applyProject(Integer boardId, Integer applicantId, ApplyProjectRequestDto applyProjectRequestDto) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,33 @@
package com.archisemtle.semtlewebserverspring.application;

import static com.archisemtle.semtlewebserverspring.common.BaseResponseStatus.NO_DATA;

import com.archisemtle.semtlewebserverspring.common.BaseException;
import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus;
import com.archisemtle.semtlewebserverspring.domain.Apply;
import com.archisemtle.semtlewebserverspring.domain.Applicants;
import com.archisemtle.semtlewebserverspring.domain.Application;
import com.archisemtle.semtlewebserverspring.domain.Member;
import com.archisemtle.semtlewebserverspring.domain.ProjectBoard;
import com.archisemtle.semtlewebserverspring.domain.ProjectJoinFile;
import com.archisemtle.semtlewebserverspring.domain.ProjectJoinUrl;
import com.archisemtle.semtlewebserverspring.domain.ProjectTypeCategory;
import com.archisemtle.semtlewebserverspring.domain.RelationFieldProjectPostMiddle;
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto;
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto.FileDto;
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto;
import com.archisemtle.semtlewebserverspring.infrastructure.ApplyRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ProjectBoardRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinFileRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinUrlRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.chrono.ChronoLocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -32,76 +37,89 @@
@Transactional(readOnly = true)
public class ApplyProjectServiceImpl implements ApplyProjectService {

private final ApplicantsRepository applicantsRepository;
private final ApplicationRepository applicationRepository;
private final MemberRepository memberRepository;
private final ApplyRepository applyRepository;
private final ProjectBoardRepository projectBoardRepository;
private final ProjectJoinFileRepository projectJoinFileRepository;
private final ProjectJoinUrlRepository projectJoinUrlRepository;
private final RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository;

@Override
@Transactional
public ApplyProjectResponseDto applyProject(ApplyProjectRequestDto applyProjectRequestDto) {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
UUID uuid = UUID.fromString(authentication.getName());
public ApplyProjectResponseDto applyProject(Integer boardId,Integer applicantId, ApplyProjectRequestDto applyProjectRequestDto)
throws Exception {
ProjectBoard projectBoard = projectBoardRepository.findById(Long.valueOf(boardId))
.orElseThrow(() -> new BaseException(NO_DATA)); //todo 나중에 BaseResponseStatue 수정 필요

if(applyProjectRequestDto == null) {
throw new BaseException(BaseResponseStatus.WRONG_PARAM);
}
LocalDateTime now = LocalDateTime.now();

ProjectBoard projectBoard = projectBoardRepository.findById(applyProjectRequestDto.getPostId())
.orElseThrow(() -> new BaseException(BaseResponseStatus.NO_BOARD_FOUND));
LocalDate endDateTime = projectBoard.getProjectRecruitingEndTime();

if(LocalDate.now().isBefore(projectBoard.getProjectRecruitingEndTime().plusDays(1))) {
Member member = memberRepository.findByUuid(uuid)
if(now.isBefore(ChronoLocalDateTime.from(endDateTime))) {
Member member = memberRepository.findById(applicantId)
.orElseThrow(() -> new BaseException(
BaseResponseStatus.NO_EXIST_MEMBERS));

if(projectBoard.getWriterUuid().equals(member.getUuid().toString())) {
throw new BaseException(BaseResponseStatus.SAME_WRITER);
}


Apply existingApply = applyRepository.findByMemberAndProjectBoardId(member, applyProjectRequestDto.getPostId());

if (existingApply != null) {
throw new BaseException(BaseResponseStatus.DUPLICATE_APPLY);
}

Apply apply = Apply.builder()
.member(member)
.projectBoard(projectBoard)
.applyDate(LocalDateTime.now())
.status("대기")
.updatedAt(LocalDateTime.now())
.answer(applyProjectRequestDto.getAnswer())
Date applyDate = Date.from(
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());

String updatedAt = LocalDateTime.now()
.atZone(ZoneId.of("UTC"))
.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"));

Applicants applicants = Applicants.builder()
.name(member.getUsername())
.applyDate(applyDate)
.status("대기") // 기본값
.email(member.getEmail())
.phone(member.getPhone())
.resumeUrl(applyProjectRequestDto.getFiles().stream()
.filter(file -> file.getFileName().equals("resume.pdf"))
.map(FileDto::getFileUrl)
.findFirst()
.orElse(null))
.portfolioUrl(applyProjectRequestDto.getUrls().stream()
.findFirst()
.orElse(null))
.customAnswer("답변 내용")
.updatedAt(updatedAt)
.boardId(boardId)
.build();

applyRepository.save(apply);
applicantsRepository.save(applicants);

List<ProjectJoinUrl> projectJoinUrls = applyProjectRequestDto.getUrls().stream()
.map(url -> ProjectJoinUrl.builder()
.url(url)
.apply(apply)
.build())
.collect(Collectors.toList());
ProjectTypeCategory projectTypeName = projectBoard.getProjectTypeCategory(); // project_type_category_name 가져오기

projectJoinUrlRepository.saveAll(projectJoinUrls);
List<RelationFieldProjectPostMiddle> relationFieldProjectPostMiddles = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId(Long.valueOf(boardId));

List<ProjectJoinFile> projectJoinFiles = applyProjectRequestDto.getFileUrls().stream()
.map(fileUrl -> ProjectJoinFile.builder()
.file(fileUrl)
.apply(apply)
.build())
List<String> relationFieldNames = relationFieldProjectPostMiddles.stream()
.map(relationField -> relationField.getRelationFieldCategory().getName()) // 이름 가져오기
.collect(Collectors.toList());

projectJoinFileRepository.saveAll(projectJoinFiles);
String questionAnswers = applyProjectRequestDto.getAnswers().stream()
.map(ApplyProjectRequestDto.AnswerDto::getAnswer) // answer만 추출
.collect(Collectors.joining("*|*")); // 구분자를 사용하여 하나의 문자열로 변환

Application application = Application.builder()
.applicantId(applicants.getApplicantId())
.projectTitle(projectBoard.getTitle())
.boardId(boardId)
.applyDate(applyDate)
.status("대기") // 수정됨.
.projectType(projectTypeName.getName())
.relateField(relationFieldNames.toString())
.questionAnswer(questionAnswers)
.build();

applicationRepository.save(application);

ApplyProjectResponseDto applyProjectResponseDto = ApplyProjectResponseDto.entityToDto(apply);
return applyProjectResponseDto;
// 응답 DTO 생성
ApplyProjectResponseDto successResponseDto = ApplyProjectResponseDto.entityToDto(application);

return successResponseDto;
}else{
throw new BaseException(BaseResponseStatus.RECRUITING_ALREADY_ENDED);
ApplyProjectResponseDto failResponseDto = ApplyProjectResponseDto.entityToDto(null);

return failResponseDto;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.archisemtle.semtlewebserverspring.application;


import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusRequestDto;
import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto;
import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto;
import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto;
import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto;
import java.util.UUID;

public interface ProjectApplicationService {
ProjectApplicantsResponseDto getApplicants(Long boardId, int page, int limit) throws Exception;
ShowProjectApplicantInfoResponseDto getApplicantInfo(Long boardId,UUID uuid) throws Exception;
ChangeApplyStatusResponseDto changeApplyStatus(Long boardId,UUID uuid, String status) throws Exception;
ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int page, int limit) throws Exception;
ProjectApplicantsResponseDto getApplicants(Integer boardId, int page, int limit) throws Exception;
ShowProjectApplicantInfoResponseDto getApplicantInfo(Integer boardId,Integer applicantId) throws Exception;
ChangeApplyStatusResponseDto changeApplyStatus(Integer boardId,Integer applicantId, String status) throws Exception;
ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(Integer applicantId,int page, int limit) throws Exception;
}
Loading