Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/main/java/com/codeit/todo/domain/Complete.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.relational.core.sql.Like;

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

@Entity
Expand Down Expand Up @@ -36,6 +39,12 @@ public class Complete {
@JoinColumn(name = "todo_id", nullable = false)
private Todo todo;

@OneToMany(mappedBy = "complete", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();

@OneToMany(mappedBy = "complete", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Likes> likes = new ArrayList<>();

@Builder
public Complete(LocalDate startDate, LocalDateTime createdAt, String note, String completeLink, String completeFile, String completePic, String completeStatus, Todo todo) {
this.startDate = startDate;
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/codeit/todo/repository/LikesRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.codeit.todo.repository;

import com.codeit.todo.domain.Likes;
import org.springframework.data.jpa.repository.JpaRepository;

public interface LikesRepository extends JpaRepository<Likes, Integer> {
Boolean existsByUser_UserIdAndComplete_CompleteId(int userId, int completeId);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.codeit.todo.service.complete;

import com.codeit.todo.web.dto.request.complete.UpdateCompleteRequest;
import com.codeit.todo.web.dto.response.complete.ReadCompleteDetailResponse;
import com.codeit.todo.web.dto.response.complete.UpdateCompleteResponse;

public interface CompleteService {
UpdateCompleteResponse updateCompleteInfo(int userId, int completeId, UpdateCompleteRequest request);

ReadCompleteDetailResponse readComplete(int userId, int completeId);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package com.codeit.todo.service.complete.impl;

import com.codeit.todo.common.exception.complete.CompleteNotFoundException;
import com.codeit.todo.common.exception.payload.ErrorStatus;
import com.codeit.todo.domain.Complete;
import com.codeit.todo.repository.CompleteRepository;
import com.codeit.todo.repository.LikesRepository;
import com.codeit.todo.service.complete.CompleteService;
import com.codeit.todo.service.storage.StorageService;
import com.codeit.todo.web.dto.request.complete.UpdateCompleteRequest;
import com.codeit.todo.web.dto.response.comment.ReadCommentResponse;
import com.codeit.todo.web.dto.response.complete.ReadCompleteDetailResponse;
import com.codeit.todo.web.dto.response.complete.UpdateCompleteResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

@Service
Expand All @@ -22,12 +25,11 @@ public class CompleteServiceImpl implements CompleteService {
private final StorageService storageService;

private final CompleteRepository completeRepository;
private final LikesRepository likesRepository;

@Override
public UpdateCompleteResponse updateCompleteInfo(int userId, int completeId, UpdateCompleteRequest request) {
Complete complete = completeRepository.findById(completeId)
.filter(c -> c.getTodo().getGoal().getUser().getUserId() == userId)
.orElseThrow(() -> new CompleteNotFoundException(String.valueOf(completeId)));
Complete complete = getComplete(userId, completeId);

String completePicUrl = "";

Expand All @@ -39,4 +41,23 @@ public UpdateCompleteResponse updateCompleteInfo(int userId, int completeId, Upd

return new UpdateCompleteResponse(completeId);
}

@Transactional(readOnly = true)
@Override
public ReadCompleteDetailResponse readComplete(int userId, int completeId) {
Complete complete = getComplete(userId, completeId);
List<ReadCommentResponse> commentResponses = complete.getComments().stream()
.map(ReadCommentResponse::fromEntity)
.toList();

Boolean likeStatus = likesRepository.existsByUser_UserIdAndComplete_CompleteId(userId, completeId);

return ReadCompleteDetailResponse.from(complete, commentResponses, likeStatus);
}

private Complete getComplete(int userId, int completeId) {
return completeRepository.findById(completeId)
.filter(c -> c.getTodo().getGoal().getUser().getUserId() == userId)
.orElseThrow(() -> new CompleteNotFoundException(String.valueOf(completeId)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import com.codeit.todo.service.complete.CompleteService;
import com.codeit.todo.web.dto.request.complete.UpdateCompleteRequest;
import com.codeit.todo.web.dto.response.Response;
import com.codeit.todo.web.dto.response.complete.ReadCompleteDetailResponse;
import com.codeit.todo.web.dto.response.complete.ReadCompleteResponse;
import com.codeit.todo.web.dto.response.complete.UpdateCompleteResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand Down Expand Up @@ -35,4 +37,20 @@ public Response<UpdateCompleteResponse> updateComplete(
int userId = userDetails.getUserId();
return Response.ok(completeService.updateCompleteInfo(userId, completeId, request));
}

@Operation(
summary = "인증 및 노트 상세 조회",
description = "인증 및 노트 상세조회하는 API 입니다."
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공")
})
@GetMapping("{completeId}")
public Response<ReadCompleteDetailResponse> readComplete(
@AuthenticationPrincipal CustomUserDetails userDetails,
@PathVariable int completeId
) {
int userId = userDetails.getUserId();
return Response.ok(completeService.readComplete(userId, completeId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.codeit.todo.web.dto.response.comment;

import com.codeit.todo.domain.Comment;
import lombok.Builder;

import java.time.LocalDateTime;

@Builder
public record ReadCommentResponse(
int commentId,
String content,
String userName,
String profileImage,
LocalDateTime createdAt
) {
public static ReadCommentResponse fromEntity(Comment comment) {
return ReadCommentResponse.builder()
.commentId(comment.getCommentId())
.content(comment.getContent())
.userName(comment.getUser().getName())
.profileImage(comment.getUser().getProfilePic())
.createdAt(comment.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.codeit.todo.web.dto.response.complete;

import com.codeit.todo.domain.Complete;
import com.codeit.todo.web.dto.response.comment.ReadCommentResponse;
import lombok.Builder;

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

@Builder
public record ReadCompleteDetailResponse(
int completeId,
String completePic,
String note,
String completeLink,
String completeStatus,
LocalDateTime createdAt,
LocalDate startDate,
Boolean likeStatus,
int likeCount,
int commentCount,
List<ReadCommentResponse> comments
) {
public static ReadCompleteDetailResponse from(Complete complete, List<ReadCommentResponse> commentResponses, Boolean likeStatus) {
return ReadCompleteDetailResponse.builder()
.completeId(complete.getCompleteId())
.completePic(complete.getCompletePic())
.note(complete.getNote())
.completeLink(complete.getCompleteLink())
.completeStatus(complete.getCompleteStatus())
.createdAt(complete.getCreatedAt())
.startDate(complete.getStartDate())
.likeCount(complete.getLikes().size())
.likeStatus(likeStatus)
.commentCount(commentResponses.size())
.comments(commentResponses)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codeit.todo.web.dto.response.complete;

import com.codeit.todo.domain.Comment;
import com.codeit.todo.domain.Complete;
import lombok.Builder;

Expand Down
Loading