Skip to content

Commit 6b5f842

Browse files
author
Ella Rohm-Ensing
committed
feat: add endpoint to get connector builder project by definiton ID (#13784)
## What <!-- * Describe what the change is solving. * It helps to add screenshots if it affects the frontend. --> * Close https://github.com/airbytehq/airbyte-internal-issues/issues/9377 * Add an endpoint which allows us to get a (optional) connector builder project ID for a given source definition ID. This allows us to enable the fork buttons * To show the fork button, we need to know if the given source def ID has a project associated with it. We then use this to be able to open the project associated with it. See https://github.com/airbytehq/airbyte-platform-internal/pull/13787 ## How <!-- * Describe how code changes achieve the solution. --> * Add a new DB method to look up a connector builder project by actor definition ID. Return an optional, since we will be looking up arbitrary actor definitions (custom or catalog). * Update the server to host the new endpoint ## 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 3171f4e commit 6b5f842

File tree

7 files changed

+117
-0
lines changed

7 files changed

+117
-0
lines changed

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

+38
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,25 @@ paths:
10291029
application/json:
10301030
schema:
10311031
$ref: "#/components/schemas/ConnectorBuilderProjectRead"
1032+
/v1/connector_builder_projects/get_for_definition_id:
1033+
post:
1034+
tags:
1035+
- connector_builder_project
1036+
summary: Get a connector builder project by source definition ID
1037+
operationId: getConnectorBuilderProjectIdForDefinitionId
1038+
requestBody:
1039+
content:
1040+
application/json:
1041+
schema:
1042+
$ref: "#/components/schemas/BuilderProjectForDefinitionRequestBody"
1043+
required: true
1044+
responses:
1045+
"200":
1046+
description: Successful operation
1047+
content:
1048+
application/json:
1049+
schema:
1050+
$ref: "#/components/schemas/BuilderProjectForDefinitionResponse"
10321051
/v1/connector_builder_projects/update_testing_values:
10331052
post:
10341053
tags:
@@ -7742,6 +7761,25 @@ components:
77427761
$ref: "#/components/schemas/WorkspaceId"
77437762
builderProject:
77447763
$ref: "#/components/schemas/ConnectorBuilderProjectDetails"
7764+
BuilderProjectForDefinitionRequestBody:
7765+
type: object
7766+
required:
7767+
- actorDefinitionId
7768+
- workspaceId
7769+
properties:
7770+
actorDefinitionId:
7771+
$ref: "#/components/schemas/ActorDefinitionId"
7772+
workspaceId:
7773+
$ref: "#/components/schemas/WorkspaceId"
7774+
BuilderProjectForDefinitionResponse:
7775+
type: object
7776+
required:
7777+
- builderProjectId
7778+
properties:
7779+
builderProjectId:
7780+
type: string
7781+
format: uuid
7782+
nullable: true
77457783
ConnectorBuilderProjectRead:
77467784
type: object
77477785
required:

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

+9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import com.fasterxml.jackson.databind.JsonNode;
1010
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import io.airbyte.api.model.generated.BuilderProjectForDefinitionRequestBody;
12+
import io.airbyte.api.model.generated.BuilderProjectForDefinitionResponse;
1113
import io.airbyte.api.model.generated.ConnectorBuilderHttpRequest;
1214
import io.airbyte.api.model.generated.ConnectorBuilderHttpResponse;
1315
import io.airbyte.api.model.generated.ConnectorBuilderProjectDetailsRead;
@@ -371,6 +373,13 @@ public ConnectorBuilderProjectStreamRead readConnectorBuilderProjectStream(final
371373
}
372374
}
373375

376+
public BuilderProjectForDefinitionResponse getConnectorBuilderProjectForDefinitionId(final BuilderProjectForDefinitionRequestBody requestBody)
377+
throws IOException {
378+
final Optional<UUID> builderProjectId =
379+
connectorBuilderService.getConnectorBuilderProjectIdForActorDefinitionId(requestBody.getActorDefinitionId());
380+
return new BuilderProjectForDefinitionResponse().builderProjectId(builderProjectId.orElse(null));
381+
}
382+
374383
private ConnectorBuilderProjectStreamRead convertStreamRead(final StreamRead streamRead) {
375384
return new ConnectorBuilderProjectStreamRead()
376385
.logs(streamRead.getLogs())

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

+28
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import com.fasterxml.jackson.databind.JsonNode;
2525
import com.fasterxml.jackson.databind.ObjectMapper;
2626
import com.fasterxml.jackson.databind.node.ObjectNode;
27+
import io.airbyte.api.model.generated.BuilderProjectForDefinitionRequestBody;
28+
import io.airbyte.api.model.generated.BuilderProjectForDefinitionResponse;
2729
import io.airbyte.api.model.generated.ConnectorBuilderHttpRequest;
2830
import io.airbyte.api.model.generated.ConnectorBuilderHttpRequest.HttpMethodEnum;
2931
import io.airbyte.api.model.generated.ConnectorBuilderHttpResponse;
@@ -85,6 +87,7 @@
8587
import java.time.OffsetDateTime;
8688
import java.util.Collections;
8789
import java.util.List;
90+
import java.util.Optional;
8891
import java.util.UUID;
8992
import java.util.function.Supplier;
9093
import java.util.stream.Stream;
@@ -755,6 +758,31 @@ void testGetBaseImageForDeclarativeManifest() {
755758
assertEquals(A_BASE_IMAGE, responseBody.getBaseImage());
756759
}
757760

761+
@Test
762+
void testGetConnectorBuilderProjectIdBySourceDefinitionId() throws IOException {
763+
final UUID actorDefinitionId = UUID.randomUUID();
764+
final UUID projectId = UUID.randomUUID();
765+
final UUID workspaceId = UUID.randomUUID();
766+
when(connectorBuilderService.getConnectorBuilderProjectIdForActorDefinitionId(actorDefinitionId)).thenReturn(Optional.of(projectId));
767+
768+
final BuilderProjectForDefinitionResponse response = connectorBuilderProjectsHandler.getConnectorBuilderProjectForDefinitionId(
769+
new BuilderProjectForDefinitionRequestBody().actorDefinitionId(actorDefinitionId).workspaceId(workspaceId));
770+
771+
assertEquals(projectId, response.getBuilderProjectId());
772+
}
773+
774+
@Test
775+
void testGetConnectorBuilderProjectIdBySourceDefinitionIdWhenNotFound() throws IOException {
776+
final UUID actorDefinitionId = UUID.randomUUID();
777+
final UUID workspaceId = UUID.randomUUID();
778+
when(connectorBuilderService.getConnectorBuilderProjectIdForActorDefinitionId(actorDefinitionId)).thenReturn(Optional.empty());
779+
780+
final BuilderProjectForDefinitionResponse response = connectorBuilderProjectsHandler.getConnectorBuilderProjectForDefinitionId(
781+
new BuilderProjectForDefinitionRequestBody().actorDefinitionId(actorDefinitionId).workspaceId(workspaceId));
782+
783+
assertNull(response.getBuilderProjectId());
784+
}
785+
758786
private static ConnectorBuilderPublishRequestBody anyConnectorBuilderProjectRequest() {
759787
return new ConnectorBuilderPublishRequestBody().initialDeclarativeManifest(anyInitialManifest());
760788
}

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

+15
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.ArrayList;
5050
import java.util.Arrays;
5151
import java.util.List;
52+
import java.util.Optional;
5253
import java.util.UUID;
5354
import org.junit.jupiter.api.BeforeEach;
5455
import org.junit.jupiter.api.Test;
@@ -308,6 +309,20 @@ void testDeleteManifestDraftForActorDefinitionId() throws IOException, ConfigNot
308309
assertNull(connectorBuilderService.getConnectorBuilderProject(project1.getBuilderProjectId(), true).getManifestDraft());
309310
}
310311

312+
@Test
313+
void testGetConnectorBuilderProjectIdByActorDefinitionId() throws IOException {
314+
createBaseObjects();
315+
final StandardSourceDefinition sourceDefinition = linkSourceDefinition(project1.getBuilderProjectId());
316+
assertEquals(Optional.of(project1.getBuilderProjectId()),
317+
connectorBuilderService.getConnectorBuilderProjectIdForActorDefinitionId(sourceDefinition.getSourceDefinitionId()));
318+
}
319+
320+
@Test
321+
void testGetConnectorBuilderProjectIdByActorDefinitionIdWhenNoMatch() throws IOException {
322+
createBaseObjects();
323+
assertEquals(Optional.empty(), connectorBuilderService.getConnectorBuilderProjectIdForActorDefinitionId(UUID.randomUUID()));
324+
}
325+
311326
private DeclarativeManifest anyDeclarativeManifest() {
312327
try {
313328
return new DeclarativeManifest()

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

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.airbyte.data.exceptions.ConfigNotFoundException;
1313
import io.airbyte.protocol.models.ConnectorSpecification;
1414
import java.io.IOException;
15+
import java.util.Optional;
1516
import java.util.UUID;
1617
import java.util.stream.Stream;
1718

@@ -22,6 +23,8 @@ public interface ConnectorBuilderService {
2223

2324
ConnectorBuilderProject getConnectorBuilderProject(UUID builderProjectId, boolean fetchManifestDraft) throws IOException, ConfigNotFoundException;
2425

26+
Optional<UUID> getConnectorBuilderProjectIdForActorDefinitionId(UUID actorDefinitionId) throws IOException;
27+
2528
ConnectorBuilderProjectVersionedManifest getVersionedConnectorBuilderProject(UUID builderProjectId, Long version)
2629
throws ConfigNotFoundException, IOException;
2730

airbyte-data/src/main/java/io/airbyte/data/services/impls/jooq/ConnectorBuilderServiceJooqImpl.java

+10
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,16 @@ public ConnectorBuilderProject getConnectorBuilderProject(final UUID builderProj
9595
return projectOptional.orElseThrow(() -> new ConfigNotFoundException(ConfigSchema.CONNECTOR_BUILDER_PROJECT, builderProjectId));
9696
}
9797

98+
@Override
99+
public Optional<UUID> getConnectorBuilderProjectIdForActorDefinitionId(final UUID actorDefinitionId) throws IOException {
100+
return database.query(ctx -> ctx
101+
.select(CONNECTOR_BUILDER_PROJECT.ID)
102+
.from(CONNECTOR_BUILDER_PROJECT)
103+
.where(CONNECTOR_BUILDER_PROJECT.ACTOR_DEFINITION_ID.eq(actorDefinitionId)
104+
.andNot(CONNECTOR_BUILDER_PROJECT.TOMBSTONE))
105+
.fetchOptional(CONNECTOR_BUILDER_PROJECT.ID));
106+
}
107+
98108
/**
99109
* Return a versioned manifest associated with a builder project.
100110
*

airbyte-server/src/main/java/io/airbyte/server/apis/ConnectorBuilderProjectApiController.java

+14
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
import com.fasterxml.jackson.databind.JsonNode;
1414
import io.airbyte.api.generated.ConnectorBuilderProjectApi;
15+
import io.airbyte.api.model.generated.BuilderProjectForDefinitionRequestBody;
16+
import io.airbyte.api.model.generated.BuilderProjectForDefinitionResponse;
1517
import io.airbyte.api.model.generated.ConnectorBuilderProjectIdWithWorkspaceId;
1618
import io.airbyte.api.model.generated.ConnectorBuilderProjectRead;
1719
import io.airbyte.api.model.generated.ConnectorBuilderProjectReadList;
@@ -40,6 +42,7 @@
4042
@Controller("/api/v1/connector_builder_projects")
4143
@Context
4244
@Secured(SecurityRule.IS_AUTHENTICATED)
45+
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
4346
public class ConnectorBuilderProjectApiController implements ConnectorBuilderProjectApi {
4447

4548
private final ConnectorBuilderProjectsHandler connectorBuilderProjectsHandler;
@@ -137,4 +140,15 @@ public JsonNode updateConnectorBuilderProjectTestingValues(@Body final Connector
137140
.execute(() -> connectorBuilderProjectsHandler.updateConnectorBuilderProjectTestingValues(connectorBuilderProjectTestingValuesUpdate));
138141
}
139142

143+
@Override
144+
@Post(uri = "/get_by_definition_id")
145+
@Status(HttpStatus.OK)
146+
@Secured({WORKSPACE_READER, ORGANIZATION_READER})
147+
@ExecuteOn(AirbyteTaskExecutors.IO)
148+
@SuppressWarnings("LineLength")
149+
public BuilderProjectForDefinitionResponse getConnectorBuilderProjectIdForDefinitionId(@Body final BuilderProjectForDefinitionRequestBody builderProjectForDefinitionRequestBody) {
150+
return ApiHelper
151+
.execute(() -> connectorBuilderProjectsHandler.getConnectorBuilderProjectForDefinitionId(builderProjectForDefinitionRequestBody));
152+
}
153+
140154
}

0 commit comments

Comments
 (0)