Skip to content

Commit

Permalink
Merge pull request #115 from 9oormthon-univ/feature/#114
Browse files Browse the repository at this point in the history
✨ [FEAT] 소식, 댓글 생성 API 작성
  • Loading branch information
7beunseo authored Dec 3, 2024
2 parents 0a1c5b6 + f54bf9e commit d700018
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/carely/backend/code/SuccessCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ public enum SuccessCode {
* News
*/
SUCCESS_RETRIEVE_NEWS(HttpStatus.OK,"소식을 성공적으로 조회했습니다."),
SUCCESS_CREATE_NEWS(HttpStatus.OK, "소식을 성공적으로 생성했습니다."),
SUCCESS_CREATE_NEWS_COMMENT(HttpStatus.OK, "소식 댓글을 성공적으로 생성했습니다."),

;
private final HttpStatus status;
Expand Down
32 changes: 27 additions & 5 deletions src/main/java/com/carely/backend/controller/NewsController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

import com.carely.backend.code.SuccessCode;
import com.carely.backend.controller.docs.NewsAPI;
import com.carely.backend.dto.group.GetGroupDTO;
import com.carely.backend.dto.news.CreateCommentDTO;
import com.carely.backend.dto.news.CreateNewsDTO;
import com.carely.backend.dto.news.NewsResponseDTO;
import com.carely.backend.dto.response.ResponseDTO;
import com.carely.backend.service.NewsService;
import com.carely.backend.service.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;

Expand All @@ -21,6 +21,7 @@
@RequestMapping("/news")
public class NewsController implements NewsAPI {
private final NewsService newsService;
private final UserService userService;

@GetMapping("/group/{groupId}")
public ResponseEntity<ResponseDTO> getGroupNewsList(@PathVariable("groupId") Long groupId) {
Expand All @@ -40,4 +41,25 @@ public ResponseEntity<ResponseDTO> getNewsDetail(@PathVariable("newsId") Long ne
.status(SuccessCode.SUCCESS_RETRIEVE_NEWS.getStatus().value())
.body(new ResponseDTO<>(SuccessCode.SUCCESS_RETRIEVE_NEWS, res));
}

@PostMapping("/create/news")
public ResponseEntity<ResponseDTO<CreateNewsDTO.Res>> createNews(@Valid @RequestBody CreateNewsDTO createNewsDTO) {
String kakaoId = SecurityContextHolder.getContext().getAuthentication().getName();
CreateNewsDTO.Res res = newsService.createNews(createNewsDTO, kakaoId);

return ResponseEntity
.status(SuccessCode.SUCCESS_CREATE_NEWS.getStatus().value())
.body(new ResponseDTO<>(SuccessCode.SUCCESS_CREATE_NEWS, res));
}

@PostMapping("/create/news/{newsId}/comment")
public ResponseEntity<ResponseDTO<CreateCommentDTO.Res>> createNewsComment(@PathVariable("newsId") Long newsId, @Valid @RequestBody CreateCommentDTO createNewsDTO) {
String kakaoId = SecurityContextHolder.getContext().getAuthentication().getName();
CreateCommentDTO.Res res = newsService.createComment(newsId, createNewsDTO, kakaoId);

return ResponseEntity
.status(SuccessCode.SUCCESS_CREATE_NEWS_COMMENT.getStatus().value())
.body(new ResponseDTO<>(SuccessCode.SUCCESS_CREATE_NEWS_COMMENT, res));
}

}
37 changes: 37 additions & 0 deletions src/main/java/com/carely/backend/dto/news/CreateCommentDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.carely.backend.dto.news;

import com.carely.backend.domain.News;
import com.carely.backend.domain.NewsComment;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
public class CreateCommentDTO {
@NotNull
private String content;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Res {
private Long commentId;
private String content;
private String writer;
private LocalDateTime createdAt;

public static CreateCommentDTO.Res toDTO(NewsComment news) {
return CreateCommentDTO.Res.builder()
.writer(news.getWriter().getUsername())
.content(news.getContent())
.createdAt(news.getCreatedAt())
.build();
}

}
}
42 changes: 42 additions & 0 deletions src/main/java/com/carely/backend/dto/news/CreateNewsDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.carely.backend.dto.news;

import com.carely.backend.domain.News;
import com.carely.backend.domain.enums.UserType;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
public class CreateNewsDTO {
@NotNull
private String title;

@NotNull
private String content;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Res {
private Long newsId;
private String title;
private String content;
private String writer;
private LocalDateTime createdAt;

public static Res toDTO(News news) {
return Res.builder()
.writer(news.getWriter().getUsername())
.title(news.getTitle())
.content(news.getContent())
.createdAt(news.getCreatedAt())
.build();
}

}
}
41 changes: 41 additions & 0 deletions src/main/java/com/carely/backend/service/NewsService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,21 @@
import com.carely.backend.domain.Group;
import com.carely.backend.domain.News;
import com.carely.backend.domain.NewsComment;
import com.carely.backend.domain.User;
import com.carely.backend.dto.news.CreateCommentDTO;
import com.carely.backend.dto.news.CreateNewsDTO;
import com.carely.backend.dto.news.NewsResponseDTO;
import com.carely.backend.exception.GroupNotFoundException;
import com.carely.backend.exception.NewsNotFoundException;
import com.carely.backend.repository.GroupRepository;
import com.carely.backend.repository.NewsCommentRepository;
import com.carely.backend.repository.NewsRepository;
import com.carely.backend.repository.UserRepository;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -21,6 +28,7 @@ public class NewsService {
private final NewsRepository newsRepository;
private final GroupRepository groupRepository;
private final NewsCommentRepository newsCommentRepository;
private final UserRepository userRepository;

public List<NewsResponseDTO.List> getGroupNewsList(Long groupId) {
Group group = groupRepository.findById(groupId)
Expand All @@ -40,4 +48,37 @@ public NewsResponseDTO.Detail getNewsDetail(Long newsId) {

return NewsResponseDTO.Detail.toDTO(news);
}

@Transactional
public CreateNewsDTO.Res createNews(@Valid CreateNewsDTO createNewsDTO, String kakaoId) {
User writer = userRepository.findByKakaoId(kakaoId)
.orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다."));

News news = News.builder()
.content(createNewsDTO.getContent())
.title(createNewsDTO.getTitle())
.writer(writer)
.build();

News newNews = newsRepository.save(news);
return CreateNewsDTO.Res.toDTO(newNews);
}

@Transactional
public CreateCommentDTO.Res createComment(Long newsId, @Valid CreateCommentDTO createNewsDTO, String kakaoId) {
User writer = userRepository.findByKakaoId(kakaoId)
.orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다."));

News news = newsRepository.findById(newsId)
.orElseThrow(() -> new NewsNotFoundException("소식을 찾을 수 없습니다."));

NewsComment comment = NewsComment.builder()
.content(createNewsDTO.getContent())
.writer(writer)
.news(news)
.build();

NewsComment newsComment = newsCommentRepository.save(comment);
return CreateCommentDTO.Res.toDTO(newsComment);
}
}

0 comments on commit d700018

Please sign in to comment.