Skip to content

Commit 40af2da

Browse files
committed
Add projectFlavor field to response models, update error handling, and refactor repository methods for case-insensitive project key lookup
1 parent 1d81b0f commit 40af2da

17 files changed

Lines changed: 307 additions & 196 deletions

File tree

api-project/openapi/api-project.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ components:
142142
type: string
143143
status:
144144
type: string
145+
projectFlavor:
146+
type: string
145147
message:
146148
type: string
147149
error:

api-project/src/main/java/org/opendevstack/apiservice/project/controller/ProjectController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public ResponseEntity<CreateProjectResponse> getProject(@PathVariable String pro
5858
log.error("Error retrieving project '{}': {}", projectKey, e.getMessage(), e);
5959
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
6060
.body(ProjectResponseFactory.internalError());
61+
} catch (Exception e) {
62+
log.error("Unexpected error retrieving project '{}': {}", projectKey, e.getMessage(), e);
63+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
64+
.body(ProjectResponseFactory.internalError());
6165
}
6266
}
6367
}

api-project/src/main/java/org/opendevstack/apiservice/project/controller/ProjectResponseFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private static CreateProjectResponse error(String error, String errorKey, String
3232
CreateProjectResponse response = new CreateProjectResponse();
3333
response.setError(error);
3434
response.setErrorKey(errorKey);
35-
response.setMessage(message);
35+
response.setErrorDescription(message);
3636
return response;
3737
}
3838
}
Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
11
package org.opendevstack.apiservice.project.mapper;
22

3-
import org.apache.logging.log4j.util.Strings;
43
import org.mapstruct.Mapper;
4+
import org.mapstruct.Mapping;
5+
import org.mapstruct.Named;
56
import org.opendevstack.apiservice.project.model.CreateProjectRequest;
67
import org.opendevstack.apiservice.project.model.CreateProjectResponse;
78
import org.opendevstack.apiservice.serviceproject.model.ProjectRequest;
89
import org.opendevstack.apiservice.serviceproject.model.ProjectResponse;
10+
import org.opendevstack.apiservice.serviceproject.model.Status;
911

1012
@Mapper(componentModel = "spring")
1113
public interface ProjectMapper {
12-
13-
ProjectRequest toServiceRequest(
14-
CreateProjectRequest apiRequest);
1514

16-
default CreateProjectResponse toApiResponse(ProjectResponse serviceResponse) {
17-
if (serviceResponse == null) {
18-
return null;
19-
}
15+
ProjectRequest toServiceRequest(CreateProjectRequest apiRequest);
2016

21-
CreateProjectResponse response = new CreateProjectResponse();
22-
response.setProjectKey(serviceResponse.getProjectKey());
23-
24-
if (!Strings.isEmpty(serviceResponse.getStatus())) {
25-
response.setStatus(serviceResponse.getStatus());
26-
}
17+
@Mapping(source = "status", target = "status", qualifiedByName = "mapStatus")
18+
@Mapping(source = "projectKey", target = "location", qualifiedByName = "mapLocation")
19+
CreateProjectResponse toApiResponse(ProjectResponse serviceResponse);
2720

28-
if (!Strings.isEmpty(serviceResponse.getProjectKey())) {
29-
response.setLocation("/api/pub/v0/projects/" + serviceResponse.getProjectKey());
21+
@Named("mapStatus")
22+
default String mapStatus(Status status) {
23+
if (status == null) {
24+
return null;
3025
}
26+
return status.getDbValue();
27+
}
3128

32-
return response;
29+
@Named("mapLocation")
30+
default String mapLocation(String projectKey) {
31+
if (projectKey == null || projectKey.isEmpty()) {
32+
return null;
3333
}
34+
return "/api/pub/v0/projects/" + projectKey;
35+
}
3436
}

api-project/src/test/java/org/opendevstack/apiservice/project/controller/ProjectControllerIntegrationTest.java

Lines changed: 0 additions & 87 deletions
This file was deleted.

api-project/src/test/java/org/opendevstack/apiservice/project/controller/ProjectControllerTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ void createProject_whenProjectCreationException_thenReturnConflict() throws Exce
7070
assertThat(result.getBody()).isNotNull();
7171
assertThat(result.getBody().getError()).isEqualTo("CONFLICT");
7272
assertThat(result.getBody().getErrorKey()).isEqualTo("PROJECT_ALREADY_EXISTS");
73-
assertThat(result.getBody().getMessage()).contains("already exists");
73+
assertThat(result.getBody().getErrorDescription()).contains("Project with key 'EXISTING' already exists");
7474
assertThat(result.getBody().getProjectKey()).isNull();
7575
assertThat(result.getBody().getStatus()).isNull();
76-
assertThat(result.getBody().getErrorDescription()).isNull();
76+
assertThat(result.getBody().getMessage()).isNull();
7777
}
7878

7979
@Test
@@ -89,10 +89,10 @@ void createProject_whenProjectKeyGenerationException_thenReturnInternalServerErr
8989
assertThat(result.getBody()).isNotNull();
9090
assertThat(result.getBody().getError()).isEqualTo("INTERNAL_ERROR");
9191
assertThat(result.getBody().getErrorKey()).isEqualTo("PROJECT_KEY_GENERATION_FAILED");
92-
assertThat(result.getBody().getMessage()).isEqualTo("Failed to generate a unique project key.");
92+
assertThat(result.getBody().getErrorDescription()).isEqualTo("Failed to generate a unique project key.");
9393
assertThat(result.getBody().getProjectKey()).isNull();
9494
assertThat(result.getBody().getStatus()).isNull();
95-
assertThat(result.getBody().getErrorDescription()).isNull();
95+
assertThat(result.getBody().getMessage()).isNull();
9696
}
9797

9898
@Test
@@ -123,10 +123,10 @@ void getProject_whenNotFound_thenReturnNotFound() throws Exception {
123123
assertThat(result.getBody()).isNotNull();
124124
assertThat(result.getBody().getError()).isEqualTo("NOT_FOUND");
125125
assertThat(result.getBody().getErrorKey()).isEqualTo("PROJECT_NOT_FOUND");
126-
assertThat(result.getBody().getMessage()).contains("UNKNOWN");
126+
assertThat(result.getBody().getErrorDescription()).contains("UNKNOWN");
127127
assertThat(result.getBody().getProjectKey()).isNull();
128128
assertThat(result.getBody().getStatus()).isNull();
129-
assertThat(result.getBody().getErrorDescription()).isNull();
129+
assertThat(result.getBody().getMessage()).isNull();
130130
}
131131

132132
@Test
@@ -140,10 +140,10 @@ void getProject_whenServiceThrows_thenReturnInternalServerError() throws Excepti
140140
assertThat(result.getBody()).isNotNull();
141141
assertThat(result.getBody().getError()).isEqualTo("INTERNAL_ERROR");
142142
assertThat(result.getBody().getErrorKey()).isEqualTo("INTERNAL_ERROR");
143-
assertThat(result.getBody().getMessage()).isEqualTo("An error occurred while processing the request.");
143+
assertThat(result.getBody().getErrorDescription()).isEqualTo("An error occurred while processing the request.");
144144
assertThat(result.getBody().getProjectKey()).isNull();
145145
assertThat(result.getBody().getStatus()).isNull();
146-
assertThat(result.getBody().getErrorDescription()).isNull();
146+
assertThat(result.getBody().getMessage()).isNull();
147147
}
148148

149149
}

api-project/src/test/java/org/opendevstack/apiservice/project/facade/impl/ProjectsFacadeImplTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.opendevstack.apiservice.project.model.CreateProjectResponse;
1212
import org.opendevstack.apiservice.serviceproject.model.ProjectRequest;
1313
import org.opendevstack.apiservice.serviceproject.model.ProjectResponse;
14+
import org.opendevstack.apiservice.serviceproject.model.Status;
1415
import org.opendevstack.apiservice.serviceproject.service.ProjectService;
1516

1617
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,7 +41,7 @@ void createProject_whenServiceReturnsValue_thenMapToApiModel() throws Exception
4041
ProjectResponse serviceResponse =
4142
new ProjectResponse();
4243
serviceResponse.setProjectKey("PROJ01");
43-
serviceResponse.setStatus("Initiated");
44+
serviceResponse.setStatus(Status.PENDING);
4445

4546
when(projectService.createProject(org.mockito.ArgumentMatchers.any(
4647
ProjectRequest.class)))
@@ -50,7 +51,7 @@ void createProject_whenServiceReturnsValue_thenMapToApiModel() throws Exception
5051

5152
assertThat(response).isNotNull();
5253
assertThat(response.getProjectKey()).isEqualTo("PROJ01");
53-
assertThat(response.getStatus()).isEqualTo("Initiated");
54+
assertThat(response.getStatus()).isEqualTo("Pending");
5455
verify(projectService).createProject(org.mockito.ArgumentMatchers.any(
5556
ProjectRequest.class));
5657
}
@@ -72,15 +73,15 @@ void getProject_whenServiceReturnsValue_thenMapToApiModel() throws Exception {
7273
ProjectResponse serviceResponse =
7374
new ProjectResponse();
7475
serviceResponse.setProjectKey("PROJ01");
75-
serviceResponse.setStatus("Found");
76+
serviceResponse.setStatus(Status.RUNNING);
7677

7778
when(projectService.getProject("PROJ01")).thenReturn(serviceResponse);
7879

7980
CreateProjectResponse response = sut.getProject("PROJ01");
8081

8182
assertThat(response).isNotNull();
8283
assertThat(response.getProjectKey()).isEqualTo("PROJ01");
83-
assertThat(response.getStatus()).isEqualTo("Found");
84+
assertThat(response.getStatus()).isEqualTo("Running");
8485
}
8586

8687
@Test

0 commit comments

Comments
 (0)