package com.kryptnostic.v2.storage.api; import java.util.Map; import java.util.Set; import java.util.UUID; import com.kryptnostic.kodex.v1.crypto.ciphers.BlockCiphertext; import com.kryptnostic.v2.constants.Names; import com.kryptnostic.v2.storage.models.CreateMetadataObjectRequest; import com.kryptnostic.v2.storage.models.CreateObjectRequest; import com.kryptnostic.v2.storage.models.ObjectMetadata; import com.kryptnostic.v2.storage.models.ObjectMetadataEncryptedNode; import com.kryptnostic.v2.storage.models.ObjectTreeLoadRequest; import com.kryptnostic.v2.storage.models.VersionedObjectKey; import retrofit.client.Response; import retrofit.http.Body; import retrofit.http.DELETE; import retrofit.http.GET; import retrofit.http.POST; import retrofit.http.PUT; import retrofit.http.Path; /** * @author Matthew Tamayo-Rios <matthew@kryptnostic.com> * */ public interface ObjectStorageApi { String CONTROLLER = "/object"; // Parameter names String ID = Names.ID_FIELD; String VERSION = "version"; String BLOCK = "block"; // Paths String OBJECT_ID_PATH = "/id/{" + ID + "}"; String VERSION_PATH = "/{" + VERSION + "}"; String CONTENTS_PATH = "/" + Names.CONTENTS; String IV_PATH = "/iv"; String SALT_PATH = "/salt"; String TAG_PATH = "/tag"; String LEVELS_PATH = "/levels"; String METADATA_PATH = "/metadata"; String BULK_PATH = "/bulk"; String LATEST = "/latest"; String OBJECTMETADATA_PATH = "/objectmetadata"; String OBJECT_METADATA_PATH = OBJECTMETADATA_PATH + OBJECT_ID_PATH; String VERSIONED_OBJECT_ID_PATH = OBJECT_ID_PATH + VERSION_PATH; String LATEST_OBJECT_ID_PATH = LATEST + OBJECT_ID_PATH; /** * Request a new object be created in a pending state * * @return The ID of the newly created object */ @POST( CONTROLLER ) VersionedObjectKey createObject( @Body CreateObjectRequest request ); @GET( CONTROLLER + LATEST_OBJECT_ID_PATH ) VersionedObjectKey getLatestVersionedObjectKey( @Path( ID ) UUID id ); /** * Lazy Person API for bulk reading base64 encoded block ciphertexts in bulk. * * @param objectIds * @return */ @POST( CONTROLLER + BULK_PATH ) Map<UUID, BlockCiphertext> getObjects( @Body Set<UUID> objectIds ); //TODO: Consider adding an API the returns the version as part of the value. /** * Lazy Person API for writing base64 encoded block ciphertexts. Objects written via this API will be available * through the more efficient byte level APIs. * * @param objectId * @param ciphertext * @return */ @PUT( CONTROLLER + OBJECT_ID_PATH + VERSION_PATH ) Response setObjectFromBlockCiphertext( @Path( ID ) UUID objectId, @Path( VERSION ) long version, @Body BlockCiphertext ciphertext ); /** * Cached Lazy Person API for reading base64 encoded block ciphertexts. Objects readable by this API will be * available through the more efficient byte level APIs. * * @param objectId * @param version * @return */ @GET( CONTROLLER + VERSIONED_OBJECT_ID_PATH ) BlockCiphertext getObjectAsBlockCiphertext( @Path( ID ) UUID objectId, @Path( VERSION ) long version ); /** * Sets the IV for an object block * * @param objectId * @param version * @param iv * @return */ @PUT( CONTROLLER + OBJECT_ID_PATH + VERSION_PATH + IV_PATH ) Response setObjectIv( @Path( ID ) UUID objectId, @Path( VERSION ) long version, @Body byte[] iv ); @PUT( CONTROLLER + OBJECT_ID_PATH + VERSION_PATH + CONTENTS_PATH ) Response setObjectContent( @Path( ID ) UUID objectId, @Path( VERSION ) long version, @Body byte[] content ); @PUT( CONTROLLER + OBJECT_ID_PATH + VERSION_PATH + SALT_PATH ) Response setObjectSalt( @Path( ID ) UUID objectId, @Path( VERSION ) long version, @Body byte[] salt ); @PUT( CONTROLLER + OBJECT_ID_PATH + VERSION_PATH + TAG_PATH ) Response setObjectTag( @Path( ID ) UUID objectId, @Path( VERSION ) long version, @Body byte[] tag ); @GET( CONTROLLER + VERSIONED_OBJECT_ID_PATH + CONTENTS_PATH ) byte[] getObjectContent( @Path( ID ) UUID objectId, @Path( VERSION ) long version ); @GET( CONTROLLER + VERSIONED_OBJECT_ID_PATH + IV_PATH ) byte[] getObjectIV( @Path( ID ) UUID objectId, @Path( VERSION ) long version ); @GET( CONTROLLER + VERSIONED_OBJECT_ID_PATH + SALT_PATH ) byte[] getObjectSalt( @Path( ID ) UUID objectId, @Path( VERSION ) long version ); @GET( CONTROLLER + VERSIONED_OBJECT_ID_PATH + TAG_PATH ) byte[] getObjectTag( @Path( ID ) UUID objectId, @Path( VERSION ) long version ); @GET( CONTROLLER + OBJECT_METADATA_PATH ) ObjectMetadata getObjectMetadata( @Path( ID ) UUID id ); @DELETE( CONTROLLER + OBJECT_ID_PATH + VERSION_PATH ) Response delete( @Path( ID ) UUID id, @Path( VERSION ) long version ); @DELETE( CONTROLLER + OBJECT_ID_PATH ) Response delete( @Path( ID ) UUID id ); @DELETE( CONTROLLER ) Set<UUID> deleteObjectTrees( @Body Set<UUID> objectTrees ); @POST( CONTROLLER + LEVELS_PATH ) Map<UUID, ObjectMetadataEncryptedNode> getObjectsByTypeAndLoadLevel( @Body ObjectTreeLoadRequest request ); // METADATA APIs /** * Request a new object be created in a pending state * * @return The ID of the newly created object */ @POST( CONTROLLER + METADATA_PATH ) VersionedObjectKey createMetadataObject( @Body CreateMetadataObjectRequest request ); }