diff --git a/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java b/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java
index 16f52d4c77ecad..51c6de5701b75e 100644
--- a/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java
+++ b/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java
@@ -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);
diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java
index 66b24c82b25b1c..ceb76e1f07303c 100644
--- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java
+++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java
@@ -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;
@@ -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);
@@ -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.
- *
+ *
* In API calls, distinguishing between various exceptions helps return the correct status code.
*/
diff --git a/airbyte-proxy/nginx-auth.conf.template b/airbyte-proxy/nginx-auth.conf.template
index ef79ab533d2db9..854feff0aa6ab2 100644
--- a/airbyte-proxy/nginx-auth.conf.template
+++ b/airbyte-proxy/nginx-auth.conf.template
@@ -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;
@@ -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;
diff --git a/airbyte-proxy/nginx-no-auth.conf.template b/airbyte-proxy/nginx-no-auth.conf.template
index b64f7b96689e4d..ac1e40866acae0 100644
--- a/airbyte-proxy/nginx-no-auth.conf.template
+++ b/airbyte-proxy/nginx-no-auth.conf.template
@@ -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;
@@ -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;
diff --git a/airbyte-server/build.gradle b/airbyte-server/build.gradle
index f9eb7626b96446..aa00568bb652c2 100644
--- a/airbyte-server/build.gradle
+++ b/airbyte-server/build.gradle
@@ -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
}
diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java
index bfd6376bbd4541..ac88419c4c0c0f 100644
--- a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java
+++ b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java
@@ -188,8 +188,8 @@ public static ServerRunnable getServer(final ServerFactory apiFactory,
final Optional 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);
diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java
index a3b7f1153d671f..c59dc23d4d979b 100644
--- a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java
+++ b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java
@@ -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;
@@ -135,25 +132,20 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul
WebBackendApiFactory.setValues(webBackendConnectionsHandler, webBackendGeographiesHandler, webBackendCheckUpdatesHandler);
- WorkspaceApiFactory.setValues(workspacesHandler);
-
- // server configuration
final Set> componentClasses = Set.of(
JobsApiController.class,
LogsApiController.class,
NotificationsApiController.class,
SourceDefinitionSpecificationApiController.class,
StateApiController.class,
- WebBackendApiController.class,
- WorkspaceApiController.class);
+ WebBackendApiController.class);
final Set