Skip to content
Merged

Dev #134

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
b088968
refactor:date->LocalDateTime 수정
bagsangbin Mar 28, 2025
b4b6f9f
refactor:Date->LocalDateTime으로 변경
bagsangbin Mar 28, 2025
fb7d6f0
refactor:Date -> LocalDateTime 수정
bagsangbin Mar 28, 2025
6715920
refactor:Activity List타입 호출 일부 수정
bagsangbin Mar 28, 2025
c491027
Merge pull request #108 from Lab-Semtle/refactor/#106
bagsangbin Mar 30, 2025
712ed8e
Merge branch 'dev' into refactor/#109
bagsangbin Mar 30, 2025
c8eb7fb
Merge pull request #110 from Lab-Semtle/refactor/#109
bagsangbin Mar 30, 2025
761982b
Merge pull request #112 from Lab-Semtle/refactor/#111
bagsangbin Mar 30, 2025
7f74cba
Refector : 공고 신청, 개인정보 수정, 개인정보 조회 및 마이페이지 공고 관련 API Refectoring
hhjkhhbgkugjnbj Apr 1, 2025
077a720
Refector : 오류 처리 추가
hhjkhhbgkugjnbj Apr 3, 2025
79af3fa
refactor: 게시물 내용 제한 수정
bagsangbin Apr 4, 2025
6667d8f
refactor: 변경사항 수정
bagsangbin Apr 4, 2025
a612c16
refactor: 페이지 전체 불러오기 수정
bagsangbin Apr 4, 2025
3597193
feature:BaseException예외를 처리하는 글로벌 예외처리기 구현
bagsangbin Apr 4, 2025
a381d6b
Refector: member_id -> uuid 수정 및 오류 체크 추가
hhjkhhbgkugjnbj Apr 8, 2025
e655894
feat: 프로젝트 게시물 삭제 안되는 문제 수정(#126)
LEEForgiveness Apr 9, 2025
4163c44
feat: 프로젝트 게시물 이미지 변경 로직 추가(#127)
LEEForgiveness Apr 9, 2025
bdb5b9f
refactor:비밀번호 재설정 API 및 호원가입 API 수정, 역할 변경 기능 추가, Swagger 문서 설명 추가
e-wha Apr 9, 2025
8becc75
Merge pull request #116 from Lab-Semtle/refactor/#115
bagsangbin Apr 10, 2025
8c7ff99
Merge pull request #118 from Lab-Semtle/refactor/#117
bagsangbin Apr 10, 2025
0f9000a
Merge branch 'dev' into feature/#119
bagsangbin Apr 10, 2025
b3499fb
Merge pull request #120 from Lab-Semtle/feature/#119
bagsangbin Apr 10, 2025
e447041
Merge pull request #124 from Lab-Semtle/feature/#105
LEEForgiveness Apr 10, 2025
a9b4bcf
Merge pull request #128 from Lab-Semtle/feature/#126
LEEForgiveness Apr 10, 2025
ba210f2
Merge pull request #129 from Lab-Semtle/feature/#127
LEEForgiveness Apr 10, 2025
e82773d
Refector: 개인 정보 조회 API 수정
hhjkhhbgkugjnbj Apr 11, 2025
57401d4
Merge branch 'dev' into refactor/#125
e-wha Apr 14, 2025
3d62ae0
Merge pull request #133 from Lab-Semtle/refector/#132
LEEForgiveness Apr 14, 2025
40d3d28
Merge pull request #130 from Lab-Semtle/refactor/#125
LEEForgiveness Apr 14, 2025
adf96a8
Revert "Refactor/#125 비밀번호 재설정 및 회원가입 API 수정, 역할 변경 기능 추가, Swagger 문서…
e-wha Apr 14, 2025
c540d6a
Merge pull request #135 from Lab-Semtle/revert-130-refactor/#125
LEEForgiveness Apr 21, 2025
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: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ bin/

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

### VS Code ###
.vscode/
.vscode/
7 changes: 5 additions & 2 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.0.2'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'

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

Expand All @@ -53,6 +53,9 @@ 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 @@ -65,4 +68,4 @@ jar {

clean {
delete file('src/main/generated')
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ 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(Integer boardId, Integer applicantId, ApplyProjectRequestDto applyProjectRequestDto) throws Exception;
ApplyProjectResponseDto applyProject(ApplyProjectRequestDto applyProjectRequestDto) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,28 @@
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.Applicants;
import com.archisemtle.semtlewebserverspring.domain.Application;
import com.archisemtle.semtlewebserverspring.domain.Apply;
import com.archisemtle.semtlewebserverspring.domain.Member;
import com.archisemtle.semtlewebserverspring.domain.ProjectBoard;
import com.archisemtle.semtlewebserverspring.domain.ProjectTypeCategory;
import com.archisemtle.semtlewebserverspring.domain.RelationFieldProjectPostMiddle;
import com.archisemtle.semtlewebserverspring.domain.ProjectJoinFile;
import com.archisemtle.semtlewebserverspring.domain.ProjectJoinUrl;
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto;
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto.FileDto;
import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto;
import com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ApplyRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ProjectBoardRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository;
import java.sql.Timestamp;
import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinFileRepository;
import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinUrlRepository;
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 @@ -37,89 +32,76 @@
@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 RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository;
private final ProjectJoinFileRepository projectJoinFileRepository;
private final ProjectJoinUrlRepository projectJoinUrlRepository;

@Override
@Transactional
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 수정 필요
public ApplyProjectResponseDto applyProject(ApplyProjectRequestDto applyProjectRequestDto) {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
UUID uuid = UUID.fromString(authentication.getName());

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

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

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

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();
if(projectBoard.getWriterUuid().equals(member.getUuid().toString())) {
throw new BaseException(BaseResponseStatus.SAME_WRITER);
}


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

ProjectTypeCategory projectTypeName = projectBoard.getProjectTypeCategory(); // project_type_category_name 가져오기
if (existingApply != null) {
throw new BaseException(BaseResponseStatus.DUPLICATE_APPLY);
}

List<RelationFieldProjectPostMiddle> relationFieldProjectPostMiddles = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId(Long.valueOf(boardId));
Apply apply = Apply.builder()
.member(member)
.projectBoard(projectBoard)
.applyDate(LocalDateTime.now())
.status("대기")
.updatedAt(LocalDateTime.now())
.answer(applyProjectRequestDto.getAnswer())
.build();

List<String> relationFieldNames = relationFieldProjectPostMiddles.stream()
.map(relationField -> relationField.getRelationFieldCategory().getName()) // 이름 가져오기
applyRepository.save(apply);

List<ProjectJoinUrl> projectJoinUrls = applyProjectRequestDto.getUrls().stream()
.map(url -> ProjectJoinUrl.builder()
.url(url)
.apply(apply)
.build())
.collect(Collectors.toList());

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();
projectJoinUrlRepository.saveAll(projectJoinUrls);

applicationRepository.save(application);
List<ProjectJoinFile> projectJoinFiles = applyProjectRequestDto.getFileUrls().stream()
.map(fileUrl -> ProjectJoinFile.builder()
.file(fileUrl)
.apply(apply)
.build())
.collect(Collectors.toList());

// 응답 DTO 생성
ApplyProjectResponseDto successResponseDto = ApplyProjectResponseDto.entityToDto(application);
projectJoinFileRepository.saveAll(projectJoinFiles);

return successResponseDto;
}else{
ApplyProjectResponseDto failResponseDto = ApplyProjectResponseDto.entityToDto(null);

return failResponseDto;
ApplyProjectResponseDto applyProjectResponseDto = ApplyProjectResponseDto.entityToDto(apply);
return applyProjectResponseDto;
}else{
throw new BaseException(BaseResponseStatus.RECRUITING_ALREADY_ENDED);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
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(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;
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;
}
Loading