From 4bfc333909ea43456d49a28c121c28ceaae93074 Mon Sep 17 00:00:00 2001 From: Rohit Date: Fri, 30 Aug 2024 22:10:03 +0530 Subject: [PATCH] feature/swagger-configuration --- .../blog/constants/EndpointConstants.java | 4 + .../blog/controller/BlogController.java | 49 ++++++++++++ .../blog/controller/ChapterController.java | 48 +++++++++++ .../blog/controller/LikeController.java | 35 +++++++- .../blog/controller/OpenController.java | 79 ++++++++++++++++++- .../blog/controller/SchedulerController.java | 3 - .../blog/controller/TopicsController.java | 23 ++++++ .../esimplementation/LikeDocumentDao.java | 4 + .../elasticsearch/LikeDocumentRepository.java | 1 + .../LikeServiceImplementation.java | 11 +++ .../blog/payload/response/CountResponse.java | 24 ++++++ .../bloggios/blog/service/LikeService.java | 2 + src/main/resources/security/privkey.pem | 52 ++++++++++++ 13 files changed, 326 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/bloggios/blog/payload/response/CountResponse.java create mode 100644 src/main/resources/security/privkey.pem diff --git a/src/main/java/com/bloggios/blog/constants/EndpointConstants.java b/src/main/java/com/bloggios/blog/constants/EndpointConstants.java index d48cc8c..6ac0c8b 100644 --- a/src/main/java/com/bloggios/blog/constants/EndpointConstants.java +++ b/src/main/java/com/bloggios/blog/constants/EndpointConstants.java @@ -58,6 +58,10 @@ public static class BlogData { public static final String BLOGS_LIST = BASE_PATH + "/list"; public static final String BLOG_COUNT_INTERNAL_RESPONSE = "/count-blogs"; } + + public static class LikeData { + public static final String COUNT_LIKES = "/count-likes"; + } } public static class FeignClient { diff --git a/src/main/java/com/bloggios/blog/controller/BlogController.java b/src/main/java/com/bloggios/blog/controller/BlogController.java index 1f5f5c7..7b6c606 100644 --- a/src/main/java/com/bloggios/blog/controller/BlogController.java +++ b/src/main/java/com/bloggios/blog/controller/BlogController.java @@ -4,10 +4,17 @@ import com.bloggios.blog.constants.EndpointConstants; import com.bloggios.blog.payload.request.BlogListRequest; import com.bloggios.blog.payload.request.BlogRequest; +import com.bloggios.blog.payload.response.ExceptionResponse; +import com.bloggios.blog.payload.response.LikeResponse; import com.bloggios.blog.payload.response.ModuleResponse; import com.bloggios.blog.service.BlogService; import com.bloggios.blog.utils.AsyncUtils; import com.bloggios.elasticsearch.configuration.payload.response.ListResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; @@ -42,6 +49,27 @@ public BlogController( } @PostMapping + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = ModuleResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + }, + security = { + @SecurityRequirement( + name = "bearerAuth" + ) + } + ) public ResponseEntity addBlog( @RequestPart(required = false) List images, @RequestParam(required = true) String title, @@ -77,6 +105,27 @@ public ResponseEntity addBlog( } @PostMapping(EndpointConstants.BlogController.BLOG_LIST) + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = ListResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + }, + security = { + @SecurityRequirement( + name = "bearerAuth" + ) + } + ) public ResponseEntity getBlogList(@RequestBody BlogListRequest blogListRequest) { return ResponseEntity.ok(AsyncUtils.getAsyncResult(blogService.blogList(blogListRequest))); } diff --git a/src/main/java/com/bloggios/blog/controller/ChapterController.java b/src/main/java/com/bloggios/blog/controller/ChapterController.java index 3c44502..332dd98 100644 --- a/src/main/java/com/bloggios/blog/controller/ChapterController.java +++ b/src/main/java/com/bloggios/blog/controller/ChapterController.java @@ -3,10 +3,16 @@ import com.bloggios.authenticationconfig.payload.AuthenticatedUser; import com.bloggios.blog.constants.EndpointConstants; import com.bloggios.blog.payload.request.ChapterRequest; +import com.bloggios.blog.payload.response.ExceptionResponse; import com.bloggios.blog.payload.response.ModuleResponse; import com.bloggios.blog.service.ChapterService; import com.bloggios.blog.utils.AsyncUtils; import com.bloggios.elasticsearch.configuration.payload.response.ListResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @@ -36,6 +42,27 @@ public ChapterController( } @PostMapping + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = ModuleResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + }, + security = { + @SecurityRequirement( + name = "bearerAuth" + ) + } + ) public ResponseEntity addChapter( @RequestParam String chapterName, @RequestPart(required = false) MultipartFile coverImage, @@ -55,6 +82,27 @@ public ResponseEntity addChapter( } @GetMapping + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = ListResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + }, + security = { + @SecurityRequirement( + name = "bearerAuth" + ) + } + ) public ResponseEntity getUserChapters(@AuthenticationPrincipal AuthenticatedUser authenticatedUser) { return ResponseEntity.ok(AsyncUtils.getAsyncResult(chapterService.getUserChapters(authenticatedUser))); } diff --git a/src/main/java/com/bloggios/blog/controller/LikeController.java b/src/main/java/com/bloggios/blog/controller/LikeController.java index 7a913ae..7614edf 100644 --- a/src/main/java/com/bloggios/blog/controller/LikeController.java +++ b/src/main/java/com/bloggios/blog/controller/LikeController.java @@ -2,16 +2,22 @@ import com.bloggios.authenticationconfig.payload.AuthenticatedUser; import com.bloggios.blog.constants.EndpointConstants; +import com.bloggios.blog.payload.response.CountResponse; +import com.bloggios.blog.payload.response.ExceptionResponse; import com.bloggios.blog.payload.response.LikeResponse; import com.bloggios.blog.service.LikeService; import com.bloggios.blog.utils.AsyncUtils; +import com.bloggios.elasticsearch.configuration.payload.response.ListResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * Owner - Rohit Parihar and Bloggios @@ -30,6 +36,27 @@ public class LikeController { private final LikeService likeService; @PostMapping + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = LikeResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + }, + security = { + @SecurityRequirement( + name = "bearerAuth" + ) + } + ) public ResponseEntity handleLike(@RequestParam String destinationId, @RequestParam String likeFor, @AuthenticationPrincipal AuthenticatedUser authenticatedUser) { return ResponseEntity.ok(AsyncUtils.getAsyncResult(likeService.handleLike(destinationId, likeFor, authenticatedUser))); } diff --git a/src/main/java/com/bloggios/blog/controller/OpenController.java b/src/main/java/com/bloggios/blog/controller/OpenController.java index 4d7d92c..3015eac 100644 --- a/src/main/java/com/bloggios/blog/controller/OpenController.java +++ b/src/main/java/com/bloggios/blog/controller/OpenController.java @@ -1,11 +1,16 @@ package com.bloggios.blog.controller; import com.bloggios.blog.constants.EndpointConstants; -import com.bloggios.blog.payload.response.BlogCountResponse; -import com.bloggios.blog.payload.response.BlogResponse; +import com.bloggios.blog.payload.response.*; import com.bloggios.blog.service.BlogService; +import com.bloggios.blog.service.LikeService; import com.bloggios.blog.utils.AsyncUtils; import com.bloggios.elasticsearch.configuration.payload.response.ListResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -28,8 +33,25 @@ public class OpenController { private final BlogService blogService; + private final LikeService likeService; @GetMapping(EndpointConstants.OpenController.BlogData.BLOGS_LIST) + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = ListResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + } + ) public ResponseEntity blogsList( @RequestParam Integer page, @RequestParam(required = false) String userId, @@ -41,6 +63,22 @@ public ResponseEntity blogsList( } @GetMapping(EndpointConstants.OpenController.BlogData.BASE_PATH) + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = BlogResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + } + ) public ResponseEntity getUnauthBlog( @RequestParam String blogId ) { @@ -48,7 +86,44 @@ public ResponseEntity getUnauthBlog( } @GetMapping(EndpointConstants.OpenController.BlogData.BLOG_COUNT_INTERNAL_RESPONSE) + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = BlogCountResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + } + ) public ResponseEntity countBlogInternalResponse(@RequestParam String userId) { return ResponseEntity.ok(AsyncUtils.getAsyncResult(blogService.countBlog(userId))); } + + @GetMapping(EndpointConstants.OpenController.LikeData.COUNT_LIKES) + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = LikeResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + } + ) + public ResponseEntity getLikesCount(@RequestParam String destinationId) { + return ResponseEntity.ok(AsyncUtils.getAsyncResult(likeService.countLikes(destinationId))); + } } diff --git a/src/main/java/com/bloggios/blog/controller/SchedulerController.java b/src/main/java/com/bloggios/blog/controller/SchedulerController.java index 4b2f784..2388925 100644 --- a/src/main/java/com/bloggios/blog/controller/SchedulerController.java +++ b/src/main/java/com/bloggios/blog/controller/SchedulerController.java @@ -37,9 +37,6 @@ public class SchedulerController { @GetMapping @Operation( - requestBody = @RequestBody( - required = false - ), responses = { @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( mediaType = "application/json", schema = @Schema(implementation = ListResponse.class) diff --git a/src/main/java/com/bloggios/blog/controller/TopicsController.java b/src/main/java/com/bloggios/blog/controller/TopicsController.java index 4234207..56d2e73 100644 --- a/src/main/java/com/bloggios/blog/controller/TopicsController.java +++ b/src/main/java/com/bloggios/blog/controller/TopicsController.java @@ -1,9 +1,16 @@ package com.bloggios.blog.controller; import com.bloggios.blog.constants.EndpointConstants; +import com.bloggios.blog.payload.response.ExceptionResponse; +import com.bloggios.blog.payload.response.ModuleResponse; import com.bloggios.blog.payload.response.TopicsListResponse; import com.bloggios.blog.service.TopicsService; import com.bloggios.blog.utils.AsyncUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -31,6 +38,22 @@ public TopicsController( } @GetMapping + @Operation( + responses = { + @ApiResponse(description = "SUCCESS", responseCode = "200", content = @Content( + mediaType = "application/json", schema = @Schema(implementation = TopicsListResponse.class) + )), + @ApiResponse(description = "No Content", responseCode = "401", content = { + @Content(schema = @Schema(implementation = Void.class)) + }), + @ApiResponse(description = "FORBIDDEN", responseCode = "403", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)) + }), + @ApiResponse(description = "BAD REQUEST", responseCode = "400", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionResponse.class)) + }) + } + ) public ResponseEntity getTags() { return ResponseEntity.ok(AsyncUtils.getAsyncResult(topicsService.tagsList())); } diff --git a/src/main/java/com/bloggios/blog/dao/implementation/esimplementation/LikeDocumentDao.java b/src/main/java/com/bloggios/blog/dao/implementation/esimplementation/LikeDocumentDao.java index eb7bb08..08b80df 100644 --- a/src/main/java/com/bloggios/blog/dao/implementation/esimplementation/LikeDocumentDao.java +++ b/src/main/java/com/bloggios/blog/dao/implementation/esimplementation/LikeDocumentDao.java @@ -30,4 +30,8 @@ public Optional findByDestinationIdAndUserId(String destinationId, public void deleteByDocument(LikeDocument likeDocument) { repository.delete(likeDocument); } + + public long countLikeDocumentByDestinationId(String destinationId) { + return repository.countLikeDocumentByDestinationId(destinationId); + } } diff --git a/src/main/java/com/bloggios/blog/dao/repository/elasticsearch/LikeDocumentRepository.java b/src/main/java/com/bloggios/blog/dao/repository/elasticsearch/LikeDocumentRepository.java index 0cc9abd..0765e26 100644 --- a/src/main/java/com/bloggios/blog/dao/repository/elasticsearch/LikeDocumentRepository.java +++ b/src/main/java/com/bloggios/blog/dao/repository/elasticsearch/LikeDocumentRepository.java @@ -17,4 +17,5 @@ public interface LikeDocumentRepository extends ElasticsearchRepository { Optional findByDestinationIdAndUserId(String destinationId, String userId); + long countLikeDocumentByDestinationId(String destinationId); } diff --git a/src/main/java/com/bloggios/blog/implementation/LikeServiceImplementation.java b/src/main/java/com/bloggios/blog/implementation/LikeServiceImplementation.java index f1127a9..afbb0b4 100644 --- a/src/main/java/com/bloggios/blog/implementation/LikeServiceImplementation.java +++ b/src/main/java/com/bloggios/blog/implementation/LikeServiceImplementation.java @@ -1,8 +1,10 @@ package com.bloggios.blog.implementation; import com.bloggios.authenticationconfig.payload.AuthenticatedUser; +import com.bloggios.blog.constants.BeanConstants; import com.bloggios.blog.dao.implementation.esimplementation.LikeDocumentDao; import com.bloggios.blog.document.LikeDocument; +import com.bloggios.blog.payload.response.CountResponse; import com.bloggios.blog.payload.response.LikeResponse; import com.bloggios.blog.processor.implementation.DoLikeProcessor; import com.bloggios.blog.processor.implementation.DoUnlikeProcessor; @@ -10,6 +12,7 @@ import com.bloggios.blog.utils.ValueCheckerUtil; import com.bloggios.blog.validator.implementation.businessvalidator.LikeTypeStringValidator; import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.Optional; @@ -46,4 +49,12 @@ public CompletableFuture handleLike(String destinationId, String l } return CompletableFuture.completedFuture(likeResponse); } + + @Override + @Async(BeanConstants.ASYNC_TASK_EXTERNAL_POOL) + public CompletableFuture countLikes(String destinationId) { + ValueCheckerUtil.isValidUUID(destinationId); + long likesCount = likeDocumentDao.countLikeDocumentByDestinationId(destinationId); + return CompletableFuture.completedFuture(new CountResponse(likesCount)); + } } diff --git a/src/main/java/com/bloggios/blog/payload/response/CountResponse.java b/src/main/java/com/bloggios/blog/payload/response/CountResponse.java new file mode 100644 index 0000000..ccceaf1 --- /dev/null +++ b/src/main/java/com/bloggios/blog/payload/response/CountResponse.java @@ -0,0 +1,24 @@ +package com.bloggios.blog.payload.response; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.*; + +/** + * Owner - Rohit Parihar + * Author - rohit + * Project - blog-provider-application + * Package - com.bloggios.blog.payload.response + * Created_on - August 30 - 2024 + * Created_at - 21:50 + */ + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@JsonIgnoreProperties(ignoreUnknown = true) +public class CountResponse { + + private long counts; +} diff --git a/src/main/java/com/bloggios/blog/service/LikeService.java b/src/main/java/com/bloggios/blog/service/LikeService.java index 84a2b06..8871d57 100644 --- a/src/main/java/com/bloggios/blog/service/LikeService.java +++ b/src/main/java/com/bloggios/blog/service/LikeService.java @@ -1,6 +1,7 @@ package com.bloggios.blog.service; import com.bloggios.authenticationconfig.payload.AuthenticatedUser; +import com.bloggios.blog.payload.response.CountResponse; import com.bloggios.blog.payload.response.LikeResponse; import java.util.concurrent.CompletableFuture; @@ -17,4 +18,5 @@ public interface LikeService { CompletableFuture handleLike(String destinationId, String likeFor, AuthenticatedUser authenticatedUser); + CompletableFuture countLikes(String destinationId); } diff --git a/src/main/resources/security/privkey.pem b/src/main/resources/security/privkey.pem new file mode 100644 index 0000000..50981f4 --- /dev/null +++ b/src/main/resources/security/privkey.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +TDJ2vmXd1m/Y2E9iAp7eDW6uMAmLcw== +-----END PRIVATE KEY-----