Skip to content
Open
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
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ dependencies {
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

// AWS SDK for S3
implementation 'software.amazon.awssdk:s3:2.20.91'

// Query dsl 설정
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,40 @@
package com.nemo.dong_geul_be.board.controller;

import com.nemo.dong_geul_be.board.domain.dto.request.CreatePostRequest;
import com.nemo.dong_geul_be.authentication.util.SecurityContextUtil;
import com.nemo.dong_geul_be.board.domain.dto.request.CreateCommentRequest;
import com.nemo.dong_geul_be.board.domain.dto.request.DonggeulPostRequest;
import com.nemo.dong_geul_be.board.domain.dto.response.CommentResponse;
import com.nemo.dong_geul_be.board.domain.dto.response.PostDTO;
import com.nemo.dong_geul_be.board.domain.dto.response.PostDetailResponse;
import com.nemo.dong_geul_be.board.domain.dto.response.PostDetailIMGResponse;
import com.nemo.dong_geul_be.board.domain.entity.Comment;
import com.nemo.dong_geul_be.board.domain.entity.Post;
import com.nemo.dong_geul_be.board.repository.CommentRepository;
import com.nemo.dong_geul_be.board.repository.PostRepository;
import com.nemo.dong_geul_be.board.service.CommentService;
import com.nemo.dong_geul_be.board.service.PostService;
import com.nemo.dong_geul_be.global.response.Response;
import com.nemo.dong_geul_be.member.domain.entity.Member;
import com.nemo.dong_geul_be.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class BoardDGController { //동글동글 : 동아리 홍보
public class BoardDGController { // 동글동글 : 동아리 홍보

private final PostService postService;
private final CommentService commentService;
private final PostRepository postRepository;
private final CommentRepository commentRepository;
private final SecurityContextUtil securityContextUtil; // SecurityContextUtil 추가
private final MemberRepository memberRepository;

// 메인페이지
@GetMapping("/donggeul")
Expand All @@ -44,26 +59,113 @@ public Response<List<PostDTO>> getPostFalseExternalTruePosts() {

// 게시글 상세보기
@GetMapping("/donggeul/{postId}")
public Response<PostDetailResponse> getPostDetails(@PathVariable Long postId) {
public Response<PostDetailIMGResponse> getPostDetails(@PathVariable Long postId) {

Post post = postService.getPostById(postId);

List<String> imageUrls = postService.getImageUrlsByPostId(postId);
List<Comment> comments = commentService.getCommentsByPost(postId);

PostDetailResponse response = new PostDetailResponse(post, comments);
PostDetailIMGResponse.SimplePostDTO simplePostDTO = new PostDetailIMGResponse.SimplePostDTO(
post.getId(),
post.getTitle(),
post.getContent(),
post.getHashtag(),
post.getPostType(),
post.getCreatedAt().toString(),
post.getCommentCount(),
post.getIsExternal(),
post.getMember().getId()
);

Long postAuthorId = post.getMember().getId();

List<PostDetailIMGResponse.SimpleCommentDTO> simpleCommentDTOs = comments.stream()
.map(comment -> new PostDetailIMGResponse.SimpleCommentDTO(
comment.getId(),
comment.getContent(),
comment.getCreatedAt().toString(),
comment.getMember().getId(),
comment.getMember().getId().equals(postAuthorId)
))
.collect(Collectors.toList());

PostDetailIMGResponse response = new PostDetailIMGResponse(simplePostDTO, imageUrls, simpleCommentDTOs);

return Response.ok(response);
}

// 글 작성
@PostMapping("/donggeul/create")
public Response<Post> createDonggeulPost(@RequestBody CreatePostRequest createPostRequest) {
Post newPost = postService.createDonggeulPost(createPostRequest);
return Response.ok(newPost);
// 글 작성 (Donggeul) - 이미지 포함
@PostMapping(value = "/donggeul/create", consumes = "multipart/form-data")
public Response<PostDetailIMGResponse> createDonggeulPost(
@RequestParam("isExternal") Boolean isExternal,
@RequestParam("title") String title,
@RequestParam("content") String content,
@RequestParam("hashtag") String hashtag,
@RequestParam(value = "images", required = false) List<MultipartFile> images
) {
// SecurityContextUtil을 사용하여 현재 로그인된 사용자의 memberId를 가져오기
Long memberId = securityContextUtil.getContextMemberInfo().getMemberId();

DonggeulPostRequest donggeulPostRequest = new DonggeulPostRequest();
donggeulPostRequest.setIsExternal(isExternal);
donggeulPostRequest.setTitle(title);
donggeulPostRequest.setContent(content);
donggeulPostRequest.setHashtag(hashtag);
donggeulPostRequest.setImages(images);
donggeulPostRequest.setMemberId(memberId);

Post newPost = postService.createDonggeulPost(donggeulPostRequest);

PostDetailIMGResponse.SimplePostDTO simplePostDTO = new PostDetailIMGResponse.SimplePostDTO(
newPost.getId(),
newPost.getTitle(),
newPost.getContent(),
newPost.getHashtag(),
newPost.getPostType(),
newPost.getCreatedAt().toString(),
newPost.getCommentCount(),
newPost.getIsExternal(),
newPost.getMember().getId()
);

List<String> imageUrls = postService.getImageUrlsByPostId(newPost.getId());
List<PostDetailIMGResponse.SimpleCommentDTO> comments = new ArrayList<>();

PostDetailIMGResponse response = new PostDetailIMGResponse(simplePostDTO, imageUrls, comments);
return Response.ok(response);
}

// 댓글 작성
@PostMapping("/donggeul/{postId}/comment")
public Response<Comment> createComment(@PathVariable Long postId, @RequestBody String content) {
Comment newComment = commentService.createComment(postId, content);
return Response.ok(newComment);
}
public CommentResponse createComment(@PathVariable Long postId, @RequestBody CreateCommentRequest request) {
// SecurityContextUtil을 사용하여 현재 로그인된 사용자의 memberId를 가져오기
Long memberId = securityContextUtil.getContextMemberInfo().getMemberId();

Post post = postRepository.findById(postId)
.orElseThrow(() -> new IllegalArgumentException("Invalid post ID"));
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("Invalid member ID"));

Comment comment = Comment.builder()
.content(request.getContent())
.post(post)
.member(member)
.createdAt(LocalDateTime.now())
.build();

postService.incrementCommentCount(postId);
commentRepository.save(comment);

boolean isAuthor = member.getId().equals(post.getMember().getId());

return new CommentResponse(
comment.getId(),
postId,
member.getId(),
comment.getContent(),
comment.getCreatedAt().toString(),
isAuthor
);
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package com.nemo.dong_geul_be.board.controller;


import com.nemo.dong_geul_be.board.domain.dto.request.CreatePostRequest;
import com.nemo.dong_geul_be.board.domain.dto.request.CreateCommentRequest;
import com.nemo.dong_geul_be.board.domain.dto.request.JejalPostRequest;
import com.nemo.dong_geul_be.board.domain.dto.response.CommentResponse;
import com.nemo.dong_geul_be.board.domain.dto.response.PostDTO;
import com.nemo.dong_geul_be.board.domain.dto.response.PostDetailResponse;
import com.nemo.dong_geul_be.board.domain.entity.Comment;
import com.nemo.dong_geul_be.board.domain.entity.Post;
import com.nemo.dong_geul_be.board.repository.CommentRepository;
import com.nemo.dong_geul_be.board.repository.PostRepository;
import com.nemo.dong_geul_be.board.service.CommentService;
import com.nemo.dong_geul_be.board.service.PostService;
import com.nemo.dong_geul_be.global.response.Response;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api")
Expand All @@ -21,6 +26,8 @@ public class BoardJJController { //재잘재잘 : 자유게시판

private final PostService postService;
private final CommentService commentService;
private final PostRepository postRepository;
private final CommentRepository commentRepository;

//메인페이지
@GetMapping("/jejal") // 재잘재잘은 booelean이 1인 게시글
Expand All @@ -47,25 +54,84 @@ public Response<List<PostDTO>> getPostTrueExternalTruePosts() {
// 게시글 상세보기
@GetMapping("/jejal/{postId}")
public Response<PostDetailResponse> getPostDetails(@PathVariable Long postId) {

Post post = postService.getPostById(postId);
List<Comment> comments = commentService.getCommentsByPost(postId);

PostDetailResponse response = new PostDetailResponse(post, comments);
PostDetailResponse.SimplePostDTO postDto = new PostDetailResponse.SimplePostDTO(
post.getId(),
post.getTitle(),
post.getContent(),
post.getHashtag(),
post.getPostType(),
post.getCreatedAt().toString(),
post.getCommentCount(),
post.getIsExternal(),
post.getMember().getId() // memberId 추가
);

List<PostDetailResponse.SimpleCommentDTO> commentDtos = commentService.getCommentsByPost(postId).stream()
.map(comment -> new PostDetailResponse.SimpleCommentDTO(
comment.getId(),
comment.getContent(),
comment.getCreatedAt().toString(),
comment.getMember().getId(),
comment.getMember().getId().equals(post.getMember().getId()) // 게시글 작성자와 댓글 작성자 비교
))
.collect(Collectors.toList());

PostDetailResponse response = new PostDetailResponse(postDto, commentDtos);

return Response.ok(response);
}

// 글 작성

// 글 작성 (Jejal) - 이미지 없이
@PostMapping("/jejal/create")
public Response<Post> createJejalPost(@RequestBody CreatePostRequest createPostRequest) {
Post newPost = postService.createJejalPost(createPostRequest);
return Response.ok(newPost);
public Response<PostDetailResponse.SimplePostDTO> createJejalPost(@RequestBody JejalPostRequest jejalPostRequest) {

Post newPost = postService.createJejalPost(jejalPostRequest);

PostDetailResponse.SimplePostDTO simplePostDTO = new PostDetailResponse.SimplePostDTO(
newPost.getId(),
newPost.getTitle(),
newPost.getContent(),
newPost.getHashtag(),
newPost.getPostType(),
newPost.getCreatedAt().toString(),
newPost.getCommentCount(),
newPost.getIsExternal(),
newPost.getMember().getId() // memberId 추가
);

// 응답 반환
return Response.ok(simplePostDTO);
}

// 댓글 작성
@PostMapping("/jejal/{postId}/comment")
public Response<Comment> createComment(@PathVariable Long postId, @RequestBody String content) {
Comment newComment = commentService.createComment(postId, content);
return Response.ok(newComment);
}
public Response<CommentResponse> createComment(
@PathVariable Long postId,
@RequestBody CreateCommentRequest request) {

// 요청 객체에 postId 설정
request.setPostId(postId);

// commentService에 postId와 request를 전달
Comment newComment = commentService.createComment(postId, request);

// 게시글 작성자 ID와 댓글 작성자 ID 비교하여 isAuthor 값 설정
boolean isAuthor = newComment.getMember().getId().equals(newComment.getPost().getMember().getId());

// CommentResponseDto로 변환 후 반환
CommentResponse responseDto = new CommentResponse(
newComment.getId(),
postId,
newComment.getMember().getId(),
newComment.getContent(),
newComment.getCreatedAt().toString(),
isAuthor
);

return Response.ok(responseDto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@

@Getter
@Setter
public class CreatePostRequest {
private Boolean isExternal;
private String title;
public class CreateCommentRequest {
private Long postId;
private Long memberId;
private String content;
private String hashtag;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.nemo.dong_geul_be.board.domain.dto.request;

import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Getter
@Setter
//동글동글(이미지 o)을 위한 Request
public class DonggeulPostRequest {
private Boolean isExternal;
private String title;
private String content;
private String hashtag;
private List<MultipartFile> images;
private Long memberId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.nemo.dong_geul_be.board.domain.dto.request;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class JejalPostRequest {
private Long memberId; // memberId
private Boolean isExternal; // 외부 여부
private String title; // 제목
private String content; // 내용
private String hashtag; // 해시태그
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.nemo.dong_geul_be.board.domain.dto.response;

import lombok.Data;

@Data
public class CommentResponse {
private Long id;
private Long postId;
private Long memberId;
private String content;
private String createdAt;
private boolean isAuthor; // 게시글 작성자인지 여부 추가

public CommentResponse(Long id, Long postId, Long memberId, String content, String createdAt, boolean isAuthor) {
this.id = id;
this.postId = postId;
this.memberId = memberId;
this.content = content;
this.createdAt = createdAt;
this.isAuthor = isAuthor;
}
}
Loading