diff --git a/src/main/java/NextLevel/demo/project/community/controller/ProjectCommunityController.java b/src/main/java/NextLevel/demo/project/community/controller/ProjectCommunityController.java index 348ef1f..226cca7 100644 --- a/src/main/java/NextLevel/demo/project/community/controller/ProjectCommunityController.java +++ b/src/main/java/NextLevel/demo/project/community/controller/ProjectCommunityController.java @@ -2,6 +2,7 @@ import NextLevel.demo.common.SuccessResponse; import NextLevel.demo.project.community.dto.request.SaveCommunityDto; +import NextLevel.demo.project.community.dto.response.ResponseCommunityListDto; import NextLevel.demo.project.community.service.ProjectCommunityAskService; import NextLevel.demo.util.jwt.JWTUtil; import jakarta.validation.Valid; @@ -10,10 +11,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.DeleteMapping; -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.*; @Controller @Slf4j @@ -22,6 +20,12 @@ public class ProjectCommunityController { private final ProjectCommunityAskService communityService; + // list + @GetMapping("/public/project/{projectId}/community") + public ResponseEntity getProjectCommunity(@PathVariable Long projectId) { + return ResponseEntity.ok().body(new SuccessResponse("success", new ResponseCommunityListDto(communityService.selectAll(projectId)))); + } + // 생성만 @PostMapping("/api1/project/{projectId}/community") public ResponseEntity saveProjectCommunity(@PathVariable("projectId") Long projectId, @RequestBody @Valid SaveCommunityDto dto) { diff --git a/src/main/java/NextLevel/demo/project/community/dto/response/ResponseCommunityListDto.java b/src/main/java/NextLevel/demo/project/community/dto/response/ResponseCommunityListDto.java index f595d90..ffd12c4 100644 --- a/src/main/java/NextLevel/demo/project/community/dto/response/ResponseCommunityListDto.java +++ b/src/main/java/NextLevel/demo/project/community/dto/response/ResponseCommunityListDto.java @@ -12,7 +12,7 @@ public class ResponseCommunityListDto { private int communityCount; private List communities; - public ResponseCommunityListDto (Collection communities) { + public ResponseCommunityListDto (List communities) { this.communities = communities.stream().map(e->ResponseProjectCommunityDto.of(e)).toList(); this.communityCount = communities.size(); } diff --git a/src/main/java/NextLevel/demo/project/community/repository/ProjectCommunityAskRepository.java b/src/main/java/NextLevel/demo/project/community/repository/ProjectCommunityAskRepository.java index efd9791..f280800 100644 --- a/src/main/java/NextLevel/demo/project/community/repository/ProjectCommunityAskRepository.java +++ b/src/main/java/NextLevel/demo/project/community/repository/ProjectCommunityAskRepository.java @@ -9,7 +9,7 @@ public interface ProjectCommunityAskRepository extends JpaRepository { - @Query("select ask from ProjectCommunityAskEntity ask left join fetch ask.answer where ask.project.id = :projectId") - List findAllByProjectId(@Param("projectId") Long projectId); + @Query("select ask from ProjectCommunityAskEntity ask left join fetch ask.answer where ask.project.id = :projectId order by ask.createdAt desc") + List findAllByProjectIdOrderByCreatedAt(@Param("projectId") Long projectId); } diff --git a/src/main/java/NextLevel/demo/project/community/service/ProjectCommunityAskService.java b/src/main/java/NextLevel/demo/project/community/service/ProjectCommunityAskService.java index 0ee802d..89b1e6e 100644 --- a/src/main/java/NextLevel/demo/project/community/service/ProjectCommunityAskService.java +++ b/src/main/java/NextLevel/demo/project/community/service/ProjectCommunityAskService.java @@ -50,10 +50,9 @@ public void update(SaveCommunityDto dto) { } @Transactional - public ResponseCommunityListDto selectAll(Long projectId) { + public List selectAll(Long projectId) { ProjectEntity project = projectValidateService.getProjectEntity(projectId); - List asks = projectCommunityAskRepository.findAllByProjectId(project.getId()); - return new ResponseCommunityListDto(asks); + return projectCommunityAskRepository.findAllByProjectIdOrderByCreatedAt(project.getId()); } @Transactional diff --git a/src/main/java/NextLevel/demo/project/notice/controller/ProjectNoticeController.java b/src/main/java/NextLevel/demo/project/notice/controller/ProjectNoticeController.java index bb87a62..a0b5a69 100644 --- a/src/main/java/NextLevel/demo/project/notice/controller/ProjectNoticeController.java +++ b/src/main/java/NextLevel/demo/project/notice/controller/ProjectNoticeController.java @@ -2,6 +2,8 @@ import NextLevel.demo.common.SuccessResponse; import NextLevel.demo.project.notice.dto.request.SaveProjectNoticeRequestDto; +import NextLevel.demo.project.notice.dto.response.ResponseNoticeListDto; +import NextLevel.demo.project.notice.dto.response.ResponseProjectNoticeDto; import NextLevel.demo.project.notice.service.ProjectNoticeService; import NextLevel.demo.util.jwt.JWTUtil; import jakarta.validation.Valid; @@ -10,11 +12,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.*; @Controller @Slf4j @@ -23,6 +21,12 @@ public class ProjectNoticeController { private final ProjectNoticeService projectNoticeService; + // select notice by project + @GetMapping("/public/project/{projectId}/notice") + public ResponseEntity getProjectNotice(@PathVariable Long projectId) { + return ResponseEntity.ok().body(new SuccessResponse("success", new ResponseNoticeListDto(projectNoticeService.getAllNotice(projectId)))); + } + @PostMapping("/api1/project/{projectId}/notice") public ResponseEntity addProjectNotice(@PathVariable("projectId") long projectId, @ModelAttribute @Valid SaveProjectNoticeRequestDto dto) { dto.setProjectId(projectId); diff --git a/src/main/java/NextLevel/demo/project/notice/dto/response/ResponseNoticeListDto.java b/src/main/java/NextLevel/demo/project/notice/dto/response/ResponseNoticeListDto.java index 8547a09..fb684a6 100644 --- a/src/main/java/NextLevel/demo/project/notice/dto/response/ResponseNoticeListDto.java +++ b/src/main/java/NextLevel/demo/project/notice/dto/response/ResponseNoticeListDto.java @@ -11,7 +11,7 @@ public class ResponseNoticeListDto { private int noticeCount; private List notices; - public ResponseNoticeListDto(Set entities) { + public ResponseNoticeListDto(List entities) { this.notices = entities.stream().map(e->ResponseProjectNoticeDto.of(e)).toList(); this.noticeCount = notices.size(); } diff --git a/src/main/java/NextLevel/demo/project/notice/repository/ProjectNoticeRepository.java b/src/main/java/NextLevel/demo/project/notice/repository/ProjectNoticeRepository.java index 7520618..d79f02b 100644 --- a/src/main/java/NextLevel/demo/project/notice/repository/ProjectNoticeRepository.java +++ b/src/main/java/NextLevel/demo/project/notice/repository/ProjectNoticeRepository.java @@ -1,6 +1,8 @@ package NextLevel.demo.project.notice.repository; import NextLevel.demo.project.notice.entity.ProjectNoticeEntity; + +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -10,4 +12,8 @@ public interface ProjectNoticeRepository extends JpaRepository findByIdWithProject(@Param("noticeId") Long noticeId); + + @Query("select pn from ProjectNoticeEntity pn where pn.project.id = :projectId order by pn.createdAt desc") + List findAllByProjectOrderByCreatedAt(@Param("projectId") Long projectId); + } diff --git a/src/main/java/NextLevel/demo/project/notice/service/ProjectNoticeService.java b/src/main/java/NextLevel/demo/project/notice/service/ProjectNoticeService.java index 50da378..d542d7b 100644 --- a/src/main/java/NextLevel/demo/project/notice/service/ProjectNoticeService.java +++ b/src/main/java/NextLevel/demo/project/notice/service/ProjectNoticeService.java @@ -13,6 +13,8 @@ import jakarta.persistence.EntityManager; import java.nio.file.Path; import java.util.ArrayList; +import java.util.List; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -27,6 +29,11 @@ public class ProjectNoticeService { private final ImgServiceImpl imgService; private final ProjectValidateService projectValidateService; + public List getAllNotice(Long projectId){ + ProjectEntity project = projectValidateService.getProjectEntity(projectId); + return projectNoticeRepository.findAllByProjectOrderByCreatedAt(project.getId()); + } + @Transactional @ImgTransaction public void saveProjectNotice(SaveProjectNoticeRequestDto dto, ArrayList imgPaths) { diff --git a/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java b/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java index 6369d78..620ad2a 100644 --- a/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java +++ b/src/main/java/NextLevel/demo/project/project/controller/ProjectController.java @@ -3,7 +3,6 @@ import NextLevel.demo.common.SuccessResponse; import NextLevel.demo.project.project.dto.request.CreateProjectDto; import NextLevel.demo.project.project.dto.request.RequestMainPageProjectListDto; -import NextLevel.demo.project.project.dto.response.ResponseProjectAllDto; import NextLevel.demo.project.project.dto.response.ResponseProjectDetailDto; import NextLevel.demo.project.project.dto.response.ResponseProjectListDto; import NextLevel.demo.project.project.service.ProjectService; @@ -99,11 +98,4 @@ public ResponseEntity getProjectDetailById(@PathVariable("projectId") @NotNul return ResponseEntity.status(HttpStatus.OK).body(new SuccessResponse("success" ,dto)); } - @GetMapping("/public/project/{projectId}/all") - public ResponseEntity getProjectNotice(@PathVariable("projectId") Long projectId) { - ResponseProjectAllDto dto = projectService.getProjectCommunityAndNoticeAndStoryDto(projectId); - - return ResponseEntity.status(HttpStatus.OK).body(new SuccessResponse("success", dto)); - } - } diff --git a/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectAllDto.java b/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectAllDto.java deleted file mode 100644 index 23a6544..0000000 --- a/src/main/java/NextLevel/demo/project/project/dto/response/ResponseProjectAllDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package NextLevel.demo.project.project.dto.response; - -import NextLevel.demo.project.community.dto.response.ResponseCommunityListDto; -import NextLevel.demo.project.notice.dto.response.ResponseNoticeListDto; -import NextLevel.demo.project.story.dto.ResponseProjectStoryListDto; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Setter -@Getter -@Builder -@AllArgsConstructor -public class ResponseProjectAllDto { - - private ResponseProjectStoryListDto story; - private ResponseNoticeListDto notice; - private ResponseCommunityListDto community; - -} diff --git a/src/main/java/NextLevel/demo/project/project/entity/ProjectEntity.java b/src/main/java/NextLevel/demo/project/project/entity/ProjectEntity.java index 4b4bee8..cd630fe 100644 --- a/src/main/java/NextLevel/demo/project/project/entity/ProjectEntity.java +++ b/src/main/java/NextLevel/demo/project/project/entity/ProjectEntity.java @@ -66,10 +66,10 @@ public class ProjectEntity extends BasedEntity { private List tags; @OneToMany(mappedBy = "project", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}) - private Set stories; + private List stories; @OneToMany(mappedBy = "project", fetch = FetchType.LAZY) - private Set options; + private List options; @OneToMany(mappedBy = "project", fetch = FetchType.LAZY) private Set freeFundings; @@ -78,15 +78,15 @@ public class ProjectEntity extends BasedEntity { private Set likes; @OneToMany(mappedBy = "project", fetch = FetchType.LAZY) - private Set communities; + private List communities; @OneToMany(mappedBy = "project", fetch = FetchType.LAZY) - private Set notices; + private List notices; @OneToMany(mappedBy = "project", fetch = FetchType.LAZY) - private Set views; + private List views; - public void setStories(Set imgs) { + public void setStories(List imgs) { this.stories = imgs; } public void setTags(List tags) { @@ -96,7 +96,7 @@ public void setTags(List tags) { @Builder public ProjectEntity(Long id, UserEntity user, String title, String content, Long goal, ImgEntity titleImg, String expired, List tags, - Set stories) throws ParseException { + List stories) throws ParseException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); this.id = id; this.user = user; diff --git a/src/main/java/NextLevel/demo/project/project/repository/ProjectRepository.java b/src/main/java/NextLevel/demo/project/project/repository/ProjectRepository.java index dfd8a2c..08068d6 100644 --- a/src/main/java/NextLevel/demo/project/project/repository/ProjectRepository.java +++ b/src/main/java/NextLevel/demo/project/project/repository/ProjectRepository.java @@ -31,11 +31,4 @@ public interface ProjectRepository extends JpaRepository { + "where p.id = :id") Optional findProjectDetailById(@Param("id") Long id); - @Query("select p from ProjectEntity p " - + "left join fetch p.notices as n " - + "left join fetch p.communities as c " - + "left join fetch p.stories as story " - + "where p.id = :id") - Optional findProjectWithNoticesAndCommunityAndStory(@Param("id") Long id); - } diff --git a/src/main/java/NextLevel/demo/project/project/service/ProjectService.java b/src/main/java/NextLevel/demo/project/project/service/ProjectService.java index a62e8c7..b309fcc 100644 --- a/src/main/java/NextLevel/demo/project/project/service/ProjectService.java +++ b/src/main/java/NextLevel/demo/project/project/service/ProjectService.java @@ -6,18 +6,14 @@ import NextLevel.demo.img.entity.ImgEntity; import NextLevel.demo.img.service.ImgServiceImpl; import NextLevel.demo.img.service.ImgTransaction; -import NextLevel.demo.project.community.dto.response.ResponseCommunityListDto; -import NextLevel.demo.project.notice.dto.response.ResponseNoticeListDto; import NextLevel.demo.project.project.dto.request.CreateProjectDto; import NextLevel.demo.project.project.dto.request.RequestMainPageProjectListDto; -import NextLevel.demo.project.project.dto.response.ResponseProjectAllDto; import NextLevel.demo.project.project.dto.response.ResponseProjectDetailDto; -import NextLevel.demo.project.project.dto.response.ResponseProjectListDetailDto; import NextLevel.demo.project.project.dto.response.ResponseProjectListDto; import NextLevel.demo.project.project.entity.ProjectEntity; import NextLevel.demo.project.project.repository.ProjectDslRepository; import NextLevel.demo.project.project.repository.ProjectRepository; -import NextLevel.demo.project.story.dto.ResponseProjectStoryListDto; +import NextLevel.demo.project.story.entity.ProjectStoryEntity; import NextLevel.demo.project.story.service.ProjectStoryService; import NextLevel.demo.project.tag.service.TagService; import NextLevel.demo.project.view.ProjectViewService; @@ -48,6 +44,7 @@ public class ProjectService { private final FundingValidateService fundingValidateService; private final ProjectDslRepository projectDslRepository; + private final ProjectValidateService projectValidateService; // 추가 @ImgTransaction @@ -134,20 +131,4 @@ public ResponseProjectDetailDto getProjectDetailById(Long id, Long userId) { return ResponseProjectDetailDto.of(project, fundingPrice, fundingCount, userId); } - // notice and community and story - // 추가 수정 필요!!! 정렬 어디다 팔아 먹음? 다시 만들것! - @Transactional - public ResponseProjectAllDto getProjectCommunityAndNoticeAndStoryDto(Long projectId) { - ProjectEntity project = projectRepository.findProjectWithNoticesAndCommunityAndStory(projectId).orElseThrow( - ()-> new CustomException(ErrorCode.NOT_FOUND,"project") - ); - - return ResponseProjectAllDto - .builder() - .community(new ResponseCommunityListDto(project.getCommunities())) - .notice(new ResponseNoticeListDto(project.getNotices())) - .story(new ResponseProjectStoryListDto(project.getStories())) - .build(); - } - } diff --git a/src/main/java/NextLevel/demo/project/story/controller/ProjectStoryController.java b/src/main/java/NextLevel/demo/project/story/controller/ProjectStoryController.java index 559c9f2..33ac2a1 100644 --- a/src/main/java/NextLevel/demo/project/story/controller/ProjectStoryController.java +++ b/src/main/java/NextLevel/demo/project/story/controller/ProjectStoryController.java @@ -1,6 +1,7 @@ package NextLevel.demo.project.story.controller; import NextLevel.demo.common.SuccessResponse; +import NextLevel.demo.project.story.dto.ResponseProjectStoryListDto; import NextLevel.demo.project.story.service.ProjectStoryService; import NextLevel.demo.util.jwt.JWTUtil; import java.util.List; @@ -9,6 +10,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -27,4 +29,9 @@ public ResponseEntity updateProjectStory(@PathVariable("projectId") long proj return ResponseEntity.status(HttpStatus.OK).body(new SuccessResponse("success",null)); } + @GetMapping("/public/project/{projectId}/story") + public ResponseEntity getProjectStory(@PathVariable("projectId") long projectId){ + return ResponseEntity.ok().body(new SuccessResponse("success", new ResponseProjectStoryListDto(projectStoryService.getProjectStory(projectId)))); + } + } diff --git a/src/main/java/NextLevel/demo/project/story/dto/ResponseProjectStoryListDto.java b/src/main/java/NextLevel/demo/project/story/dto/ResponseProjectStoryListDto.java index 82c1982..4d2edba 100644 --- a/src/main/java/NextLevel/demo/project/story/dto/ResponseProjectStoryListDto.java +++ b/src/main/java/NextLevel/demo/project/story/dto/ResponseProjectStoryListDto.java @@ -3,7 +3,6 @@ import NextLevel.demo.img.ImgDto; import NextLevel.demo.project.story.entity.ProjectStoryEntity; import java.util.List; -import java.util.Set; import lombok.Getter; import lombok.Setter; @@ -12,7 +11,7 @@ public class ResponseProjectStoryListDto { private List imgs; - public ResponseProjectStoryListDto (Set entities) { + public ResponseProjectStoryListDto (List entities) { this.imgs = entities.stream().map(e-> new ImgDto(e.getImg())).toList(); } } diff --git a/src/main/java/NextLevel/demo/project/story/repository/ProjectStoryRepository.java b/src/main/java/NextLevel/demo/project/story/repository/ProjectStoryRepository.java index 0f4aad2..9e93963 100644 --- a/src/main/java/NextLevel/demo/project/story/repository/ProjectStoryRepository.java +++ b/src/main/java/NextLevel/demo/project/story/repository/ProjectStoryRepository.java @@ -2,7 +2,7 @@ import NextLevel.demo.project.story.entity.ProjectStoryEntity; import java.util.List; -import java.util.Set; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -13,4 +13,7 @@ public interface ProjectStoryRepository extends JpaRepository findAllByProjectOrderByCreatedAt(@Param("projectId") Long projectId); + } diff --git a/src/main/java/NextLevel/demo/project/story/service/ProjectStoryService.java b/src/main/java/NextLevel/demo/project/story/service/ProjectStoryService.java index 07373e8..6b3b624 100644 --- a/src/main/java/NextLevel/demo/project/story/service/ProjectStoryService.java +++ b/src/main/java/NextLevel/demo/project/story/service/ProjectStoryService.java @@ -1,20 +1,15 @@ package NextLevel.demo.project.story.service; -import NextLevel.demo.exception.CustomException; -import NextLevel.demo.exception.ErrorCode; import NextLevel.demo.img.entity.ImgEntity; import NextLevel.demo.img.service.ImgServiceImpl; import NextLevel.demo.img.service.ImgTransaction; import NextLevel.demo.project.project.entity.ProjectEntity; -import NextLevel.demo.project.project.repository.ProjectRepository; +import NextLevel.demo.project.project.service.ProjectValidateService; import NextLevel.demo.project.story.entity.ProjectStoryEntity; import NextLevel.demo.project.story.repository.ProjectStoryRepository; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; +import java.util.*; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,9 +21,9 @@ @Slf4j public class ProjectStoryService { - private final ProjectRepository projectRepository; private final ProjectStoryRepository projectStoryRepository; private final ImgServiceImpl imgService; + private final ProjectValidateService projectValidateService; @ImgTransaction @Transactional @@ -61,12 +56,13 @@ public void updateProjectStory(Long projectId, Long userId, List if(imgFiles == null || imgFiles.isEmpty()) return; - ProjectEntity oldProject = projectRepository.findByIdWithAll(projectId).orElseThrow( - ()->new CustomException(ErrorCode.NOT_FOUND, "project") - ); - if(oldProject.getUser().getId() != userId) - throw new CustomException(ErrorCode.NOT_AUTHOR); + ProjectEntity project = projectValidateService.validateAuthor(projectId, userId); + + updateProjectStory(project, imgFiles, imgPaths); + } - updateProjectStory(oldProject, imgFiles, imgPaths); + public List getProjectStory(Long projectId) { + projectValidateService.getProjectEntity(projectId); + return projectStoryRepository.findAllByProjectOrderByCreatedAt(projectId); } }