PrivMX DOCS
C++

Overview

Stores provide encrypted block storage, enabling simple file uploading and downloading.

Before working with Stores, follow our Getting Started Guide. It will show you how to set up your project to work with PrivMX Bridge.

Sample code on this page is based on the initial assumptions.

Working with Stores

When working with Stores, you will use the following:

  • StoreApi - provides methods used to manage Stores in given Context

Let's modify the program from the First App chapter to connect to the Bridge server, create a Store, and put the first file in it.

CMakeLists.txt

...
target_link_libraries(test_program PUBLIC 
		privmxendpoint::privmxendpointcore
        privmxendpoint::privmxendpointstore
		privmxendpoint::crypto
)

main.cpp

// setup some defaults
core::PagingQuery defaultListQuery = {.skip = 0, .limit = 100, .sortOrder = "desc"};
 
// initialize Endpoint connection and Stores API
auto connection {core::Connection::connect(USER1_PRIVATE_KEY, SOLUTION_ID, BRIDGE_URL)};
auto storeApi {store::StoreApi::create(connection)};
 
// ...

Creating Stores

Creating a basic, unnamed Store, which can act as an encrypted data container:

// ...
 
std::vector<core::UserWithPubKey> managers {
    {.userId = USER1_ID, .pubKey = USER1_PUBLIC_KEY}
};
 
std::vector<core::UserWithPubKey> users {
    {.userId = USER1_ID, .pubKey = USER1_PUBLIC_KEY},
    {.userId = USER2_ID, .pubKey = USER2_PUBLIC_KEY}
};
 
// create a new Store with access for USER_1 as manager and USER_2 as regular user
auto storeId {storeApi.createStore(
    CONTEXT_ID, 
    users, managers, 
    core::Buffer::from("some Store's public meta-data"), 
    core::Buffer::from("some Store's private meta-data")
)};
 
// ...

Hint: You can assign any data to private and public meta fields (e.g. the Store's name), as long as it is serialized and can be given as the core::Buffer.

Fetching Stores

Getting a list of Stores available for the user in the given Context:

// ...
 
auto storesList = storeApi.listStores(CONTEXT_ID, defaultListQuery);
 
// ...

As a result you will receive an object:

// storesList:
{
    readItems: [<storeObject1>, <storeObject2>,..., <storeObjectN>],
    totalAvailable: <number_of_all_stores>
}

Getting a single Store:

// ...
 
auto store = storeApi.getStore(storeId, defaultListQuery);
 
// ...

A detailed description of the Store object fields can be found in API Reference.

Modifying Stores

How Updates Work

To update a Store, you must always provide a full list of parameters.

The updateStore(...) method needs all the parameters as in the createStore(...) method and a few more. If you want to update one of the parameters – provide it in a new modified form. If, on the other hand, you want to leave the parameter unchanged – provide it as it was before.

// ...
auto currentStore {storeApi.getStore(storeId)};
 
std::vector<core::UserWithPubKey> managers {
    {.userId = USER1_ID, .pubKey = USER1_PUBLIC_KEY}
};
 
std::vector<core::UserWithPubKey> users {
    {.userId = USER1_ID, .pubKey = USER1_PUBLIC_KEY}
};
 
// update a new Store with access for USER_1 as the only user.
storeApi.updateStore(
    storeId, 
    users, managers, 
    currentStore.publicMeta, 
    currentStore.privateMeta,
    currentStore.version, // <- pass the version of the Store you will perform the update on
    false, // <- force update (without checking version)
    false // <- force to regenerate a key for the Store
);
 
// ...

We use cookies on our website. We use them to ensure the proper functioning of the site and, if you agree, for purposes we set, such as analytics or marketing.

On this page