Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/comment #29

Merged
merged 3 commits into from
Sep 28, 2024
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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.0'

implementation 'org.springframework.boot:spring-boot-starter-validation'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.kakaogroom6.server.domain.comment.dto.req;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

@Getter
@Setter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CommentRequestDto {
@NotNull(message = "travelogId cannot be null")
private Long travelogId;

@NotBlank(message = "content connot be blank")
private String content;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.kakaogroom6.server.domain.comment.dto.res;

import lombok.*;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CommentResponseDto {
private String userName;
private String content;
private String createdAt;
private String profileImgUrl;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.kakaogroom6.server.domain.comment.entity;

import com.kakaogroom6.server.domain.member.entity.MemberEntity;
import com.kakaogroom6.server.domain.travelog.entity.TravelogEntity;
import com.kakaogroom6.server.global.common.BaseEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

@Entity
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "comment")
public class CommentEntity extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
private MemberEntity member;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "travelog_id", nullable = false)
private TravelogEntity travelog;

@Column(name = "content")
private String content;

public CommentEntity(MemberEntity member, TravelogEntity travelog, String content) {
this.member = member;
this.travelog = travelog;
this.content = content;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.kakaogroom6.server.domain.comment.repository;

import com.kakaogroom6.server.domain.comment.entity.CommentEntity;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface CommentRepository extends JpaRepository<CommentEntity, Long> {
Optional<List<CommentEntity>> findAllByTravelogId(Long travelogId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.kakaogroom6.server.domain.comment.service;

import com.kakaogroom6.server.domain.comment.dto.req.CommentRequestDto;
import com.kakaogroom6.server.domain.comment.dto.res.CommentResponseDto;
import com.kakaogroom6.server.domain.comment.entity.CommentEntity;
import com.kakaogroom6.server.domain.comment.repository.CommentRepository;
import com.kakaogroom6.server.domain.member.entity.MemberEntity;
import com.kakaogroom6.server.domain.member.repository.MemberRepository;
import com.kakaogroom6.server.domain.travelog.entity.TravelogEntity;
import com.kakaogroom6.server.domain.travelog.repository.TravelogRepository;
import com.kakaogroom6.server.global.errors.code.CommonErrorCode;
import com.kakaogroom6.server.global.errors.exception.RestApiException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class CommentService {

private final CommentRepository commentRepository;
private final MemberRepository memberRepository;
private final TravelogRepository travelogRepository;

public boolean saveComment(String email, CommentRequestDto request){
MemberEntity member = memberRepository.findByEmail(email)
.orElseThrow(() -> new RestApiException(CommonErrorCode.MEMBER_NOT_FOUND));

TravelogEntity travelog = travelogRepository.findById(request.getTravelogId())
.orElseThrow(() -> new RestApiException(CommonErrorCode.TRAVELOG_NOT_FOUND));

System.out.println("memberinfo" + member.getId() + member.getEmail());

CommentEntity comment = new CommentEntity(member, travelog, request.getContent());

commentRepository.save(comment);

return true;
}

public List<CommentResponseDto> getComment(Long travelogId){
List<CommentEntity> comments = commentRepository.findAllByTravelogId(travelogId)
.orElse(List.of());

List<CommentResponseDto> response = comments.stream()
.map(this::convertToResponseDto)
.collect(Collectors.toList());

return response;
}

public CommentResponseDto convertToResponseDto(CommentEntity comment){
MemberEntity member = memberRepository.findById(comment.getMember().getId())
.orElseThrow(() -> new RestApiException(CommonErrorCode.MEMBER_NOT_FOUND_AT_COMMENT));

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
String formattedDate = comment.getCreatedAt().format(formatter);

return new CommentResponseDto(
comment.getMember().getName(),
comment.getContent(),
formattedDate,
member.getProfileUrl()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public ProfileResponseDto getProfile(String email) {
// }

private TravelogSummaryDto convertToSummaryDto(TravelogEntity travelog) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
String formattedDate = travelog.getCreatedAt().format(formatter);

return new TravelogSummaryDto(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,31 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.kakaogroom6.server.domain.comment.dto.req.CommentRequestDto;
import com.kakaogroom6.server.domain.comment.dto.res.CommentResponseDto;
import com.kakaogroom6.server.domain.comment.service.CommentService;
import com.kakaogroom6.server.domain.travelog.dto.request.CreateOnePlaceRequestDTO;
import com.kakaogroom6.server.domain.travelog.dto.request.CreateTravelogRequestDTO;
import com.kakaogroom6.server.domain.travelog.dto.request.FirstTravelRequestDTO;
import com.kakaogroom6.server.domain.travelog.dto.response.CreateTravelogResponseDTO;
import com.kakaogroom6.server.domain.travelog.dto.response.GetTravelogDetaiResponselDTO;
import com.kakaogroom6.server.domain.travelog.dto.response.TravelogsResponseDto;
import com.kakaogroom6.server.domain.travelog.service.TravelogService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/core/travelog")
public class TravelogController {

private final TravelogService travelogService;
private final CommentService commentService;

@GetMapping
public ResponseEntity<TravelogsResponseDto> getAllTravelogs(
Expand All @@ -35,7 +43,6 @@ public ResponseEntity<TravelogsResponseDto> searchTravelogs(
return ResponseEntity.ok(response);
}


// 여행기 등록
@PostMapping("/")
public ResponseEntity<CreateTravelogResponseDTO> createTravelog(
Expand Down Expand Up @@ -65,9 +72,26 @@ public ResponseEntity<CreateTravelogResponseDTO> createTravelog(
return ResponseEntity.ok(response);
}

@PostMapping("/comment")
public ResponseEntity<?> addComment(
@CookieValue(name = "email", required = true)String email,
@Valid @RequestBody CommentRequestDto request){
boolean response = commentService.saveComment(email, request);
return ResponseEntity.ok(response);
}

@GetMapping("/comment/{travelogId}")
public ResponseEntity<List<CommentResponseDto>> getComments(
@PathVariable Long travelogId){
List<CommentResponseDto> response = commentService.getComment(travelogId);
return ResponseEntity.ok(response);
}


@GetMapping("/{travelogId}")
public ResponseEntity<GetTravelogDetaiResponselDTO> getTravelogDetail(@PathVariable Long travelogId) {
GetTravelogDetaiResponselDTO travelogDetail = travelogService.getTravelogDetail(travelogId);
return ResponseEntity.ok(travelogDetail);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public interface TravelogRepository extends JpaRepository<TravelogEntity, Long>
Optional<List<TravelogEntity>> findAllByOrderByCreatedAtDesc();
Optional<List<TravelogEntity>> findAllByOrderByLikesDesc();

Optional<List<TravelogEntity>> findByTitleContainingOrderByCreatedAtDesc(String location);
Optional<List<TravelogEntity>> findByTitleContainingOrderByLikesDesc(String location);
Optional<List<TravelogEntity>> findAllByTitleContainingOrderByCreatedAtDesc(String location);
Optional<List<TravelogEntity>> findAllByTitleContainingOrderByLikesDesc(String location);

}
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ public TravelogsResponseDto getAllTravelogs(String sortBy) {
public TravelogsResponseDto searchTravelogs(String location, String sortBy) {
List<TravelogEntity> travelogs;
if ("likes".equalsIgnoreCase(sortBy)) {
travelogs = travelogRepository.findByTitleContainingOrderByLikesDesc(location)
travelogs = travelogRepository.findAllByTitleContainingOrderByLikesDesc(location)
.orElse(List.of());
} else {
travelogs = travelogRepository.findByTitleContainingOrderByCreatedAtDesc(location)
travelogs = travelogRepository.findAllByTitleContainingOrderByCreatedAtDesc(location)
.orElse(List.of());
}

Expand All @@ -69,6 +69,8 @@ public TravelogsResponseDto searchTravelogs(String location, String sortBy) {
return new TravelogsResponseDto(travelogSummarys, travelogSummarys.size());
}

// public List<TravelogSummaryDto>

private TravelogSummaryDto convertToSummaryDto(TravelogEntity travelog) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = travelog.getCreatedAt().format(formatter);
Expand Down Expand Up @@ -139,7 +141,6 @@ private void saveKeywords(List<String> keywords, TravelogEntity travelog) {

private void savePlaces(List<CreateOnePlaceRequestDTO> places, TravelogEntity travelog) {
if (places != null) {

for (CreateOnePlaceRequestDTO place : places) {
PlaceEntity placeEntity = new PlaceEntity();
placeEntity.setDetails(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ public enum CommonErrorCode implements ErrorCode {
PUT_OBJECT_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, 500, "Failed to upload the image to S3."),
IO_EXCEPTION_ON_IMAGE_DELETE(HttpStatus.INTERNAL_SERVER_ERROR, 500, "An I/O error occurred while deleting the image from S3."),

MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, 404, "Member not found")
// Member
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, 404, "Member not found"),
MEMBER_NOT_FOUND_AT_COMMENT(HttpStatus.NOT_FOUND, 404, "Member not found for Comment"),

// Travelog
TRAVELOG_NOT_FOUND(HttpStatus.NOT_FOUND, 404, "Travelog not found")
;

private final HttpStatus httpStatus;
Expand Down
Loading