Skip to content

Commit

Permalink
Merge pull request #6 from Likelion-YeungNam-Univ/feat/#5-community-post
Browse files Browse the repository at this point in the history
Feat/#5 community post
  • Loading branch information
jjjjjinseo authored Jul 22, 2024
2 parents 4221ddb + 69c2c35 commit c44415c
Show file tree
Hide file tree
Showing 16 changed files with 597 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ out/

### VS Code ###
.vscode/

src/main/resources/application.yml
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ dependencies {
implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-orgjson', version: '0.11.2'
implementation group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '9.37.2'

//s3
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.beginnerfitbe.category.domain;

import com.example.beginnerfitbe.post.domain.Post;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Entity
@Getter
@NoArgsConstructor
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true)
private String categoryName;

@OneToMany(mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JsonIgnore
private List<Post> posts;

@Builder
public Category(String categoryName) {
this.categoryName = categoryName;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.beginnerfitbe.category.repository;

import com.example.beginnerfitbe.category.domain.Category;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {
Optional<Category> findByCategoryName (String categoryName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.beginnerfitbe.category.service;

import com.example.beginnerfitbe.category.domain.Category;
import com.example.beginnerfitbe.category.repository.CategoryRepository;
import com.example.beginnerfitbe.post.domain.Post;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
@RequiredArgsConstructor
public class CategoryService {

private final CategoryRepository categoryRepository;
@PostConstruct
public void initCategories() {
List<String> categoryNames = Arrays.asList("자유게시판", "정보공유");

categoryNames.forEach(categoryName -> {
if (categoryRepository.findByCategoryName(categoryName).isEmpty()) {
categoryRepository.save(new Category(categoryName));
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.example.beginnerfitbe.post.controller;

import com.example.beginnerfitbe.error.StateResponse;
import com.example.beginnerfitbe.jwt.util.JwtUtil;
import com.example.beginnerfitbe.post.dto.PostCreateDto;
import com.example.beginnerfitbe.post.dto.PostUpdateDto;
import com.example.beginnerfitbe.post.service.PostService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;


@RestController
@RequiredArgsConstructor
@RequestMapping("/posts")
public class PostController {

private final PostService postService;
private final JwtUtil jwtUtil;

@GetMapping("")
@Operation(summary = "게시글 조회 메서드", description = "전체 게시글을 조회합니다.")
public ResponseEntity<?> list() {
return ResponseEntity.ok(postService.list());
}

@GetMapping("/{postId}")
@Operation(summary = "게시글 상세 조회 메서드", description = "게시글 상세 정보를 조회합니다.")
public ResponseEntity<?> read(@PathVariable Long postId) {
return ResponseEntity.ok(postService.read(postId));
}
@GetMapping("/me")
@Operation(summary = "사용자 게시글 조회 메소드", description = "사용자가 마이페이지에서 자신이 등록한 글을 조회합니다.")
public ResponseEntity<?> me(HttpServletRequest request) {
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return ResponseEntity.ok(postService.me(userId));
}

@GetMapping("/categories/{categoryName}")
@Operation(summary = "카테고리 별 게시글 조회 메소드", description = "카테고리 이름을 통해 카테고리 별로 게시글을 조회합니다.")
public ResponseEntity<?> getPostsByCategoryName(@PathVariable String categoryName) {
return ResponseEntity.ok(postService.getPostsByCategoryName(categoryName));
}

@PostMapping("")
@Operation(summary = "게시글 생성 메서드", description = "제목/내용/카테고리이름/사진(선택)을 입력받아 게시글을 생성합니다.")
public ResponseEntity<?> create(HttpServletRequest request, @RequestPart("createDto") PostCreateDto createDto, @RequestPart(value = "postPicture", required = false) MultipartFile postPicture){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return postService.create(userId, createDto, postPicture);
}
@PutMapping("/{postId}")
@Operation(summary = "사용자 글 수정 메서드", description = "사용자가 자신이 작성한 글을 수정합니다.")
ResponseEntity<StateResponse> update(HttpServletRequest request, @PathVariable Long postId, @RequestPart("updateDto") PostUpdateDto updateDto, @RequestPart(value = "postPicture", required = false) MultipartFile postPicture){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return postService.update(postId, userId, updateDto ,postPicture);
}
@DeleteMapping("/{postId}")
@Operation(summary = "게시글 삭제 메서드", description = "사용자가 커뮤니티 글을 삭제하기 위한 메서드입니다.")
ResponseEntity<StateResponse> delete(HttpServletRequest request, @PathVariable Long postId){
Long userId = jwtUtil.getUserId(jwtUtil.resolveToken(request).substring(7));
return postService.delete(postId, userId);
}

}
60 changes: 60 additions & 0 deletions src/main/java/com/example/beginnerfitbe/post/domain/Post.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.example.beginnerfitbe.post.domain;

import com.example.beginnerfitbe.category.domain.Category;
import com.example.beginnerfitbe.user.domain.User;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;

import java.time.LocalDateTime;

@Entity
@Getter
@NoArgsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String title;

@Column(nullable = false)
private String content;

@Column
private String pictureUrl;

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne
@JoinColumn(name = "category_id", nullable = false)
private Category category;

@CreatedDate
@Column(nullable = false)
private LocalDateTime createdAt;

@Builder
public Post(String title, String content, String pictureUrl, LocalDateTime createdAt, User user, Category category) {
this.title = title;
this.content = content;
this.pictureUrl = pictureUrl;
this.createdAt = createdAt;
this.category = category;
this.user = user;
}

public void update(String title, String content, Category category) {
this.title=title;
this.content = content;
this.category= category;
}
public void updatePicture(String pictureUrl) {
this.pictureUrl = pictureUrl;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.beginnerfitbe.post.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
public class PostCreateDto {
private String title;
private String content;
private String categoryName;

@Builder
public PostCreateDto(String title, String content, String categoryName) {
this.title = title;
this.content = content;
this.categoryName = categoryName;
}

}
43 changes: 43 additions & 0 deletions src/main/java/com/example/beginnerfitbe/post/dto/PostDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.example.beginnerfitbe.post.dto;

import com.example.beginnerfitbe.post.domain.Post;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class PostDto {
private Long id;
private String title;
private String content;
private String pictureUrl;
private LocalDateTime createdAt;

private Long userId;
private String userName;
private String categoryName;

public PostDto(Long id, String title, String content, String pictureUrl, LocalDateTime createdAt, Long userId, String userName, String categoryName) {
this.id = id;
this.title = title;
this.content = content;
this.pictureUrl=pictureUrl;
this.createdAt = createdAt;
this.userId = userId;
this.userName = userName;
this.categoryName = categoryName;
}

public static PostDto fromEntity(Post post) {
return new PostDto(
post.getId(),
post.getTitle(),
post.getContent(),
post.getPictureUrl(),
post.getCreatedAt(),
post.getUser().getId(),
post.getUser().getName(),
post.getCategory().getCategoryName()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.beginnerfitbe.post.dto;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class PostUpdateDto {
private String title;
private String content;
private String categoryName;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.beginnerfitbe.post.repository;

import com.example.beginnerfitbe.category.domain.Category;
import com.example.beginnerfitbe.post.domain.Post;
import com.example.beginnerfitbe.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findAllByUser(User user);
List<Post> findPostsByCategory(Category category);
}
Loading

0 comments on commit c44415c

Please sign in to comment.