diff --git a/README.md b/README.md index 3675370..572bd8a 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,10 @@ To run the tests for the application, use Gradle: ./gradlew test ``` +### Swagger documentation API + +http://localhost:8090/swagger-ui/index.html + ## License This project is licensed under the MIT License. diff --git a/build.gradle b/build.gradle index 2da365c..15b6117 100644 --- a/build.gradle +++ b/build.gradle @@ -73,6 +73,8 @@ dependencies { implementation 'org.modelmapper:modelmapper:3.2.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' implementation 'org.glassfish:jakarta.el:4.0.2' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' + implementation 'org.springdoc:springdoc-openapi-ui:1.8.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' testImplementation 'org.mockito:mockito-core:4.5.1' testImplementation 'org.mockito:mockito-junit-jupiter:4.5.1' diff --git a/src/main/java/pl/commit/craft/config/OpenApiConfig.java b/src/main/java/pl/commit/craft/config/OpenApiConfig.java new file mode 100644 index 0000000..0487723 --- /dev/null +++ b/src/main/java/pl/commit/craft/config/OpenApiConfig.java @@ -0,0 +1,17 @@ +package pl.commit.craft.config; + +import org.springdoc.core.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenApiConfig { + + @Bean + public GroupedOpenApi publicApi() { + return GroupedOpenApi.builder() + .group("public-api") + .pathsToMatch("/api/**") + .build(); + } +} diff --git a/src/main/java/pl/commit/craft/controller/CommitTranslateController.java b/src/main/java/pl/commit/craft/controller/CommitTranslateController.java index c04a4c2..bf4e3ed 100644 --- a/src/main/java/pl/commit/craft/controller/CommitTranslateController.java +++ b/src/main/java/pl/commit/craft/controller/CommitTranslateController.java @@ -1,5 +1,6 @@ package pl.commit.craft.controller; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.web.bind.annotation.*; import pl.commit.craft.service.CommitTranslateService; @@ -13,8 +14,13 @@ public CommitTranslateController(CommitTranslateService commitTranslateService) this.commitTranslateService = commitTranslateService; } + @Operation( + summary = "Generate commit translation", + description = "Generates a translated commit message based on the provided request information." + ) @PostMapping("/craft") - public String generateCommit(@RequestBody CommitTranslateRequest commitTranslateRequest) { + public String generateCommit( + @RequestBody CommitTranslateRequest commitTranslateRequest) { return commitTranslateService.generateTranslateCommit( commitTranslateRequest.major(), commitTranslateRequest.type(), diff --git a/src/main/java/pl/commit/craft/flow/CommitFlowController.java b/src/main/java/pl/commit/craft/flow/CommitFlowController.java index 898e573..edd024e 100644 --- a/src/main/java/pl/commit/craft/flow/CommitFlowController.java +++ b/src/main/java/pl/commit/craft/flow/CommitFlowController.java @@ -1,5 +1,6 @@ package pl.commit.craft.flow; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -16,6 +17,10 @@ public CommitFlowController(CommitTranslateService commitTranslateService) { this.commitTranslateService = commitTranslateService; } + @Operation( + summary = "Generate a commit message based on the provided commit flow data", + description = "This endpoint receives commit flow details and generates the corresponding commit message." + ) @PostMapping("/craft") public String generateCommit(@RequestBody CommitFlowRequest commitFlowRequest) { return commitTranslateService.generateFlowCommit( diff --git a/src/main/java/pl/commit/craft/quick/CommitQuickController.java b/src/main/java/pl/commit/craft/quick/CommitQuickController.java index 4b1d943..598fb22 100644 --- a/src/main/java/pl/commit/craft/quick/CommitQuickController.java +++ b/src/main/java/pl/commit/craft/quick/CommitQuickController.java @@ -1,5 +1,8 @@ package pl.commit.craft.quick; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -9,12 +12,21 @@ @RestController @RequestMapping("/api/v1/commit-quick") @RequiredArgsConstructor +@Tag(name = "Commit Quick Controller", description = "Very quick commit audit or PR review") public class CommitQuickController { final CommitQuickService commitQuickService; + @Operation( + summary = "Generate a quick commit message based on the provided details", + description = "This endpoint receives the commit details and generates a quick commit message." + ) @PostMapping("/craft") - public String generateCommit(@RequestBody CommitQuickRequest commitQuickRequest) { + public String generateCommit( + @RequestBody @Parameter( + description = "Request body containing the commit details, including topic scope and Git command flag. Actual use *audit* message - Audit fix, *fix*: message - Pull request comments improved, *test*: message -Fixed tests", + required = true + ) CommitQuickRequest commitQuickRequest) { return commitQuickService.generateQuickCommit( commitQuickRequest.topicScope(), commitQuickRequest.isGitCommand() diff --git a/src/main/java/pl/commit/craft/template/CommitCraftTemplateController.java b/src/main/java/pl/commit/craft/template/CommitCraftTemplateController.java index ea7ea3b..d046db0 100644 --- a/src/main/java/pl/commit/craft/template/CommitCraftTemplateController.java +++ b/src/main/java/pl/commit/craft/template/CommitCraftTemplateController.java @@ -1,5 +1,7 @@ package pl.commit.craft.template; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,12 +16,24 @@ public class CommitCraftTemplateController { private final CommitTemplateService commitTemplateService; + @Operation( + summary = "Get all commit templates", + description = "Fetches a list of all available commit craft templates." + ) @GetMapping("/all") public ResponseEntity> getAllTemplates() throws IOException { List templates = commitTemplateService.getAllTemplates(); return ResponseEntity.ok(templates); } + @Operation( + summary = "Create a dedicated commit template", + description = "Creates a new dedicated commit template if the pattern and model scope are valid.", + responses = { + @ApiResponse(responseCode = "200", description = "Template added successfully"), + @ApiResponse(responseCode = "400", description = "Template already exists") + } + ) @PostMapping("/dedicated") public ResponseEntity createDedicatedTemplate(@RequestBody CommitCraftTemplate template) throws IOException { boolean patternAndModelScope = CommitDedicatedTemplateValidator.validatePatternAndModelScope(template); @@ -30,12 +44,26 @@ public ResponseEntity createDedicatedTemplate(@RequestBody CommitCraftTe return ResponseEntity.badRequest().body("Template already exists."); } + @Operation( + summary = "Remove a commit template", + description = "Removes a dedicated commit template by name.", + responses = { + @ApiResponse(responseCode = "200", description = "Template removed successfully") + } + ) @DeleteMapping("/removed/{name}") public ResponseEntity addTemplate(@PathVariable("name") String name) throws IOException { commitTemplateService.removeDedicatedTemplate(name); return ResponseEntity.ok("Template removed successfully."); } + @Operation( + summary = "Generate commit template JSON", + description = "Generates a JSON representation of the commit template based on its name.", + responses = { + @ApiResponse(responseCode = "200", description = "JSON generated successfully") + } + ) @PostMapping("/generate-json/{name}") public Map generateJson(@PathVariable String name) throws IOException { CommitCraftJson commitCraftJson = commitTemplateService.prepareJsonByModel(name); diff --git a/src/test/java/pl/commit/craft/CommitCraftApplicationTests.java b/src/test/java/pl/commit/craft/CommitCraftApplicationTests.java index 0b7cb00..4ed3c3b 100644 --- a/src/test/java/pl/commit/craft/CommitCraftApplicationTests.java +++ b/src/test/java/pl/commit/craft/CommitCraftApplicationTests.java @@ -1,9 +1,7 @@ package pl.commit.craft; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest class CommitCraftApplicationTests { @Test diff --git a/src/test/java/pl/commit/craft/quick/CommitQuickControllerTest.java b/src/test/java/pl/commit/craft/quick/CommitQuickControllerTest.java index 1a246cc..5ff5d85 100644 --- a/src/test/java/pl/commit/craft/quick/CommitQuickControllerTest.java +++ b/src/test/java/pl/commit/craft/quick/CommitQuickControllerTest.java @@ -5,8 +5,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import static org.mockito.Mockito.*; @@ -19,7 +19,7 @@ class CommitQuickControllerTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private CommitQuickService commitQuickService; private ObjectMapper objectMapper;