Skip to content

Commit b602336

Browse files
authored
Implement Workspace and Source* API endpoints (#42)
1 parent a5bd329 commit b602336

File tree

8 files changed

+434
-39
lines changed

8 files changed

+434
-39
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"workspaceId": "5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6",
3+
"name": "default",
4+
"slug": "default",
5+
"initialSetupComplete": false
6+
}

dataline-api/src/main/openapi/config.yaml

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,29 @@ paths:
9191
description: Workspace not found
9292
"422":
9393
$ref: "#/components/responses/InvalidInput"
94+
/v1/workspaces/update:
95+
post:
96+
tags:
97+
- workspace
98+
summary: Update workspace state
99+
operationId: updateWorkspace
100+
requestBody:
101+
content:
102+
application/json:
103+
schema:
104+
$ref: "#/components/schemas/WorkspaceUpdate"
105+
required: true
106+
responses:
107+
"200":
108+
description: Successful operation
109+
content:
110+
application/json:
111+
schema:
112+
$ref: "#/components/schemas/WorkspaceRead"
113+
"404":
114+
description: Workspace not found
115+
"422":
116+
$ref: "#/components/responses/InvalidInput"
94117
/v1/sources/list:
95118
post:
96119
tags:
@@ -245,7 +268,7 @@ paths:
245268
tags:
246269
- source_implementation
247270
summary: Test connection to the source implementation
248-
operationId: testConnectiontoSourceImplementation
271+
operationId: testConnectionToSourceImplementation
249272
requestBody:
250273
content:
251274
application/json:
@@ -584,6 +607,28 @@ components:
584607
type: string
585608
initialSetupComplete:
586609
type: boolean
610+
WorkspaceUpdate:
611+
type: object
612+
required:
613+
- workspaceId
614+
- initialSetupComplete
615+
- anonymousDataCollection
616+
- news
617+
- securityUpdates
618+
properties:
619+
workspaceId:
620+
$ref: "#/components/schemas/WorkspaceId"
621+
email:
622+
type: string
623+
format: email
624+
initialSetupComplete:
625+
type: boolean
626+
anonymousDataCollection:
627+
type: boolean
628+
news:
629+
type: boolean
630+
securityUpdates:
631+
type: boolean
587632
# SLUG
588633
SlugRequestBody:
589634
type: object
Lines changed: 68 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,72 @@
11
package io.dataline.server.apis;
22

33
import io.dataline.api.model.*;
4+
import io.dataline.config.persistence.ConfigPersistence;
5+
import io.dataline.config.persistence.ConfigPersistenceImpl;
6+
import io.dataline.server.handlers.SourceImplementationsHandler;
7+
import io.dataline.server.handlers.SourceSpecificationsHandler;
8+
import io.dataline.server.handlers.SourcesHandler;
9+
import io.dataline.server.handlers.WorkspacesHandler;
410
import javax.validation.Valid;
511
import javax.ws.rs.Path;
612

713
@Path("/v1")
814
public class ConfigurationApi implements io.dataline.api.V1Api {
15+
private final WorkspacesHandler workspacesHandler;
16+
private final SourcesHandler sourcesHandler;
17+
private final SourceSpecificationsHandler sourceSpecificationsHandler;
18+
private final SourceImplementationsHandler sourceImplementationsHandler;
19+
20+
public ConfigurationApi() {
21+
ConfigPersistence configPersistence = new ConfigPersistenceImpl();
22+
workspacesHandler = new WorkspacesHandler(configPersistence);
23+
sourcesHandler = new SourcesHandler(configPersistence);
24+
sourceSpecificationsHandler = new SourceSpecificationsHandler(configPersistence);
25+
sourceImplementationsHandler = new SourceImplementationsHandler(configPersistence);
26+
}
27+
28+
// WORKSPACE
929

1030
@Override
11-
public ConnectionRead createConnection(@Valid ConnectionCreate connectionCreate) {
12-
return null;
31+
public WorkspaceRead getWorkspace(@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
32+
return workspacesHandler.getWorkspace(workspaceIdRequestBody);
1333
}
1434

1535
@Override
16-
public DestinationImplementationRead createDestinationImplementation(
17-
@Valid DestinationImplementationCreate destinationImplementationCreate) {
18-
return null;
36+
public WorkspaceRead getWorkspaceBySlug(@Valid SlugRequestBody slugRequestBody) {
37+
return workspacesHandler.getWorkspaceBySlug(slugRequestBody);
38+
}
39+
40+
@Override
41+
public WorkspaceRead updateWorkspace(@Valid WorkspaceUpdate workspaceUpdate) {
42+
return workspacesHandler.updateWorkspace(workspaceUpdate);
43+
}
44+
45+
// SOURCE
46+
47+
@Override
48+
public SourceReadList listSources() {
49+
return sourcesHandler.listSources();
50+
}
51+
52+
@Override
53+
public SourceRead getSource(@Valid SourceIdRequestBody sourceIdRequestBody) {
54+
return sourcesHandler.getSource(sourceIdRequestBody);
55+
}
56+
57+
// SOURCE SPECIFICATION
58+
59+
@Override
60+
public SourceSpecificationRead getSourceSpecification(
61+
@Valid SourceIdRequestBody sourceIdRequestBody) {
62+
return sourceSpecificationsHandler.getSourceSpecification(sourceIdRequestBody);
1963
}
2064

65+
// SOURCE IMPLEMENTATION
2166
@Override
2267
public SourceImplementationRead createSourceImplementation(
2368
@Valid SourceImplementationCreate sourceImplementationCreate) {
24-
return null;
69+
return sourceImplementationsHandler.createSourceImplementation(sourceImplementationCreate);
2570
}
2671

2772
@Override
@@ -31,57 +76,59 @@ public SourceImplementationDiscoverSchemaRead discoverSchemaForSourceImplementat
3176
}
3277

3378
@Override
34-
public ConnectionRead getConnection(@Valid ConnectionIdRequestBody connectionIdRequestBody) {
79+
public SourceImplementationRead getSourceImplementation(
80+
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
3581
return null;
3682
}
3783

3884
@Override
39-
public DestinationRead getDestination(@Valid DestinationIdRequestBody destinationIdRequestBody) {
85+
public SourceImplementationReadList getSourceImplementationsForWorkspace(
86+
@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
4087
return null;
4188
}
4289

4390
@Override
44-
public DestinationImplementationRead getDestinationImplementation(
45-
@Valid DestinationImplementationIdRequestBody destinationImplementationIdRequestBody) {
91+
public SourceImplementationTestConnectionRead testConnectionToSourceImplementation(
92+
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
4693
return null;
4794
}
4895

4996
@Override
50-
public DestinationSpecificationRead getDestinationSpecification(
51-
@Valid DestinationIdRequestBody destinationIdRequestBody) {
97+
public SourceImplementationRead updateSourceImplementation(
98+
@Valid SourceImplementationUpdate sourceImplementationUpdate) {
5299
return null;
53100
}
54101

55102
@Override
56-
public SourceRead getSource(@Valid SourceIdRequestBody sourceIdRequestBody) {
103+
public ConnectionRead createConnection(@Valid ConnectionCreate connectionCreate) {
57104
return null;
58105
}
59106

60107
@Override
61-
public SourceImplementationRead getSourceImplementation(
62-
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
108+
public DestinationImplementationRead createDestinationImplementation(
109+
@Valid DestinationImplementationCreate destinationImplementationCreate) {
63110
return null;
64111
}
65112

66113
@Override
67-
public SourceImplementationReadList getSourceImplementationsForWorkspace(
68-
@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
114+
public ConnectionRead getConnection(@Valid ConnectionIdRequestBody connectionIdRequestBody) {
69115
return null;
70116
}
71117

72118
@Override
73-
public SourceSpecificationRead getSourceSpecification(
74-
@Valid SourceIdRequestBody sourceIdRequestBody) {
119+
public DestinationRead getDestination(@Valid DestinationIdRequestBody destinationIdRequestBody) {
75120
return null;
76121
}
77122

78123
@Override
79-
public WorkspaceRead getWorkspace(@Valid WorkspaceIdRequestBody workspaceIdRequestBody) {
124+
public DestinationImplementationRead getDestinationImplementation(
125+
@Valid DestinationImplementationIdRequestBody destinationImplementationIdRequestBody) {
80126
return null;
81127
}
82128

83129
@Override
84-
public WorkspaceRead getWorkspaceBySlug(@Valid SlugRequestBody slugRequestBody) {
130+
public DestinationSpecificationRead getDestinationSpecification(
131+
@Valid DestinationIdRequestBody destinationIdRequestBody) {
85132
return null;
86133
}
87134

@@ -102,22 +149,11 @@ public DestinationReadList listDestinations() {
102149
return null;
103150
}
104151

105-
@Override
106-
public SourceReadList listSources() {
107-
return null;
108-
}
109-
110152
@Override
111153
public ConnectionSyncRead syncConnection(@Valid ConnectionIdRequestBody connectionIdRequestBody) {
112154
return null;
113155
}
114156

115-
@Override
116-
public SourceImplementationTestConnectionRead testConnectiontoSourceImplementation(
117-
@Valid SourceImplementationIdRequestBody sourceImplementationIdRequestBody) {
118-
return null;
119-
}
120-
121157
@Override
122158
public ConnectionRead updateConnection(@Valid ConnectionUpdate connectionUpdate) {
123159
return null;
@@ -128,10 +164,4 @@ public DestinationImplementationRead updateDestinationImplementation(
128164
@Valid DestinationImplementationUpdate destinationImplementationUpdate) {
129165
return null;
130166
}
131-
132-
@Override
133-
public SourceImplementationRead updateSourceImplementation(
134-
@Valid SourceImplementationUpdate sourceImplementationUpdate) {
135-
return null;
136-
}
137167
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.dataline.server.handlers;
2+
3+
import io.dataline.api.model.SourceImplementationCreate;
4+
import io.dataline.api.model.SourceImplementationRead;
5+
import io.dataline.config.SourceConnectionImplementation;
6+
import io.dataline.config.persistence.ConfigNotFoundException;
7+
import io.dataline.config.persistence.ConfigPersistence;
8+
import io.dataline.config.persistence.JsonValidationException;
9+
import io.dataline.config.persistence.PersistenceConfigType;
10+
import io.dataline.server.errors.KnownException;
11+
import io.dataline.server.validation.IntegrationSchemaValidation;
12+
import java.util.UUID;
13+
14+
public class SourceImplementationsHandler {
15+
private final ConfigPersistence configPersistence;
16+
17+
public SourceImplementationsHandler(ConfigPersistence configPersistence) {
18+
this.configPersistence = configPersistence;
19+
}
20+
21+
public SourceImplementationRead createSourceImplementation(
22+
SourceImplementationCreate sourceImplementationCreate) {
23+
try {
24+
// validate configuration
25+
final IntegrationSchemaValidation validator =
26+
new IntegrationSchemaValidation(configPersistence);
27+
validator.validateSourceConnectionConfiguration(
28+
sourceImplementationCreate.getSourceSpecificationId(),
29+
sourceImplementationCreate.getConnectionConfiguration());
30+
31+
// persist
32+
final UUID sourceImplementationId = UUID.randomUUID();
33+
final SourceConnectionImplementation newSourceConnectionImplementation =
34+
new SourceConnectionImplementation();
35+
newSourceConnectionImplementation.setSourceSpecificationId(
36+
sourceImplementationCreate.getSourceSpecificationId());
37+
newSourceConnectionImplementation.setSourceImplementationId(sourceImplementationId);
38+
newSourceConnectionImplementation.setConfiguration(
39+
sourceImplementationCreate.getConnectionConfiguration());
40+
41+
configPersistence.writeConfig(
42+
PersistenceConfigType.SOURCE_CONNECTION_IMPLEMENTATION,
43+
sourceImplementationId.toString(),
44+
newSourceConnectionImplementation);
45+
46+
// read configuration from db
47+
final SourceConnectionImplementation retrievedSourceConnectionImplementation =
48+
configPersistence.getConfig(
49+
PersistenceConfigType.SOURCE_CONNECTION_IMPLEMENTATION,
50+
sourceImplementationId.toString(),
51+
SourceConnectionImplementation.class);
52+
53+
return toSourceImplementationRead(retrievedSourceConnectionImplementation);
54+
} catch (JsonValidationException e) {
55+
throw new KnownException(
56+
422,
57+
String.format(
58+
"The provided configuration does not fulfill the specification. Errors: %s",
59+
e.getMessage()));
60+
} catch (ConfigNotFoundException e) {
61+
throw new KnownException(
62+
422,
63+
String.format(
64+
"Could not find source specification: %s.",
65+
sourceImplementationCreate.getSourceSpecificationId()));
66+
}
67+
}
68+
69+
private SourceImplementationRead toSourceImplementationRead(
70+
SourceConnectionImplementation sourceConnectionImplementation) {
71+
final SourceImplementationRead sourceImplementationRead = new SourceImplementationRead();
72+
sourceConnectionImplementation.setSourceImplementationId(
73+
sourceConnectionImplementation.getSourceImplementationId());
74+
sourceConnectionImplementation.setSourceSpecificationId(
75+
sourceConnectionImplementation.getSourceSpecificationId());
76+
sourceConnectionImplementation.setConfiguration(
77+
sourceConnectionImplementation.getConfiguration());
78+
79+
return sourceImplementationRead;
80+
}
81+
}

0 commit comments

Comments
 (0)