diff --git a/src/main/java/org/battles/battles/exception/ExceptionAdvice.java b/src/main/java/org/battles/battles/exception/ExceptionAdvice.java index f3e5062..e1c3323 100644 --- a/src/main/java/org/battles/battles/exception/ExceptionAdvice.java +++ b/src/main/java/org/battles/battles/exception/ExceptionAdvice.java @@ -93,6 +93,12 @@ protected CommonResult RefreshTokenException(HttpServletRequest request, Excepti return responseService.getFailResultWithMsg("잘못된 Refresh 토큰입니다. 다시 입력해주세요."); } + + @ExceptionHandler(CSchoolNotFoundException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + protected CommonResult SchoolNotFoundException(HttpServletRequest request, Exception e) { + return responseService.getFailResultWithMsg("해당 학교가 존재하지 않거나 잘못된 학교입니다."); + } @ExceptionHandler(CCategoryExistedException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) protected CommonResult CategoryExistedException(HttpServletRequest request, Exception e) { @@ -145,5 +151,13 @@ protected CommonResult BattleExistedException(HttpServletRequest request, Except @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) protected CommonResult BattleNotFoundException(HttpServletRequest request, Exception e) { return responseService.getFailResultWithMsg("해당 경기가 존재하지 않습니다."); + + } + + @ExceptionHandler(CPostNotFoundException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + protected CommonResult PostNotFoundException(HttpServletRequest request, Exception e) { + return responseService.getFailResultWithMsg("해당 게시글이 존재하지 않습니다."); + } } diff --git a/src/main/java/org/battles/battles/exception/exception/CPostNotFoundException.java b/src/main/java/org/battles/battles/exception/exception/CPostNotFoundException.java new file mode 100644 index 0000000..750d2c5 --- /dev/null +++ b/src/main/java/org/battles/battles/exception/exception/CPostNotFoundException.java @@ -0,0 +1,16 @@ +package org.battles.battles.exception.exception; + +public class CPostNotFoundException extends RuntimeException { + + public CPostNotFoundException(String msg, Throwable t) { + super(msg, t); + } + + public CPostNotFoundException(String msg) { + super(msg); + } + + public CPostNotFoundException() { + super(); + } +} diff --git a/src/main/java/org/battles/battles/exception/exception/CSchoolNotFoundException.java b/src/main/java/org/battles/battles/exception/exception/CSchoolNotFoundException.java new file mode 100644 index 0000000..87a2e5c --- /dev/null +++ b/src/main/java/org/battles/battles/exception/exception/CSchoolNotFoundException.java @@ -0,0 +1,16 @@ +package org.battles.battles.exception.exception; + +public class CSchoolNotFoundException extends RuntimeException{ + + public CSchoolNotFoundException(String msg, Throwable t) { + super(msg, t); + } + + public CSchoolNotFoundException(String msg) { + super(msg); + } + + public CSchoolNotFoundException() { + super(); + } +} diff --git a/src/main/java/org/battles/battles/post/Dto/PostsResponseDto.java b/src/main/java/org/battles/battles/post/Dto/PostsResponseDto.java new file mode 100644 index 0000000..498a3ce --- /dev/null +++ b/src/main/java/org/battles/battles/post/Dto/PostsResponseDto.java @@ -0,0 +1,59 @@ +package org.battles.battles.post.Dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.battles.battles.battle.Battle; +import org.battles.battles.battle.category.Category; +import org.battles.battles.common.Status; +import org.battles.battles.post.Post; +import org.battles.battles.post.PostType; +import org.battles.battles.school.School; +import org.battles.battles.user.User; + +import java.time.LocalDateTime; +import java.util.Optional; + +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class PostsResponseDto { + private Long postId; + + private Long userId; + + private String nickName; + + private Long schoolId; + + private String schoolName; + + private String title; + + private String content; + + private PostType postType; + + private Status status; + + private LocalDateTime createdAt; + + private LocalDateTime modifiedAt; + + public PostsResponseDto(Post post) { + this.postId = post.getPostId(); + this.userId = post.getUser().getUserId(); + this.nickName = post.getUser().getNickName(); + this.schoolId = post.getUser().getSchool().getSchoolId(); + this.schoolName = post.getUser().getSchool().getSchoolName(); + this.title = post.getTitle(); + this.content = post.getContent(); + this.postType = post.getPostType(); + this.status = post.getStatus(); + this.createdAt = post.getCreatedAt(); + this.modifiedAt = post.getModifiedAt(); + } + +} diff --git a/src/main/java/org/battles/battles/post/Dto/PostsSaveRequestDto.java b/src/main/java/org/battles/battles/post/Dto/PostsSaveRequestDto.java new file mode 100644 index 0000000..2e7f2e2 --- /dev/null +++ b/src/main/java/org/battles/battles/post/Dto/PostsSaveRequestDto.java @@ -0,0 +1,24 @@ +package org.battles.battles.post.Dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.battles.battles.common.Status; +import org.battles.battles.post.Post; +import org.battles.battles.post.PostType; +import org.battles.battles.school.School; +import org.battles.battles.user.User; + +import java.util.Optional; + +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class PostsSaveRequestDto { + private String title; + private String content; + + +} diff --git a/src/main/java/org/battles/battles/post/Post.java b/src/main/java/org/battles/battles/post/Post.java index 12e0cdb..0f29052 100644 --- a/src/main/java/org/battles/battles/post/Post.java +++ b/src/main/java/org/battles/battles/post/Post.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import org.battles.battles.common.Status; import org.battles.battles.common.TimeStamped; +import org.battles.battles.school.School; +import org.battles.battles.user.User; import javax.persistence.*; @@ -15,20 +17,21 @@ @AllArgsConstructor @Entity @Table(name = "Post_Table") - public class Post extends TimeStamped { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long postId; - // fix me = fk mapping 필요 - @Column(nullable = false) - private Long userId; + // fix me = fk mapping 필요 + @ManyToOne + @JoinColumn(name = "userId", nullable = true) + private User user; // fix me = fk mapping 필요 - @Column(nullable = true) - private Long schoolId; + @ManyToOne + @JoinColumn(name = "schoolId", nullable = true) + private School school; @Column(nullable = false) private String title; @@ -45,9 +48,9 @@ public class Post extends TimeStamped { private Status status; @Builder - public Post(Long userId, Long schoolId, String title, String content, PostType postType, Status status) { - this.userId = userId; - this.schoolId = schoolId; + public Post(User user, School school, String title, String content, PostType postType, Status status) { + this.user = user; + this.school = school; this.title = title; this.content = content; this.postType = postType; diff --git a/src/main/java/org/battles/battles/post/PostController.java b/src/main/java/org/battles/battles/post/PostController.java index 0c42f42..d4f6e60 100644 --- a/src/main/java/org/battles/battles/post/PostController.java +++ b/src/main/java/org/battles/battles/post/PostController.java @@ -1,4 +1,79 @@ package org.battles.battles.post; -public class PostController { +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.battles.battles.post.Dto.PostsSaveRequestDto; +import org.battles.battles.response.CommonResult; +import org.battles.battles.response.ResponseService; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; +import org.springframework.security.core.Authentication; + +@Api(tags = {"6. 게시판 컨트롤러"}) +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/post") +@Slf4j +public class PostController{ + private final ResponseService responseService; + + private final PostService postService; + @ApiImplicitParams({ + @ApiImplicitParam(name = "AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") + }) + @ApiOperation(value = "전체 게시글 작성", notes = "회원정보와 제목, 내용을 입력하여 전체 게시글을 작성한다.") + @PostMapping("/entire") + public CommonResult saveEntire(@RequestBody PostsSaveRequestDto requestDto) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String email = authentication.getName(); + + return responseService.getSingleResult(postService.saveEntire(email, requestDto)); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") + }) + @ApiOperation(value = "학교 게시글 작성", notes = "회원정보와 제목, 내용을 입력하여 학교 게시글을 작성한다.") + @PostMapping("/{schoolId}") + public CommonResult saveSchool(@RequestBody PostsSaveRequestDto requestDto, @PathVariable Long schoolId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String email = authentication.getName(); + + return responseService.getSingleResult(postService.saveSchool(email, requestDto, schoolId)); +} + @ApiOperation(value = "게시글 단건 조회", notes = "게시글 단건을 조회한다.") + @GetMapping("/{postId}") + public CommonResult getPostById(@PathVariable Long postId) { + + return responseService.getSingleResult(postService.getPostById(postId)); + } + + + + @ApiOperation(value = "전체 게시글 조회", notes = "전체 게시글을 조회한다.") + @GetMapping("/entire") + public CommonResult getEntirePosts() { + + return responseService.getListResult(postService.getPostAllEntire()); + } + + @ApiOperation(value = "학교별 게시글 조회", notes = "학교 게시글을 조회한다.") + @GetMapping("/school/{schoolId}") + public CommonResult getSchoolPosts(@PathVariable Long schoolId) { + + return responseService.getListResult(postService.getPostAllSchool(schoolId)); + } + + +@ApiOperation(value = "모든 게시글 조회", notes = "모든 게시글을 조회한다.") +@GetMapping("/all") +public CommonResult getAllPosts() { + + return responseService.getListResult(postService.getPostAll()); +} + } diff --git a/src/main/java/org/battles/battles/post/PostRepository.java b/src/main/java/org/battles/battles/post/PostRepository.java index 2a426dc..e2f73bd 100644 --- a/src/main/java/org/battles/battles/post/PostRepository.java +++ b/src/main/java/org/battles/battles/post/PostRepository.java @@ -2,5 +2,10 @@ import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface PostRepository extends JpaRepository { + + List findAllByPostType(PostType postType); + } diff --git a/src/main/java/org/battles/battles/post/PostService.java b/src/main/java/org/battles/battles/post/PostService.java index 647a00f..6b8ad9f 100644 --- a/src/main/java/org/battles/battles/post/PostService.java +++ b/src/main/java/org/battles/battles/post/PostService.java @@ -1,5 +1,121 @@ package org.battles.battles.post; +import lombok.RequiredArgsConstructor; +import org.battles.battles.common.Status; +import org.battles.battles.exception.exception.CPostNotFoundException; +import org.battles.battles.exception.exception.CSchoolNotFoundException; +import org.battles.battles.exception.exception.CUserNotFoundException; +import org.battles.battles.post.Dto.PostsResponseDto; +import org.battles.battles.post.Dto.PostsSaveRequestDto; +import org.battles.battles.school.School; +import org.battles.battles.school.SchoolRepository; +import org.battles.battles.user.User; +import org.battles.battles.user.UserService; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.transaction.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor public class PostService { + private final PostRepository postRepository; + + private final UserService userService; + + @Transactional + public PostsResponseDto saveEntire(String email, PostsSaveRequestDto requestDto) { + + Optional user = userService.getUserByEmail(email); + if(user.isEmpty()) { + throw new CUserNotFoundException(); + } + + Post post = Post.builder() + .title(requestDto.getTitle()) + .content(requestDto.getContent()) + .status(Status.ACTIVE) + .postType(PostType.ENTIRE) + .user(user.get()) + .school(user.get().getSchool()) + .build(); + + postRepository.save(post); + + return new PostsResponseDto(post); + } + + @Transactional + public PostsResponseDto saveSchool(String email, PostsSaveRequestDto requestDto, Long schoolId) { + Optional user = userService.getUserByEmail(email); + + if(user.isEmpty()) { + throw new CUserNotFoundException(); + } + + Post post = Post.builder() + .title(requestDto.getTitle()) + .content(requestDto.getContent()) + .status(Status.ACTIVE) + .postType(PostType.SCHOOL) + .user(user.get()) + .school(user.get().getSchool()) + .build(); + + postRepository.save(post); + + return new PostsResponseDto(post); + } + + @Transactional + public PostsResponseDto getPostById(Long postId) { + Optional post = postRepository.findById(postId); + + if(post.isEmpty()) { + throw new CPostNotFoundException(); + } + + System.out.println(new PostsResponseDto(post.get())); + return new PostsResponseDto(post.get()); + } + + @Transactional + public List getPostAllEntire() { + + List posts = postRepository.findAllByPostType(PostType.ENTIRE); + + List postsResponseDtos = new ArrayList<>(); + + for (int i = 0; i < posts.size(); i++) { + postsResponseDtos.add(new PostsResponseDto(posts.get(i))); + } + return postsResponseDtos; + } + @Transactional + public List getPostAllSchool(Long schoolId) { + List posts = postRepository.findAllByPostType(PostType.SCHOOL); + + List postsResponseDtos = new ArrayList<>(); + + for (int i = 0; i < posts.size(); i++) { + postsResponseDtos.add(new PostsResponseDto(posts.get(i))); + } + return postsResponseDtos; + } + + @Transactional + public List getPostAll() { + List posts = postRepository.findAll(); + + List postsResponseDtos = new ArrayList<>(); + + for (int i = 0; i < posts.size(); i++) { + postsResponseDtos.add(new PostsResponseDto(posts.get(i))); + } + return postsResponseDtos; + } } diff --git a/src/main/java/org/battles/battles/school/School.java b/src/main/java/org/battles/battles/school/School.java index a1fe554..41122b2 100644 --- a/src/main/java/org/battles/battles/school/School.java +++ b/src/main/java/org/battles/battles/school/School.java @@ -1,17 +1,17 @@ package org.battles.battles.school; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.battles.battles.common.TimeStamped; +import org.battles.battles.post.Post; + +import java.util.ArrayList; +import java.util.List; @Getter @Setter @@ -32,4 +32,5 @@ public class School extends TimeStamped { @Column(nullable = true) private String schoolDomainName; + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4703eb3..dd20fad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,3 +3,8 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true spring.profiles.include=aws + +spring.h2.console.enabled=true +spring.datasource.url=jdbc:h2:mem:testdb + +spring.jpa.show-sql=true \ No newline at end of file