Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/protocol/whitefox-protocol-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1426,6 +1426,9 @@ components:
type: object
additionalProperties:
type: string
required:
- name
- properties
example:
name: customer
properties:
Expand Down
43 changes: 34 additions & 9 deletions server/src/main/java/io/whitefox/api/deltasharing/Mappers.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package io.whitefox.api.deltasharing;

import io.whitefox.api.deltasharing.model.v1.generated.*;
import io.whitefox.api.model.v1.generated.CreateTableInput;
import io.whitefox.api.model.v1.generated.ProviderInput;
import io.whitefox.api.model.v1.generated.TableInfo;
import io.whitefox.core.*;
import io.whitefox.core.Schema;
import io.whitefox.core.Share;
import io.whitefox.core.Table;
import io.whitefox.core.SharedTable;
import io.whitefox.core.Storage;
import io.whitefox.core.StorageProperties;
import io.whitefox.core.StorageType;
import io.whitefox.core.actions.CreateInternalTable;
import io.whitefox.core.actions.CreateMetastore;
import io.whitefox.core.actions.CreateProvider;
import io.whitefox.core.storage.CreateStorage;
import io.whitefox.core.storage.Storage;
import io.whitefox.core.storage.StorageProperties;
import io.whitefox.core.storage.StorageType;
import io.whitefox.core.actions.CreateStorage;
import java.time.OffsetDateTime;
import java.util.Arrays;
import java.util.List;
Expand All @@ -34,11 +37,12 @@ public static io.whitefox.api.deltasharing.model.v1.generated.Schema schema2api(
.share(schema.share());
}

public static io.whitefox.api.deltasharing.model.v1.generated.Table table2api(Table table) {
public static io.whitefox.api.deltasharing.model.v1.generated.Table table2api(
SharedTable sharedTable) {
return new io.whitefox.api.deltasharing.model.v1.generated.Table()
.name(table.name())
.share(table.share())
.schema(table.schema());
.name(sharedTable.name())
.share(sharedTable.share())
.schema(sharedTable.schema());
}

public static io.whitefox.api.model.v1.generated.Storage storage2api(Storage storage) {
Expand Down Expand Up @@ -315,4 +319,25 @@ public static io.whitefox.api.model.v1.generated.Provider provider2Api(Provider
.updatedBy(provider.updatedBy().name())
.owner(provider.owner().name());
}

public static TableInfo internalTable2api(InternalTable internalTable) {
return new TableInfo()
.providerName(internalTable.provider().name())
.name(internalTable.name())
.comment(internalTable.comment().orElse(null))
.properties(internalTable.properties().asMap())
.validatedAt(internalTable.validatedAt().orElse(null))
.createdAt(internalTable.createdAt())
.createdBy(internalTable.createdBy().name())
.updatedAt(internalTable.updatedAt())
.updatedBy(internalTable.updatedBy().name());
}

public static CreateInternalTable api2createInternalTable(CreateTableInput createTableInput) {
return new CreateInternalTable(
createTableInput.getName(),
Optional.ofNullable(createTableInput.getComment()),
createTableInput.getSkipValidation(),
InternalTable.InternalTableProperties.fromMap(createTableInput.getProperties()));
}
}
16 changes: 4 additions & 12 deletions server/src/main/java/io/whitefox/api/server/ApiUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
import io.whitefox.api.deltasharing.model.v1.generated.CommonErrorResponse;
import io.whitefox.core.Principal;
import io.whitefox.core.services.DeltaSharedTable;
import io.whitefox.core.services.exceptions.MetastoreNotFound;
import io.whitefox.core.services.exceptions.StorageNotFound;
import io.whitefox.persistence.DuplicateKeyException;
import io.whitefox.core.services.exceptions.AlreadyExists;
import io.whitefox.core.services.exceptions.NotFound;
import jakarta.ws.rs.core.Response;
import java.util.Map;
import java.util.Optional;
Expand All @@ -22,20 +21,13 @@ public interface ApiUtils extends DeltaHeaders {
.errorCode("BAD REQUEST")
.message(ExceptionUtil.generateStackTrace(t)))
.build();
} else if (t instanceof DuplicateKeyException) {
} else if (t instanceof AlreadyExists) {
return Response.status(Response.Status.CONFLICT)
.entity(new CommonErrorResponse()
.errorCode("CONFLICT")
.message(ExceptionUtil.generateStackTrace(t)))
.build();
} else if (t instanceof MetastoreNotFound) {
return Response.status(Response.Status.NOT_FOUND)
.entity(new CommonErrorResponse()
.errorCode("NOT FOUND")
.message(ExceptionUtil.generateStackTrace(t)))
.build();
}
if (t instanceof StorageNotFound) {
} else if (t instanceof NotFound) {
return Response.status(Response.Status.NOT_FOUND)
.entity(new CommonErrorResponse()
.errorCode("NOT FOUND")
Expand Down
59 changes: 59 additions & 0 deletions server/src/main/java/io/whitefox/api/server/TableV1ApiImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package io.whitefox.api.server;

import io.whitefox.api.deltasharing.Mappers;
import io.whitefox.api.model.v1.generated.CreateTableInput;
import io.whitefox.api.model.v1.generated.PatchTableInput;
import io.whitefox.api.server.v1.generated.TableV1Api;
import io.whitefox.core.services.TableService;
import jakarta.ws.rs.core.Response;

public class TableV1ApiImpl implements TableV1Api, ApiUtils {

private final TableService tableService;

public TableV1ApiImpl(TableService tableService) {
this.tableService = tableService;
}

@Override
public Response createTableInProvider(String providerName, CreateTableInput createTableInput) {
return wrapExceptions(
() -> Response.status(Response.Status.CREATED)
.entity(Mappers.internalTable2api(tableService.createInternalTable(
providerName,
getRequestPrincipal(),
Mappers.api2createInternalTable(createTableInput))))
.build(),
exceptionToResponse);
}

@Override
public Response deleteTableInProvider(String providerName, String tableName, String force) {
return Response.status(501).build();
}

@Override
public Response describeTableInProvider(String providerName, String tableName) {
return wrapExceptions(
() -> optionalToNotFound(
tableService.getInternalTable(providerName, tableName).map(Mappers::internalTable2api),
t -> Response.ok(t).build()),
exceptionToResponse);
}

@Override
public Response listTablesInProvider(String providerName) {
return Response.status(501).build();
}

@Override
public Response patchTableInProvider(
String providerName, String tableName, PatchTableInput patchTableInput) {
return Response.status(501).build();
}

@Override
public Response validateTable(String providerName, String tableName) {
return Response.status(501).build();
}
}
Loading