Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions src/main/java/pl/commit/gen/controller/CommitController.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package pl.commit.gen.controller;

import org.springframework.web.bind.annotation.*;
import pl.commit.gen.service.CommitService;

@RestController
@RequestMapping("/api/commit-translate")
public class CommitTranslateController {

private final CommitService commitService;

public CommitTranslateController(CommitService commitService) {
this.commitService = commitService;
}

@PostMapping("/generate")
public String generateCommit(@RequestBody CommitTranslateRequest commitTranslateRequest) {
return commitService.generateTranslateCommit(
commitTranslateRequest.major(),
commitTranslateRequest.type(),
commitTranslateRequest.component(),
commitTranslateRequest.changeDescription(),
commitTranslateRequest.details(),
commitTranslateRequest.wholeGitCommand()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package pl.commit.gen.controller;

public record CommitRequest(
public record CommitTranslateRequest(
String major,
String type,
String component,
String changeDescription,
String details
String details,
boolean wholeGitCommand
) {}
30 changes: 30 additions & 0 deletions src/main/java/pl/commit/gen/flow/CommitFlowController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package pl.commit.gen.flow;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pl.commit.gen.service.CommitService;

@RestController
@RequestMapping("/api/commit-flow")
public class CommitFlowController {

private final CommitService commitService;

public CommitFlowController(CommitService commitService) {
this.commitService = commitService;
}

@PostMapping("/generate")
public String generateCommit(@RequestBody CommitFlowRequest commitFlowRequest) {
return commitService.generateFlowCommit(
commitFlowRequest.major(),
commitFlowRequest.type(),
commitFlowRequest.component(),
commitFlowRequest.changeDescription(),
commitFlowRequest.details(),
commitFlowRequest.wholeGitCommand()
);
}
}
11 changes: 11 additions & 0 deletions src/main/java/pl/commit/gen/flow/CommitFlowRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package pl.commit.gen.flow;

record CommitFlowRequest(
String major,
String type,
String component,
String changeDescription,
String details,
boolean wholeGitCommand
) {}

4 changes: 4 additions & 0 deletions src/main/java/pl/commit/gen/pattern/BasicModelPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
sealed class BasicModelPattern permits CommitModelPattern {
private static final String TARGET_LANG = "EN";

protected BasicModelPattern() {
throw new IllegalStateException("Utility class");
}

public static String getTargetLanguage() {
return TARGET_LANG;
}
Expand Down
92 changes: 88 additions & 4 deletions src/main/java/pl/commit/gen/pattern/CommitModelPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,97 @@

public final class CommitModelPattern extends BasicModelPattern {
private static final String GIT_COMMAND = "git commit -m";
private static final String COMMITING_WORK_PATTERN = "%s \"%s %s(%s): %s\n\n%s\"";

public static String getCommittingWorkPattern() {
private static final String GIT_COMMAND_COMMITING_WORK_PATTERN = GIT_COMMAND + " \"%s %s(%s): %s\n\n%s\"";
private static final String GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT = GIT_COMMAND + " \"%s %s: %s\n\n%s\"";
private static final String GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_DETAILS = GIT_COMMAND + " \"%s %s(%s): %s\"";
private static final String GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS = GIT_COMMAND + " \"%s %s: %s\"";

private static final String COMMITING_WORK_PATTERN = "%s %s(%s): %s\n\n%s";
private static final String COMMITING_WORK_PATTERN_WITHOUT_COMPONENT = "%s %s: %s\n\n%s";
private static final String COMMITING_WORK_PATTERN_WITHOUT_DETAILS = "%s %s(%s): %s";
private static final String COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS = "%s %s: %s";

private static String getGitCommandCommittingWorkPattern() {
return GIT_COMMAND_COMMITING_WORK_PATTERN;
}

private static String getGitCommandCommittingWorkPatternWithoutComponent() {
return GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT;
}

private static String getGitCommandCommittingWorkPatternWithoutDetails() {
return GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_DETAILS;
}

private static String getGitCommandCommittingWorkPatternWithoutComponentAndDetails() {
return GIT_COMMAND_COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS;
}

private static String getCommittingWorkPattern() {
return COMMITING_WORK_PATTERN;
}

public static String getGitCommandPattern() {
return GIT_COMMAND;
private static String getCommittingWorkPatternWithoutComponent() {
return COMMITING_WORK_PATTERN_WITHOUT_COMPONENT;
}

private static String getCommittingWorkPatternWithoutDetails() {
return COMMITING_WORK_PATTERN_WITHOUT_DETAILS;
}

private static String getCommittingWorkPatternWithoutComponentAndDetails() {
return COMMITING_WORK_PATTERN_WITHOUT_COMPONENT_AND_DETAILS;
}

/**
* Główna metoda wybierająca odpowiedni wzorzec na podstawie flagi `wholeGitCommand`, `component` i `details`.
* @param wholeGitCommand - jeśli true, zwraca wzorzec z pełnym git commit.
* @param component - nazwa komponentu, może być pusta.
* @param details - szczegóły, mogą być puste.
* @return odpowiedni wzorzec.
*/
public static String getPattern(boolean wholeGitCommand, String component, String details) {
if (wholeGitCommand) {
return getPatternWithGitCommand(component, details);
} else {
return getPatternWithoutGitCommand(component, details);
}
}

/**
* Zwraca odpowiedni wzorzec z pełnym poleceniem Git, w zależności od tego, czy `component` i `details` są puste.
* @param component - nazwa komponentu.
* @param details - szczegóły.
* @return wzorzec z pełnym poleceniem Git.
*/
private static String getPatternWithGitCommand(String component, String details) {
if (component.isEmpty() && details.isEmpty()) {
return getGitCommandCommittingWorkPatternWithoutComponentAndDetails();
} else if (component.isEmpty()) {
return getGitCommandCommittingWorkPatternWithoutComponent();
} else if (details.isEmpty()) {
return getGitCommandCommittingWorkPatternWithoutDetails();
} else {
return getGitCommandCommittingWorkPattern();
}
}

/**
* Zwraca odpowiedni wzorzec bez pełnego polecenia Git, w zależności od tego, czy `component` i `details` są puste.
* @param component - nazwa komponentu.
* @param details - szczegóły.
* @return wzorzec bez pełnego polecenia Git.
*/
private static String getPatternWithoutGitCommand(String component, String details) {
if (component.isEmpty() && details.isEmpty()) {
return getCommittingWorkPatternWithoutComponentAndDetails();
} else if (component.isEmpty()) {
return getCommittingWorkPatternWithoutComponent();
} else if (details.isEmpty()) {
return getCommittingWorkPatternWithoutDetails();
} else {
return getCommittingWorkPattern();
}
}
}
36 changes: 29 additions & 7 deletions src/main/java/pl/commit/gen/service/CommitService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import pl.commit.gen.pattern.CommitModelPattern;
import pl.commit.translate.TranslateCommiting;

Expand All @@ -10,21 +11,42 @@
public class CommitService {
private final TranslateCommiting translateCommiting;

public String generateCommit(String major, String type, String component, String changeDescription, String details) {
if (!isValidType(type)) {
public String generateTranslateCommit(String major, String type, String component, String changeDescription, String details, boolean wholeGitCommand) {
if (isValidType(type)) {
throw new IllegalArgumentException("Invalid commit type: " + type);
}

MajorNumber majorNumber = MajorNumberPreparer.of(major).getMajorNumber();
String changeDescriptionTranslated = getChangeDescriptionTranslated(changeDescription);
String detailsTranslated = !details.isEmpty() ? getChangeDescriptionTranslated(details) : "";
String pattern = CommitModelPattern.getPattern(wholeGitCommand, component, detailsTranslated);

return String.format(
CommitModelPattern.getCommittingWorkPattern(),
CommitModelPattern.getGitCommandPattern(),
pattern,
majorNumber != null ? majorNumber.issueNumber() : "",
type,
component,
component.isEmpty() ? changeDescriptionTranslated : component,
changeDescriptionTranslated,
detailsTranslated.isEmpty() ? "" : detailsTranslated
detailsTranslated
).trim();
}

public String generateFlowCommit(String major, String type, String component, String changeDescription, String details, boolean wholeGitCommand) {
if (isValidType(type)) {
throw new IllegalArgumentException("Invalid commit type: " + type);
}

MajorNumber majorNumber = MajorNumberPreparer.of(major).getMajorNumber();
String detailsFlow = details.isEmpty() ? StringUtils.trimAllWhitespace(details) : details;
String pattern = CommitModelPattern.getPattern(wholeGitCommand, component, detailsFlow);

return String.format(
pattern,
majorNumber != null ? majorNumber.issueNumber() : "",
type,
component,
changeDescription,
detailsFlow
).trim();
}

Expand All @@ -33,6 +55,6 @@ private String getChangeDescriptionTranslated(String changeDescription) {
}

private boolean isValidType(String type) {
return CommitType.isValidType(type);
return !CommitType.isValidType(type);
}
}
3 changes: 2 additions & 1 deletion src/main/java/pl/commit/gen/service/CommitType.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ enum CommitType {
STYLE("style"),
REFACTOR("refactor"),
TEST("test"),
CHORE("chore");
CHORE("chore"),
AUDIT("audit");

private final String type;

Expand Down
59 changes: 59 additions & 0 deletions src/test/java/pl/commit/gen/flow/CommitFlowControllerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package pl.commit.gen.flow;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import pl.commit.gen.service.CommitService;

import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;

@ExtendWith(MockitoExtension.class)
class CommitFlowControllerTest {

@Mock
private CommitService commitService;

@InjectMocks
private CommitFlowController commitFlowController;

private MockMvc mockMvc;

@Test
void testGenerateCommitSuccess() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(commitFlowController).build();
MockHttpServletRequest request = new MockHttpServletRequest();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));

// given
String requestBody = "{"
+ "\"major\":\"1\","
+ "\"type\":\"bugfix\","
+ "\"component\":\"componentA\","
+ "\"changeDescription\":\"Fixed issue\","
+ "\"details\":\"Detailed description\","
+ "\"wholeGitCommand\":true"
+ "}";

// when
when(commitService.generateFlowCommit("1", "bugfix", "componentA", "Fixed issue", "Detailed description", true))
.thenReturn("git commit -m \"1 bugfix(componentA): Fixed issue\n\nDetailed description\"");

//then
mockMvc.perform(post("/api/commit-flow/generate")
.contentType(MediaType.APPLICATION_JSON)
.content(requestBody))
.andExpect(status().isOk()) // Oczekiwany status HTTP 200
.andExpect(content().string("git commit -m \"1 bugfix(componentA): Fixed issue\n\nDetailed description\"")); // Oczekiwana odpowiedź
}
}
Loading
Loading