Skip to content

Commit

Permalink
Merge pull request #34 from dnd-side-project/feature/#32
Browse files Browse the repository at this point in the history
프로젝트 전체 조회(메인 페이지), 끌올 api #32
  • Loading branch information
woo0doo authored Feb 18, 2024
2 parents 1ebb87b + ee52cd8 commit c576956
Show file tree
Hide file tree
Showing 36 changed files with 1,038 additions and 117 deletions.
51 changes: 50 additions & 1 deletion src/docs/asciidoc/api/project.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,35 @@
[[Project-API]]
= Project API

[[project-select]]
== 프로젝트 전체 조회(메인 페이지)

=== 성공

==== HTTP Requests
include::{snippets}/project/select/http-request.adoc[]

- Query parameters
include::{snippets}/project/select/query-parameters.adoc[]
page : default(1 페이지)

field 종류 : 예술/대중문화, 금융/핀테크, 환경, 교육, 건강, AI/머신러닝, 취미/실용, 게임, 기타, *(아무것도 안보내면 전체)*

keyword : (default 검색 키워드가 없는 것으로 간주)

is-finished : false(피드백 중) or true(피드백 중인게 없는) (default : false)

sort : 0 (최신순) or 1 (인기순) (default : 0)

- Header +
로그인 한 사용자면 보내주시고 아니면 안보내주셔도 됩니다
include::{snippets}/project/select/request-headers.adoc[]

==== HTTP Response
include::{snippets}/project/select/http-response.adoc[]
- Request body +
include::{snippets}/project/select/response-fields.adoc[]

[[project-save]]
== 프로젝트 등록

Expand Down Expand Up @@ -45,6 +74,8 @@ include::{snippets}/project/detail/response-fields.adoc[]

==== HTTP Requests
include::{snippets}/project/update/http-request.adoc[]
- Path parameters +
include::{snippets}/project/update/path-parameters.adoc[]

- Request body +
include::{snippets}/project/update/request-parts.adoc[]
Expand All @@ -63,9 +94,27 @@ include::{snippets}/project/update/response-fields.adoc[]

==== HTTP Requests
include::{snippets}/project/delete/http-request.adoc[]
- Path parameters +
include::{snippets}/project/delete/path-parameters.adoc[]


==== HTTP Response
include::{snippets}/project/delete/http-response.adoc[]
- Response body +
include::{snippets}/project/delete/response-fields.adoc[]
include::{snippets}/project/delete/response-fields.adoc[]

[[project-pull-up]]
== 프로젝트 끌올

=== 성공

==== HTTP Requests
include::{snippets}/project/pull-up/http-request.adoc[]

- Path parameters +
include::{snippets}/project/pull-up/path-parameters.adoc[]

==== HTTP Response
include::{snippets}/project/pull-up/http-response.adoc[]
- Response body +
include::{snippets}/project/pull-up/response-fields.adoc[]
Original file line number Diff line number Diff line change
@@ -1,28 +1,33 @@
package com.sendback.domain.feedback.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sendback.domain.feedback.entity.Feedback;
import com.sendback.domain.project.entity.Project;
import com.sendback.domain.user.entity.User;

import static com.sendback.global.util.CustomDateUtil.customDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;

public record FeedbackDetailResponseDto(

Long userId,
String username,
String nickname,
String userLevel,
String profileImageUrl,
Long feedbackId,
String feedbackTitle,
String linkUrl,
String content,
String rewardMessage,
String createdAt,
String startedAt,
String endedAt,
@JsonFormat(pattern = "yyyy.MM.dd hh:mm")
LocalDateTime createdAt,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDate startedAt,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDate endedAt,
Long projectId,
String projectTitle,
String fieldName,
String field,
String progress
) {
public static FeedbackDetailResponseDto from(Feedback feedback) {
Expand All @@ -38,9 +43,9 @@ public static FeedbackDetailResponseDto from(Feedback feedback) {
feedback.getLinkUrl(),
feedback.getContent(),
feedback.getRewardMessage(),
customDateFormat(feedback.getCreatedAt()),
feedback.getStartedAt().toString(),
feedback.getEndedAt().toString(),
feedback.getCreatedAt(),
feedback.getStartedAt(),
feedback.getEndedAt(),
project.getId(),
project.getTitle(),
project.getFieldName().getName(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package com.sendback.domain.feedback.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sendback.domain.feedback.entity.Feedback;

import java.time.LocalDate;

public record FeedbackResponseDto(
Long feedbackId,
String title,
String rewardMessage,
String startedAt,
String endedAt,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDate startedAt,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDate endedAt,
boolean isFinished,
boolean isAuthor,
boolean isSubmitted
Expand All @@ -17,8 +22,8 @@ public static FeedbackResponseDto of(Feedback feedback, boolean isAuthor, boolea
feedback.getId(),
feedback.getTitle(),
feedback.getRewardMessage(),
feedback.getStartedAt().toString(),
feedback.getEndedAt().toString(),
feedback.getStartedAt(),
feedback.getEndedAt(),
feedback.isFinished(),
isAuthor,
isSubmitted
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,18 @@

import com.sendback.domain.project.dto.request.SaveProjectRequestDto;
import com.sendback.domain.project.dto.request.UpdateProjectRequestDto;
import com.sendback.domain.project.dto.response.GetProjectsResponseDto;
import com.sendback.domain.project.dto.response.ProjectDetailResponseDto;
import com.sendback.domain.project.dto.response.ProjectIdResponseDto;
import com.sendback.domain.project.dto.response.PullUpProjectResponseDto;
import com.sendback.domain.project.service.ProjectService;
import com.sendback.global.common.ApiResponse;
import com.sendback.global.common.CustomPage;
import com.sendback.global.common.UserId;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.MediaType;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
Expand All @@ -26,8 +31,26 @@ public class ProjectController {

private final ProjectService projectService;

@GetMapping
public ApiResponse<CustomPage<GetProjectsResponseDto>> getProjects(
@PageableDefault(page = 1, size = 5) Pageable pageable,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) String field,
@RequestParam(name = "is-finished", required = false) Boolean isFinished,
@RequestParam(required = false) Long sort
) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if (authentication.getPrincipal() == "anonymousUser") {
return success(projectService.getProjects(null , pageable, keyword, field, isFinished, sort));
}

Long userId = (Long) authentication.getPrincipal();
return success(projectService.getProjects(userId, pageable, keyword, field, isFinished, sort));
}

@GetMapping("/{projectId}")
private ApiResponse<ProjectDetailResponseDto> getProjectDetail(
public ApiResponse<ProjectDetailResponseDto> getProjectDetail(
@PathVariable Long projectId
) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Expand All @@ -45,6 +68,7 @@ public ApiResponse<ProjectIdResponseDto> saveProject(
@UserId Long userId,
@RequestPart(value = "data") @Valid SaveProjectRequestDto saveProjectRequestDto,
@RequestPart(value = "images", required = false) List<MultipartFile> images) {

return success(projectService.saveProject(userId, saveProjectRequestDto, images));
}

Expand All @@ -54,6 +78,7 @@ public ApiResponse<ProjectIdResponseDto> updateProject(
@PathVariable Long projectId,
@RequestPart(value = "data") @Valid UpdateProjectRequestDto updateProjectRequestDto,
@RequestPart(value = "images", required = false) List<MultipartFile> images) {

return success(projectService.updateProject(userId, projectId, updateProjectRequestDto, images));
}

Expand All @@ -66,4 +91,12 @@ public ApiResponse<Object> deleteProject(

return success(null);
}

@PutMapping("/{projectId}/pull-up")
public ApiResponse<PullUpProjectResponseDto> pullUpProject(
@UserId Long userId,
@PathVariable Long projectId) {

return success(projectService.pullUpProject(userId, projectId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public record SaveProjectRequestDto(
@NotBlank(message = "제목은 비워둘 수 없습니다.")
String title,
@NotBlank(message = "분야는 비워둘 수 없습니다.")
String fieldName,
String field,
@Size(max = 1_000, message = "설명은 글자 수가 최대 1,000자 입니다.")
@NotBlank(message = "설명은 비워둘 수 없습니다.")
String content,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public record UpdateProjectRequestDto(
@NotBlank(message = "제목은 비워둘 수 없습니다.")
String title,
@NotBlank(message = "분야는 비워둘 수 없습니다.")
String fieldName,
String field,
@Size(max = 1_000, message = "설명은 글자 수가 최대 1,000자 입니다.")
@NotBlank(message = "설명은 비워둘 수 없습니다.")
String content,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.sendback.domain.project.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sendback.domain.project.entity.Project;

import java.time.LocalDateTime;

public record GetProjectsResponseDto(
String nickname,
String profileImageUrl,
Long projectId,
String title,
String summary,
String progress,
String field,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDateTime createdAt,
Long pullUpCount,
Long likeCount,
Long commentCount,
boolean isScrapped
) {
public static GetProjectsResponseDto of(Project project, boolean isScrapped) {
return new GetProjectsResponseDto(
project.getUser().getNickname(),
project.getUser().getProfileImageUrl(),
project.getId(),
project.getTitle(),
project.getSummary(),
project.getProgress().getValue(),
project.getFieldName().getName(),
project.getCreatedAt(),
project.getProjectPull().getPullUpCnt(),
project.getLikes().stream().map(like -> !like.isDeleted()).count(),
project.getComments().stream().map(comment -> !comment.isDeleted()).count(),
isScrapped
);
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package com.sendback.domain.project.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sendback.domain.project.entity.Project;
import com.sendback.domain.project.entity.ProjectImage;
import com.sendback.domain.user.entity.User;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import static com.sendback.global.util.CustomDateUtil.customDateFormat;

public record ProjectDetailResponseDto(
Long userId,
String username,
String nickname,
String userLevel,
String profileImageUrl,
Long projectId,
String title,
String fieldName,
String field,
String content,
String demoSiteUrl,
String progress,
Expand All @@ -27,9 +28,12 @@ public record ProjectDetailResponseDto(
Long likeCount,
Long scrapCount,
Long commentCount,
String createdAt,
String startedAt,
String endedAt,
@JsonFormat(pattern = "yyyy.MM.dd hh:mm")
LocalDateTime createdAt,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDate startedAt,
@JsonFormat(pattern = "yyyy.MM.dd")
LocalDate endedAt,
boolean isAuthor,
boolean isCheckedLike,
boolean isCheckedScrap
Expand All @@ -55,9 +59,9 @@ public static ProjectDetailResponseDto of(Project project, boolean isAuthor, boo
project.getLikes().stream().filter(like -> !like.isDeleted()).count(),
project.getScraps().stream().filter(scrap -> !scrap.isDeleted()).count(),
project.getComments().stream().filter(comment -> !comment.isDeleted()).count(),
customDateFormat(project.getCreatedAt()),
project.getStartedAt().toString(),
project.getEndedAt().toString(),
project.getCreatedAt(),
project.getStartedAt(),
project.getEndedAt(),
isAuthor,
isCheckedLike,
isCheckedScrap
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.sendback.domain.project.dto.response;

public record PullUpProjectResponseDto(boolean isPulledUp) {
}
Loading

0 comments on commit c576956

Please sign in to comment.