Skip to content

Commit

Permalink
feat: 게시글 작성 api 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
kyeong-hyeok committed Oct 7, 2023
1 parent 2a92a4a commit f08c612
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
package com.kusitms.teamc.domain.article.controller;

import com.kusitms.teamc.common.dto.SliceResponseDto;
import com.kusitms.teamc.domain.article.dto.request.ArticleSaveRequestDto;
import com.kusitms.teamc.domain.article.dto.response.ArticleResponseDto;
import com.kusitms.teamc.domain.article.entity.Article;
import com.kusitms.teamc.domain.article.repository.ArticleRepository;
import com.kusitms.teamc.domain.article.service.ArticleService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@RestController
Expand All @@ -30,4 +33,11 @@ public ResponseEntity<SliceResponseDto> getArticlesByCategory(@RequestParam("sea
Slice<ArticleResponseDto> response = articleService.getArticlesByCategory(category, pageable);
return SliceResponseDto.ok(response);
}

@PostMapping(value = "", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<Void> saveArticle(@RequestPart ArticleSaveRequestDto requestDto,
@RequestPart(name = "file", required = false) MultipartFile file) {
articleService.saveArticle(requestDto, file);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.kusitms.teamc.domain.article.dto.request;

public record ArticleSaveRequestDto(String accessToken, String category, String title, String content, String image) {
}
19 changes: 11 additions & 8 deletions src/main/java/com/kusitms/teamc/domain/article/entity/Article.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
package com.kusitms.teamc.domain.article.entity;

import com.kusitms.teamc.common.entity.BaseTimeEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

Expand All @@ -25,6 +19,15 @@ public class Article extends BaseTimeEntity {
private Category category;
private String title;
private String content;
@Column(columnDefinition = "TEXT")
private String image;

@Builder
public Article(Category category, String title, String content, String image) {
this.category = category;
this.title = title;
this.content = content;
this.image = image;
}
}

Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package com.kusitms.teamc.domain.article.service;

import com.kusitms.teamc.common.s3.FileService;
import com.kusitms.teamc.domain.article.dto.request.ArticleSaveRequestDto;
import com.kusitms.teamc.domain.article.dto.response.ArticleResponseDto;
import com.kusitms.teamc.domain.article.entity.Article;
import com.kusitms.teamc.domain.article.entity.Category;
import com.kusitms.teamc.domain.article.repository.ArticleRepository;
import com.kusitms.teamc.domain.member.entity.Member;
import com.kusitms.teamc.domain.member.repository.MemberRepository;
import com.kusitms.teamc.error.ErrorCode;
import com.kusitms.teamc.error.exception.custom.BusinessException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
@Slf4j
Expand All @@ -18,11 +26,21 @@
public class ArticleService {

private final ArticleRepository articleRepository;
private final FileService fileService;
private final MemberRepository memberRepository;

@Transactional(readOnly = true)
public Slice<ArticleResponseDto> getArticlesByCategory(String search, Pageable pageable) {
Category category = Category.create(search);
Slice<Article> articles = articleRepository.findAllByCategory(category, pageable);
Slice<ArticleResponseDto> response = articles.map(a -> ArticleResponseDto.from(a));
return response;
}

public void saveArticle(ArticleSaveRequestDto requestDto, MultipartFile file) {
Category category = Category.create(requestDto.category());
Member member = memberRepository.findByAccessToken(requestDto.accessToken()).orElseThrow(() -> new BusinessException(ErrorCode.MEMBER_NOT_FOUND));
String profileImageUrl = fileService.uploadFile(file, member.getName());
articleRepository.save(new Article(category, requestDto.title(), requestDto.content(), profileImageUrl));
}
}
1 change: 1 addition & 0 deletions src/main/java/com/kusitms/teamc/error/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
@RequiredArgsConstructor
public enum ErrorCode {

MEMBER_NOT_FOUND(NOT_FOUND, "해당 회원을 찾을 수 없습니다."),
TOKEN_NOT_EXIST(NOT_FOUND, "토큰이 존재하지 않습니다."),
INVALID_FILE_UPLOAD(BAD_REQUEST, "잘못된 파일 업로드입니다."),
INVALID_CATEGORY(BAD_REQUEST, "잘못된 카테고리입니다.");
Expand Down

0 comments on commit f08c612

Please sign in to comment.