Skip to content

Commit afc52cf

Browse files
clnolljoeykmh
andcommitted
chore: update list_for_workspace to get actor definitions by workspace (#16963)
Co-authored-by: josephkmh <[email protected]>
1 parent e367090 commit afc52cf

File tree

18 files changed

+792
-113
lines changed

18 files changed

+792
-113
lines changed

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ paths:
644644
content:
645645
application/json:
646646
schema:
647-
$ref: "#/components/schemas/WorkspaceIdRequestBody"
647+
$ref: "#/components/schemas/WorkspaceIdActorDefinitionRequestBody"
648648
responses:
649649
"200":
650650
description: Successful operation
@@ -1682,7 +1682,7 @@ paths:
16821682
content:
16831683
application/json:
16841684
schema:
1685-
$ref: "#/components/schemas/WorkspaceIdRequestBody"
1685+
$ref: "#/components/schemas/WorkspaceIdActorDefinitionRequestBody"
16861686
responses:
16871687
"200":
16881688
description: Successful operation
@@ -10698,6 +10698,18 @@ components:
1069810698
$ref: "#/components/schemas/WorkspaceId"
1069910699
includeTombstone:
1070010700
type: boolean
10701+
WorkspaceIdActorDefinitionRequestBody:
10702+
type: object
10703+
required:
10704+
- workspaceId
10705+
properties:
10706+
workspaceId:
10707+
$ref: "#/components/schemas/WorkspaceId"
10708+
includeTombstone:
10709+
type: boolean
10710+
filterByUsed:
10711+
type: boolean
10712+
default: false
1070110713
ListConnectionsForWorkspacesRequestBody:
1070210714
type: object
1070310715
required:

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

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.airbyte.api.model.generated.DestinationRead;
1616
import io.airbyte.api.model.generated.PrivateDestinationDefinitionRead;
1717
import io.airbyte.api.model.generated.PrivateDestinationDefinitionReadList;
18+
import io.airbyte.api.model.generated.WorkspaceIdActorDefinitionRequestBody;
1819
import io.airbyte.api.model.generated.WorkspaceIdRequestBody;
1920
import io.airbyte.api.problems.model.generated.ProblemMessageData;
2021
import io.airbyte.api.problems.throwable.generated.BadRequestProblem;
@@ -196,12 +197,31 @@ public DestinationDefinitionReadList listLatestDestinationDefinitions() {
196197
return toDestinationDefinitionReadList(validDestinationDefs, destinationDefVersions);
197198
}
198199

199-
public DestinationDefinitionReadList listDestinationDefinitionsForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody)
200+
public DestinationDefinitionReadList listDestinationDefinitionsForWorkspace(final WorkspaceIdActorDefinitionRequestBody workspaceIdActorDefinitionRequestBody)
200201
throws IOException, JsonValidationException, ConfigNotFoundException {
202+
if (workspaceIdActorDefinitionRequestBody.getFilterByUsed() != null && workspaceIdActorDefinitionRequestBody.getFilterByUsed()) {
203+
return listDestinationDefinitionsUsedByWorkspace(workspaceIdActorDefinitionRequestBody.getWorkspaceId());
204+
} else {
205+
return listAllowedDestinationDefinitions(workspaceIdActorDefinitionRequestBody.getWorkspaceId());
206+
}
207+
}
208+
209+
DestinationDefinitionReadList listDestinationDefinitionsUsedByWorkspace(final UUID workspaceId)
210+
throws IOException {
201211

212+
final List<StandardDestinationDefinition> destinationDefs = destinationService.listDestinationDefinitionsForWorkspace(workspaceId, false);
213+
214+
final Map<UUID, ActorDefinitionVersion> destinationDefVersionMap =
215+
actorDefinitionVersionHelper.getDestinationVersions(destinationDefs, workspaceId);
216+
217+
return toDestinationDefinitionReadList(destinationDefs, destinationDefVersionMap);
218+
}
219+
220+
DestinationDefinitionReadList listAllowedDestinationDefinitions(final UUID workspaceId)
221+
throws IOException, JsonValidationException, ConfigNotFoundException {
202222
final List<StandardDestinationDefinition> publicDestinationDefs = destinationService.listPublicDestinationDefinitions(false);
203223

204-
final StandardWorkspace workspace = workspaceService.getStandardWorkspaceNoSecrets(workspaceIdRequestBody.getWorkspaceId(), true);
224+
final StandardWorkspace workspace = workspaceService.getStandardWorkspaceNoSecrets(workspaceId, true);
205225
final Map<UUID, Boolean> publicDestinationEntitlements = licenseEntitlementChecker.checkEntitlements(
206226
workspace.getOrganizationId(),
207227
Entitlement.DESTINATION_CONNECTOR,
@@ -212,18 +232,18 @@ public DestinationDefinitionReadList listDestinationDefinitionsForWorkspace(fina
212232

213233
final List<StandardDestinationDefinition> destinationDefs = Stream.concat(
214234
entitledPublicDestinationDefs,
215-
destinationService.listGrantedDestinationDefinitions(workspaceIdRequestBody.getWorkspaceId(), false).stream()).toList();
235+
destinationService.listGrantedDestinationDefinitions(workspaceId, false).stream()).toList();
216236

217237
// Hide destination definitions from the list via feature flag
218238
final List<StandardDestinationDefinition> shownDestinationDefs = destinationDefs
219239
.stream().filter((destinationDefinition) -> !featureFlagClient.boolVariation(
220240
HideActorDefinitionFromList.INSTANCE,
221241
new Multi(List.of(new DestinationDefinition(destinationDefinition.getDestinationDefinitionId()),
222-
new Workspace(workspaceIdRequestBody.getWorkspaceId())))))
242+
new Workspace(workspaceId)))))
223243
.toList();
224244

225245
final Map<UUID, ActorDefinitionVersion> sourceDefVersionMap =
226-
actorDefinitionVersionHelper.getDestinationVersions(shownDestinationDefs, workspaceIdRequestBody.getWorkspaceId());
246+
actorDefinitionVersionHelper.getDestinationVersions(shownDestinationDefs, workspaceId);
227247
return toDestinationDefinitionReadList(shownDestinationDefs, sourceDefVersionMap);
228248
}
229249

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

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.airbyte.api.model.generated.SourceDefinitionReadList;
1717
import io.airbyte.api.model.generated.SourceDefinitionUpdate;
1818
import io.airbyte.api.model.generated.SourceRead;
19+
import io.airbyte.api.model.generated.WorkspaceIdActorDefinitionRequestBody;
1920
import io.airbyte.api.model.generated.WorkspaceIdRequestBody;
2021
import io.airbyte.api.problems.model.generated.ProblemMessageData;
2122
import io.airbyte.api.problems.throwable.generated.BadRequestProblem;
@@ -205,12 +206,32 @@ public SourceDefinitionReadList listLatestSourceDefinitions() {
205206
return toSourceDefinitionReadList(validSourceDefs, sourceDefVersionMap);
206207
}
207208

208-
public SourceDefinitionReadList listSourceDefinitionsForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody)
209+
public SourceDefinitionReadList listSourceDefinitionsForWorkspace(final WorkspaceIdActorDefinitionRequestBody workspaceIdActorDefinitionRequestBody)
209210
throws IOException, JsonValidationException, ConfigNotFoundException {
210211

212+
if (workspaceIdActorDefinitionRequestBody.getFilterByUsed() != null && workspaceIdActorDefinitionRequestBody.getFilterByUsed()) {
213+
return listSourceDefinitionsUsedByWorkspace(workspaceIdActorDefinitionRequestBody.getWorkspaceId());
214+
} else {
215+
return listAllowedSourceDefinitions(workspaceIdActorDefinitionRequestBody.getWorkspaceId());
216+
}
217+
}
218+
219+
SourceDefinitionReadList listSourceDefinitionsUsedByWorkspace(final UUID workspaceId)
220+
throws IOException {
221+
222+
final List<StandardSourceDefinition> sourceDefs = sourceService.listSourceDefinitionsForWorkspace(workspaceId, false);
223+
224+
final Map<UUID, ActorDefinitionVersion> sourceDefVersionMap =
225+
actorDefinitionVersionHelper.getSourceVersions(sourceDefs, workspaceId);
226+
227+
return toSourceDefinitionReadList(sourceDefs, sourceDefVersionMap);
228+
}
229+
230+
SourceDefinitionReadList listAllowedSourceDefinitions(final UUID workspaceId)
231+
throws IOException, JsonValidationException, ConfigNotFoundException {
211232
final List<StandardSourceDefinition> publicSourceDefs = sourceService.listPublicSourceDefinitions(false);
212233

213-
final StandardWorkspace workspace = workspaceService.getStandardWorkspaceNoSecrets(workspaceIdRequestBody.getWorkspaceId(), true);
234+
final StandardWorkspace workspace = workspaceService.getStandardWorkspaceNoSecrets(workspaceId, true);
214235
final Map<UUID, Boolean> publicSourceEntitlements = licenseEntitlementChecker.checkEntitlements(
215236
workspace.getOrganizationId(),
216237
Entitlement.SOURCE_CONNECTOR,
@@ -221,16 +242,16 @@ public SourceDefinitionReadList listSourceDefinitionsForWorkspace(final Workspac
221242

222243
final List<StandardSourceDefinition> sourceDefs = Stream.concat(
223244
entitledPublicSourceDefs,
224-
sourceService.listGrantedSourceDefinitions(workspaceIdRequestBody.getWorkspaceId(), false).stream()).toList();
245+
sourceService.listGrantedSourceDefinitions(workspaceId, false).stream()).toList();
225246

226247
// Hide source definitions from the list via feature flag
227248
final List<StandardSourceDefinition> shownSourceDefs = sourceDefs.stream().filter((sourceDefinition) -> !featureFlagClient.boolVariation(
228249
HideActorDefinitionFromList.INSTANCE,
229-
new Multi(List.of(new SourceDefinition(sourceDefinition.getSourceDefinitionId()), new Workspace(workspaceIdRequestBody.getWorkspaceId())))))
250+
new Multi(List.of(new SourceDefinition(sourceDefinition.getSourceDefinitionId()), new Workspace(workspaceId)))))
230251
.toList();
231252

232253
final Map<UUID, ActorDefinitionVersion> sourceDefVersionMap =
233-
actorDefinitionVersionHelper.getSourceVersions(shownSourceDefs, workspaceIdRequestBody.getWorkspaceId());
254+
actorDefinitionVersionHelper.getSourceVersions(shownSourceDefs, workspaceId);
234255
return toSourceDefinitionReadList(shownSourceDefs, sourceDefVersionMap);
235256
}
236257

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

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.airbyte.api.model.generated.PrivateDestinationDefinitionReadList;
3232
import io.airbyte.api.model.generated.ReleaseStage;
3333
import io.airbyte.api.model.generated.SupportLevel;
34+
import io.airbyte.api.model.generated.WorkspaceIdActorDefinitionRequestBody;
3435
import io.airbyte.api.model.generated.WorkspaceIdRequestBody;
3536
import io.airbyte.api.problems.throwable.generated.BadRequestProblem;
3637
import io.airbyte.commons.entitlements.Entitlement;
@@ -308,7 +309,7 @@ void testListDestinationDefinitionsForWorkspace() throws IOException, URISyntaxE
308309
.supportsDataActivation(destinationDefinitionVersion.getSupportsDataActivation());
309310

310311
final DestinationDefinitionReadList actualDestinationDefinitionReadList = destinationDefinitionsHandler
311-
.listDestinationDefinitionsForWorkspace(new WorkspaceIdRequestBody().workspaceId(workspaceId));
312+
.listDestinationDefinitionsForWorkspace(new WorkspaceIdActorDefinitionRequestBody().workspaceId(workspaceId));
312313

313314
assertEquals(
314315
List.of(expectedDestinationDefinitionRead1),
@@ -334,7 +335,7 @@ void testListDestinationDefinitionsForWorkspaceWithUnentitledConnectors() throws
334335
.thenReturn(Map.of(destinationDefinitionVersion.getActorDefinitionId(), destinationDefinitionVersion));
335336

336337
final DestinationDefinitionReadList actualDestinationDefinitionReadList = destinationDefinitionsHandler
337-
.listDestinationDefinitionsForWorkspace(new WorkspaceIdRequestBody().workspaceId(workspaceId));
338+
.listDestinationDefinitionsForWorkspace(new WorkspaceIdActorDefinitionRequestBody().workspaceId(workspaceId));
338339

339340
final List<UUID> expectedIds =
340341
List.of(destinationDefinition.getDestinationDefinitionId());
@@ -366,7 +367,7 @@ void testListDestinationDefinitionsForWorkspaceWithHiddenConnectors() throws IOE
366367
.thenReturn(Map.of(destinationDefinitionVersion.getActorDefinitionId(), destinationDefinitionVersion));
367368

368369
final DestinationDefinitionReadList actualDestinationDefinitionReadList = destinationDefinitionsHandler
369-
.listDestinationDefinitionsForWorkspace(new WorkspaceIdRequestBody().workspaceId(workspaceId));
370+
.listDestinationDefinitionsForWorkspace(new WorkspaceIdActorDefinitionRequestBody().workspaceId(workspaceId));
370371

371372
final List<UUID> expectedIds =
372373
List.of(destinationDefinition.getDestinationDefinitionId());
@@ -376,6 +377,76 @@ void testListDestinationDefinitionsForWorkspaceWithHiddenConnectors() throws IOE
376377
.map(DestinationDefinitionRead::getDestinationDefinitionId).toList()));
377378
}
378379

380+
@Test
381+
@DisplayName("listDestinationDefinitionsUsedByWorkspace should return the right list")
382+
void testListDestinationDefinitionsUsedByWorkspace() throws IOException, URISyntaxException, ConfigNotFoundException, JsonValidationException {
383+
final StandardDestinationDefinition usedDestinationDefinition = generateDestinationDefinition();
384+
final ActorDefinitionVersion usedDestinationDefinitionVersion = generateVersionFromDestinationDefinition(usedDestinationDefinition);
385+
386+
when(destinationService.listDestinationDefinitionsForWorkspace(workspaceId, false)).thenReturn(List.of(usedDestinationDefinition));
387+
when(actorDefinitionVersionHelper.getDestinationVersions(List.of(usedDestinationDefinition), workspaceId))
388+
.thenReturn(Map.of(usedDestinationDefinitionVersion.getActorDefinitionId(), usedDestinationDefinitionVersion));
389+
390+
final DestinationDefinitionReadList actualDestinationDefinitionReadList = destinationDefinitionsHandler
391+
.listDestinationDefinitionsForWorkspace(new WorkspaceIdActorDefinitionRequestBody().workspaceId(workspaceId).filterByUsed(true));
392+
393+
final List<UUID> expectedIds =
394+
List.of(usedDestinationDefinition.getDestinationDefinitionId());
395+
396+
assertEquals(expectedIds.size(), actualDestinationDefinitionReadList.getDestinationDefinitions().size());
397+
assertTrue(expectedIds.containsAll(actualDestinationDefinitionReadList.getDestinationDefinitions().stream()
398+
.map(DestinationDefinitionRead::getDestinationDefinitionId).toList()));
399+
}
400+
401+
@Test
402+
@DisplayName("listDestinationDefinitionsUsedByWorkspace should return all definitions when filterByUsed is false")
403+
void testListDestinationDefinitionsUsedByWorkspaceWithFilterByUsedFalse() throws IOException, JsonValidationException, ConfigNotFoundException {
404+
final StandardDestinationDefinition destinationDefinition2 = generateDestinationDefinition();
405+
final ActorDefinitionVersion destinationDefinitionVersion2 = generateVersionFromDestinationDefinition(destinationDefinition2);
406+
407+
when(featureFlagClient.boolVariation(eq(HideActorDefinitionFromList.INSTANCE), any())).thenReturn(false);
408+
when(destinationService.listPublicDestinationDefinitions(false)).thenReturn(List.of(destinationDefinition));
409+
when(destinationService.listGrantedDestinationDefinitions(workspaceId, false)).thenReturn(List.of(destinationDefinition2));
410+
when(actorDefinitionVersionHelper.getDestinationVersions(List.of(destinationDefinition, destinationDefinition2), workspaceId))
411+
.thenReturn(
412+
Map.of(
413+
destinationDefinitionVersion.getActorDefinitionId(), destinationDefinitionVersion,
414+
destinationDefinitionVersion2.getActorDefinitionId(), destinationDefinitionVersion2));
415+
when(workspaceService.getStandardWorkspaceNoSecrets(workspaceId, true)).thenReturn(mock(StandardWorkspace.class));
416+
when(licenseEntitlementChecker.checkEntitlements(any(), eq(Entitlement.DESTINATION_CONNECTOR),
417+
eq(List.of(destinationDefinition.getDestinationDefinitionId()))))
418+
.thenReturn(Map.of(destinationDefinition.getDestinationDefinitionId(), true));
419+
420+
final DestinationDefinitionReadList actualDestinationDefinitionReadList = destinationDefinitionsHandler
421+
.listDestinationDefinitionsForWorkspace(new WorkspaceIdActorDefinitionRequestBody().workspaceId(workspaceId).filterByUsed(false));
422+
423+
final List<UUID> expectedIds = List.of(destinationDefinition.getDestinationDefinitionId(), destinationDefinition2.getDestinationDefinitionId());
424+
assertEquals(expectedIds.size(), actualDestinationDefinitionReadList.getDestinationDefinitions().size());
425+
assertTrue(expectedIds.containsAll(actualDestinationDefinitionReadList.getDestinationDefinitions().stream()
426+
.map(DestinationDefinitionRead::getDestinationDefinitionId)
427+
.toList()));
428+
}
429+
430+
@Test
431+
@DisplayName("listDestinationDefinitionsUsedByWorkspace should return only used definitions when filterByUsed is true")
432+
void testListDestinationDefinitionsUsedByWorkspaceWithFilterByUsedTrue() throws IOException, ConfigNotFoundException, JsonValidationException {
433+
final StandardDestinationDefinition usedDestinationDefinition = generateDestinationDefinition();
434+
final ActorDefinitionVersion usedDestinationDefinitionVersion = generateVersionFromDestinationDefinition(usedDestinationDefinition);
435+
436+
when(destinationService.listDestinationDefinitionsForWorkspace(workspaceId, false)).thenReturn(List.of(usedDestinationDefinition));
437+
when(actorDefinitionVersionHelper.getDestinationVersions(List.of(usedDestinationDefinition), workspaceId))
438+
.thenReturn(Map.of(usedDestinationDefinitionVersion.getActorDefinitionId(), usedDestinationDefinitionVersion));
439+
440+
final DestinationDefinitionReadList actualDestinationDefinitionReadList = destinationDefinitionsHandler
441+
.listDestinationDefinitionsForWorkspace(new WorkspaceIdActorDefinitionRequestBody().workspaceId(workspaceId).filterByUsed(true));
442+
443+
final List<UUID> expectedIds = List.of(usedDestinationDefinition.getDestinationDefinitionId());
444+
assertEquals(expectedIds.size(), actualDestinationDefinitionReadList.getDestinationDefinitions().size());
445+
assertTrue(expectedIds.containsAll(actualDestinationDefinitionReadList.getDestinationDefinitions().stream()
446+
.map(DestinationDefinitionRead::getDestinationDefinitionId)
447+
.toList()));
448+
}
449+
379450
@Test
380451
@DisplayName("listPrivateDestinationDefinitions should return the right list")
381452
void testListPrivateDestinationDefinitions() throws IOException, URISyntaxException {

0 commit comments

Comments
 (0)