Skip to content

Commit 02a80ff

Browse files
Ramesh FadatareRamesh Fadatare
Ramesh Fadatare
authored and
Ramesh Fadatare
committed
spring boot blog app
1 parent d507704 commit 02a80ff

17 files changed

+283
-9
lines changed

src/main/java/com/springboot/blog/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
5555
.authorizeHttpRequests((authorize) ->
5656
//authorize.anyRequest().authenticated()
5757
authorize.requestMatchers(HttpMethod.GET, "/api/**").permitAll()
58+
//.requestMatchers(HttpMethod.GET, "/api/categories/**").permitAll()
5859
.requestMatchers("/api/auth/**").permitAll()
5960
.anyRequest().authenticated()
6061

src/main/java/com/springboot/blog/controller/AuthController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ public ResponseEntity<String> register(@RequestBody RegisterDto registerDto){
3838
String response = authService.register(registerDto);
3939
return new ResponseEntity<>(response, HttpStatus.CREATED);
4040
}
41-
}
41+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.springboot.blog.controller;
2+
3+
import com.springboot.blog.entity.Category;
4+
import com.springboot.blog.payload.CategoryDto;
5+
import com.springboot.blog.service.CategoryService;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.security.access.prepost.PreAuthorize;
9+
import org.springframework.web.bind.annotation.*;
10+
11+
import java.util.List;
12+
13+
@RestController
14+
@RequestMapping("/api/v1/categories")
15+
public class CategoryController {
16+
17+
private CategoryService categoryService;
18+
19+
public CategoryController(CategoryService categoryService) {
20+
this.categoryService = categoryService;
21+
}
22+
23+
// Build Add Category REST API
24+
@PostMapping
25+
@PreAuthorize("hasRole('ADMIN')")
26+
public ResponseEntity<CategoryDto> addCategory(@RequestBody CategoryDto categoryDto){
27+
CategoryDto savedCategory = categoryService.addCategory(categoryDto);
28+
return new ResponseEntity<>(savedCategory, HttpStatus.CREATED);
29+
}
30+
31+
// Build Get Category REST API
32+
@GetMapping("{id}")
33+
public ResponseEntity<CategoryDto> getCategory(@PathVariable("id") Long categoryId){
34+
CategoryDto categoryDto = categoryService.getCategory(categoryId);
35+
return ResponseEntity.ok(categoryDto);
36+
}
37+
38+
// Build Get All Categories REST API
39+
@GetMapping
40+
public ResponseEntity<List<CategoryDto>> getCategories(){
41+
return ResponseEntity.ok(categoryService.getAllCategories());
42+
}
43+
44+
// Build Update Category REST API
45+
@PreAuthorize("hasRole('ADMIN')")
46+
@PutMapping("{id}")
47+
public ResponseEntity<CategoryDto> updateCategory(@RequestBody CategoryDto categoryDto,
48+
@PathVariable("id") Long categoryId){
49+
return ResponseEntity.ok(categoryService.updateCategory(categoryDto, categoryId));
50+
}
51+
52+
// Build Delete Category REST API
53+
@PreAuthorize("hasRole('ADMIN')")
54+
@DeleteMapping("{id}")
55+
public ResponseEntity<String> deleteCategory(@PathVariable("id") Long categoryId){
56+
categoryService.deleteCategory(categoryId);
57+
return ResponseEntity.ok("Category deleted successfully!.");
58+
}
59+
}

src/main/java/com/springboot/blog/controller/PostController.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.web.bind.annotation.*;
1111

1212
import jakarta.validation.Valid;
13+
import java.util.List;
1314

1415
@RestController
1516
@RequestMapping()
@@ -21,8 +22,8 @@ public PostController(PostService postService) {
2122
this.postService = postService;
2223
}
2324

24-
@PreAuthorize("hasRole('ADMIN')")
2525
// create blog post rest api
26+
@PreAuthorize("hasRole('ADMIN')")
2627
@PostMapping("/api/v1/posts")
2728
public ResponseEntity<PostDto> createPost(@Valid @RequestBody PostDto postDto){
2829
return new ResponseEntity<>(postService.createPost(postDto), HttpStatus.CREATED);
@@ -41,27 +42,35 @@ public PostResponse getAllPosts(
4142

4243
// get post by id
4344
@GetMapping(value = "/api/v1/posts/{id}")
44-
public ResponseEntity<PostDto> getPostByIdV1(@PathVariable(name = "id") long id){
45+
public ResponseEntity<PostDto> getPostById(@PathVariable(name = "id") long id){
4546
return ResponseEntity.ok(postService.getPostById(id));
4647
}
4748

48-
@PreAuthorize("hasRole('ADMIN')")
4949
// update post by id rest api
50+
@PreAuthorize("hasRole('ADMIN')")
5051
@PutMapping("/api/v1/posts/{id}")
5152
public ResponseEntity<PostDto> updatePost(@Valid @RequestBody PostDto postDto, @PathVariable(name = "id") long id){
5253

53-
PostDto postResponse = postService.updatePost(postDto, id);
54+
PostDto postResponse = postService.updatePost(postDto, id);
5455

55-
return new ResponseEntity<>(postResponse, HttpStatus.OK);
56+
return new ResponseEntity<>(postResponse, HttpStatus.OK);
5657
}
5758

58-
@PreAuthorize("hasRole('ADMIN')")
5959
// delete post rest api
60+
@PreAuthorize("hasRole('ADMIN')")
6061
@DeleteMapping("/api/v1/posts/{id}")
6162
public ResponseEntity<String> deletePost(@PathVariable(name = "id") long id){
6263

6364
postService.deletePostById(id);
6465

6566
return new ResponseEntity<>("Post entity deleted successfully.", HttpStatus.OK);
6667
}
68+
69+
// Build Get Posts by Category REST API
70+
// http://localhost:8080/api/posts/category/3
71+
@GetMapping("/api/v1/posts/category/{id}")
72+
public ResponseEntity<List<PostDto>> getPostsByCategory(@PathVariable("id") Long categoryId){
73+
List<PostDto> postDtos = postService.getPostsByCategory(categoryId);
74+
return ResponseEntity.ok(postDtos);
75+
}
6776
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.springboot.blog.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
9+
import java.util.List;
10+
11+
@Getter
12+
@Setter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Entity
16+
@Table(name = "categories")
17+
public class Category {
18+
19+
@Id
20+
@GeneratedValue(strategy = GenerationType.IDENTITY)
21+
private Long id;
22+
private String name;
23+
private String description;
24+
25+
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
26+
private List<Post> posts;
27+
}

src/main/java/com/springboot/blog/entity/Post.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,7 @@ public class Post {
3535
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
3636
private Set<Comment> comments = new HashSet<>();
3737

38+
@ManyToOne(fetch = FetchType.LAZY)
39+
@JoinColumn(name = "category_id")
40+
private Category category;
3841
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.springboot.blog.payload;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import lombok.Setter;
7+
8+
@Getter
9+
@Setter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class CategoryDto {
13+
private Long id;
14+
private String name;
15+
private String description;
16+
}

src/main/java/com/springboot/blog/payload/PostDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ public class PostDto {
2626
@NotEmpty
2727
private String content;
2828
private Set<CommentDto> comments;
29+
30+
private Long categoryId;
2931
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.springboot.blog.repository;
2+
3+
import com.springboot.blog.entity.Category;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface CategoryRepository extends JpaRepository<Category, Long> {
7+
}

src/main/java/com/springboot/blog/repository/PostRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.springboot.blog.entity.Post;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

6+
import java.util.List;
7+
68
public interface PostRepository extends JpaRepository<Post, Long> {
79

10+
List<Post> findByCategoryId(Long categoryId);
11+
812
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.springboot.blog.service;
2+
3+
import com.springboot.blog.payload.CategoryDto;
4+
5+
import java.util.List;
6+
7+
public interface CategoryService {
8+
CategoryDto addCategory(CategoryDto categoryDto);
9+
10+
CategoryDto getCategory(Long categoryId);
11+
12+
List<CategoryDto> getAllCategories();
13+
14+
CategoryDto updateCategory(CategoryDto categoryDto, Long categoryId);
15+
16+
void deleteCategory(Long categoryId);
17+
}

src/main/java/com/springboot/blog/service/PostService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public interface PostService {
1515
PostDto updatePost(PostDto postDto, long id);
1616

1717
void deletePostById(long id);
18+
19+
List<PostDto> getPostsByCategory(Long categoryId);
1820
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.springboot.blog.service.impl;
2+
3+
import com.springboot.blog.entity.Category;
4+
import com.springboot.blog.exception.ResourceNotFoundException;
5+
import com.springboot.blog.payload.CategoryDto;
6+
import com.springboot.blog.repository.CategoryRepository;
7+
import com.springboot.blog.service.CategoryService;
8+
import org.modelmapper.ModelMapper;
9+
import org.springframework.stereotype.Service;
10+
11+
import java.util.List;
12+
import java.util.stream.Collectors;
13+
14+
@Service
15+
public class CategoryServiceImpl implements CategoryService {
16+
17+
private CategoryRepository categoryRepository;
18+
private ModelMapper modelMapper;
19+
20+
public CategoryServiceImpl(CategoryRepository categoryRepository, ModelMapper modelMapper) {
21+
this.categoryRepository = categoryRepository;
22+
this.modelMapper = modelMapper;
23+
}
24+
25+
@Override
26+
public CategoryDto addCategory(CategoryDto categoryDto) {
27+
Category category = modelMapper.map(categoryDto, Category.class);
28+
Category savedCategory = categoryRepository.save(category);
29+
return modelMapper.map(savedCategory, CategoryDto.class);
30+
}
31+
32+
@Override
33+
public CategoryDto getCategory(Long categoryId) {
34+
35+
Category category = categoryRepository.findById(categoryId)
36+
.orElseThrow(() -> new ResourceNotFoundException("Category", "id", categoryId));
37+
38+
return modelMapper.map(category, CategoryDto.class);
39+
}
40+
41+
@Override
42+
public List<CategoryDto> getAllCategories() {
43+
44+
List<Category> categories = categoryRepository.findAll();
45+
46+
return categories.stream().map((category) -> modelMapper.map(category, CategoryDto.class))
47+
.collect(Collectors.toList());
48+
}
49+
50+
@Override
51+
public CategoryDto updateCategory(CategoryDto categoryDto, Long categoryId) {
52+
53+
Category category = categoryRepository.findById(categoryId)
54+
.orElseThrow(() -> new ResourceNotFoundException("Category", "id", categoryId));
55+
56+
category.setName(categoryDto.getName());
57+
category.setDescription(categoryDto.getDescription());
58+
category.setId(categoryId);
59+
60+
Category updatedCategory = categoryRepository.save(category);
61+
62+
return modelMapper.map(updatedCategory, CategoryDto.class);
63+
}
64+
65+
@Override
66+
public void deleteCategory(Long categoryId) {
67+
68+
Category category = categoryRepository.findById(categoryId)
69+
.orElseThrow(() -> new ResourceNotFoundException("Category", "id", categoryId));
70+
71+
categoryRepository.delete(category);
72+
}
73+
}

src/main/java/com/springboot/blog/service/impl/PostServiceImpl.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.springboot.blog.service.impl;
22

3+
import com.springboot.blog.entity.Category;
34
import com.springboot.blog.entity.Post;
45
import com.springboot.blog.exception.ResourceNotFoundException;
56
import com.springboot.blog.payload.PostDto;
67
import com.springboot.blog.payload.PostResponse;
8+
import com.springboot.blog.repository.CategoryRepository;
79
import com.springboot.blog.repository.PostRepository;
810
import com.springboot.blog.service.PostService;
911
import org.modelmapper.ModelMapper;
@@ -23,16 +25,24 @@ public class PostServiceImpl implements PostService {
2325

2426
private ModelMapper mapper;
2527

26-
public PostServiceImpl(PostRepository postRepository, ModelMapper mapper) {
28+
private CategoryRepository categoryRepository;
29+
30+
public PostServiceImpl(PostRepository postRepository, ModelMapper mapper,
31+
CategoryRepository categoryRepository) {
2732
this.postRepository = postRepository;
2833
this.mapper = mapper;
34+
this.categoryRepository = categoryRepository;
2935
}
3036

3137
@Override
3238
public PostDto createPost(PostDto postDto) {
3339

40+
Category category = categoryRepository.findById(postDto.getCategoryId())
41+
.orElseThrow(() -> new ResourceNotFoundException("Category", "id", postDto.getCategoryId()));
42+
3443
// convert DTO to entity
3544
Post post = mapToEntity(postDto);
45+
post.setCategory(category);
3646
Post newPost = postRepository.save(post);
3747

3848
// convert entity to DTO
@@ -78,10 +88,13 @@ public PostDto updatePost(PostDto postDto, long id) {
7888
// get post by id from the database
7989
Post post = postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Post", "id", id));
8090

91+
Category category = categoryRepository.findById(postDto.getCategoryId())
92+
.orElseThrow(() -> new ResourceNotFoundException("Category", "id", postDto.getCategoryId()));
93+
8194
post.setTitle(postDto.getTitle());
8295
post.setDescription(postDto.getDescription());
8396
post.setContent(postDto.getContent());
84-
97+
post.setCategory(category);
8598
Post updatedPost = postRepository.save(post);
8699
return mapToDTO(updatedPost);
87100
}
@@ -93,6 +106,18 @@ public void deletePostById(long id) {
93106
postRepository.delete(post);
94107
}
95108

109+
@Override
110+
public List<PostDto> getPostsByCategory(Long categoryId) {
111+
112+
Category category = categoryRepository.findById(categoryId)
113+
.orElseThrow(() -> new ResourceNotFoundException("Category", "id", categoryId));
114+
115+
List<Post> posts = postRepository.findByCategoryId(categoryId);
116+
117+
return posts.stream().map((post) -> mapToDTO(post))
118+
.collect(Collectors.toList());
119+
}
120+
96121
// convert Entity into DTO
97122
private PostDto mapToDTO(Post post){
98123
PostDto postDto = mapper.map(post, PostDto.class);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
spring.datasource.url = jdbc:mysql://localhost:3306/myblog?useSSL=false&serverTimezone=UTC
2+
spring.datasource.username = root
3+
spring.datasource.password = root
4+
5+
# hibernate properties
6+
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
7+
8+
# Hibernate ddl auto (create, create-drop, validate, update)
9+
spring.jpa.hibernate.ddl-auto = update

0 commit comments

Comments
 (0)