From d419b4551558eeb2f75a5dece5bacc6bab379dff Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Mon, 30 Jun 2025 19:00:43 +0800 Subject: [PATCH] Add Post module --- .../com/openisle/config/SecurityConfig.java | 1 + .../openisle/controller/PostController.java | 64 +++++++++++++++++++ src/main/java/com/openisle/model/Post.java | 40 ++++++++++++ .../openisle/repository/PostRepository.java | 7 ++ .../com/openisle/service/PostService.java | 38 +++++++++++ 5 files changed, 150 insertions(+) create mode 100644 src/main/java/com/openisle/controller/PostController.java create mode 100644 src/main/java/com/openisle/model/Post.java create mode 100644 src/main/java/com/openisle/repository/PostRepository.java create mode 100644 src/main/java/com/openisle/service/PostService.java diff --git a/src/main/java/com/openisle/config/SecurityConfig.java b/src/main/java/com/openisle/config/SecurityConfig.java index 44c44fd1b..0c513a465 100644 --- a/src/main/java/com/openisle/config/SecurityConfig.java +++ b/src/main/java/com/openisle/config/SecurityConfig.java @@ -63,6 +63,7 @@ public class SecurityConfig { .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.POST, "/api/auth/**").permitAll() + .requestMatchers(HttpMethod.GET, "/api/posts/**").permitAll() .anyRequest().authenticated() ) .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); diff --git a/src/main/java/com/openisle/controller/PostController.java b/src/main/java/com/openisle/controller/PostController.java new file mode 100644 index 000000000..a15290943 --- /dev/null +++ b/src/main/java/com/openisle/controller/PostController.java @@ -0,0 +1,64 @@ +package com.openisle.controller; + +import com.openisle.model.Post; +import com.openisle.service.PostService; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/posts") +@RequiredArgsConstructor +public class PostController { + private final PostService postService; + + @PostMapping + public ResponseEntity createPost(@RequestBody PostRequest req, Authentication auth) { + Post post = postService.createPost(auth.getName(), req.getTitle(), req.getContent()); + return ResponseEntity.ok(toDto(post)); + } + + @GetMapping("/{id}") + public ResponseEntity getPost(@PathVariable Long id) { + Post post = postService.getPost(id); + return ResponseEntity.ok(toDto(post)); + } + + @GetMapping + public List listPosts() { + return postService.listPosts().stream().map(this::toDto).collect(Collectors.toList()); + } + + private PostDto toDto(Post post) { + PostDto dto = new PostDto(); + dto.setId(post.getId()); + dto.setTitle(post.getTitle()); + dto.setContent(post.getContent()); + dto.setCreatedAt(post.getCreatedAt()); + dto.setAuthor(post.getAuthor().getUsername()); + dto.setViews(post.getViews()); + return dto; + } + + @Data + private static class PostRequest { + private String title; + private String content; + } + + @Data + private static class PostDto { + private Long id; + private String title; + private String content; + private LocalDateTime createdAt; + private String author; + private long views; + } +} diff --git a/src/main/java/com/openisle/model/Post.java b/src/main/java/com/openisle/model/Post.java new file mode 100644 index 000000000..a923e44c8 --- /dev/null +++ b/src/main/java/com/openisle/model/Post.java @@ -0,0 +1,40 @@ +package com.openisle.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@Table(name = "posts") +public class Post { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "author_id") + private User author; + + @Column(nullable = false) + private long views = 0; + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/openisle/repository/PostRepository.java b/src/main/java/com/openisle/repository/PostRepository.java new file mode 100644 index 000000000..c720ec1b0 --- /dev/null +++ b/src/main/java/com/openisle/repository/PostRepository.java @@ -0,0 +1,7 @@ +package com.openisle.repository; + +import com.openisle.model.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository extends JpaRepository { +} diff --git a/src/main/java/com/openisle/service/PostService.java b/src/main/java/com/openisle/service/PostService.java new file mode 100644 index 000000000..a7dc70517 --- /dev/null +++ b/src/main/java/com/openisle/service/PostService.java @@ -0,0 +1,38 @@ +package com.openisle.service; + +import com.openisle.model.Post; +import com.openisle.model.User; +import com.openisle.repository.PostRepository; +import com.openisle.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PostService { + private final PostRepository postRepository; + private final UserRepository userRepository; + + public Post createPost(String username, String title, String content) { + User author = userRepository.findByUsername(username) + .orElseThrow(() -> new IllegalArgumentException("User not found")); + Post post = new Post(); + post.setTitle(title); + post.setContent(content); + post.setAuthor(author); + return postRepository.save(post); + } + + public Post getPost(Long id) { + Post post = postRepository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Post not found")); + post.setViews(post.getViews() + 1); + return postRepository.save(post); + } + + public List listPosts() { + return postRepository.findAll(); + } +}