Skip to content

Commit

Permalink
Merge pull request #16 from jorbush/post
Browse files Browse the repository at this point in the history
Implementing `Post` resources
  • Loading branch information
jorbush authored Sep 28, 2024
2 parents c6a194e + 3e6c9cb commit acd6a85
Show file tree
Hide file tree
Showing 15 changed files with 684 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.postrify.postrifybackend.controller;

import com.postrify.postrifybackend.model.JwtResponse;
import com.postrify.postrifybackend.model.LoginRequest;
import com.postrify.postrifybackend.model.MessageResponse;
import com.postrify.postrifybackend.model.SignUpRequest;
import com.postrify.postrifybackend.dto.JwtResponse;
import com.postrify.postrifybackend.dto.LoginRequest;
import com.postrify.postrifybackend.dto.MessageResponse;
import com.postrify.postrifybackend.dto.SignUpRequest;
import com.postrify.postrifybackend.model.User;
import com.postrify.postrifybackend.security.JwtTokenProvider;
import com.postrify.postrifybackend.service.UserService;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.postrify.postrifybackend.controller;

import com.postrify.postrifybackend.dto.PostRequest;
import com.postrify.postrifybackend.dto.PostResponseDTO;
import com.postrify.postrifybackend.model.Post;
import com.postrify.postrifybackend.model.User;
import com.postrify.postrifybackend.service.PostService;
import com.postrify.postrifybackend.service.UserService;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

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

@Autowired private PostService postService;

@Autowired private UserService userService;

@GetMapping
public List<PostResponseDTO> getAllPosts() {
return postService.getAllPosts();
}

@GetMapping("/{id}")
public ResponseEntity<PostResponseDTO> getPostById(@PathVariable final Long id) {
Optional<PostResponseDTO> post = postService.getPostById(id);
return post.map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());
}

@GetMapping("/user/{userId}")
public List<PostResponseDTO> getPostsByUser(@PathVariable final Long userId) {
return postService.getPostsByUser(userId);
}

@PostMapping
public ResponseEntity<PostResponseDTO> createPost(
@RequestBody final PostRequest postRequest, final Authentication authentication) {
String username = authentication.getName();
User user = userService.findByUsername(username);

Post post = new Post();
post.setTitle(postRequest.getTitle());
post.setContent(postRequest.getContent());
post.setUser(user);

PostResponseDTO createdPost = postService.createPost(post);
return ResponseEntity.ok(createdPost);
}

@PutMapping("/{id}")
public ResponseEntity<PostResponseDTO> updatePost(
@PathVariable final Long id,
@RequestBody final PostRequest postRequest,
final Authentication authentication) {
String username = authentication.getName();
User user = userService.findByUsername(username);

Post postDetails = new Post();
postDetails.setTitle(postRequest.getTitle());
postDetails.setContent(postRequest.getContent());

PostResponseDTO updatedPost = postService.updatePost(id, postDetails, user);
return ResponseEntity.ok(updatedPost);
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deletePost(
@PathVariable final Long id, final Authentication authentication) {
String username = authentication.getName();
User user = userService.findByUsername(username);
postService.deletePost(id, user);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.postrify.postrifybackend.model;
package com.postrify.postrifybackend.dto;

public class JwtResponse {
private String token;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.postrify.postrifybackend.model;
package com.postrify.postrifybackend.dto;

import javax.validation.constraints.NotBlank;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.postrify.postrifybackend.model;
package com.postrify.postrifybackend.dto;

public class MessageResponse {
private String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.postrify.postrifybackend.dto;

public class PostRequest {
private String title;
private String content;

public String getTitle() {
return title;
}

public void setTitle(final String title) {
this.title = title;
}

public String getContent() {
return content;
}

public void setContent(final String content) {
this.content = content;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.postrify.postrifybackend.dto;

import java.time.LocalDateTime;

public class PostResponseDTO {
private Long id;
private String title;
private String content;
private UserDTO user;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

public PostResponseDTO(
final Long id,
final String title,
final String content,
final UserDTO user,
final LocalDateTime createdAt,
final LocalDateTime updatedAt) {
this.id = id;
this.title = title;
this.content = content;
this.user = user;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}

public Long getId() {
return id;
}

public String getTitle() {
return title;
}

public String getContent() {
return content;
}

public UserDTO getUser() {
return user;
}

public LocalDateTime getCreatedAt() {
return createdAt;
}

public LocalDateTime getUpdatedAt() {
return updatedAt;
}

public void setId(final Long id) {
this.id = id;
}

public void setTitle(final String title) {
this.title = title;
}

public void setContent(final String content) {
this.content = content;
}

public void setUser(final UserDTO user) {
this.user = user;
}

public void setCreatedAt(final LocalDateTime createdAt) {
this.createdAt = createdAt;
}

public void setUpdatedAt(final LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.postrify.postrifybackend.model;
package com.postrify.postrifybackend.dto;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.postrify.postrifybackend.dto;

public class UserDTO {
private Long id;
private String username;
private String email;

public UserDTO(final Long id, final String username, final String email) {
this.id = id;
this.username = username;
this.email = email;
}

public Long getId() {
return id;
}

public String getUsername() {
return username;
}

public String getEmail() {
return email;
}

public void setId(final Long id) {
this.id = id;
}

public void setUsername(final String username) {
this.username = username;
}

public void setEmail(final String email) {
this.email = email;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.postrify.postrifybackend.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@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;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
@JsonIgnore
private User user;

@Column(nullable = false)
private LocalDateTime createdAt;

@Column(nullable = false)
private LocalDateTime updatedAt;

public Post() {}

public Post(final String title, final String content, final User user) {
this.title = title;
this.content = content;
this.user = user;
}

public Long getId() {
return id;
}

public String getTitle() {
return title;
}

public String getContent() {
return content;
}

public User getUser() {
return user;
}

public LocalDateTime getCreatedAt() {
return createdAt;
}

public LocalDateTime getUpdatedAt() {
return updatedAt;
}

public void setTitle(final String title) {
this.title = title;
}

public void setContent(final String content) {
this.content = content;
}

public void setUser(final User user) {
this.user = user;
}

@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
}

@PreUpdate
protected void onUpdate() {
this.updatedAt = LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.postrify.postrifybackend.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import java.util.List;

@Entity
@Table(name = "users")
Expand All @@ -18,6 +20,10 @@ public class User {
@Column(nullable = false, unique = true)
private String email;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnore
private List<Post> posts;

public User() {}

public User(final String username, final String email, final String password) {
Expand All @@ -26,6 +32,10 @@ public User(final String username, final String email, final String password) {
this.password = password;
}

public Long getId() {
return id;
}

public String getUsername() {
return username;
}
Expand All @@ -41,4 +51,12 @@ public void setPassword(final String password) {
public String getEmail() {
return email;
}

public List<Post> getPosts() {
return posts;
}

public void setPosts(final List<Post> posts) {
this.posts = posts;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.postrify.postrifybackend.repository;

import com.postrify.postrifybackend.model.Post;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByUserId(Long userId);
}
Loading

0 comments on commit acd6a85

Please sign in to comment.