Skip to content

Commit

Permalink
#25 feat: content 생성
Browse files Browse the repository at this point in the history
  • Loading branch information
wjdwlghks committed Apr 25, 2024
1 parent 53ee22b commit 593b454
Show file tree
Hide file tree
Showing 11 changed files with 208 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.project.capstone.book.domain;

import com.project.capstone.club.domain.Club;
import com.project.capstone.content.domain.Content;
import com.project.capstone.quiz.domain.Quiz;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -32,4 +34,10 @@ public class Book {

@OneToMany(mappedBy = "book")
private List<Club> clubs = new ArrayList<>();

@OneToMany(mappedBy = "book")
private List<Content> contents = new ArrayList<>();

@OneToMany(mappedBy = "book")
private List<Quiz> quizzes = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.project.capstone.book.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface BookRepository extends JpaRepository<Book, Long> {
Optional<Book> findBookById(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.book.exception;

import com.project.capstone.common.exception.BaseException;
import com.project.capstone.common.exception.ExceptionType;

public class BookException extends BaseException {
public BookException(ExceptionType exceptionType) {
super(exceptionType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.project.capstone.book.exception;

import com.project.capstone.common.exception.ExceptionType;
import lombok.AllArgsConstructor;
import org.springframework.http.HttpStatus;

import static org.springframework.http.HttpStatus.NOT_FOUND;

@AllArgsConstructor
public enum BookExceptionType implements ExceptionType {

BOOK_NOT_FOUND(NOT_FOUND, 801, "해당 책을 찾을 수 없습니다.")
;

private final HttpStatus status;
private final int exceptionCode;
private final String message;

@Override
public HttpStatus httpStatus() {
return status;
}

@Override
public int exceptionCode() {
return exceptionCode;
}

@Override
public String message() {
return message;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public enum PublicStatus {
private final String description;


@JsonCreator
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static PublicStatus from(String status) {
for (PublicStatus publicStatus : PublicStatus.values()) {
if (publicStatus.getDescription().equals(status)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.project.capstone.content.controller;

import com.project.capstone.auth.domain.PrincipalDetails;
import com.project.capstone.content.controller.dto.ContentCreateRequest;
import com.project.capstone.content.service.ContentService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/content")
public class ContentController {

private final ContentService contentService;

@PostMapping("/create")
public ResponseEntity<?> createContent(@AuthenticationPrincipal PrincipalDetails details,
@RequestBody ContentCreateRequest request,
@RequestParam Long bookId, @RequestParam(required = false) Long clubId) {
contentService.createContent(details.getUserId(), request, bookId, clubId);
return ResponseEntity.ok().body("컨텐츠 생성 완료");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.project.capstone.content.controller.dto;

import com.project.capstone.content.domain.ContentType;

public record ContentCreateRequest(
ContentType contentType,
String title,
String body
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,13 @@ public class Content {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String type;

@Enumerated(EnumType.STRING)
@Column(name = "content_type")
private ContentType type;
private String title;
private String body;
private String likes;
private int likes;

@ManyToOne
private Member member;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.project.capstone.content.domain;

import org.springframework.data.jpa.repository.JpaRepository;

public interface ContentRepository extends JpaRepository<Content, Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.project.capstone.content.domain;

import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

@AllArgsConstructor
@Getter
@Slf4j
public enum ContentType {

Review("독후감"),
Quotation("인용구"),
ShortReview("한줄평");

private final String type;

@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static ContentType from(String type) {
for (ContentType contentType : ContentType.values()) {
if (contentType.getType().equals(type)) {
return contentType;
}
}
throw new RuntimeException("잘못된 컨텐츠 타입 입니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.project.capstone.content.service;

import com.project.capstone.book.domain.Book;
import com.project.capstone.book.domain.BookRepository;
import com.project.capstone.book.exception.BookException;
import com.project.capstone.book.exception.BookExceptionType;
import com.project.capstone.club.domain.Club;
import com.project.capstone.club.domain.ClubRepository;
import com.project.capstone.club.exception.ClubException;
import com.project.capstone.club.exception.ClubExceptionType;
import com.project.capstone.content.controller.dto.ContentCreateRequest;
import com.project.capstone.content.domain.Content;
import com.project.capstone.content.domain.ContentRepository;
import com.project.capstone.member.domain.Member;
import com.project.capstone.member.domain.MemberRepository;
import com.project.capstone.member.exception.MemberException;
import com.project.capstone.member.exception.MemberExceptionType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.UUID;

import static com.project.capstone.book.exception.BookExceptionType.BOOK_NOT_FOUND;
import static com.project.capstone.club.exception.ClubExceptionType.CLUB_NOT_FOUND;
import static com.project.capstone.member.exception.MemberExceptionType.MEMBER_NOT_FOUND;

@Service
@RequiredArgsConstructor
@Slf4j
public class ContentService {

private final ContentRepository contentRepository;
private final BookRepository bookRepository;
private final ClubRepository clubRepository;
private final MemberRepository memberRepository;

public void createContent(String userId, ContentCreateRequest request, Long bookId, Long clubId) {
Member member = memberRepository.findMemberById(UUID.fromString(userId)).orElseThrow(
() -> new MemberException(MEMBER_NOT_FOUND)
);
Book book = bookRepository.findBookById(bookId).orElseThrow(
() -> new BookException(BOOK_NOT_FOUND)
);
Club club;
if (clubId == null) {
club = null;
}
else {
club = clubRepository.findClubById(clubId).orElseThrow(
() -> new ClubException(CLUB_NOT_FOUND)
);
}
Content saved = contentRepository.save(
Content.builder()
.type(request.contentType())
.title(request.title())
.body(request.body())
.likes(0)
.member(member)
.book(book)
.club(club)
.build()
);

member.getContents().add(saved);
book.getContents().add(saved);
if (club != null) {
club.getContents().add(saved);
}
}
}

0 comments on commit 593b454

Please sign in to comment.