Skip to content

Commit b6ed20c

Browse files
committed
[backend] feat : add update connector instance
Signed-off-by: Marine LM <[email protected]>
1 parent e66569b commit b6ed20c

34 files changed

+947
-853
lines changed

openaev-api/src/main/java/io/openaev/rest/catalog_connector/dto/CatalogConnectorSimpleOutput.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,7 @@ public class CatalogConnectorSimpleOutput {
1414

1515
@JsonProperty("catalog_connector_short_description")
1616
private String shortDescription;
17+
18+
@JsonProperty("catalog_connector_logo_url")
19+
private String logoUrl;
1720
}

openaev-api/src/main/java/io/openaev/rest/connector_instance/ConnectorInstanceApi.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
package io.openaev.rest.connector_instance;
22

33
import io.openaev.aop.RBAC;
4-
import io.openaev.database.model.Action;
5-
import io.openaev.database.model.ConnectorInstance;
6-
import io.openaev.database.model.ConnectorInstanceLog;
7-
import io.openaev.database.model.ResourceType;
8-
import io.openaev.rest.connector_instance.dto.ConnectorInstanceHealthInput;
9-
import io.openaev.rest.connector_instance.dto.ConnectorInstanceLogsInput;
10-
import io.openaev.rest.connector_instance.dto.CreateConnectorInstanceInput;
11-
import io.openaev.rest.connector_instance.dto.UpdateConnectorInstanceRequestedStatus;
4+
import io.openaev.database.model.*;
5+
import io.openaev.rest.connector_instance.dto.*;
126
import io.openaev.rest.helper.RestBehavior;
137
import io.openaev.service.ConnectorInstanceLogService;
148
import io.openaev.service.connector_instances.ConnectorInstanceService;
@@ -26,6 +20,7 @@
2620
import org.springframework.web.bind.annotation.*;
2721

2822
import java.util.List;
23+
import java.util.Set;
2924

3025
@RestController
3126
@RequiredArgsConstructor
@@ -61,9 +56,39 @@ public ConnectorInstance createConnectorInstance(
6156
responseCode = "200",
6257
description = "Successfully retrieved connector instance")
6358
})
64-
public ConnectorInstance getConnectorInstance(
59+
public ConnectorInstanceOutput getConnectorInstance(
6560
@PathVariable @NotBlank final String connectorInstanceId) {
66-
return connectorInstanceService.connectorInstanceById(connectorInstanceId);
61+
return connectorInstanceService.connectorInstanceOutputById(connectorInstanceId);
62+
}
63+
64+
@GetMapping(value = CONNECTOR_INSTANCE_URI + "/{connectorInstanceId}/configurations")
65+
@Operation(summary = "Retrieve connector Instance configuratiosn by instance id")
66+
@RBAC(actionPerformed = Action.READ, resourceType = ResourceType.CATALOG)
67+
@ApiResponse(
68+
responseCode = "200",
69+
content =
70+
@Content(
71+
mediaType = "application/json",
72+
array = @ArraySchema(schema = @Schema(implementation = ConnectorInstanceConfiguration.class))))
73+
public Set<ConnectorInstanceConfiguration> getConnectorInstanceConfiguration(
74+
@PathVariable @NotBlank final String connectorInstanceId) {
75+
return connectorInstanceService.getConnectorInstanceConfigurations(connectorInstanceId);
76+
}
77+
78+
@PutMapping(value = CONNECTOR_INSTANCE_URI + "/{connectorInstanceId}/configurations")
79+
@Operation(
80+
summary = "Update connector instance configuration")
81+
@RBAC(actionPerformed = Action.WRITE, resourceType = ResourceType.CATALOG)
82+
@ApiResponse(
83+
responseCode = "200",
84+
content =
85+
@Content(
86+
mediaType = "application/json",
87+
array = @ArraySchema(schema = @Schema(implementation = ConnectorInstanceConfiguration.class))))
88+
public List<ConnectorInstanceConfiguration> updateConnectorInstanceConfigurations(
89+
@PathVariable @NotBlank final String connectorInstanceId,
90+
@Valid @RequestBody CreateConnectorInstanceInput input) {
91+
return orchestrationService.updateConnectorInstanceConfiguration(connectorInstanceId, input);
6792
}
6893

6994
@GetMapping(value = CONNECTOR_INSTANCE_URI + "/{connectorInstanceId}/logs")
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.openaev.rest.connector_instance.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import io.openaev.database.model.ConnectorInstance;
5+
import jakarta.validation.constraints.NotBlank;
6+
import jakarta.validation.constraints.NotNull;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
10+
@Builder
11+
@Data
12+
public class ConnectorInstanceOutput {
13+
@JsonProperty("connector_instance_id")
14+
@NotBlank
15+
private String id;
16+
17+
@JsonProperty("connector_instance_current_status")
18+
@NotNull
19+
private ConnectorInstance.CURRENT_STATUS_TYPE currentStatus;
20+
21+
@JsonProperty("connector_instance_requested_status")
22+
private ConnectorInstance.REQUESTED_STATUS_TYPE requestedStatus;
23+
}

openaev-api/src/main/java/io/openaev/service/ConnectorOrchestrationService.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
package io.openaev.service;
22

3-
import static io.openaev.database.model.SettingKeys.*;
43

54
import io.openaev.api.xtm_composer.dto.XtmComposerInstanceOutput;
65
import io.openaev.config.cache.LicenseCacheManager;
7-
import io.openaev.database.model.BaseConnectorEntity;
8-
import io.openaev.database.model.CatalogConnector;
9-
import io.openaev.database.model.ConnectorInstance;
10-
import io.openaev.database.model.Setting;
6+
import io.openaev.database.model.*;
117
import io.openaev.ee.Ee;
128
import io.openaev.executors.ExecutorService;
139
import io.openaev.rest.collector.service.CollectorService;
1410
import io.openaev.rest.connector_instance.dto.CreateConnectorInstanceInput;
1511
import java.util.List;
16-
import java.util.Map;
1712
import java.util.Optional;
1813

1914
import io.openaev.rest.exception.LicenseRestrictionException;
@@ -154,4 +149,24 @@ public ConnectorInstance createConnectorInstance(CreateConnectorInstanceInput in
154149
return connectorInstanceService.createConnectorInstance(catalogConnector.get(), input);
155150
}
156151

152+
/**
153+
* Update connector instance configurations
154+
*
155+
* @param connectorInstanceId the identifier of the connector instance to update
156+
* @param input CreateConnectorInstanceInput
157+
* @return list of connector instance configuration updated
158+
*/
159+
public List<ConnectorInstanceConfiguration> updateConnectorInstanceConfiguration(String connectorInstanceId, CreateConnectorInstanceInput input) {
160+
validateEnterpriseLicense();
161+
162+
Optional<CatalogConnector> catalogConnector = catalogConnectorService.findById(input.getCatalogConnectorId());
163+
if (catalogConnector.isEmpty()) {
164+
throw new EntityNotFoundException(
165+
"CatalogConnector with id " + input.getCatalogConnectorId() + " not found");
166+
}
167+
validateXtmComposerIfRequired(catalogConnector.get());
168+
169+
return connectorInstanceService.updateConnectorInstanceConfiguration(connectorInstanceId, catalogConnector.get(), input);
170+
}
171+
157172
}

openaev-api/src/main/java/io/openaev/service/connector_instances/ConnectorInstanceService.java

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
import com.fasterxml.jackson.databind.JsonNode;
88
import com.fasterxml.jackson.databind.ObjectMapper;
99
import io.openaev.database.model.*;
10+
import io.openaev.database.repository.ConnectorInstanceConfigurationRepository;
1011
import io.openaev.database.repository.ConnectorInstanceRepository;
1112
import io.openaev.database.repository.TokenRepository;
1213
import io.openaev.rest.connector_instance.dto.ConnectorInstanceHealthInput;
14+
import io.openaev.rest.connector_instance.dto.ConnectorInstanceOutput;
1315
import io.openaev.rest.connector_instance.dto.CreateConnectorInstanceInput;
1416
import io.openaev.service.ConnectorInstanceLogService;
17+
import io.openaev.utils.mapper.ConnectorInstanceMapper;
1518
import jakarta.persistence.EntityNotFoundException;
1619

1720
import java.util.*;
@@ -30,8 +33,10 @@ public class ConnectorInstanceService {
3033
// TODO clean file + ADD JAVA DOC
3134

3235
private final ObjectMapper objectMapper;
36+
private final ConnectorInstanceMapper connectorInstanceMapper;
3337

3438
private final ConnectorInstanceRepository connectorInstanceRepository;
39+
private final ConnectorInstanceConfigurationRepository connectorInstanceConfigurationRepository;
3540
private final TokenRepository tokenRepository;
3641

3742
private final ConnectorInstanceLogService connectorInstanceLogService;
@@ -67,6 +72,15 @@ public ConnectorInstance connectorInstanceById(String id) {
6772
() -> new EntityNotFoundException("ConnectorInstance with id " + id + " not found"));
6873
}
6974

75+
public ConnectorInstanceOutput connectorInstanceOutputById(String id) {
76+
return connectorInstanceMapper.toConnectorInstanceOutput(connectorInstanceById(id));
77+
}
78+
79+
public Set<ConnectorInstanceConfiguration> getConnectorInstanceConfigurations(String id){
80+
ConnectorInstance connectorInstance = connectorInstanceById(id);
81+
return connectorInstance.getConfigurations();
82+
}
83+
7084
public ConnectorInstance updateCurrentStatus(
7185
String connectorInstanceId, ConnectorInstance.CURRENT_STATUS_TYPE newCurrentStatus) {
7286
ConnectorInstance instance = this.connectorInstanceById(connectorInstanceId);
@@ -138,8 +152,8 @@ private ConnectorInstanceConfiguration createConfigurationFromInput(
138152
}
139153

140154

141-
private List<ConnectorInstanceConfiguration> getConnectorInstanceConfigurations(
142-
ConnectorInstance instance, CatalogConnector catalogConnector, CreateConnectorInstanceInput input ){
155+
private List<ConnectorInstanceConfiguration> getConnectorInstanceConfigurationsFromInput(
156+
ConnectorInstance instance, CatalogConnector catalogConnector, CreateConnectorInstanceInput input){
143157
List<ConnectorInstanceConfiguration> configurations = new ArrayList<>();
144158
Map<String, CatalogConnectorConfiguration> definitionsMap =
145159
catalogConnector.getCatalogConnectorConfigurations().stream()
@@ -181,7 +195,7 @@ private ConnectorInstanceConfiguration createContainerIdConfiguration(ConnectorI
181195

182196
public ConnectorInstance createConnectorInstance(CatalogConnector catalogConnector, CreateConnectorInstanceInput input) {
183197
ConnectorInstance newInstance = buildNewConnectorInstanceFromCatalog(catalogConnector);
184-
List<ConnectorInstanceConfiguration> configurations = getConnectorInstanceConfigurations(newInstance, catalogConnector, input);
198+
List<ConnectorInstanceConfiguration> configurations = getConnectorInstanceConfigurationsFromInput(newInstance, catalogConnector, input);
185199

186200
// Add OpenAEV token
187201
configurations.add(createTokenConfiguration(newInstance));
@@ -192,6 +206,47 @@ public ConnectorInstance createConnectorInstance(CatalogConnector catalogConnect
192206
return this.save(newInstance);
193207
}
194208

209+
private List<ConnectorInstanceConfiguration> mergeConfigurations(
210+
ConnectorInstance instance,
211+
Map<String, ConnectorInstanceConfiguration> existingConfigurationMap,
212+
List<ConnectorInstanceConfiguration> newConfigurations) {
213+
214+
return newConfigurations.stream()
215+
.map(newConfig ->{
216+
ConnectorInstanceConfiguration existingConfig = existingConfigurationMap.get(newConfig.getKey());
217+
218+
if (existingConfig != null) {
219+
existingConfig.setValue(newConfig.getValue());
220+
existingConfig.setEncrypted(newConfig.isEncrypted());
221+
return existingConfig;
222+
} else {
223+
return createConfiguration(
224+
newConfig.getKey(),
225+
newConfig.getValue(),
226+
newConfig.isEncrypted(),
227+
instance
228+
);
229+
}
230+
})
231+
.collect(Collectors.toList());
232+
}
233+
234+
public List<ConnectorInstanceConfiguration> updateConnectorInstanceConfiguration(String connectorInstanceId, CatalogConnector catalogConnector, CreateConnectorInstanceInput input){
235+
ConnectorInstance instance = connectorInstanceById(connectorInstanceId);
236+
Map<String, ConnectorInstanceConfiguration> existingConfigurationMap =
237+
instance.getConfigurations().stream()
238+
.collect(Collectors.toMap(
239+
ConnectorInstanceConfiguration::getKey,
240+
Function.identity()
241+
));
242+
243+
List<ConnectorInstanceConfiguration> newConfigurations = getConnectorInstanceConfigurationsFromInput(instance, catalogConnector, input);
244+
List<ConnectorInstanceConfiguration> configurationsToSave =
245+
mergeConfigurations(instance, existingConfigurationMap, newConfigurations);
246+
247+
return fromIterable(this.connectorInstanceConfigurationRepository.saveAll(configurationsToSave));
248+
}
249+
195250
public ConnectorInstanceLog pushLogsByConnectorInstance(String connectorInstanceId, Set<String> logs) {
196251
if (logs.isEmpty()) {
197252
return null;

openaev-api/src/main/java/io/openaev/utils/mapper/CatalogConnectorMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public CatalogConnectorSimpleOutput toCatalogSimpleOutput(
3939
return CatalogConnectorSimpleOutput.builder()
4040
.id(catalogConnector.getId())
4141
.shortDescription(catalogConnector.getShortDescription())
42+
.logoUrl(catalogConnector.getLogoUrl())
4243
.build();
4344
}
4445

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.openaev.utils.mapper;
2+
3+
import io.openaev.database.model.ConnectorInstance;
4+
import io.openaev.rest.connector_instance.dto.ConnectorInstanceOutput;
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.stereotype.Component;
8+
9+
@RequiredArgsConstructor
10+
@Component
11+
@Slf4j
12+
public class ConnectorInstanceMapper {
13+
14+
public ConnectorInstanceOutput toConnectorInstanceOutput(ConnectorInstance connectorInstance) {
15+
return ConnectorInstanceOutput.builder()
16+
.id(connectorInstance.getId())
17+
.currentStatus(connectorInstance.getCurrentStatus())
18+
.requestedStatus(connectorInstance.getRequestedStatus())
19+
.build();
20+
}
21+
}

openaev-api/src/main/resources/catalog/catalog-integrators.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

openaev-front/src/actions/connector_instances/connector-instance-actions.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
import type { Dispatch } from 'redux';
22

3-
import { delReferential, getReferential, putReferential, simpleCall, simplePostCall } from '../../utils/Action';
3+
import {
4+
delReferential,
5+
getReferential,
6+
putReferential,
7+
simpleCall,
8+
simplePostCall,
9+
simplePutCall,
10+
} from '../../utils/Action';
411
import {
512
type ConnectorInstance,
13+
type ConnectorInstanceOutput,
614
type CreateConnectorInstanceInput,
715
type UpdateConnectorInstanceRequestedStatus,
816
} from '../../utils/api-types';
@@ -19,6 +27,14 @@ export const fetchConnectorInstance = (instanceId: string) => (dispatch: Dispatc
1927
return getReferential(connectorInstance, uri)(dispatch);
2028
};
2129

30+
export const fetchConnectorInstanceConfigurations = (instanceId: string) => {
31+
return simpleCall(`${CONNECTOR_INSTANCE_URI}/${instanceId}/configurations`);
32+
};
33+
34+
export const updateConnectorInstance = (instanceId: string, input: CreateConnectorInstanceInput) => {
35+
return simplePutCall(`${CONNECTOR_INSTANCE_URI}/${instanceId}/configurations`, input, undefined, false);
36+
};
37+
2238
export const updateRequestedStatus = (instanceId: string, data: UpdateConnectorInstanceRequestedStatus) => (dispatch: Dispatch) => {
2339
const uri = `${CONNECTOR_INSTANCE_URI}/${instanceId}/requested-status`;
2440
return putReferential(connectorInstance, uri, data)(dispatch);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import type { ConnectorInstance } from '../../utils/api-types';
1+
import type { ConnectorInstanceOutput } from '../../utils/api-types';
22

3-
export interface ConnectorInstanceHelper { getConnectorInstance: (instanceId: string) => ConnectorInstance }
3+
export interface ConnectorInstanceHelper { getConnectorInstance: (instanceId: string) => ConnectorInstanceOutput }

0 commit comments

Comments
 (0)