Skip to content

Implement Workspace and Source* API endpoints #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Aug 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well this feels dorky. not sure if i should just throw it in its own module. 🤷‍♀️

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this file?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the is the default workspace that will ship with the app. in a world where there is one workspace, we can just set it up with some default values.

the data dir is where i plan to save configs for now until i figure out how to work with whatever mount point is configured.

"workspaceId": "5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6",
"name": "default",
"slug": "default",
"initialSetupComplete": false
}
47 changes: 46 additions & 1 deletion dataline-api/src/main/openapi/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,29 @@ paths:
description: Workspace not found
"422":
$ref: "#/components/responses/InvalidInput"
/v1/workspaces/update:
post:
tags:
- workspace
summary: Update workspace state
operationId: updateWorkspace
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceUpdate"
required: true
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceRead"
"404":
description: Workspace not found
"422":
$ref: "#/components/responses/InvalidInput"
/v1/sources/list:
post:
tags:
Expand Down Expand Up @@ -245,7 +268,7 @@ paths:
tags:
- source_implementation
summary: Test connection to the source implementation
operationId: testConnectiontoSourceImplementation
operationId: testConnectionToSourceImplementation
requestBody:
content:
application/json:
Expand Down Expand Up @@ -584,6 +607,28 @@ components:
type: string
initialSetupComplete:
type: boolean
WorkspaceUpdate:
type: object
required:
- workspaceId
- initialSetupComplete
- anonymousDataCollection
- news
- securityUpdates
properties:
workspaceId:
$ref: "#/components/schemas/WorkspaceId"
email:
type: string
format: email
initialSetupComplete:
type: boolean
anonymousDataCollection:
type: boolean
news:
type: boolean
securityUpdates:
type: boolean
# SLUG
SlugRequestBody:
type: object
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,72 @@
package io.dataline.server.apis;

import io.dataline.api.model.*;
import io.dataline.config.persistence.ConfigPersistence;
import io.dataline.config.persistence.ConfigPersistenceImpl;
import io.dataline.server.handlers.SourceImplementationsHandler;
import io.dataline.server.handlers.SourceSpecificationsHandler;
import io.dataline.server.handlers.SourcesHandler;
import io.dataline.server.handlers.WorkspacesHandler;
import javax.validation.Valid;
import javax.ws.rs.Path;

@Path("/v1")
public class ConfigurationApi implements io.dataline.api.V1Api {
private final WorkspacesHandler workspacesHandler;
private final SourcesHandler sourcesHandler;
private final SourceSpecificationsHandler sourceSpecificationsHandler;
private final SourceImplementationsHandler sourceImplementationsHandler;

public ConfigurationApi() {
ConfigPersistence configPersistence = new ConfigPersistenceImpl();
workspacesHandler = new WorkspacesHandler(configPersistence);
sourcesHandler = new SourcesHandler(configPersistence);
sourceSpecificationsHandler = new SourceSpecificationsHandler(configPersistence);
sourceImplementationsHandler = new SourceImplementationsHandler(configPersistence);
}

// WORKSPACE

@Override
public ConnectionRead createConnection(@Valid ConnectionCreate connectionCreate) {
return null;
public WorkspaceRead getWorkspace(@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
return workspacesHandler.getWorkspace(workspaceIdRequestBody);
}

@Override
public DestinationImplementationRead createDestinationImplementation(
@Valid DestinationImplementationCreate destinationImplementationCreate) {
return null;
public WorkspaceRead getWorkspaceBySlug(@Valid SlugRequestBody slugRequestBody) {
return workspacesHandler.getWorkspaceBySlug(slugRequestBody);
}

@Override
public WorkspaceRead updateWorkspace(@Valid WorkspaceUpdate workspaceUpdate) {
return workspacesHandler.updateWorkspace(workspaceUpdate);
}

// SOURCE

@Override
public SourceReadList listSources() {
return sourcesHandler.listSources();
}

@Override
public SourceRead getSource(@Valid SourceIdRequestBody sourceIdRequestBody) {
return sourcesHandler.getSource(sourceIdRequestBody);
}

// SOURCE SPECIFICATION

@Override
public SourceSpecificationRead getSourceSpecification(
@Valid SourceIdRequestBody sourceIdRequestBody) {
return sourceSpecificationsHandler.getSourceSpecification(sourceIdRequestBody);
}

// SOURCE IMPLEMENTATION
@Override
public SourceImplementationRead createSourceImplementation(
@Valid SourceImplementationCreate sourceImplementationCreate) {
return null;
return sourceImplementationsHandler.createSourceImplementation(sourceImplementationCreate);
}

@Override
Expand All @@ -31,57 +76,59 @@ public SourceImplementationDiscoverSchemaRead discoverSchemaForSourceImplementat
}

@Override
public ConnectionRead getConnection(@Valid ConnectionIdRequestBody connectionIdRequestBody) {
public SourceImplementationRead getSourceImplementation(
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
return null;
}

@Override
public DestinationRead getDestination(@Valid DestinationIdRequestBody destinationIdRequestBody) {
public SourceImplementationReadList getSourceImplementationsForWorkspace(
@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
return null;
}

@Override
public DestinationImplementationRead getDestinationImplementation(
@Valid DestinationImplementationIdRequestBody destinationImplementationIdRequestBody) {
public SourceImplementationTestConnectionRead testConnectionToSourceImplementation(
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
return null;
}

@Override
public DestinationSpecificationRead getDestinationSpecification(
@Valid DestinationIdRequestBody destinationIdRequestBody) {
public SourceImplementationRead updateSourceImplementation(
@Valid SourceImplementationUpdate sourceImplementationUpdate) {
return null;
}

@Override
public SourceRead getSource(@Valid SourceIdRequestBody sourceIdRequestBody) {
public ConnectionRead createConnection(@Valid ConnectionCreate connectionCreate) {
return null;
}

@Override
public SourceImplementationRead getSourceImplementation(
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
public DestinationImplementationRead createDestinationImplementation(
@Valid DestinationImplementationCreate destinationImplementationCreate) {
return null;
}

@Override
public SourceImplementationReadList getSourceImplementationsForWorkspace(
@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
public ConnectionRead getConnection(@Valid ConnectionIdRequestBody connectionIdRequestBody) {
return null;
}

@Override
public SourceSpecificationRead getSourceSpecification(
@Valid SourceIdRequestBody sourceIdRequestBody) {
public DestinationRead getDestination(@Valid DestinationIdRequestBody destinationIdRequestBody) {
return null;
}

@Override
public WorkspaceRead getWorkspace(@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
public DestinationImplementationRead getDestinationImplementation(
@Valid DestinationImplementationIdRequestBody destinationImplementationIdRequestBody) {
return null;
}

@Override
public WorkspaceRead getWorkspaceBySlug(@Valid SlugRequestBody slugRequestBody) {
public DestinationSpecificationRead getDestinationSpecification(
@Valid DestinationIdRequestBody destinationIdRequestBody) {
return null;
}

Expand All @@ -102,22 +149,11 @@ public DestinationReadList listDestinations() {
return null;
}

@Override
public SourceReadList listSources() {
return null;
}

@Override
public ConnectionSyncRead syncConnection(@Valid ConnectionIdRequestBody connectionIdRequestBody) {
return null;
}

@Override
public SourceImplementationTestConnectionRead testConnectiontoSourceImplementation(
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
return null;
}

@Override
public ConnectionRead updateConnection(@Valid ConnectionUpdate connectionUpdate) {
return null;
Expand All @@ -128,10 +164,4 @@ public DestinationImplementationRead updateDestinationImplementation(
@Valid DestinationImplementationUpdate destinationImplementationUpdate) {
return null;
}

@Override
public SourceImplementationRead updateSourceImplementation(
@Valid SourceImplementationUpdate sourceImplementationUpdate) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package io.dataline.server.handlers;

import io.dataline.api.model.SourceImplementationCreate;
import io.dataline.api.model.SourceImplementationRead;
import io.dataline.config.SourceConnectionImplementation;
import io.dataline.config.persistence.ConfigNotFoundException;
import io.dataline.config.persistence.ConfigPersistence;
import io.dataline.config.persistence.JsonValidationException;
import io.dataline.config.persistence.PersistenceConfigType;
import io.dataline.server.errors.KnownException;
import io.dataline.server.validation.IntegrationSchemaValidation;
import java.util.UUID;

public class SourceImplementationsHandler {
private final ConfigPersistence configPersistence;

public SourceImplementationsHandler(ConfigPersistence configPersistence) {
this.configPersistence = configPersistence;
}

public SourceImplementationRead createSourceImplementation(
SourceImplementationCreate sourceImplementationCreate) {
try {
// validate configuration
final IntegrationSchemaValidation validator =
new IntegrationSchemaValidation(configPersistence);
validator.validateSourceConnectionConfiguration(
sourceImplementationCreate.getSourceSpecificationId(),
sourceImplementationCreate.getConnectionConfiguration());

// persist
final UUID sourceImplementationId = UUID.randomUUID();
final SourceConnectionImplementation newSourceConnectionImplementation =
new SourceConnectionImplementation();
newSourceConnectionImplementation.setSourceSpecificationId(
sourceImplementationCreate.getSourceSpecificationId());
newSourceConnectionImplementation.setSourceImplementationId(sourceImplementationId);
newSourceConnectionImplementation.setConfiguration(
sourceImplementationCreate.getConnectionConfiguration());

configPersistence.writeConfig(
PersistenceConfigType.SOURCE_CONNECTION_IMPLEMENTATION,
sourceImplementationId.toString(),
newSourceConnectionImplementation);

// read configuration from db
final SourceConnectionImplementation retrievedSourceConnectionImplementation =
configPersistence.getConfig(
PersistenceConfigType.SOURCE_CONNECTION_IMPLEMENTATION,
sourceImplementationId.toString(),
SourceConnectionImplementation.class);

return toSourceImplementationRead(retrievedSourceConnectionImplementation);
} catch (JsonValidationException e) {
throw new KnownException(
422,
String.format(
"The provided configuration does not fulfill the specification. Errors: %s",
e.getMessage()));
} catch (ConfigNotFoundException e) {
throw new KnownException(
422,
String.format(
"Could not find source specification: %s.",
sourceImplementationCreate.getSourceSpecificationId()));
}
}

private SourceImplementationRead toSourceImplementationRead(
SourceConnectionImplementation sourceConnectionImplementation) {
final SourceImplementationRead sourceImplementationRead = new SourceImplementationRead();
sourceConnectionImplementation.setSourceImplementationId(
sourceConnectionImplementation.getSourceImplementationId());
sourceConnectionImplementation.setSourceSpecificationId(
sourceConnectionImplementation.getSourceSpecificationId());
sourceConnectionImplementation.setConfiguration(
sourceConnectionImplementation.getConfiguration());

return sourceImplementationRead;
}
}
Loading