Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/#9 user profile #10

Merged
merged 19 commits into from
Jul 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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("/category/{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;
}

}
46 changes: 46 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,46 @@
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 profileUrl;
private String categoryName;

public PostDto(Long id, String title, String content, String pictureUrl, LocalDateTime createdAt, Long userId, String userName, String profileUrl, String categoryName) {
this.id = id;
this.title = title;
this.content = content;
this.pictureUrl=pictureUrl;
this.createdAt = createdAt;
this.userId = userId;
this.userName = userName;
this.profileUrl = profileUrl;
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.getUser().getProfilePictureUrl(),
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