Skip to content

Commit fde00dd

Browse files
author
Ella Rohm-Ensing
committed
feat: store contribution info on project update (#13832)
## What <!-- * Describe what the change is solving. * It helps to add screenshots if it affects the frontend. --> We added 2 columns related to contribution info to `connector_builder_project` in https://github.com/airbytehq/airbyte-platform-internal/pull/13597. This PR adds the persistence layers such that when we call `writeConnectorBuilderProject` to create/update a connector builder project, or `getConnectorBuilderProject` to get a project, these fields are stored and returned. ## Can this PR be safely reverted and rolled back? <!-- * If you know that your be safely rolled back, check YES.* * If that is not the case (e.g. a database migration), check NO. * If unsure, leave it blank.* --> - [X] YES 💚 - [ ] NO ❌
1 parent 597bb8b commit fde00dd

File tree

11 files changed

+111
-31
lines changed

11 files changed

+111
-31
lines changed

airbyte-api/server-api/src/main/openapi/config.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -7730,6 +7730,13 @@ components:
77307730
type: string
77317731
baseActorDefinitionVersionId:
77327732
$ref: "#/components/schemas/NullableActorDefinitionVersionId"
7733+
contributionPullRequestUrl:
7734+
type: string
7735+
nullable: true
7736+
contributionActorDefinitionId:
7737+
type: string
7738+
format: uuid
7739+
nullable: true
77337740
ConnectorBuilderProjectDetailsRead:
77347741
type: object
77357742
required:

airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectorBuilderProjectsHandler.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ public ConnectorBuilderProjectIdWithWorkspaceId createConnectorBuilderProject(fi
177177

178178
connectorBuilderService.writeBuilderProjectDraft(id, projectCreate.getWorkspaceId(), projectCreate.getBuilderProject().getName(),
179179
new ObjectMapper().valueToTree(projectCreate.getBuilderProject().getDraftManifest()),
180-
projectCreate.getBuilderProject().getBaseActorDefinitionVersionId());
180+
projectCreate.getBuilderProject().getBaseActorDefinitionVersionId(), projectCreate.getBuilderProject().getContributionPullRequestUrl(),
181+
projectCreate.getBuilderProject().getContributionActorDefinitionId());
181182

182183
return buildIdResponseFromId(id, projectCreate.getWorkspaceId());
183184
}
@@ -193,6 +194,12 @@ private ConnectorBuilderProjectDetails applyPatchDefaultsFromDb(final ConnectorB
193194
if (projectDetailsUpdate.getBaseActorDefinitionVersionId() == null) {
194195
projectDetailsUpdate.setBaseActorDefinitionVersionId(persistedProject.getBaseActorDefinitionVersionId());
195196
}
197+
if (projectDetailsUpdate.getContributionPullRequestUrl() == null) {
198+
projectDetailsUpdate.setContributionPullRequestUrl(persistedProject.getContributionPullRequestUrl());
199+
}
200+
if (projectDetailsUpdate.getContributionActorDefinitionId() == null) {
201+
projectDetailsUpdate.setContributionActorDefinitionId(persistedProject.getContributionActorDefinitionId());
202+
}
196203
return projectDetailsUpdate;
197204
}
198205

airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConfigRepositoryBuilderProjectUpdater.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,17 @@ public void persistBuilderProjectUpdate(final ExistingConnectorBuilderProjectWit
3131
projectUpdate.getBuilderProject().getName(),
3232
projectUpdate.getBuilderProject().getDraftManifest(),
3333
projectUpdate.getBuilderProject().getBaseActorDefinitionVersionId(),
34+
projectUpdate.getBuilderProject().getContributionPullRequestUrl(),
35+
projectUpdate.getBuilderProject().getContributionActorDefinitionId(),
3436
connectorBuilderProject.getActorDefinitionId());
3537
} else {
3638
connectorBuilderService.writeBuilderProjectDraft(projectUpdate.getBuilderProjectId(),
3739
projectUpdate.getWorkspaceId(),
3840
projectUpdate.getBuilderProject().getName(),
3941
projectUpdate.getBuilderProject().getDraftManifest(),
40-
projectUpdate.getBuilderProject().getBaseActorDefinitionVersionId());
42+
projectUpdate.getBuilderProject().getBaseActorDefinitionVersionId(),
43+
projectUpdate.getBuilderProject().getContributionPullRequestUrl(),
44+
projectUpdate.getBuilderProject().getContributionActorDefinitionId());
4145
}
4246

4347
}

airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectorBuilderProjectsHandlerTest.java

+10-7
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,8 @@ void testCreateConnectorBuilderProject() throws IOException {
244244

245245
verify(connectorBuilderService, times(1))
246246
.writeBuilderProjectDraft(
247-
project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(), project.getManifestDraft(), null);
247+
project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(), project.getManifestDraft(),
248+
project.getBaseActorDefinitionVersionId(), project.getContributionPullRequestUrl(), project.getContributionActorDefinitionId());
248249
}
249250

250251
@Test
@@ -305,7 +306,7 @@ void testUpdateConnectorBuilderProjectValidateWorkspace() throws IOException, Co
305306
assertThrows(ConfigNotFoundException.class, () -> connectorBuilderProjectsHandler.updateConnectorBuilderProject(update));
306307

307308
verify(connectorBuilderService, never()).writeBuilderProjectDraft(any(UUID.class), any(UUID.class), any(String.class), any(JsonNode.class),
308-
any(UUID.class));
309+
any(UUID.class), any(String.class), any(UUID.class));
309310
}
310311

311312
@Test
@@ -851,23 +852,25 @@ void testCreateForkedConnectorBuilderProject() throws JsonValidationException, C
851852
new ConnectorBuilderProjectForkRequestBody().workspaceId(workspaceId).baseActorDefinitionId(baseActorDefinitionId);
852853

853854
final String connectorName = "Test Connector";
854-
final UUID defaultVersionId = UUID.randomUUID();
855+
final UUID baseActorDefinitionVersionId = UUID.randomUUID();
855856
final String dockerRepository = "airbyte/source-test";
856857
final String dockerImageTag = "1.2.3";
857-
final ActorDefinitionVersion defaultADV = new ActorDefinitionVersion().withVersionId(defaultVersionId)
858+
final ActorDefinitionVersion defaultADV = new ActorDefinitionVersion().withVersionId(baseActorDefinitionVersionId)
858859
.withActorDefinitionId(baseActorDefinitionId).withDockerRepository(dockerRepository).withDockerImageTag(dockerImageTag);
859860
final UUID connectorBuilderProjectId = UUID.randomUUID();
860861

861862
when(sourceService.getStandardSourceDefinition(baseActorDefinitionId)).thenReturn(
862-
new StandardSourceDefinition().withSourceDefinitionId(baseActorDefinitionId).withDefaultVersionId(defaultVersionId).withName(connectorName));
863-
when(actorDefinitionService.getActorDefinitionVersion(defaultVersionId)).thenReturn(defaultADV);
863+
new StandardSourceDefinition().withSourceDefinitionId(baseActorDefinitionId).withDefaultVersionId(baseActorDefinitionVersionId)
864+
.withName(connectorName));
865+
when(actorDefinitionService.getActorDefinitionVersion(baseActorDefinitionVersionId)).thenReturn(defaultADV);
864866
when(remoteDefinitionsProvider.getConnectorManifest(dockerRepository, dockerImageTag)).thenReturn(Optional.of(draftManifest));
865867
when(uuidSupplier.get()).thenReturn(connectorBuilderProjectId);
866868

867869
connectorBuilderProjectsHandler.createForkedConnectorBuilderProject(requestBody);
868870

869871
verify(connectorBuilderService, times(1))
870-
.writeBuilderProjectDraft(eq(connectorBuilderProjectId), eq(workspaceId), eq(connectorName), eq(draftManifest), eq(defaultVersionId));
872+
.writeBuilderProjectDraft(eq(connectorBuilderProjectId), eq(workspaceId), eq(connectorName), eq(draftManifest),
873+
eq(baseActorDefinitionVersionId), eq(null), eq(null));
871874
}
872875

873876
}

airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/helpers/ConfigRepositoryBuilderProjectUpdaterTest.java

+14-5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class ConfigRepositoryBuilderProjectUpdaterTest {
3737
private static final String A_SOURCE_NAME = "a source name";
3838
private static final JsonNode A_MANIFEST;
3939
private static final UUID A_BASE_ACTOR_DEFINITION_VERSION_ID = UUID.randomUUID();
40+
private static final String A_CONTRIBUTION_PULL_REQUEST_URL = "https://github.com/airbytehq/airbyte/pull/1234";
41+
private static final UUID A_CONTRIBUTION_ACTOR_DEFINITION_ID = UUID.randomUUID();
4042

4143
static {
4244
try {
@@ -86,7 +88,8 @@ void testUpdateConnectorBuilderProjectWipeDraft() throws IOException, ConfigNotF
8688

8789
verify(connectorBuilderService, times(1))
8890
.writeBuilderProjectDraft(
89-
project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(), null, null);
91+
project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(), null, project.getBaseActorDefinitionVersionId(),
92+
project.getContributionPullRequestUrl(), project.getContributionActorDefinitionId());
9093
}
9194

9295
@Test
@@ -107,7 +110,8 @@ void testUpdateConnectorBuilderProject() throws IOException, ConfigNotFoundExcep
107110

108111
verify(connectorBuilderService, times(1))
109112
.writeBuilderProjectDraft(
110-
project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(), project.getManifestDraft(), null);
113+
project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(), project.getManifestDraft(),
114+
project.getBaseActorDefinitionVersionId(), project.getContributionPullRequestUrl(), project.getContributionActorDefinitionId());
111115
}
112116

113117
@Test
@@ -116,19 +120,24 @@ void givenActorDefinitionAssociatedWithProjectWhenUpdateConnectorBuilderProjectT
116120
.withBuilderProjectId(A_BUILDER_PROJECT_ID)
117121
.withWorkspaceId(A_WORKSPACE_ID)
118122
.withActorDefinitionId(A_SOURCE_DEFINITION_ID)
119-
.withBaseActorDefinitionVersionId(A_BASE_ACTOR_DEFINITION_VERSION_ID));
123+
.withBaseActorDefinitionVersionId(A_BASE_ACTOR_DEFINITION_VERSION_ID)
124+
.withContributionPullRequestUrl(A_CONTRIBUTION_PULL_REQUEST_URL)
125+
.withContributionActorDefinitionId(A_CONTRIBUTION_ACTOR_DEFINITION_ID));
120126

121127
projectUpdater.persistBuilderProjectUpdate(new ExistingConnectorBuilderProjectWithWorkspaceId()
122128
.builderProject(new ConnectorBuilderProjectDetails()
123129
.name(A_SOURCE_NAME)
124130
.draftManifest(A_MANIFEST)
125-
.baseActorDefinitionVersionId(A_BASE_ACTOR_DEFINITION_VERSION_ID))
131+
.baseActorDefinitionVersionId(A_BASE_ACTOR_DEFINITION_VERSION_ID)
132+
.contributionPullRequestUrl(A_CONTRIBUTION_PULL_REQUEST_URL)
133+
.contributionActorDefinitionId(A_CONTRIBUTION_ACTOR_DEFINITION_ID))
126134
.workspaceId(A_WORKSPACE_ID)
127135
.builderProjectId(A_BUILDER_PROJECT_ID));
128136

129137
verify(connectorBuilderService, times(1))
130138
.updateBuilderProjectAndActorDefinition(
131-
A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, A_SOURCE_NAME, A_MANIFEST, A_BASE_ACTOR_DEFINITION_VERSION_ID, A_SOURCE_DEFINITION_ID);
139+
A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, A_SOURCE_NAME, A_MANIFEST, A_BASE_ACTOR_DEFINITION_VERSION_ID, A_CONTRIBUTION_PULL_REQUEST_URL,
140+
A_CONTRIBUTION_ACTOR_DEFINITION_ID, A_SOURCE_DEFINITION_ID);
132141
}
133142

134143
private ConnectorBuilderProject generateBuilderProject() throws JsonProcessingException {

airbyte-config/config-models/src/main/resources/types/ConnectorBuilderProject.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,10 @@ properties:
3939
description: Optional base actor definition version id. Existence indicates that the project was created by forking an existing connector.
4040
type: string
4141
format: uuid
42+
contributionPullRequestUrl:
43+
description: Optional URL of the contribution pull request
44+
type: string
45+
contributionActorDefinitionId:
46+
description: Optional actor definition id the pull request is contributing to
47+
type: string
48+
format: uuid

airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/ConnectorBuilderProjectPersistenceTest.java

+34-10
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ void testListWithNoManifest() throws IOException {
178178
// actually set draft to null for first project
179179
project1.setManifestDraft(null);
180180
project1.setHasDraft(false);
181-
connectorBuilderService.writeBuilderProjectDraft(project1.getBuilderProjectId(), project1.getWorkspaceId(), project1.getName(), null, null);
181+
connectorBuilderService.writeBuilderProjectDraft(project1.getBuilderProjectId(), project1.getWorkspaceId(), project1.getName(), null,
182+
project1.getBaseActorDefinitionVersionId(), project1.getContributionPullRequestUrl(), project1.getContributionActorDefinitionId());
182183

183184
// set draft to null because it won't be returned as part of listing call
184185
project2.setManifestDraft(null);
@@ -196,13 +197,14 @@ void testUpdate() throws IOException, ConfigNotFoundException {
196197
project1.setName("Updated name");
197198
project1.setManifestDraft(new ObjectMapper().readTree("{}"));
198199
connectorBuilderService.writeBuilderProjectDraft(project1.getBuilderProjectId(), project1.getWorkspaceId(), project1.getName(),
199-
project1.getManifestDraft(), project1.getBaseActorDefinitionVersionId());
200+
project1.getManifestDraft(), project1.getBaseActorDefinitionVersionId(), project1.getContributionPullRequestUrl(),
201+
project1.getContributionActorDefinitionId());
200202
assertEquals(project1, connectorBuilderService.getConnectorBuilderProject(project1.getBuilderProjectId(), true));
201203
}
202204

203205
@Test
204206
void whenUpdateBuilderProjectAndActorDefinitionThenUpdateConnectorBuilderAndActorDefinition() throws Exception {
205-
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, A_PROJECT_NAME, A_MANIFEST, null);
207+
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, A_PROJECT_NAME, A_MANIFEST, null, null, null);
206208
workspaceService.writeStandardWorkspaceNoSecrets(MockData.standardWorkspaces().get(0).withWorkspaceId(A_WORKSPACE_ID));
207209
sourceService.writeCustomConnectorMetadata(MockData.customSourceDefinition()
208210
.withSourceDefinitionId(A_SOURCE_DEFINITION_ID)
@@ -211,7 +213,7 @@ void whenUpdateBuilderProjectAndActorDefinitionThenUpdateConnectorBuilderAndActo
211213
MockData.actorDefinitionVersion().withActorDefinitionId(A_SOURCE_DEFINITION_ID), A_WORKSPACE_ID, ScopeType.WORKSPACE);
212214

213215
connectorBuilderService.updateBuilderProjectAndActorDefinition(
214-
A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, ANOTHER_PROJECT_NAME, ANOTHER_MANIFEST, null, A_SOURCE_DEFINITION_ID);
216+
A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, ANOTHER_PROJECT_NAME, ANOTHER_MANIFEST, null, null, null, A_SOURCE_DEFINITION_ID);
215217

216218
final ConnectorBuilderProject updatedConnectorBuilder = connectorBuilderService.getConnectorBuilderProject(A_BUILDER_PROJECT_ID, true);
217219
assertEquals(ANOTHER_PROJECT_NAME, updatedConnectorBuilder.getName());
@@ -221,7 +223,7 @@ void whenUpdateBuilderProjectAndActorDefinitionThenUpdateConnectorBuilderAndActo
221223

222224
@Test
223225
void givenSourceIsPublicWhenUpdateBuilderProjectAndActorDefinitionThenActorDefinitionNameIsNotUpdated() throws Exception {
224-
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, A_PROJECT_NAME, A_MANIFEST, null);
226+
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, A_PROJECT_NAME, A_MANIFEST, null, null, null);
225227
workspaceService.writeStandardWorkspaceNoSecrets(MockData.standardWorkspaces().get(0).withWorkspaceId(A_WORKSPACE_ID));
226228
sourceService.writeCustomConnectorMetadata(MockData.customSourceDefinition()
227229
.withSourceDefinitionId(A_SOURCE_DEFINITION_ID)
@@ -230,7 +232,7 @@ void givenSourceIsPublicWhenUpdateBuilderProjectAndActorDefinitionThenActorDefin
230232
MockData.actorDefinitionVersion().withActorDefinitionId(A_SOURCE_DEFINITION_ID), A_WORKSPACE_ID, ScopeType.WORKSPACE);
231233

232234
connectorBuilderService.updateBuilderProjectAndActorDefinition(
233-
A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, ANOTHER_PROJECT_NAME, ANOTHER_MANIFEST, null, A_SOURCE_DEFINITION_ID);
235+
A_BUILDER_PROJECT_ID, A_WORKSPACE_ID, ANOTHER_PROJECT_NAME, ANOTHER_MANIFEST, null, null, null, A_SOURCE_DEFINITION_ID);
234236

235237
assertEquals(A_PROJECT_NAME, sourceService.getStandardSourceDefinition(A_SOURCE_DEFINITION_ID).getName());
236238
}
@@ -263,13 +265,15 @@ void givenProjectDoesNotExistWhenGetVersionedConnectorBuilderProjectThenThrowExc
263265

264266
@Test
265267
void givenNoMatchingActiveDeclarativeManifestWhenGetVersionedConnectorBuilderProjectThenThrowException() throws IOException {
266-
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, ANY_UUID, A_PROJECT_NAME, new ObjectMapper().readTree("{}"), null);
268+
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, ANY_UUID, A_PROJECT_NAME, new ObjectMapper().readTree("{}"), null, null,
269+
null);
267270
assertThrows(ConfigNotFoundException.class, () -> connectorBuilderService.getVersionedConnectorBuilderProject(A_BUILDER_PROJECT_ID, 1L));
268271
}
269272

270273
@Test
271274
void whenGetVersionedConnectorBuilderProjectThenReturnVersionedProject() throws ConfigNotFoundException, IOException {
272-
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, ANY_UUID, A_PROJECT_NAME, new ObjectMapper().readTree("{}"), null);
275+
connectorBuilderService.writeBuilderProjectDraft(A_BUILDER_PROJECT_ID, ANY_UUID, A_PROJECT_NAME, new ObjectMapper().readTree("{}"), null, null,
276+
null);
273277
connectorBuilderService.assignActorDefinitionToConnectorBuilderProject(A_BUILDER_PROJECT_ID, A_SOURCE_DEFINITION_ID);
274278
connectorBuilderService.insertActiveDeclarativeManifest(anyDeclarativeManifest()
275279
.withActorDefinitionId(A_SOURCE_DEFINITION_ID)
@@ -343,12 +347,31 @@ void testCreateForkedProject() throws IOException, ConfigNotFoundException {
343347
.withBaseActorDefinitionVersionId(forkedADVId);
344348

345349
connectorBuilderService.writeBuilderProjectDraft(forkedProject.getBuilderProjectId(), forkedProject.getWorkspaceId(), forkedProject.getName(),
346-
forkedProject.getManifestDraft(), forkedProject.getBaseActorDefinitionVersionId());
350+
forkedProject.getManifestDraft(), forkedProject.getBaseActorDefinitionVersionId(), forkedProject.getContributionPullRequestUrl(),
351+
forkedProject.getContributionActorDefinitionId());
347352

348353
final ConnectorBuilderProject project = connectorBuilderService.getConnectorBuilderProject(forkedProject.getBuilderProjectId(), false);
349354
assertEquals(forkedADVId, project.getBaseActorDefinitionVersionId());
350355
}
351356

357+
@Test
358+
void testAddContributionInfo() throws IOException, ConfigNotFoundException {
359+
createBaseObjects();
360+
final UUID contributionActorDefinitionId = UUID.randomUUID();
361+
final String contributionPullRequestUrl = "https://github.com/airbytehq/airbyte/pull/1234";
362+
363+
project1.setContributionPullRequestUrl(contributionPullRequestUrl);
364+
project1.setContributionActorDefinitionId(contributionActorDefinitionId);
365+
366+
connectorBuilderService.writeBuilderProjectDraft(project1.getBuilderProjectId(), project1.getWorkspaceId(), project1.getName(),
367+
project1.getManifestDraft(), project1.getBaseActorDefinitionVersionId(), project1.getContributionPullRequestUrl(),
368+
project1.getContributionActorDefinitionId());
369+
370+
final ConnectorBuilderProject updatedProject = connectorBuilderService.getConnectorBuilderProject(project1.getBuilderProjectId(), true);
371+
assertEquals(contributionPullRequestUrl, updatedProject.getContributionPullRequestUrl());
372+
assertEquals(contributionActorDefinitionId, updatedProject.getContributionActorDefinitionId());
373+
}
374+
352375
private DeclarativeManifest anyDeclarativeManifest() {
353376
try {
354377
return new DeclarativeManifest()
@@ -387,7 +410,8 @@ private ConnectorBuilderProject createConnectorBuilderProject(final UUID workspa
387410
.withHasDraft(true)
388411
.withWorkspaceId(workspace);
389412
connectorBuilderService.writeBuilderProjectDraft(project.getBuilderProjectId(), project.getWorkspaceId(), project.getName(),
390-
project.getManifestDraft(), project.getBaseActorDefinitionVersionId());
413+
project.getManifestDraft(), project.getBaseActorDefinitionVersionId(), project.getContributionPullRequestUrl(),
414+
project.getContributionActorDefinitionId());
391415
if (deleted) {
392416
connectorBuilderService.deleteBuilderProject(project.getBuilderProjectId());
393417
}

airbyte-data/src/main/java/io/airbyte/data/services/ConnectorBuilderService.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ void writeBuilderProjectDraft(UUID projectId,
3838
UUID workspaceId,
3939
String name,
4040
JsonNode manifestDraft,
41-
UUID baseActorDefinitionVersionId)
41+
UUID baseActorDefinitionVersionId,
42+
String contributionUrl,
43+
UUID contributionActorDefinitionId)
4244
throws IOException;
4345

4446
void deleteBuilderProjectDraft(UUID projectId) throws IOException;
@@ -50,6 +52,8 @@ void updateBuilderProjectAndActorDefinition(UUID projectId,
5052
String name,
5153
JsonNode manifestDraft,
5254
UUID baseActorDefinitionVersionId,
55+
String contributionUrl,
56+
UUID contributionActorDefinitionId,
5357
UUID actorDefinitionId)
5458
throws IOException;
5559

0 commit comments

Comments
 (0)