Skip to content

Commit

Permalink
convert WorkspaceApiController to micronaut (#20214)
Browse files Browse the repository at this point in the history
* wip; broken

* convert WorkspaceApiController to micronaut

* remove test controller

* format

* format

* add @Body to SourceOauthApiController

* consolidate nginx settings

* remove unnecessary factories
  • Loading branch information
colesnodgrass committed Dec 12, 2022
1 parent fe595fb commit e9484a5
Show file tree
Hide file tree
Showing 16 changed files with 95 additions and 141 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public AirbyteApiClient(final ApiClient apiClient, final ApiClient micronautApiC
sourceDefinitionApi = new SourceDefinitionApi(micronautApiClient);
sourceApi = new SourceApi(micronautApiClient);
sourceDefinitionSpecificationApi = new SourceDefinitionSpecificationApi(apiClient);
workspaceApi = new WorkspaceApi(apiClient);
workspaceApi = new WorkspaceApi(micronautApiClient);
healthApi = new HealthApi(micronautApiClient);
attemptApi = new AttemptApi(micronautApiClient);
stateApi = new StateApi(micronautApiClient);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.airbyte.config.persistence.ConfigRepository;
import io.airbyte.persistence.job.models.Job;
import io.airbyte.validation.json.JsonValidationException;
import jakarta.inject.Singleton;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;
Expand All @@ -30,6 +31,7 @@
// scheduler:persistence in order to get workspace ids for configs (e.g. source). Our options are to
// split this helper by database or put it in a new module.
@SuppressWarnings("PMD.AvoidCatchingThrowable")
@Singleton
public class WorkspaceHelper {

private static final Logger LOGGER = LoggerFactory.getLogger(WorkspaceHelper.class);
Expand Down Expand Up @@ -106,7 +108,7 @@ public UUID load(@NonNull final Long jobId) throws ConfigNotFoundException, IOEx
* There are generally two kinds of helper methods present here. The first kind propagate exceptions
* for the method backing the cache. The second ignores them. The former is meant to be used with
* proper api calls, while the latter is meant to be use with asserts and precondtions checks.
*
* <p>
* In API calls, distinguishing between various exceptions helps return the correct status code.
*/

Expand Down
4 changes: 2 additions & 2 deletions airbyte-proxy/nginx-auth.conf.template
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ http {
}
}

location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* {
location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Expand Down Expand Up @@ -103,7 +103,7 @@ http {
}
}

location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* {
location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Expand Down
4 changes: 2 additions & 2 deletions airbyte-proxy/nginx-no-auth.conf.template
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ http {
proxy_pass "${PROXY_PASS_MICRONAUT_API}";
}

location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* {
location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Expand Down Expand Up @@ -58,7 +58,7 @@ http {
proxy_pass "${PROXY_PASS_MICRONAUT_API}";
}

location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* {
location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Expand Down
4 changes: 3 additions & 1 deletion airbyte-server/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,15 @@ dependencies {

annotationProcessor platform(libs.micronaut.bom)
annotationProcessor libs.bundles.micronaut.annotation.processor
annotationProcessor libs.micronaut.jaxrs.processor

implementation platform(libs.micronaut.bom)
implementation libs.bundles.micronaut
implementation libs.micronaut.jaxrs.server

// Ensure that the versions defined in deps.toml are used
// instead of versions from transitive dependencies
implementation (libs.flyway.core) {
implementation(libs.flyway.core) {
force = true
}

Expand Down
4 changes: 2 additions & 2 deletions airbyte-server/src/main/java/io/airbyte/server/ServerApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,8 @@ public static ServerRunnable getServer(final ServerFactory apiFactory,
final Optional<SecretPersistence> ephemeralSecretPersistence = SecretPersistence.getEphemeral(configsDslContext, configs);
final ConfigRepository configRepository = new ConfigRepository(configsDatabase);
final SecretsRepositoryReader secretsRepositoryReader = new SecretsRepositoryReader(configRepository, secretsHydrator);
final SecretsRepositoryWriter secretsRepositoryWriter =
new SecretsRepositoryWriter(configRepository, secretPersistence, ephemeralSecretPersistence);
final SecretsRepositoryWriter secretsRepositoryWriter = new SecretsRepositoryWriter(configRepository, secretPersistence,
ephemeralSecretPersistence);

LOGGER.info("Creating jobs persistence...");
final Database jobsDatabase = new Database(jobsDslContext);
Expand Down
12 changes: 2 additions & 10 deletions airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,16 @@
import io.airbyte.server.apis.SourceDefinitionSpecificationApiController;
import io.airbyte.server.apis.StateApiController;
import io.airbyte.server.apis.WebBackendApiController;
import io.airbyte.server.apis.WorkspaceApiController;
import io.airbyte.server.apis.binders.JobsApiBinder;
import io.airbyte.server.apis.binders.LogsApiBinder;
import io.airbyte.server.apis.binders.NotificationApiBinder;
import io.airbyte.server.apis.binders.SourceDefinitionSpecificationApiBinder;
import io.airbyte.server.apis.binders.WebBackendApiBinder;
import io.airbyte.server.apis.binders.WorkspaceApiBinder;
import io.airbyte.server.apis.factories.JobsApiFactory;
import io.airbyte.server.apis.factories.LogsApiFactory;
import io.airbyte.server.apis.factories.NotificationsApiFactory;
import io.airbyte.server.apis.factories.SourceDefinitionSpecificationApiFactory;
import io.airbyte.server.apis.factories.WebBackendApiFactory;
import io.airbyte.server.apis.factories.WorkspaceApiFactory;
import io.airbyte.server.handlers.AttemptHandler;
import io.airbyte.server.handlers.ConnectionsHandler;
import io.airbyte.server.handlers.DestinationDefinitionsHandler;
Expand Down Expand Up @@ -135,25 +132,20 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul

WebBackendApiFactory.setValues(webBackendConnectionsHandler, webBackendGeographiesHandler, webBackendCheckUpdatesHandler);

WorkspaceApiFactory.setValues(workspacesHandler);

// server configuration
final Set<Class<?>> componentClasses = Set.of(
JobsApiController.class,
LogsApiController.class,
NotificationsApiController.class,
SourceDefinitionSpecificationApiController.class,
StateApiController.class,
WebBackendApiController.class,
WorkspaceApiController.class);
WebBackendApiController.class);

final Set<Object> components = Set.of(
new JobsApiBinder(),
new LogsApiBinder(),
new NotificationApiBinder(),
new SourceDefinitionSpecificationApiBinder(),
new WebBackendApiBinder(),
new WorkspaceApiBinder());
new WebBackendApiBinder());

// construct server
return new ServerApp(airbyteVersion, componentClasses, components);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import io.airbyte.api.model.generated.SetInstancewideSourceOauthParamsRequestBody;
import io.airbyte.api.model.generated.SourceOauthConsentRequest;
import io.airbyte.server.handlers.OAuthHandler;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;
import java.util.Map;
Expand All @@ -25,19 +26,19 @@ public SourceOauthApiController(final OAuthHandler oAuthHandler) {

@Post("/complete_oauth")
@Override
public Map<String, Object> completeSourceOAuth(final CompleteSourceOauthRequest completeSourceOauthRequest) {
public Map<String, Object> completeSourceOAuth(@Body final CompleteSourceOauthRequest completeSourceOauthRequest) {
return ApiHelper.execute(() -> oAuthHandler.completeSourceOAuth(completeSourceOauthRequest));
}

@Post("/get_consent_url")
@Override
public OAuthConsentRead getSourceOAuthConsent(final SourceOauthConsentRequest sourceOauthConsentRequest) {
public OAuthConsentRead getSourceOAuthConsent(@Body final SourceOauthConsentRequest sourceOauthConsentRequest) {
return ApiHelper.execute(() -> oAuthHandler.getSourceOAuthConsent(sourceOauthConsentRequest));
}

@Post("/oauth_params/create")
@Override
public void setInstancewideSourceOauthParams(final SetInstancewideSourceOauthParamsRequestBody setInstancewideSourceOauthParamsRequestBody) {
public void setInstancewideSourceOauthParams(@Body final SetInstancewideSourceOauthParamsRequestBody setInstancewideSourceOauthParamsRequestBody) {
ApiHelper.execute(() -> {
oAuthHandler.setSourceInstancewideOauthParams(setInstancewideSourceOauthParamsRequestBody);
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,63 +15,76 @@
import io.airbyte.api.model.generated.WorkspaceUpdate;
import io.airbyte.api.model.generated.WorkspaceUpdateName;
import io.airbyte.server.handlers.WorkspacesHandler;
import javax.ws.rs.Path;
import lombok.AllArgsConstructor;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;

@Path("/v1/workspaces")
@AllArgsConstructor
@Controller("/api/v1/workspaces")
public class WorkspaceApiController implements WorkspaceApi {

private final WorkspacesHandler workspacesHandler;

public WorkspaceApiController(final WorkspacesHandler workspacesHandler) {
this.workspacesHandler = workspacesHandler;
}

@Post("/create")
@Override
public WorkspaceRead createWorkspace(final WorkspaceCreate workspaceCreate) {
public WorkspaceRead createWorkspace(@Body final WorkspaceCreate workspaceCreate) {
return ApiHelper.execute(() -> workspacesHandler.createWorkspace(workspaceCreate));
}

@Post("/delete")
@Override
public void deleteWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) {
public void deleteWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) {
ApiHelper.execute(() -> {
workspacesHandler.deleteWorkspace(workspaceIdRequestBody);
return null;
});
}

@Post("/get")
@Override
public WorkspaceRead getWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) {
public WorkspaceRead getWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) {
return ApiHelper.execute(() -> workspacesHandler.getWorkspace(workspaceIdRequestBody));
}

@Post("/get_by_slug")
@Override
public WorkspaceRead getWorkspaceBySlug(final SlugRequestBody slugRequestBody) {
public WorkspaceRead getWorkspaceBySlug(@Body final SlugRequestBody slugRequestBody) {
return ApiHelper.execute(() -> workspacesHandler.getWorkspaceBySlug(slugRequestBody));
}

@Post("/list")
@Override
public WorkspaceReadList listWorkspaces() {
return ApiHelper.execute(workspacesHandler::listWorkspaces);
}

@Post("/update")
@Override
public WorkspaceRead updateWorkspace(final WorkspaceUpdate workspaceUpdate) {
public WorkspaceRead updateWorkspace(@Body final WorkspaceUpdate workspaceUpdate) {
return ApiHelper.execute(() -> workspacesHandler.updateWorkspace(workspaceUpdate));
}

@Post("/tag_feedback_status_as_done")
@Override
public void updateWorkspaceFeedback(final WorkspaceGiveFeedback workspaceGiveFeedback) {
public void updateWorkspaceFeedback(@Body final WorkspaceGiveFeedback workspaceGiveFeedback) {
ApiHelper.execute(() -> {
workspacesHandler.setFeedbackDone(workspaceGiveFeedback);
return null;
});
}

@Post("/update_name")
@Override
public WorkspaceRead updateWorkspaceName(final WorkspaceUpdateName workspaceUpdateName) {
public WorkspaceRead updateWorkspaceName(@Body final WorkspaceUpdateName workspaceUpdateName) {
return ApiHelper.execute(() -> workspacesHandler.updateWorkspaceName(workspaceUpdateName));
}

@Post("/get_by_connection_id")
@Override
public WorkspaceRead getWorkspaceByConnectionId(final ConnectionIdRequestBody connectionIdRequestBody) {
public WorkspaceRead getWorkspaceByConnectionId(@Body final ConnectionIdRequestBody connectionIdRequestBody) {
return ApiHelper.execute(() -> workspacesHandler.getWorkspaceByConnectionId(connectionIdRequestBody));
}

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import io.airbyte.server.converters.ConfigurationUpdate;
import io.airbyte.validation.json.JsonSchemaValidator;
import io.airbyte.validation.json.JsonValidationException;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import java.io.IOException;
import java.util.List;
Expand All @@ -48,6 +49,25 @@ public class DestinationHandler {
private final ConfigurationUpdate configurationUpdate;
private final JsonSecretsProcessor secretsProcessor;

@Inject
public DestinationHandler(final ConfigRepository configRepository,
final SecretsRepositoryReader secretsRepositoryReader,
final SecretsRepositoryWriter secretsRepositoryWriter,
final JsonSchemaValidator integrationSchemaValidation,
final ConnectionsHandler connectionsHandler) {
this(
configRepository,
secretsRepositoryReader,
secretsRepositoryWriter,
integrationSchemaValidation,
connectionsHandler,
UUID::randomUUID,
JsonSecretsProcessor.builder()
.copySecrets(true)
.build(),
new ConfigurationUpdate(configRepository, secretsRepositoryReader));
}

@VisibleForTesting
DestinationHandler(final ConfigRepository configRepository,
final SecretsRepositoryReader secretsRepositoryReader,
Expand All @@ -67,24 +87,6 @@ public class DestinationHandler {
this.secretsProcessor = secretsProcessor;
}

public DestinationHandler(final ConfigRepository configRepository,
final SecretsRepositoryReader secretsRepositoryReader,
final SecretsRepositoryWriter secretsRepositoryWriter,
final JsonSchemaValidator integrationSchemaValidation,
final ConnectionsHandler connectionsHandler) {
this(
configRepository,
secretsRepositoryReader,
secretsRepositoryWriter,
integrationSchemaValidation,
connectionsHandler,
UUID::randomUUID,
JsonSecretsProcessor.builder()
.copySecrets(true)
.build(),
new ConfigurationUpdate(configRepository, secretsRepositoryReader));
}

public DestinationRead createDestination(final DestinationCreate destinationCreate)
throws ConfigNotFoundException, IOException, JsonValidationException {
// validate configuration
Expand Down
Loading

0 comments on commit e9484a5

Please sign in to comment.