diff --git a/.gitignore b/.gitignore index b9b1a83..80524f4 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ bin/ ### IntelliJ IDEA ### application.properties +application.yml +.env .idea *.iws *.iml @@ -36,4 +38,4 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ \ No newline at end of file +.vscode/ diff --git a/build.gradle b/build.gradle index 767144d..d85a2a8 100644 --- a/build.gradle +++ b/build.gradle @@ -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' @@ -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') { @@ -65,4 +68,4 @@ jar { clean { delete file('src/main/generated') -} \ No newline at end of file +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java b/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java index 15a2ba3..08db5b9 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java @@ -10,4 +10,5 @@ public static void main(String[] args) { SpringApplication.run(SemtleWebServerSpringApplication.class, args); } + } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java index 97a3aa7..ca65cb1 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java @@ -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; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java index ff67c34..a61fcae 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java @@ -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; @@ -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 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 relationFieldNames = relationFieldProjectPostMiddles.stream() - .map(relationField -> relationField.getRelationFieldCategory().getName()) // 이름 가져오기 + applyRepository.save(apply); + + List 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 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); } } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java index 6765b28..e52f044 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java @@ -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; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java index 150f8fd..1364531 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java @@ -2,24 +2,26 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; +import com.archisemtle.semtlewebserverspring.domain.Apply; import com.archisemtle.semtlewebserverspring.domain.Member; -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import com.archisemtle.semtlewebserverspring.domain.Application; -import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusRequestDto; +import com.archisemtle.semtlewebserverspring.domain.ProjectBoard; 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 com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository; -import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository; -import java.sql.Timestamp; +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.time.LocalDateTime; -import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,33 +31,33 @@ @Transactional(readOnly = true) public class ProjectApplicationServiceImpl implements ProjectApplicationService { - private final ApplicantsRepository applicantsRepository; - private final ApplicationRepository applicationRepository; + private final ApplyRepository applyRepository; + private final MemberRepository memberRepository; + private final ProjectBoardRepository projectBoardRepository; + private final RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository; @Override - public ProjectApplicantsResponseDto getApplicants(Integer boardId, int page, int limit) - throws Exception { + public ProjectApplicantsResponseDto getApplicants(Long postId, int page, int limit) { + if(postId == null || page == 0 || limit == 0) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + + ProjectBoard projectBoard = projectBoardRepository.findById(postId) + .orElseThrow(() -> new BaseException(BaseResponseStatus.NO_BOARD_FOUND)); - // 게시글 ID로 지원자 목록 조회 (페이징 처리) - Pageable pageable = PageRequest.of(page - 1, limit); // Pageable로 선언 - Page applicantsPage = applicantsRepository.findAllWithApplication( - boardId, + Pageable pageable = PageRequest.of(page - 1, limit); + Page applyPage = applyRepository.findByProjectBoard( + projectBoard, pageable ); - // 결과가 비어있거나 지원자 목록 조회에 실패한 경우 처리 - if (applicantsPage.isEmpty()) { - throw new BaseException(BaseResponseStatus.APPLICATION_NOT_FOUND); + if (applyPage == null) { + throw new BaseException(BaseResponseStatus.NO_APPLICANTS); } - // 지원자 정보를 DTO로 변환 - List applicants = applicantsPage.getContent(); - - // DTO 생성 ProjectApplicantsResponseDto projectApplicantsResponseDto = ProjectApplicantsResponseDto.entityToDto( - applicants, - page, - (int) applicantsPage.getTotalElements() + applyPage, + page ); return projectApplicantsResponseDto; @@ -63,66 +65,91 @@ public ProjectApplicantsResponseDto getApplicants(Integer boardId, int page, int @Override - public ShowProjectApplicantInfoResponseDto getApplicantInfo(Integer boardId, Integer applicantId) throws Exception { - Applicants applicants = applicantsRepository.findByBoardIdAndApplicantId(boardId, applicantId).orElseThrow(() -> new BaseException( - BaseResponseStatus.NO_APPLICANT_FOUND)); + public ShowProjectApplicantInfoResponseDto getApplicantInfo(Long postId, UUID uuid) { + if(postId == null || uuid == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Member member = memberRepository.findByUuid(uuid) + .orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_EXIST_MEMBERS)); + + Apply apply = applyRepository.findByMemberAndProjectBoardId(member, postId); + if(apply == null) { + throw new BaseException(BaseResponseStatus.NO_APPLICANTS); + } ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = ShowProjectApplicantInfoResponseDto.entityToDto( - applicants); + apply); return showProjectApplicantInfoResponseDto; } @Override @Transactional - public ChangeApplyStatusResponseDto changeApplyStatus(Integer boardId, Integer applicantId, - String status) throws Exception { - // 신청자 정보 조회 - Applicants applicants = applicantsRepository.findByBoardIdAndApplicantId(boardId, applicantId).orElseThrow(() -> new BaseException( - BaseResponseStatus.NO_APPLICANT_FOUND)); - - Applicants updatedApplicants = Applicants.builder() - .applicantId(applicants.getApplicantId()) - .name(applicants.getName()) - .applyDate(applicants.getApplyDate()) + public ChangeApplyStatusResponseDto changeApplyStatus(Long postId, UUID uuid, String status) { + + if(postId == null || uuid == null || status == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Member member = memberRepository.findByUuid(uuid) + .orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_EXIST_MEMBERS)); + + Apply apply = applyRepository.findByMemberAndProjectBoardId(member, postId); + + if (apply == null) { + throw new BaseException(BaseResponseStatus.NO_APPLICATIONS); + } + + if(!(status.equals("승인") || status.equals("대기") || status.equals("반려"))) { + throw new BaseException(BaseResponseStatus.FALSE_STATUS); + } + + if(apply.getStatus().equals(status)) { + throw new BaseException(BaseResponseStatus.PROCESSED_APPLY); + } + + Apply updatedApply = Apply.builder() + .applyId(apply.getApplyId()) + .member(apply.getMember()) + .projectBoard(apply.getProjectBoard()) + .applyDate(apply.getApplyDate()) .status(status) - .email(applicants.getEmail()) - .phone(applicants.getPhone()) - .resumeUrl(applicants.getResumeUrl()) - .portfolioUrl(applicants.getPortfolioUrl()) - .customAnswer(applicants.getCustomAnswer()) - .additionalFile(applicants.getAdditionalFile()) - .updatedAt(String.valueOf(LocalDateTime.now())) - .boardId(applicants.getBoardId()) + .updatedAt(LocalDateTime.now()) + .answer(apply.getAnswer()) .build(); - applicantsRepository.save(updatedApplicants); + applyRepository.save(updatedApply); - ChangeApplyStatusResponseDto changeApplyStatusResponseDto = ChangeApplyStatusResponseDto.entityToDto(updatedApplicants); + ChangeApplyStatusResponseDto changeApplyStatusResponseDto = ChangeApplyStatusResponseDto.entityToDto( + updatedApply); return changeApplyStatusResponseDto; } @Override - public ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(Integer applicantId, int page, int limit) - throws Exception { + public ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int page, int limit) { - // 게시글 ID로 지원자 목록 조회 (페이징 처리) - Pageable pageable = PageRequest.of(page - 1, limit); // Pageable로 선언 - Page applicationsPage = applicationRepository.findByApplicantId(applicantId, pageable); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + UUID uuid = UUID.fromString(authentication.getName()); - // 결과가 비어있거나 신청서 조회에 실패한 경우 처리 - if (applicationsPage.isEmpty()) { - System.out.println("신청한 공고가 없거나 조회에 실패했습니다."); - return null; + if(page == 0 || limit == 0) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); } - // 지원자 정보를 DTO로 변환 - List applications = applicationsPage.getContent(); + Member member = memberRepository.findByUuid(uuid) + .orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_EXIST_MEMBERS)); + + Pageable pageable = PageRequest.of(page - 1, limit); + Page applyPage = applyRepository.findByMember(member, pageable); + + if (applyPage == null || applyPage.isEmpty()) { + throw new BaseException(BaseResponseStatus.NO_APPLICATIONS); + } - // DTO 생성 ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = ShowApplyingProjectInfoResponseDto.entityToDto( - applications, + applyPage, page, - (int) applicationsPage.getTotalElements() + relationFieldProjectPostMiddleRepository ); return showApplyingProjectInfoResponseDto; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java index 595049e..8d48072 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java @@ -247,6 +247,13 @@ public void deleteProjectBoard(UUID uuid, Long id) { throw new BaseException(FAIL_TO_DELETE); } + List projectBoardImages = projectBoardImageRepository.findAllByProjectBoardId( + id); + + if (!projectBoardImages.isEmpty()) { + projectBoardImageRepository.deleteAllByProjectBoardId(id); + } + List relationFieldProjectPostMiddleList = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId( id); @@ -273,7 +280,7 @@ public void updateProjectBoard(UUID uuid, Long id, .id(id) .title(updateProjectBoardRequestDto.getTitle()) .content(updateProjectBoardRequestDto.getContent()) - .writerUuid(origin.getWriterUuid()) //TODO: 나중에 실제 값으로 변경해야함 + .writerUuid(origin.getWriterUuid()) .writerName(origin.getWriterName()) .contact(updateProjectBoardRequestDto.getContact()) .projectTypeCategory(updateProjectBoardRequestDto.getProjectTypeCategory()) @@ -285,6 +292,21 @@ public void updateProjectBoard(UUID uuid, Long id, projectBoardRepository.save(projectBoard); + List projectBoardImages = projectBoardImageRepository.findAllByProjectBoardId( + id); + + if (!projectBoardImages.isEmpty()) { + projectBoardImageRepository.deleteAllByProjectBoardId(id); + } + List projectBoardImageList = updateProjectBoardRequestDto.getProjectBoardImages() + .stream().map( + image -> ProjectBoardImage.builder() + .projectBoard(projectBoard) + .projectBoardImageUrl(image) + .build()) + .collect(Collectors.toList()); + projectBoardImageRepository.saveAll(projectBoardImageList); + relationFieldProjectPostMiddleRepository.deleteAllByProjectBoardId(id); List relationFieldProjectPostMiddles = updateProjectBoardRequestDto.getRelationFieldCategories() diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java index b402e5a..3a68170 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java @@ -36,10 +36,10 @@ public void createActivityBoard(ActivityRequestDto requestDto) throws IOExceptio Activity activity = Activity.builder() .title(requestDto.getTitle()) .content(requestDto.getContent()) + .createdAt(requestDto.getCreatedAt()) .writer(requestDto.getWriter()) .images(requestDto.getImages()) .uuid(requestDto.getUuid()) - .createdAt(new Date()) .type(requestDto.getType()) .build(); @@ -72,7 +72,6 @@ public void updateActivityBoard(Long id, ActivityRequestDto requestDto){ .images(requestDto.getImages()) .type(requestDto.getType()) .build(); - activityRepository.save(changedActivity); } @@ -88,8 +87,8 @@ public ActivityListResponseDto readActivityListBoard(ActivityListRequestDto requ Pageable pageable = PageRequest.of(requestDto.getPage()-1, requestDto.getSize(), Sort.by(Direction.ASC, "createdAt")); - - activityPage = activityRepository.findByTypeContainingIgnoreCase(requestDto.getType(), pageable); + activityPage = requestDto.getType().equals("all") ? activityRepository.findAll(pageable) : + activityRepository.findByTypeContainingIgnoreCase(requestDto.getType(), pageable); int total_posts = (int)activityPage.getTotalElements(); int total_pages = (int) Math.ceil((double) total_posts / requestDto.getSize()); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java index 868458c..6656fd3 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java @@ -11,7 +11,6 @@ public interface ArchiveService { - public void createArchiveBoard(ArchiveRequestDto requestDto); public ArchiveResponseDto readArchiveBoard(Long id); public void updateArchiveBoard(Long id, ArchiveRequestDto requestDto); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java index 838fee5..3964f1d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java @@ -9,23 +9,26 @@ import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveResponseDto; import com.archisemtle.semtlewebserverspring.infrastructure.archive.ArchiveRepository; -import java.util.Date; +import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; import java.util.UUID; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.stereotype.Service; -import com.archisemtle.semtlewebserverspring.domain.archive.Archive; @Service @AllArgsConstructor +@Slf4j public class ArchiveServiceImpl implements ArchiveService{ - private final ArchiveRepository archiveRepository; + private static final Logger logger = LoggerFactory.getLogger(ArchiveServiceImpl.class); //게시판 생성 @Override @@ -34,13 +37,13 @@ public void createArchiveBoard(ArchiveRequestDto requestDto) { .title(requestDto.getTitle()) .content(requestDto.getContent()) .writer(requestDto.getWriter()) - .createdAt(new Date()) + .createdAt(requestDto.getCreatedAt()) .uuid(requestDto.getUuid()) .imageUrl(requestDto.getImageUrl()) .fileUrl(requestDto.getFileUrl()) .build(); - archiveRepository.save(archive); + archiveRepository.save(archive); } //게시판 읽기 diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java index f71c859..9dcf44d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; +import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.config.jwt.JwtToken; import com.archisemtle.semtlewebserverspring.config.jwt.JwtTokenProvider; import com.archisemtle.semtlewebserverspring.domain.Member; @@ -18,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -89,7 +91,7 @@ public ExcelAddMemberResponseDto excelAddMember(MultipartFile file) throws IOExc .password(passwordEncoder.encode("#semtle308")) .studentId(studentId) .username(username) - .birth(parseDate("2025-01-01")) + .birth(LocalDate.parse("2025-01-01")) .phone(phone) .role(role) .manageApprovalStatus(false) @@ -129,6 +131,11 @@ private Date parseDate(String dateStr) { // Member 조회 메서드 @Override public MemberReadResponseDto show(UUID uuid) { + + if(uuid == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Member member = memberRepository.findByUuid(uuid).orElseThrow(()-> new BaseException( BaseResponseStatus.NO_EXIST_MEMBERS)); @@ -141,6 +148,7 @@ public MemberReadResponseDto show(UUID uuid) { .birth(member.getBirth()) .phone(member.getPhone()) .role(member.getRole()) + .profileImageUrl(member.getProfileImageUrl()) .manageApprovalStatus(member.isManageApprovalStatus()) .build(); } @@ -149,6 +157,13 @@ public MemberReadResponseDto show(UUID uuid) { @Override @Transactional public void update(UUID uuid , MemberUpdateRequestDto memberUpdateRequestDto) { + + if(uuid == null || memberUpdateRequestDto.getUsername() == null || memberUpdateRequestDto.getBirth() == null + || memberUpdateRequestDto.getPhone() == null || memberUpdateRequestDto.getImageUrl() + == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Member member = memberRepository.findByUuid(uuid).orElseThrow(()-> new BaseException( BaseResponseStatus.NO_EXIST_MEMBERS)); @@ -157,10 +172,11 @@ public void update(UUID uuid , MemberUpdateRequestDto memberUpdateRequestDto) { .uuid(member.getUuid()) .email(member.getEmail()) .password(member.getPassword()) - .studentId(member.getStudentId() != null ? memberUpdateRequestDto.getStudentId() : member.getStudentId()) + .studentId(member.getStudentId()) .username(memberUpdateRequestDto.getUsername() != null ? memberUpdateRequestDto.getUsername() : member.getUsername()) // 업데이트 값 적용 .birth(memberUpdateRequestDto.getBirth() != null ? memberUpdateRequestDto.getBirth() : member.getBirth()) .phone(memberUpdateRequestDto.getPhone() != null ? memberUpdateRequestDto.getPhone() : member.getPhone()) + .profileImageUrl(memberUpdateRequestDto.getImageUrl() != null ? memberUpdateRequestDto.getImageUrl() : member.getProfileImageUrl()) .role(member.getRole()) .manageApprovalStatus(member.isManageApprovalStatus()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java index e062055..4afb789 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java @@ -91,10 +91,17 @@ public enum BaseResponseStatus { /** * 5000 : Applicant & Application Service Error */ - NO_APPLICANT_FOUND(HttpStatus.NOT_FOUND, false, 5001, "신청자를 찾을 수 없습니다."), INVALID_APPLICATION_STATUS(HttpStatus.BAD_REQUEST, false, 5002, "유효하지 않은 신청 상태입니다."), APPLICATION_ALREADY_PROCESSED(HttpStatus.CONFLICT, false, 5003, "이미 처리된 신청입니다."), APPLICATION_NOT_FOUND(HttpStatus.NOT_FOUND, false, 5004, "신청 정보를 찾을 수 없습니다."), + NO_BOARD_FOUND(HttpStatus.NOT_FOUND, false, 5005, "공고를 찾을 수 없습니다."), + RECRUITING_ALREADY_ENDED(HttpStatus.BAD_REQUEST, false, 5006, "프로젝트 모집이 마감되었습니다."), + NO_APPLICANTS(HttpStatus.BAD_REQUEST, false, 5007, "신청자가 존재하지 않습니다."), + NO_APPLICATIONS(HttpStatus.BAD_REQUEST, false, 5007, "신청서가 존재하지 않습니다."), + DUPLICATE_APPLY(HttpStatus.BAD_REQUEST, false, 5008, "이미 신청한 공고입니다."), + PROCESSED_APPLY(HttpStatus.BAD_REQUEST, false, 5009, "이미 변경된 상태입니다."), + FALSE_STATUS(HttpStatus.BAD_REQUEST, false, 5010, "존재하지 않는 상태입니다."), + SAME_WRITER(HttpStatus.BAD_REQUEST, false, 5011, "작성자는 공고 신청이 불가합니다."), /** * 6000 : Cart & WishProductList Service Error diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java new file mode 100644 index 0000000..b7657cc --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java @@ -0,0 +1,19 @@ +package com.archisemtle.semtlewebserverspring.common; + +import io.jsonwebtoken.io.IOException; +import io.swagger.v3.oas.annotations.Hidden; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + + +//Swagger는 api문서는 다 들고오려는 특성이 있는데 예외 처리 컨트롤러를 가져오는 과정에서는 에럭 발생 +// 이에 Hidden 어노테이션으로 swagger가 탐지하는 영역에서 벗어나게 설정 + +@Hidden +@RestControllerAdvice +public class GlobalExceptionContreoller { + @ExceptionHandler(BaseException.class) + public CommonResponse BaseExceptionHandler(BaseException e){ + return CommonResponse.fail(e.getErrorCode(), e.getErrorCode().getMessage()); + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java b/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java index 400494c..d210007 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java @@ -32,7 +32,7 @@ public CorsConfigurationSource corsConfigurationSource() { var cors = new org.springframework.web.cors.CorsConfiguration(); cors.setAllowedOriginPatterns( List.of("http://localhost:3000", "https://archisemtle.com", - "https://archisemtle.site")); + "https://archisemtle.site", "http://localhost:8080")); cors.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")); cors.setAllowedHeaders(List.of("*")); cors.setAllowCredentials(true); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicants.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicants.java deleted file mode 100644 index 2ada142..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicants.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.archisemtle.semtlewebserverspring.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import java.util.Date; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity(name = "applicants") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Applicants { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer applicantId; - - @Column(nullable = false) - private String name; - - @Column(nullable = false) - private Date applyDate; - - @Column(nullable = false) - private String status; - - @Column(nullable = false, unique = true) - private String email; - - private String phone; - - private String resumeUrl; - - private String portfolioUrl; - - private String customAnswer; - - private String additionalFile; - - private String updatedAt; - - @Column(nullable = false) - private Integer boardId; // 게시판 ID - - @Builder - public Applicants(Integer applicantId,String name, Date applyDate, String status, String email, String phone, - String resumeUrl, String portfolioUrl, String customAnswer, - String additionalFile, String updatedAt , Integer boardId) { - this.applicantId = applicantId; - this.name = name; - this.applyDate = applyDate; - this.status = status; - this.email = email; - this.phone = phone; - this.resumeUrl = resumeUrl; - this.portfolioUrl = portfolioUrl; - this.customAnswer = customAnswer; - this.additionalFile = additionalFile; - this.updatedAt = updatedAt; - this.boardId = boardId; - } - -} - diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java deleted file mode 100644 index c0f022c..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.archisemtle.semtlewebserverspring.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import java.time.LocalDateTime; - -import java.util.Date; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity(name = "applications") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Application { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer applicationId; - - @Column(name = "applicant_id", nullable = false) - private Integer applicantId; // 지원자 ID - - @ManyToOne // ManyToOne 관계 설정 - @JoinColumn(name = "applicant_id", referencedColumnName = "applicantId", insertable = false, updatable = false) // 외래 키 설정 - private Applicants applicant; // 지원자와의 관계 - - @Column(nullable = false) - private String projectTitle; // 프로젝트 제목 - - @Column(nullable = false) - private Integer boardId; // 게시판 ID - - @Column(nullable = false) - private Date applyDate; // 지원 날짜 - - @Column(nullable = false) - private String status; // 지원 상태 - - private String projectType; // 프로젝트 유형 - - private String relateField; // 관련 분야 - - private String questionAnswer; - - @Builder - public Application(Integer applicantId ,String projectTitle, Integer boardId, Date applyDate, String status, - String projectType, String relateField, String questionAnswer) { - this.applicantId = applicantId; - this.projectTitle = projectTitle; - this.boardId = boardId; - this.applyDate = applyDate; - this.status = status; - this.projectType = projectType; - this.relateField = relateField; - this.questionAnswer = questionAnswer; - } -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java new file mode 100644 index 0000000..a6dcce6 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java @@ -0,0 +1,57 @@ +package com.archisemtle.semtlewebserverspring.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToOne; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity(name = "apply") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Apply { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long applyId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_board_id", nullable = false) + private ProjectBoard projectBoard; + + @Column(nullable = false) + private LocalDateTime applyDate; + + @Column(nullable = false) + private String status; + + @Column(nullable = false) + private LocalDateTime updatedAt; + + @Lob + @Column(nullable = false) + private String answer; + + @Builder + public Apply(Long applyId, Member member, ProjectBoard projectBoard, LocalDateTime applyDate, String status, LocalDateTime updatedAt, String answer) { + this.applyId = applyId; + this.member = member; + this.projectBoard = projectBoard; + this.applyDate = applyDate; + this.status = status; + this.updatedAt = updatedAt; + this.answer = answer; + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java index a917619..9a69ace 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java @@ -5,8 +5,8 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import java.time.LocalDate; import java.util.Collection; -import java.util.Date; import java.util.List; import java.util.UUID; import lombok.AccessLevel; @@ -41,7 +41,7 @@ public class Member implements UserDetails { private String username; // @DateTimeFormat(pattern = "yyyy-MM-dd") - private Date birth; + private LocalDate birth; private String phone; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java new file mode 100644 index 0000000..4bc19a1 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java @@ -0,0 +1,38 @@ +package com.archisemtle.semtlewebserverspring.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProjectJoinFile { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long projectJoinFileId; + + @Column(nullable = false) + private String file; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "apply_id", nullable = false) + @Comment("신청 ID") + private Apply apply; + + @Builder + public ProjectJoinFile(String file, Apply apply) { + this.file = file; + this.apply = apply; + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java new file mode 100644 index 0000000..8324637 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java @@ -0,0 +1,38 @@ +package com.archisemtle.semtlewebserverspring.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProjectJoinUrl { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long projectJoinUrlId; + + @Column(nullable = false) + private String url; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "apply_id", nullable = false) + @Comment("신청 ID") + private Apply apply; + + @Builder + public ProjectJoinUrl(String url, Apply apply) { + this.url = url; + this.apply = apply; + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ShowMember.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ShowMember.java deleted file mode 100644 index b08c20e..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ShowMember.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.archisemtle.semtlewebserverspring.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import java.util.Date; -import java.util.UUID; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ShowMember { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int memberId; - - @Column(nullable = false, unique = true) - private UUID uuid = UUID.randomUUID(); - - private String name; - - // @DateTimeFormat(pattern = "yyyy-MM-dd") - private Date birth; - - private String phone; - - //private String imageUrl; - - @Builder - public ShowMember(String name, Date birth, String phone) { - this.name = name; - this.birth = birth; - this.phone = phone; - } -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java index d0f99d4..f45bb87 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.dto.activity.ActivityRequestDto; import com.archisemtle.semtlewebserverspring.vo.activity.ActivityResponseVo; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -23,14 +24,14 @@ public class Activity { @Column(nullable = false, unique = false) private String title; + @Lob @Column(nullable = false, unique = false) private String content; @Column(nullable = false, unique = false) private String writer; - @Column(nullable = true, unique = false) - @Temporal(TemporalType.DATE) - private Date createdAt; - @Column(nullable = true, unique = false, columnDefinition = "uuid") + @Column(nullable = false, unique = false) + private LocalDateTime createdAt; + @Column(nullable = false, unique = false, columnDefinition = "uuid") private UUID uuid; @ElementCollection @CollectionTable(name = "activity_image", joinColumns = @JoinColumn(name = "activity_id")) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java index afbfe37..aef7132 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java @@ -1,23 +1,26 @@ package com.archisemtle.semtlewebserverspring.domain.archive; -import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; -import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveResponseDto; + import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import java.util.Date; +import jakarta.persistence.Lob; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @Entity(name = "archive") +@AllArgsConstructor @NoArgsConstructor +@Builder public class Archive { @Id @@ -27,31 +30,23 @@ public class Archive { @Column(unique = false, nullable = false) private String title; + @Column(unique = false, nullable = false) private String writer; + + @Lob + @Column(unique = false, nullable = false) private String content; - private Date createdAt; + @Column(unique = false, nullable = false) + private LocalDateTime createdAt; @Column(unique = false, nullable = false) private UUID uuid; @Column(unique = false, nullable = true) private List imageUrl; + @Column(unique = false, nullable = true) private List fileUrl; - @Builder - public Archive(Long id, String title, String writer, String content, Date createdAt, UUID uuid, - List imageUrl, List fileUrl) - { - this.id = id; - this.title = title; - this.writer = writer; - this.content = content; - this.createdAt = createdAt; - this.uuid = uuid; - this.imageUrl = imageUrl; - this.fileUrl = fileUrl; - } - public static ArchiveResponseVo entityToVo(Archive archive){ return ArchiveResponseVo.builder() .writer(archive.getWriter()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java index b336fef..a7cb19f 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; import java.util.List; +import java.util.UUID; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -9,23 +10,8 @@ @Setter @Builder public class ApplyProjectRequestDto { - private List answers; + private Long postId; + private String answer; private List urls; - private List files; - - @Getter - @Setter - @Builder - public static class AnswerDto { - private Integer questionId; - private String answer; - } - - @Getter - @Setter - @Builder - public static class FileDto { - private String fileName; - private String fileUrl; - } + private List fileUrls; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java index 76cd51d..db95136 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java @@ -1,10 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import com.archisemtle.semtlewebserverspring.domain.Application; -import com.archisemtle.semtlewebserverspring.domain.ShowMember; +import com.archisemtle.semtlewebserverspring.domain.Apply; import java.time.LocalDateTime; -import java.util.Date; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -13,23 +10,13 @@ @Setter @Builder public class ApplyProjectResponseDto { - private String message; - private Integer appliedId; - private String appliedAt; + private Long applyId; + private LocalDateTime appliedAt; - public static ApplyProjectResponseDto entityToDto(Application application) { - if(application == null) { - return ApplyProjectResponseDto.builder() - .message("모집기간이 마감되었습니다.") - .appliedId(null) - .appliedAt(null) - .build(); - }else { - return ApplyProjectResponseDto.builder() - .message("프로젝트 신청이 성공적으로 접수되었습니다.") - .appliedId(application.getApplicationId()) - .appliedAt(LocalDateTime.now().toString()) - .build(); - } + public static ApplyProjectResponseDto entityToDto(Apply apply) { + return ApplyProjectResponseDto.builder() + .applyId(apply.getApplyId()) + .appliedAt(LocalDateTime.now()) + .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java index 24fcebf..3a03789 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java @@ -1,8 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; +import com.archisemtle.semtlewebserverspring.domain.Apply; import java.time.LocalDateTime; -import java.util.Date; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -11,15 +10,13 @@ @Setter @Builder public class ChangeApplyStatusResponseDto { - private String message; private String updatedStatus; - private String updatedAt; + private LocalDateTime updatedAt; - public static ChangeApplyStatusResponseDto entityToDto(Applicants applicants) { + public static ChangeApplyStatusResponseDto entityToDto(Apply apply) { return ChangeApplyStatusResponseDto.builder() - .message("신청자의 상태가 성공적으로 변경되었습니다.") - .updatedStatus(applicants.getStatus()) - .updatedAt(String.valueOf(LocalDateTime.now())) + .updatedStatus(apply.getStatus()) + .updatedAt(apply.getUpdatedAt()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java index a465c95..03987fc 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java @@ -1,13 +1,14 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import java.util.Date; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.springframework.data.domain.Page; @Getter @Setter @@ -17,42 +18,45 @@ public class ProjectApplicantsResponseDto { private int totalElements; private int totalPages; private int currentPage; - private List applicants; + private List applys; @Getter @NoArgsConstructor - public static class ApplicantInfo { - private Integer applicantId; - private String name; - private Date applyDate; + public static class ApplyInfo { + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; @Builder - public ApplicantInfo(Integer applicantId, String name, Date applyDate, String status) { - this.applicantId = applicantId; - this.name = name; + public ApplyInfo(Long applyId, String username, LocalDateTime applyDate, String status) { + this.applyId = applyId; + this.username = username; this.applyDate = applyDate; this.status = status; } } - public static ProjectApplicantsResponseDto entityToDto(List applicants, int currentPage, int totalElements) { - List applicantInfoList = applicants.stream() - .map(applicant -> ApplicantInfo.builder() - .applicantId(applicant.getApplicantId()) - .name(applicant.getName()) - .applyDate(applicant.getApplyDate()) - .status(applicant.getStatus()) + public static ProjectApplicantsResponseDto entityToDto(Page applicantsPage, int currentPage) { + List applys = applicantsPage.getContent(); + int totalElements = (int) applicantsPage.getTotalElements(); + + List applyInfoList = applys.stream() + .map(apply -> ApplyInfo.builder() + .applyId(apply.getApplyId()) + .username(apply.getMember().getUsername()) + .applyDate(apply.getApplyDate()) + .status(apply.getStatus()) .build()) .collect(Collectors.toList()); - int totalPages = (int) Math.ceil((double) totalElements / applicants.size()); + int totalPages = (int) Math.ceil((double) totalElements / applys.size()); return ProjectApplicantsResponseDto.builder() .totalElements(totalElements) .totalPages(totalPages) .currentPage(currentPage) - .applicants(applicantInfoList) + .applys(applyInfoList) .build(); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java index a508a27..ea29b4a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java @@ -1,15 +1,16 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Application; -import java.lang.reflect.Array; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import com.archisemtle.semtlewebserverspring.domain.RelationFieldProjectPostMiddle; +import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository; import java.time.LocalDateTime; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.springframework.data.domain.Page; @Getter @Setter @@ -19,59 +20,72 @@ public class ShowApplyingProjectInfoResponseDto { private int totalElements; private int totalPages; private int currentPage; - private List applications; + private List applys; @Getter @NoArgsConstructor - public static class ApplicationInfo { - private Integer applicationId; + public static class ApplyInfo { + private Long applyId; + private Long postId; private String projectTitle; - private Integer boardId; - private Date applyDate; + private LocalDateTime applyDate; private String status; private String projectType; private String relateField; @Builder - public ApplicationInfo( - Integer applicationId, + public ApplyInfo( + Long applyId, + Long postId, String projectTitle, - Integer boardId, - Date applyDate, String status, String projectType, - String relateField) { - this.applicationId = applicationId; + String relateField, + LocalDateTime applyDate) { + this.applyId = applyId; + this.postId = postId; this.projectTitle = projectTitle; - this.boardId = boardId; - this.applyDate = applyDate; this.status = status; this.projectType = projectType; this.relateField = relateField; + this.applyDate = applyDate; } } - public static ShowApplyingProjectInfoResponseDto entityToDto(List applications, int currentPage, int totalElements) { - List applicationInfoList = applications.stream() - .map(application -> ApplicationInfo.builder() - .applicationId(application.getApplicationId()) - .projectTitle(application.getProjectTitle()) - .boardId(application.getBoardId()) - .applyDate(application.getApplyDate()) - .status(application.getStatus()) - .projectType(application.getProjectType()) - .relateField(application.getRelateField()) - .build()) + public static ShowApplyingProjectInfoResponseDto entityToDto(Page applyPage, int currentPage, RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository) { + + List applys = applyPage.getContent(); + int totalElements = (int) applyPage.getTotalElements(); + + List applyInfoList = applys.stream() + .map(apply -> { + List relatedFields = relationFieldProjectPostMiddleRepository + .findAllByProjectBoardId(apply.getProjectBoard().getId()); + + String relatedFieldsStr = relatedFields.stream() + .map(field -> field.getRelationFieldCategory().getName()) + .collect(Collectors.joining(", ")); + + return ApplyInfo.builder() + .applyId(apply.getApplyId()) + .postId(apply.getProjectBoard().getId()) + .projectTitle(apply.getProjectBoard().getTitle()) + .status(apply.getStatus()) + .projectType(apply.getProjectBoard().getProjectTypeCategory().getName()) + .relateField(relatedFieldsStr) + .applyDate(apply.getApplyDate()) + .build(); + }) .collect(Collectors.toList()); - int totalPages = (int) Math.ceil((double) totalElements / applications.size()); + int totalPages = (int) Math.ceil((double) totalElements / applys.size()); return ShowApplyingProjectInfoResponseDto.builder() .totalElements(totalElements) .totalPages(totalPages) .currentPage(currentPage) - .applications(applicationInfoList) + .applys(applyInfoList) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java index 2d0b457..3713086 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import java.util.Date; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -10,29 +10,21 @@ @Setter @Builder public class ShowProjectApplicantInfoResponseDto { - private Integer applicantId; - private String name; - private Date applyDate; + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; private String email; private String phone; - private String resumeUrl; - private String portfolioUrl; - private String customAnswer; - private String additionalFile; - public static ShowProjectApplicantInfoResponseDto entityToDto(Applicants applicants) { + public static ShowProjectApplicantInfoResponseDto entityToDto(Apply apply) { return ShowProjectApplicantInfoResponseDto.builder() - .applicantId(applicants.getApplicantId()) - .name(applicants.getName()) - .applyDate(applicants.getApplyDate()) - .status(applicants.getStatus()) - .email(applicants.getEmail()) - .phone(applicants.getPhone()) - .resumeUrl(applicants.getResumeUrl()) - .portfolioUrl(applicants.getPortfolioUrl()) - .customAnswer(applicants.getCustomAnswer()) - .additionalFile(applicants.getAdditionalFile()) + .applyId(apply.getApplyId()) + .username(apply.getMember().getUsername()) + .applyDate(apply.getApplyDate()) + .status(apply.getStatus()) + .email(apply.getMember().getEmail()) + .phone(apply.getMember().getPhone()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java index 70f7de2..e5ae41b 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java @@ -21,4 +21,5 @@ public class UpdateProjectBoardRequestDto { private LocalDate projectStartTime; private LocalDate projectEndTime; private LocalDate projectRecruitingEndTime; + private List projectBoardImages; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java index b129c93..0467771 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java @@ -1,5 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto.activity; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -16,7 +18,7 @@ public class ActivityRequestDto { private String content; private String writer; private UUID uuid; - private Date createdAt; + private LocalDateTime createdAt; private String type; private List images; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java index 419dd80..b2da687 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.domain.activity.Activity; import com.archisemtle.semtlewebserverspring.vo.activity.ActivityResponseVo; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -16,7 +17,7 @@ public class ActivityResponseDto { private String title; private String content; private String writer; - private Date createdAt; + private LocalDateTime createdAt; private List images; private String type; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java index ccdbd63..9c4231e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java @@ -1,5 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto.archive; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -16,7 +17,7 @@ public class ArchiveRequestDto { private String content; private String title; private UUID uuid; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java index 65e8b4a..4adf4a8 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java @@ -2,7 +2,7 @@ import com.archisemtle.semtlewebserverspring.domain.archive.Archive; import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -16,7 +16,7 @@ public class ArchiveResponseDto { private String writer; private String content; private String title; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java index 6a56164..08f1296 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto.member; -import java.util.Date; +import java.time.LocalDate; import java.util.UUID; import lombok.Builder; import lombok.Data; @@ -13,8 +13,9 @@ public class MemberReadResponseDto { private String password; private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; + private String profileImageUrl; private String role; private boolean manageApprovalStatus; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java index ed5a505..e0e7237 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java @@ -1,15 +1,14 @@ package com.archisemtle.semtlewebserverspring.dto.member; -import java.util.Date; +import java.time.LocalDate; import lombok.Data; @Data public class MemberUpdateRequestDto { - private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; - //private String imageUrl; + private String imageUrl; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java deleted file mode 100644 index 4819e1c..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.archisemtle.semtlewebserverspring.infrastructure; - -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import java.util.Optional; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface ApplicantsRepository extends JpaRepository { - @Query(value = "SELECT pa.* FROM applicants pa " + - "JOIN applications app ON pa.applicant_id = app.applicant_id " + // 조인 조건 수정 - "WHERE app.board_id = :boardId", nativeQuery = true) // nativeQuery를 사용하여 SQL 쿼리 - Page findAllWithApplication(@Param("boardId") Integer boardId, Pageable pageable); - - Optional findByBoardIdAndApplicantId(Integer boardId, Integer applicantId); -} - diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java deleted file mode 100644 index 33ac0cf..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.archisemtle.semtlewebserverspring.infrastructure; - -import com.archisemtle.semtlewebserverspring.domain.Application; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ApplicationRepository extends JpaRepository { - - Page findByApplicantId(Integer applicantId, Pageable pageable); -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java new file mode 100644 index 0000000..03f5340 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java @@ -0,0 +1,16 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.Apply; +import com.archisemtle.semtlewebserverspring.domain.Member; +import com.archisemtle.semtlewebserverspring.domain.ProjectBoard; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ApplyRepository extends JpaRepository { + Apply findByMemberAndProjectBoardId(Member member, Long postId); + Page findByProjectBoard(ProjectBoard projectBoard, Pageable pageable); + Page findByMember(Member member, Pageable pageable); +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java index 936e6e4..6bdfcbe 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java @@ -7,4 +7,5 @@ public interface ProjectBoardImageRepository extends JpaRepository { List findAllByProjectBoardId(Long id); + void deleteAllByProjectBoardId(Long id); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java new file mode 100644 index 0000000..ff56c45 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java @@ -0,0 +1,10 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinFile; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectJoinFileRepository extends JpaRepository { + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java new file mode 100644 index 0000000..1fc0e56 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java @@ -0,0 +1,10 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinUrl; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectJoinUrlRepository extends JpaRepository { + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java index b264caf..e6a137a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java @@ -1,14 +1,14 @@ package com.archisemtle.semtlewebserverspring.presentation; import com.archisemtle.semtlewebserverspring.application.ApplyProjectService; +import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; import com.archisemtle.semtlewebserverspring.vo.ApplyProjectResponseVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,20 +21,17 @@ public class ApplyingController { private final ApplyProjectService applyProjectService; - // 공고 신청 - @PostMapping("/{post_id}/apply/{id}") - public CommonResponse ApplyProject( - @PathVariable("post_id") Integer boardId, - @PathVariable("id") Integer applicantId, - @RequestBody ApplyProjectRequestDto applyProjectRequestDto - ) throws Exception { - ApplyProjectResponseDto applyProjectResponseDto = applyProjectService.applyProject(boardId, applicantId, applyProjectRequestDto); - ApplyProjectResponseVo applyProjectResponseVo = ApplyProjectResponseVo.dtoToVo(applyProjectResponseDto); - if(applyProjectResponseVo.getAppliedAt() != null) { - return CommonResponse.success("applied successfully", applyProjectResponseVo); - }else{ - return CommonResponse.fail(null,"apply failed"); + @PostMapping("/apply") + public CommonResponse ApplyProject(@RequestBody ApplyProjectRequestDto applyProjectRequestDto){ + try { + ApplyProjectResponseDto applyProjectResponseDto = applyProjectService.applyProject(applyProjectRequestDto); + ApplyProjectResponseVo applyProjectResponseVo = ApplyProjectResponseVo.dtoToVo(applyProjectResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), applyProjectResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); } } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java index 0d508e6..a943ad2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java @@ -83,19 +83,31 @@ public CommonResponse excelAddMember( // 출력 - 이름, 생년월일, 전화번호, 학번, 프로필 사진 @GetMapping("/{uuid}") public CommonResponse showMember(@PathVariable UUID uuid) { - MemberReadResponseDto showMemberDto = memberService.show(uuid); - MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); - return CommonResponse.success("해당하는 멤버의 정보를 조회하는데 성공하였습니다.", responseVo); + try{ + MemberReadResponseDto showMemberDto = memberService.show(uuid); + MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), responseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } } // 개인 정보 수정 - // uuid, 이름, 생년월일, 전화번호, 학번, 프로필 사진 + // 이름, 생년월일, 전화번호, 프로필 사진 @PatchMapping("/{uuid}") - public CommonResponse updateMember(@PathVariable UUID uuid, + public CommonResponse updateMember(@PathVariable UUID uuid, @RequestBody MemberUpdateRequestDto memberUpdateRequestDto) { - memberService.update(uuid, memberUpdateRequestDto); + try { + memberService.update(uuid, memberUpdateRequestDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), BaseResponseStatus.SUCCESS.getCode()); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } - return CommonResponse.success("회원 정보 수정에 성공하였습니다."); } @GetMapping diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java deleted file mode 100644 index ca40e2c..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.archisemtle.semtlewebserverspring.presentation; - -import com.archisemtle.semtlewebserverspring.application.ProjectApplicationService; -import com.archisemtle.semtlewebserverspring.common.CommonResponse; -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 com.archisemtle.semtlewebserverspring.vo.ChangeApplyStatusResponseVo; -import com.archisemtle.semtlewebserverspring.vo.ShowApplyingProjectListResponseVo; -import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantInfoResponseVo; -import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantsListResponseVo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@RequiredArgsConstructor -@RestController -@RequestMapping("/api/v1/own/projects") -public class ProjectApplicaionController { - - private final ProjectApplicationService projectApplicationService; - - // 본인이 게시한 프로젝트(공고) 신청자 목록 조회 API - @GetMapping("/{post_id}/applicants") - public CommonResponse ShowProjectApplicantsList( - @PathVariable("post_id") Integer postId, - @RequestParam(value = "page", defaultValue = "1") int page, - @RequestParam(value = "limit", defaultValue = "10") int limit) throws Exception { - - ProjectApplicantsResponseDto projectApplicantsResponseDto = projectApplicationService.getApplicants(postId, page, limit); - ShowProjectApplicantsListResponseVo showProjectApplicantsResponseVo = ShowProjectApplicantsListResponseVo.dtoToVo(projectApplicantsResponseDto); - - return CommonResponse.success("applicants Showed successfully", showProjectApplicantsResponseVo); - } - - // 본인이 게시한 프로젝트(공고) 신청자 정보(내용) 조회 API - @GetMapping("/{post_id}/applicants/{id}") - public CommonResponse ShowProjectApplicantsInfo(@PathVariable("post_id") Integer boardId, @PathVariable("id") Integer applicantId) - throws Exception { - - ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = projectApplicationService.getApplicantInfo(boardId, applicantId); - - ShowProjectApplicantInfoResponseVo showProjectApplicantInfoResponseVo = ShowProjectApplicantInfoResponseVo.dtoToVo(showProjectApplicantInfoResponseDto); - return CommonResponse.success("applicants Info Showed successfully", showProjectApplicantInfoResponseVo); - } - - // 본인이 게시한 프로젝트(공고) 신청자 승인 상태 변경 API - @PatchMapping("/{post_id}/applicants/{id}") - public CommonResponse ChangeApplyStatus( - @PathVariable("post_id") Integer boardId, - @PathVariable("id") Integer applicantId, - @RequestBody ChangeApplyStatusRequestDto changeApplyStatusRequestDto - ) throws Exception { - - ChangeApplyStatusResponseDto changeApplyStatusResponseDto = projectApplicationService.changeApplyStatus(boardId,applicantId,changeApplyStatusRequestDto.getStatus()); - - ChangeApplyStatusResponseVo changeApplyStatusResponseVo = ChangeApplyStatusResponseVo.dtoToVo(changeApplyStatusResponseDto); - return CommonResponse.success("applicant Status changed successfully", changeApplyStatusResponseVo); - } - - // 본인이 신청한 프로젝트 목록 조회 (승인결과포함) API - @GetMapping("/applications/{id}") - public CommonResponse ShowApplyingProjectList( - @PathVariable("id") Integer applicantId, - @RequestParam(value = "page", defaultValue = "1") int page, - @RequestParam(value = "limit", defaultValue = "10") int limit) throws Exception { - - ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = projectApplicationService.getApplyingProjectInfo(applicantId, page, limit); - - ShowApplyingProjectListResponseVo showApplyingProjectListResponseVo = ShowApplyingProjectListResponseVo.dtoToVo(showApplyingProjectInfoResponseDto); - return CommonResponse.success("Applying applications Showed successfully", showApplyingProjectListResponseVo); - } -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicationController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicationController.java new file mode 100644 index 0000000..ddc6d31 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicationController.java @@ -0,0 +1,99 @@ +package com.archisemtle.semtlewebserverspring.presentation; + +import com.archisemtle.semtlewebserverspring.application.ProjectApplicationService; +import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; +import com.archisemtle.semtlewebserverspring.common.CommonResponse; +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 com.archisemtle.semtlewebserverspring.vo.ChangeApplyStatusResponseVo; +import com.archisemtle.semtlewebserverspring.vo.ShowApplyingProjectListResponseVo; +import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantInfoResponseVo; +import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantsListResponseVo; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/v1/projects") +public class ProjectApplicationController { + + private final ProjectApplicationService projectApplicationService; + + // 본인이 게시한 프로젝트(공고) 신청자 목록 조회 API + @GetMapping("/{post_id}/applicants") + public CommonResponse ShowProjectApplicantsList( + @PathVariable("post_id") Long postId, + @RequestParam(value = "page", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "10") int limit){ + try { + ProjectApplicantsResponseDto projectApplicantsResponseDto = projectApplicationService.getApplicants(postId, page, limit); + ShowProjectApplicantsListResponseVo showProjectApplicantsResponseVo = ShowProjectApplicantsListResponseVo.dtoToVo(projectApplicantsResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showProjectApplicantsResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } + } + + // 본인이 게시한 프로젝트(공고) 신청자 정보(내용) 조회 API + @GetMapping("/{post_id}/applicants/{uuid}") + public CommonResponse ShowProjectApplicantsInfo(@PathVariable("post_id") Long postId, @PathVariable("uuid") UUID uuid) { + try { + ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = projectApplicationService.getApplicantInfo(postId, uuid); + ShowProjectApplicantInfoResponseVo showProjectApplicantInfoResponseVo = ShowProjectApplicantInfoResponseVo.dtoToVo(showProjectApplicantInfoResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showProjectApplicantInfoResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } + } + + // 본인이 게시한 프로젝트(공고) 신청자 승인 상태 변경 API + @PatchMapping("/{post_id}/applicants/{uuid}") + public CommonResponse ChangeApplyStatus( + @PathVariable("post_id") Long postId, + @PathVariable("uuid") UUID uuid, + @RequestBody ChangeApplyStatusRequestDto changeApplyStatusRequestDto + ) { + try { + ChangeApplyStatusResponseDto changeApplyStatusResponseDto = projectApplicationService.changeApplyStatus(postId,uuid,changeApplyStatusRequestDto.getStatus()); + ChangeApplyStatusResponseVo changeApplyStatusResponseVo = ChangeApplyStatusResponseVo.dtoToVo(changeApplyStatusResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), changeApplyStatusResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } + } + + // 본인이 신청한 프로젝트 목록 조회 (승인결과포함) API + @GetMapping("/applications") + public CommonResponse ShowApplyingProjectList( + @RequestParam(value = "page", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "10") int limit) { + try { + ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = projectApplicationService.getApplyingProjectInfo(page, limit); + ShowApplyingProjectListResponseVo showApplyingProjectListResponseVo = ShowApplyingProjectListResponseVo.dtoToVo(showApplyingProjectInfoResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showApplyingProjectListResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java index d29c19a..cdd8897 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java @@ -3,6 +3,7 @@ import com.archisemtle.semtlewebserverspring.application.activity.ActivityService; import com.archisemtle.semtlewebserverspring.application.activity.ActivityServiceImpl; import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.dto.activity.ActivityListRequestDto; import com.archisemtle.semtlewebserverspring.dto.activity.ActivityListResponseDto; @@ -48,9 +49,8 @@ public class ActivityController { //게시물 생성 @PostMapping - public CommonResponse createActivity(@RequestBody ActivityRequestVo requestVo) + public CommonResponse createActivity(@Valid @RequestBody ActivityRequestVo requestVo) throws IOException { - activityService.createActivityBoard(ActivityRequestVo.voToDto(requestVo)); return CommonResponse.success("게시글 작성 성공"); } @@ -82,7 +82,10 @@ public CommonResponse deleteActivity(@PathVariable Long id) { public CommonResponse getActivityList( @RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "size", defaultValue = "15") int size, - @RequestParam(name = "type", defaultValue = "기타") String type){ + @RequestParam(name = "type", defaultValue = "all") String type){ + + if(page < 1 || size < 1 || type.isEmpty()) throw new BaseException(BaseResponseStatus.WRONG_PARAM); + ActivityListRequestVo requestVo = ActivityListRequestVo.builder() .page(page) .size(size) @@ -96,6 +99,7 @@ public CommonResponse getActivityList( @GetMapping("/recent") public CommonResponse getCurActivityList( @RequestParam(name = "limit", defaultValue = "3") int limit){ + if(limit < 1) throw new BaseException(BaseResponseStatus.WRONG_PARAM); ActivityListResponseDto responseDto = activityService.readRecentActivityListBoard(limit); return CommonResponse.success("최근 활동 게시물 목록 읽어오기 성공", ActivityListResponseDto.dtoToVo(responseDto)); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java index ce05073..2d9088e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.presentation.archive; import com.archisemtle.semtlewebserverspring.application.archive.ArchiveService; +import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveListRequestDto; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveListResponseDto; @@ -38,6 +40,7 @@ public class ArchiveController { @PostMapping public CommonResponse createArchive(@RequestBody ArchiveRequestVo requestVo) throws IOException{ archiveService.createArchiveBoard(ArchiveRequestVo.voToDto(requestVo)); + return CommonResponse.success("Secret Note 게시물이 성공적으로 등록되었습니다."); } @@ -45,6 +48,7 @@ public CommonResponse createArchive(@RequestBody ArchiveRequestVo reques @GetMapping("/{id}") public CommonResponse readArchive(@PathVariable Long id){ ArchiveResponseDto responseDto = archiveService.readArchiveBoard(id); + return CommonResponse.success("족보 게시판 흭득 성공", ArchiveResponseDto.dtoToVo(responseDto)); } @@ -71,6 +75,7 @@ public CommonResponse getArchiveList( @RequestParam(name = "size", defaultValue = "15") int size, @RequestParam(name = "search_keyword", defaultValue = "") String search_keyword ){ + if(page < 1 || size < 1) throw new BaseException(BaseResponseStatus.WRONG_PARAM); ArchiveListRequestVo requestVo = new ArchiveListRequestVo(page, size, search_keyword); ArchiveListRequestDto requestDto = ArchiveListRequestVo.voToDto(requestVo); ArchiveListResponseDto responseDto = archiveService.getArchiveList(requestDto); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java index 3472bcf..1c320c7 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,22 +9,19 @@ @Getter @NoArgsConstructor public class ApplyProjectResponseVo { - private String message; - private Integer appliedId; - private String appliedAt; + private Long applyId; + private LocalDateTime appliedAt; @Builder - public ApplyProjectResponseVo(String message, Integer appliedId, String appliedAt) { - this.message = message; - this.appliedId = appliedId; + public ApplyProjectResponseVo(Long applyId, LocalDateTime appliedAt) { + this.applyId = applyId; this.appliedAt = appliedAt; } public static ApplyProjectResponseVo dtoToVo( ApplyProjectResponseDto applyProjectResponseDto) { return ApplyProjectResponseVo.builder() - .message(applyProjectResponseDto.getMessage()) - .appliedId(applyProjectResponseDto.getAppliedId()) + .applyId(applyProjectResponseDto.getApplyId()) .appliedAt(applyProjectResponseDto.getAppliedAt()) .build(); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java index ab91713..7cb3127 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; +import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,13 +10,11 @@ @Getter @NoArgsConstructor public class ChangeApplyStatusResponseVo { - String message; String updatedStatus; - String updatedAt; + LocalDateTime updatedAt; @Builder - public ChangeApplyStatusResponseVo(String message, String updatedStatus, String updatedAt) { - this.message = message; + public ChangeApplyStatusResponseVo(String updatedStatus, LocalDateTime updatedAt) { this.updatedStatus = updatedStatus; this.updatedAt = updatedAt; } @@ -22,7 +22,6 @@ public ChangeApplyStatusResponseVo(String message, String updatedStatus, String public static ChangeApplyStatusResponseVo dtoToVo( ChangeApplyStatusResponseDto changeApplyStatusResponseDto) { return ChangeApplyStatusResponseVo.builder() - .message(changeApplyStatusResponseDto.getMessage()) .updatedStatus(changeApplyStatusResponseDto.getUpdatedStatus()) .updatedAt(changeApplyStatusResponseDto.getUpdatedAt()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java index cefe7b8..f063973 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java @@ -2,7 +2,6 @@ import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; import java.time.LocalDateTime; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -16,59 +15,60 @@ public class ShowApplyingProjectListResponseVo { private int totalElements; private int totalPages; private int currentPage; - private List applications; + private List apply; @Getter @NoArgsConstructor - public static class ApplicationInfo { - private Integer applicationId; + public static class ApplyInfo { + private Long applyId; + private Long postId; private String projectTitle; - private Integer boardId; - private Date applyDate; + private LocalDateTime applyDate; private String status; private String projectType; private String relateField; @Builder - public ApplicationInfo( - Integer applicationId, + public ApplyInfo( + Long applyId, + Long postId, String projectTitle, - Integer boardId, - Date applyDate, String status, String projectType, - String relateField) { - this.applicationId = applicationId; + String relateField, + LocalDateTime applyDate) { + this.applyId = applyId; + this.postId = postId; this.projectTitle = projectTitle; - this.boardId = boardId; - this.applyDate = applyDate; this.status = status; this.projectType = projectType; this.relateField = relateField; + this.applyDate = applyDate; } } + @Builder public ShowApplyingProjectListResponseVo(int totalElements, int totalPages, int currentPage, - List applications) { + List apply) { this.totalElements = totalElements; this.totalPages = totalPages; this.currentPage = currentPage; - this.applications = applications; + this.apply = apply; } public static ShowApplyingProjectListResponseVo dtoToVo( ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto) { - List applicationInfoList = showApplyingProjectInfoResponseDto.getApplications().stream() - .map(dtoApplication -> ShowApplyingProjectListResponseVo.ApplicationInfo.builder() - .applicationId(dtoApplication.getApplicationId()) - .projectTitle(dtoApplication.getProjectTitle()) - .boardId(dtoApplication.getBoardId()) - .applyDate(dtoApplication.getApplyDate()) - .status(dtoApplication.getStatus()) - .projectType(dtoApplication.getProjectType()) - .relateField(dtoApplication.getRelateField()) + List applyInfoList = showApplyingProjectInfoResponseDto.getApplys().stream() + .map(apply -> ShowApplyingProjectListResponseVo.ApplyInfo.builder() + .applyId(apply.getApplyId()) + .postId(apply.getPostId()) + .projectTitle(apply.getProjectTitle()) + .status(apply.getStatus()) + .projectType(apply.getProjectType()) + .relateField(apply.getRelateField()) + .applyDate(apply.getApplyDate()) .build()) .collect(Collectors.toList()); @@ -76,7 +76,7 @@ public static ShowApplyingProjectListResponseVo dtoToVo( .totalElements(showApplyingProjectInfoResponseDto.getTotalElements()) .totalPages(showApplyingProjectInfoResponseDto.getTotalPages()) .currentPage(showApplyingProjectInfoResponseDto.getCurrentPage()) - .applications(applicationInfoList) + .apply(applyInfoList) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java index f53cbfe..12f4e35 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; -import java.util.Date; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,54 +9,38 @@ @Getter @NoArgsConstructor public class ShowProjectApplicantInfoResponseVo { - private Integer applicantId; - private String name; - private Date applyDate; + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; private String email; private String phone; - private String resumeUrl; - private String portfolioUrl; - private String customAnswer; - private String additionalFile; @Builder public ShowProjectApplicantInfoResponseVo( - Integer applicantId, - String name, - Date applyDate, + Long applyId, + String username, + LocalDateTime applyDate, String status, String email, - String phone, - String resumeUrl, - String portfolioUrl, - String customAnswer, - String additionalFile){ - this.applicantId = applicantId; - this.name = name; + String phone){ + this.applyId = applyId; + this.username = username; this.applyDate = applyDate; this.status = status; this.email = email; this.phone = phone; - this.resumeUrl = resumeUrl; - this.portfolioUrl = portfolioUrl; - this.customAnswer = customAnswer; - this.additionalFile = additionalFile; } public static ShowProjectApplicantInfoResponseVo dtoToVo( ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto) { return ShowProjectApplicantInfoResponseVo.builder() - .applicantId(showProjectApplicantInfoResponseDto.getApplicantId()) - .name(showProjectApplicantInfoResponseDto.getName()) + .applyId(showProjectApplicantInfoResponseDto.getApplyId()) + .username(showProjectApplicantInfoResponseDto.getUsername()) .applyDate(showProjectApplicantInfoResponseDto.getApplyDate()) .status(showProjectApplicantInfoResponseDto.getStatus()) .email(showProjectApplicantInfoResponseDto.getEmail()) .phone(showProjectApplicantInfoResponseDto.getPhone()) - .resumeUrl(showProjectApplicantInfoResponseDto.getResumeUrl()) - .portfolioUrl(showProjectApplicantInfoResponseDto.getPortfolioUrl()) - .customAnswer(showProjectApplicantInfoResponseDto.getCustomAnswer()) - .additionalFile(showProjectApplicantInfoResponseDto.getAdditionalFile()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java index ba0e0ab..db5be96 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -15,20 +15,20 @@ public class ShowProjectApplicantsListResponseVo { private int totalElements; private int totalPages; private int currentPage; - private List applicants; + private List applys; @Getter @NoArgsConstructor - public static class ApplicantInfo { - private Integer applicantId; - private String name; - private Date applyDate; + public static class ApplyInfo { + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; @Builder - public ApplicantInfo(Integer applicantId, String name, Date applyDate, String status) { - this.applicantId = applicantId; - this.name = name; + public ApplyInfo(Long applyId, String username, LocalDateTime applyDate, String status) { + this.applyId = applyId; + this.username = username; this.applyDate = applyDate; this.status = status; } @@ -36,22 +36,22 @@ public ApplicantInfo(Integer applicantId, String name, Date applyDate, String st @Builder public ShowProjectApplicantsListResponseVo(int totalElements, int totalPages, int currentPage, - List applicants) { + List applys) { this.totalElements = totalElements; this.totalPages = totalPages; this.currentPage = currentPage; - this.applicants = applicants; + this.applys = applys; } public static ShowProjectApplicantsListResponseVo dtoToVo( ProjectApplicantsResponseDto projectApplicantsResponseDto) { - List applicantInfoList = projectApplicantsResponseDto.getApplicants().stream() - .map(dtoApplicant -> ApplicantInfo.builder() - .applicantId(dtoApplicant.getApplicantId()) - .name(dtoApplicant.getName()) - .applyDate(dtoApplicant.getApplyDate()) - .status(dtoApplicant.getStatus()) + List applyInfoList = projectApplicantsResponseDto.getApplys().stream() + .map(apply -> ApplyInfo.builder() + .applyId(apply.getApplyId()) + .username(apply.getUsername()) + .applyDate(apply.getApplyDate()) + .status(apply.getStatus()) .build()) .collect(Collectors.toList()); @@ -59,7 +59,7 @@ public static ShowProjectApplicantsListResponseVo dtoToVo( .totalElements(projectApplicantsResponseDto.getTotalElements()) .totalPages(projectApplicantsResponseDto.getTotalPages()) .currentPage(projectApplicantsResponseDto.getCurrentPage()) - .applicants(applicantInfoList) + .applys(applyInfoList) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java index 98ee4b0..759da3c 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java @@ -18,6 +18,7 @@ public class UpdateProjectBoardRequestVo { private LocalDate projectStartTime; private LocalDate projectEndTime; private LocalDate projectRecruitingEndTime; + private List projectBoardImages; public static UpdateProjectBoardRequestDto voToDto( UpdateProjectBoardRequestVo updateProjectBoardRequestVo) { @@ -30,6 +31,7 @@ public static UpdateProjectBoardRequestDto voToDto( .projectStartTime(updateProjectBoardRequestVo.getProjectStartTime()) .projectEndTime(updateProjectBoardRequestVo.getProjectEndTime()) .projectRecruitingEndTime(updateProjectBoardRequestVo.getProjectRecruitingEndTime()) + .projectBoardImages(updateProjectBoardRequestVo.getProjectBoardImages()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java index 5837ae2..8dafd25 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.vo.activity; import com.archisemtle.semtlewebserverspring.dto.activity.ActivityRequestDto; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -14,7 +16,6 @@ public class ActivityRequestVo { private String title; private String content; private String writer; - private Date createdAt; private UUID uuid; private List images; private String type; @@ -25,7 +26,7 @@ public static ActivityRequestDto voToDto(ActivityRequestVo requestVo){ .content(requestVo.getContent()) .writer(requestVo.getWriter()) .images(requestVo.getImages()) - .createdAt(requestVo.getCreatedAt()) + .createdAt(LocalDateTime.now()) .uuid(requestVo.getUuid()) .type(requestVo.getType()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java index 0414091..d15bea8 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java @@ -1,5 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo.activity; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import lombok.Builder; @@ -14,7 +16,7 @@ public class ActivityResponseVo { private String title; private String content; private String writer; - private Date createdAt; + private LocalDateTime createdAt; private List images; private String type; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java index 757db58..2f0f5b5 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo.archive; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -14,7 +15,6 @@ public class ArchiveRequestVo { private String content; private String title; private UUID uuid; - private Date createdAt; private List imageUrl; private List fileUrl; @@ -23,7 +23,7 @@ public static ArchiveRequestDto voToDto(ArchiveRequestVo requestVo) { .content(requestVo.getContent()) .writer(requestVo.getWriter()) .title(requestVo.getTitle()) - .createdAt(requestVo.getCreatedAt()) + .createdAt(LocalDateTime.now()) .uuid(requestVo.getUuid()) .imageUrl(requestVo.getImageUrl()) .fileUrl(requestVo.getFileUrl()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java index 507b93d..ec1412d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.vo.archive; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -13,7 +13,7 @@ public class ArchiveResponseVo { private String writer; private String content; private String title; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java index a3883c3..7381063 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo.member; import com.archisemtle.semtlewebserverspring.dto.member.MemberReadResponseDto; -import java.util.Date; +import java.time.LocalDate; import java.util.UUID; import lombok.Builder; import lombok.Getter; @@ -14,9 +14,10 @@ public class MemberReadResponseVo { private String password; private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; private String role; + private String profileImageUrl; private boolean manageApprovalStatus; public static MemberReadResponseVo dtoToVo( @@ -30,6 +31,7 @@ public static MemberReadResponseVo dtoToVo( .birth(memberReadResponseDto.getBirth()) .phone(memberReadResponseDto.getPhone()) .role(memberReadResponseDto.getRole()) + .profileImageUrl(memberReadResponseDto.getProfileImageUrl()) .manageApprovalStatus(memberReadResponseDto.isManageApprovalStatus()) .build(); }