diff --git a/api-project-component-v0/openapi/api-project-component-v0.yaml b/api-project-component-v0/openapi/api-project-component-v0.yaml
index dcd3912..868e72e 100644
--- a/api-project-component-v0/openapi/api-project-component-v0.yaml
+++ b/api-project-component-v0/openapi/api-project-component-v0.yaml
@@ -12,14 +12,14 @@ servers:
default: localhost:8080
description: Development environment
tags:
- - name: ProjectComponents
+ - name: Project Components
description: API for managing project components
paths:
/projects/{projectId}/components/:
post:
tags:
- - projectComponents
+ - Project Components
summary: Create a component in a project
operationId: createProjectComponent
description: Retrieves information about a specific component
@@ -61,7 +61,7 @@ paths:
/projects/{projectId}/components/{componentId}:
get:
tags:
- - projectComponents
+ - Project Components
summary: Get component information
operationId: getProjectComponent
description: Retrieves information about a specific component
diff --git a/api-project-component-v0/pom.xml b/api-project-component-v0/pom.xml
index a3f50df..845c6d5 100644
--- a/api-project-component-v0/pom.xml
+++ b/api-project-component-v0/pom.xml
@@ -44,6 +44,12 @@
${project.version}
+
+ org.opendevstack.apiservice
+ external-service-marketplace
+ ${project.version}
+
+
io.jsonwebtoken
jjwt-api
@@ -89,6 +95,7 @@
spring-boot-starter-test
test
+
org.springframework.security
spring-security-core
diff --git a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ComponentsResponseFactory.java b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ComponentsResponseFactory.java
index 7eb10ce..c3f876a 100644
--- a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ComponentsResponseFactory.java
+++ b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ComponentsResponseFactory.java
@@ -15,10 +15,10 @@ public static CreateComponentResponse error(String projectId) {
return response;
}
- public static CreateComponentResponse entityCreated(String projectId, String componentName) {
+ public static CreateComponentResponse entityCreated(String projectId, String componentId) {
CreateComponentResponse response = new CreateComponentResponse();
response.setErrorCode(HttpStatus.CREATED.value());
- response.setMessage(componentName + " component created successfully in project " + projectId);
+ response.setMessage(componentId + " component created successfully in project " + projectId);
return response;
}
}
diff --git a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ProjectComponentsController.java b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ProjectComponentsController.java
index 9f50dee..f8b0ae8 100644
--- a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ProjectComponentsController.java
+++ b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/controller/ProjectComponentsController.java
@@ -3,18 +3,20 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.opendevstack.apiservice.project.api.ProjectComponentsApi;
+import org.opendevstack.apiservice.project.facade.ComponentsFacade;
import org.opendevstack.apiservice.project.mapper.ComponentResponseMapper;
import org.opendevstack.apiservice.project.model.Component;
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
import org.opendevstack.apiservice.project.model.CreateComponentResponse;
-import org.opendevstack.apiservice.project.facade.ComponentsFacade;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
@Slf4j
+@RequestMapping("/api/pub/v0")
public class ProjectComponentsController implements ProjectComponentsApi {
private final ComponentsFacade componentsFacade;
@@ -25,11 +27,12 @@ public class ProjectComponentsController implements ProjectComponentsApi {
public ResponseEntity createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
try {
Component component = componentsFacade.createProjectComponent(projectId, createComponentRequest);
+ log.info("Created component {} for project id {} and request {}", component, projectId, createComponentRequest);
if (component == null) {
log.error("Failed to create component for project '{}'", projectId);
return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.error(projectId));
}
- return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.entityCreated(projectId, component.getName()));
+ return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.entityCreated(projectId, component.getId()));
} catch (Exception e) {
log.error("Error while trying to create component for project '" + projectId + "': " + e.getMessage(), e);
return componentResponseMapper.toResponseEntity(ComponentsResponseFactory.error(projectId));
@@ -40,6 +43,7 @@ public ResponseEntity createProjectComponent(String pro
public ResponseEntity getProjectComponent(String projectId, String componentId) {
try {
Component component = componentsFacade.getProjectComponent(projectId, componentId);
+ log.info("Retrieved component '{}' for project '{}': {}", componentId, projectId, component);
if (component == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
diff --git a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/facade/ComponentsFacade.java b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/facade/ComponentsFacade.java
index 012f21d..f36476f 100644
--- a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/facade/ComponentsFacade.java
+++ b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/facade/ComponentsFacade.java
@@ -2,42 +2,41 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.opendevstack.apiservice.externalservice.api.ExternalService;
+import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
+import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
+import org.opendevstack.apiservice.externalservice.marketplace.service.MarketplaceService;
+import org.opendevstack.apiservice.project.mapper.MarketplaceMapper;
import org.opendevstack.apiservice.project.model.Component;
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
import org.springframework.stereotype.Service;
+import java.util.List;
+
@Service
@AllArgsConstructor
@Slf4j
public class ComponentsFacade {
- private final MarketplaceExternalServicePlaceholder marketplaceExternalService;
-
- public Component getProjectComponent(String projectId, String componentId) {
- return marketplaceExternalService.getProjectComponent(projectId, componentId);
- }
-
- public Component createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
- return marketplaceExternalService.createProjectComponent(projectId, createComponentRequest);
- }
-
- @Service
- class MarketplaceExternalServicePlaceholder implements ExternalService {
+ private final MarketplaceService marketplaceExternalService;
- @Override
- public boolean isHealthy() {
- return false;
- }
+ private final MarketplaceMapper marketplaceMapper;
- public Component getProjectComponent(String projectId, String componentId) {
- log.info("Get component with id '" + componentId + "' for project '" + projectId + "'");
+ public Component getProjectComponent(String projectId, String componentId) {
+ ProjectComponent marketplaceComponent = marketplaceExternalService.getProjectComponent(projectId, componentId);
+ if (marketplaceComponent == null) {
+ log.info("Marketplace component with id {} not found", componentId);
return null;
}
+ return marketplaceMapper.mapMarketplaceComponentToV0Component(marketplaceComponent);
+ }
- public Component createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
- log.info("Creating component for project '" + projectId + "'" + " with request: " + createComponentRequest);
+ public Component createProjectComponent(String projectId, CreateComponentRequest createComponentRequest) {
+ List createComponentParameterList = marketplaceMapper.mapCreateComponentRequestToCreateComponentParameterList(createComponentRequest);
+ ProjectComponent marketplaceComponent = marketplaceExternalService.createProjectComponent(projectId, createComponentParameterList);
+ if (marketplaceComponent == null) {
+ log.error("Failed to create component in marketplace for project with id {}", projectId);
return null;
}
+ return marketplaceMapper.mapMarketplaceComponentToV0Component(marketplaceComponent);
}
}
diff --git a/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/mapper/MarketplaceMapper.java b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/mapper/MarketplaceMapper.java
new file mode 100644
index 0000000..f142064
--- /dev/null
+++ b/api-project-component-v0/src/main/java/org/opendevstack/apiservice/project/mapper/MarketplaceMapper.java
@@ -0,0 +1,30 @@
+package org.opendevstack.apiservice.project.mapper;
+
+
+import org.mapstruct.Mapper;
+import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
+import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
+import org.opendevstack.apiservice.project.model.Component;
+import org.opendevstack.apiservice.project.model.CreateComponentRequest;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface MarketplaceMapper {
+
+ default Component mapMarketplaceComponentToV0Component(ProjectComponent source) {
+ if (source == null) {
+ return null;
+ }
+ Component target = new Component();
+ target.setId(source.getComponentId());
+ target.setStatus(source.getStatus());
+ return target;
+ }
+
+ default List mapCreateComponentRequestToCreateComponentParameterList(CreateComponentRequest createComponentRequest) {
+ return createComponentRequest.getParams().entrySet().stream()
+ .map(entry -> new CreateComponentParameter(entry.getKey(), "string", entry.getValue()))
+ .toList();
+ }
+}
diff --git a/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/controller/ProjectComponentsControllerTest.java b/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/controller/ProjectComponentsControllerTest.java
index 23aec13..a98c778 100644
--- a/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/controller/ProjectComponentsControllerTest.java
+++ b/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/controller/ProjectComponentsControllerTest.java
@@ -40,7 +40,7 @@ void testCreateProjectComponent_whenSuccess_thenReturnOk() throws Exception {
Component testComponent = buildTestComponent();
String testProjectId = "testProjectId";
CreateComponentRequest testCreateComponentRequest = buildTestCreateComponentRequest();
- CreateComponentResponse testServiceResponseSuccess = buildTestCreateComponentResponseSuccess(testComponent.getName(),
+ CreateComponentResponse testServiceResponseSuccess = buildTestCreateComponentResponseSuccess(testComponent.getId(),
testProjectId);
when(componentsFacade.createProjectComponent(anyString(), any(CreateComponentRequest.class)))
diff --git a/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsServiceTest.java b/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsFacadeTest.java
similarity index 58%
rename from api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsServiceTest.java
rename to api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsFacadeTest.java
index 31d2bcb..3935839 100644
--- a/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsServiceTest.java
+++ b/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/facade/ComponentsFacadeTest.java
@@ -3,45 +3,55 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.mapstruct.factory.Mappers;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
+import org.opendevstack.apiservice.externalservice.marketplace.service.MarketplaceService;
+import org.opendevstack.apiservice.project.mapper.MarketplaceMapper;
import org.opendevstack.apiservice.project.model.Component;
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
+import java.util.List;
+
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
-import static org.opendevstack.apiservice.project.util.TestObjectsBuilder.buildTestComponent;
import static org.opendevstack.apiservice.project.util.TestObjectsBuilder.buildTestCreateComponentRequest;
+import static org.opendevstack.apiservice.project.util.TestObjectsBuilder.buildTestMarketplaceComponent;
@ExtendWith(MockitoExtension.class)
-class ComponentsServiceTest {
+class ComponentsFacadeTest {
+
+ private final MarketplaceMapper marketplaceMapper = Mappers.getMapper(MarketplaceMapper.class);
@Mock
- private ComponentsFacade.MarketplaceExternalServicePlaceholder marketPlaceExternalServicePlaceholder;
+ private MarketplaceService marketplaceExternalService;
private ComponentsFacade componentsFacade;
@BeforeEach
void setup() {
- componentsFacade = new ComponentsFacade(marketPlaceExternalServicePlaceholder);
+ componentsFacade = new ComponentsFacade(marketplaceExternalService, marketplaceMapper);
}
@Test
void testGetProjectComponent_whenSuccess_thenReturnCorrectComponent() throws Exception {
- Component testComponent = buildTestComponent();
+ ProjectComponent testComponent = buildTestMarketplaceComponent();
- when(marketPlaceExternalServicePlaceholder.getProjectComponent(anyString(), eq("testId")))
+ when(marketplaceExternalService.getProjectComponent(anyString(), eq("testId")))
.thenReturn(testComponent);
Component retrievedComponent = componentsFacade.getProjectComponent("testId", "testId");
- assertThat(retrievedComponent).isEqualTo(testComponent);
+ assertThat(retrievedComponent.getId()).isEqualTo(testComponent.getComponentId());
+ assertThat(retrievedComponent.getStatus()).isEqualTo(testComponent.getStatus());
}
@Test
void testGetProjectComponent_whenNoComponentFound_thenReturnNull() throws Exception {
- when(marketPlaceExternalServicePlaceholder.getProjectComponent(anyString(), eq("testId")))
+ when(marketplaceExternalService.getProjectComponent(anyString(), eq("testId")))
.thenReturn(null);
Component retrievedComponent = componentsFacade.getProjectComponent("testId", "testId");
@@ -50,14 +60,15 @@ void testGetProjectComponent_whenNoComponentFound_thenReturnNull() throws Except
@Test
void testCreateProjectComponent_whenSuccess_thenReturnCorrectComponent() throws Exception {
- Component testComponent = buildTestComponent();
+ ProjectComponent testComponent = buildTestMarketplaceComponent();
CreateComponentRequest testRequest = buildTestCreateComponentRequest();
- when(marketPlaceExternalServicePlaceholder.createProjectComponent(anyString(), eq(testRequest)))
+ when(marketplaceExternalService.createProjectComponent(anyString(), any(List.class)))
.thenReturn(testComponent);
Component retrievedComponent = componentsFacade.createProjectComponent("testId", testRequest);
- assertThat(retrievedComponent).isEqualTo(testComponent);
+ assertThat(retrievedComponent.getId()).isEqualTo(testComponent.getComponentId());
+ assertThat(retrievedComponent.getStatus()).isEqualTo(testComponent.getStatus());
}
@@ -65,7 +76,7 @@ void testCreateProjectComponent_whenSuccess_thenReturnCorrectComponent() throws
void testCreateProjectComponent_whenFailure_thenReturnNull() throws Exception {
CreateComponentRequest testRequest = buildTestCreateComponentRequest();
- when(marketPlaceExternalServicePlaceholder.createProjectComponent(anyString(), eq(testRequest)))
+ when(marketplaceExternalService.createProjectComponent(anyString(), any(List.class)))
.thenReturn(null);
Component retrievedComponent = componentsFacade.createProjectComponent("testId", testRequest);
diff --git a/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/util/TestObjectsBuilder.java b/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/util/TestObjectsBuilder.java
index 60ca92b..14cc84f 100644
--- a/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/util/TestObjectsBuilder.java
+++ b/api-project-component-v0/src/test/java/org/opendevstack/apiservice/project/util/TestObjectsBuilder.java
@@ -1,10 +1,15 @@
package org.opendevstack.apiservice.project.util;
+import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
+import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
import org.opendevstack.apiservice.project.model.Component;
import org.opendevstack.apiservice.project.model.CreateComponentRequest;
import org.opendevstack.apiservice.project.model.CreateComponentResponse;
import org.springframework.http.HttpStatus;
+import java.util.ArrayList;
+import java.util.List;
+
public class TestObjectsBuilder {
private TestObjectsBuilder() {
@@ -19,6 +24,14 @@ public static Component buildTestComponent() {
return component;
}
+ public static ProjectComponent buildTestMarketplaceComponent() {
+ ProjectComponent component = new ProjectComponent();
+ component.setComponentId("testComponentId");
+ component.setCanBeDeleted(false);
+ component.setComponentUrl("http://test.component.url");
+ return component;
+ }
+
public static CreateComponentRequest buildTestCreateComponentRequest() {
CreateComponentRequest request = new CreateComponentRequest();
request.setName("testComponentName");
@@ -26,10 +39,17 @@ public static CreateComponentRequest buildTestCreateComponentRequest() {
return request;
}
- public static CreateComponentResponse buildTestCreateComponentResponseSuccess(String componentName, String projectId) {
+ public static List buildTestMarketplaceCreateComponentParameters() {
+ List parameters = new ArrayList<>();
+ parameters.add(new CreateComponentParameter("name", "string", "testComponentName"));
+ parameters.add(new CreateComponentParameter("productId", "string", "testProductId"));
+ return parameters;
+ }
+
+ public static CreateComponentResponse buildTestCreateComponentResponseSuccess(String componentId, String projectId) {
CreateComponentResponse response = new CreateComponentResponse();
response.setErrorCode(HttpStatus.CREATED.value());
- response.setMessage(componentName + " component created successfully in project " + projectId);
+ response.setMessage(componentId + " component created successfully in project " + projectId);
return response;
}
diff --git a/core/pom.xml b/core/pom.xml
index c3aa14b..252da50 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -109,6 +109,12 @@
${project.version}
+
+ org.opendevstack.apiservice
+ external-service-marketplace
+ ${project.version}
+
+
org.opendevstack.apiservice
api-project-users
@@ -121,6 +127,12 @@
${project.version}
+
+ org.opendevstack.apiservice
+ api-project-component-v0
+ ${project.version}
+
+
org.opendevstack.apiservice
api-project-platform
diff --git a/external-service-marketplace/pom.xml b/external-service-marketplace/pom.xml
new file mode 100644
index 0000000..6358551
--- /dev/null
+++ b/external-service-marketplace/pom.xml
@@ -0,0 +1,129 @@
+
+ 4.0.0
+
+
+ org.opendevstack.apiservice
+ devstack-api-service
+ 0.0.3
+
+
+ external-service-marketplace
+ External Service Marketplace 2.0
+ Service module for integrating with Marketplace 2.0
+
+
+
+
+ org.opendevstack.apiservice
+ external-service-api
+ ${project.version}
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+
+
+ org.wiremock.integrations
+ wiremock-spring-boot
+ 3.10.0
+ test
+
+
+
+
+ org.openapitools
+ jackson-databind-nullable
+ ${jackson-databind-nullable.version}
+
+
+
+
+ jakarta.annotation
+ jakarta.annotation-api
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ add-source
+ generate-sources
+
+ add-source
+
+
+
+ ${project.basedir}/target/generated-sources/openapi/src/main/java
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+
+
diff --git a/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/model/CreateComponentParameter.java b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/model/CreateComponentParameter.java
new file mode 100644
index 0000000..a4409c3
--- /dev/null
+++ b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/model/CreateComponentParameter.java
@@ -0,0 +1,17 @@
+package org.opendevstack.apiservice.externalservice.marketplace.model;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class CreateComponentParameter {
+
+ private String name;
+ private String type;
+ private String value;
+
+}
diff --git a/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/model/ProjectComponent.java b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/model/ProjectComponent.java
new file mode 100644
index 0000000..89b640b
--- /dev/null
+++ b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/model/ProjectComponent.java
@@ -0,0 +1,18 @@
+package org.opendevstack.apiservice.externalservice.marketplace.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ProjectComponent {
+
+ private String componentId;
+ private String status;
+ private boolean canBeDeleted;
+ private String logoUrl;
+ private String componentUrl;
+
+}
diff --git a/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/service/MarketplaceService.java b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/service/MarketplaceService.java
new file mode 100644
index 0000000..8873f42
--- /dev/null
+++ b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/service/MarketplaceService.java
@@ -0,0 +1,15 @@
+package org.opendevstack.apiservice.externalservice.marketplace.service;
+
+import org.opendevstack.apiservice.externalservice.api.ExternalService;
+import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
+import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
+
+import java.util.List;
+
+public interface MarketplaceService extends ExternalService {
+
+
+ ProjectComponent getProjectComponent(String projectId, String componentId);
+
+ ProjectComponent createProjectComponent(String projectId, List params);
+}
diff --git a/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/service/impl/MarketplaceServiceMockImpl.java b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/service/impl/MarketplaceServiceMockImpl.java
new file mode 100644
index 0000000..2301a76
--- /dev/null
+++ b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/service/impl/MarketplaceServiceMockImpl.java
@@ -0,0 +1,74 @@
+package org.opendevstack.apiservice.externalservice.marketplace.service.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.opendevstack.apiservice.externalservice.marketplace.model.CreateComponentParameter;
+import org.opendevstack.apiservice.externalservice.marketplace.model.ProjectComponent;
+import org.opendevstack.apiservice.externalservice.marketplace.service.MarketplaceService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class MarketplaceServiceMockImpl implements MarketplaceService {
+
+ @Override
+ public boolean isHealthy() {
+ return true;
+ }
+
+ private Map mockComponentsCache = new HashMap<>();
+
+ public ProjectComponent getProjectComponent(String projectId, String componentId) {
+ log.info("Get component with id '" + componentId + "' for project '" + projectId + "'");
+ ComposedId composedId = new ComposedId(projectId, componentId);
+ return mockComponentsCache.get(composedId);
+ }
+
+ public ProjectComponent createProjectComponent(String projectId, List createComponentParams) {
+ log.info("Creating component for project '" + projectId + "'" + " with request: " + createComponentParams);
+ ProjectComponent mockComponent = new ProjectComponent();
+ mockComponent.setComponentId(generateNextId());
+ mockComponent.setCanBeDeleted(true);
+ mockComponent.setStatus("CREATING");
+ ComposedId composedId = new ComposedId(projectId, mockComponent.getComponentId());
+ mockComponentsCache.put(composedId, mockComponent);
+
+ return mockComponent;
+ }
+
+ private String generateNextId() {
+ return "mock-component-id-" + (mockComponentsCache.size() + 1);
+ }
+
+ class ComposedId {
+ private String projectId;
+ private String componentId;
+
+ public ComposedId(String projectId, String componentId) {
+ this.projectId = projectId;
+ this.componentId = componentId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ComposedId that = (ComposedId) o;
+
+ if (!projectId.equals(that.projectId)) return false;
+ return componentId.equals(that.componentId);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = projectId.hashCode();
+ result = 31 * result + componentId.hashCode();
+ return result;
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index 01d9d24..2a5aace 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,6 +53,7 @@
external-service-ocp
external-service-bitbucket
external-service-jira
+ external-service-marketplace
external-service-webhookproxy
service-projects
api-project-users