Program Listing for File ServiceBase.h
↰ Return to documentation for file (axr.sdk/ServiceBase.h
)
// Copyright (C) AcceleratXR, Inc. All rights reserved.
//
// Author: Jean-Philippe Steinmetz <info@acceleratxr.com>
//
// NOTE: This file was auto generated by the AcceleratXR code generator.
// https://gitlab.com/AcceleratXR/Core/code_generator.git
#pragma once
#include <cpprest/asyncrt_utils.h>
#include "Variant.h"
#include "models/Count.h"
#include "net/IApiClient.h"
#include "utils/StringUtils.h"
#include "Configuration.h"
namespace axr {
namespace sdk {
class IServiceBase
{
};
template<class T>
class ServiceBase : public IServiceBase
{
protected:
ServiceBase(std::shared_ptr<Configuration> config, std::shared_ptr<net::IApiClient> apiClient)
: m_apiClient(apiClient)
, m_config(config)
{
}
pplx::task<std::vector<std::shared_ptr<T>>> FindAll(
const utility::string_t& path,
const std::map<utility::string_t, utility::string_t>* searchParams = nullptr,
const uint16_t startIndex = 0,
const uint16_t maxResults = 1000,
const utility::string_t& sortBy = _XPLATSTR("")
)
{
std::map<utility::string_t, utility::string_t> headerParams;
std::map<utility::string_t, utility::string_t> queryParams;
// Add default query parameters
queryParams[_XPLATSTR("page")] = utility::conversions::to_string_t(std::to_string(startIndex));
queryParams[_XPLATSTR("limit")] = utility::conversions::to_string_t(std::to_string(maxResults));
if (!sortBy.empty()) queryParams[_XPLATSTR("sort")] = sortBy;
// Add all search parameters as query parameters
if (searchParams != nullptr)
{
for (auto iter = searchParams->cbegin(); iter != searchParams->cend(); iter++)
{
queryParams[iter->first] = iter->second;
}
}
return m_apiClient->Get(path, queryParams, headerParams).then([=](Variant result)
{
std::vector<std::shared_ptr<T>> arr;
if (4 == result.index())
{
for (auto& item : std::get<std::vector<Variant>>(result))
{
std::shared_ptr<T> itemObj = std::make_shared<T>();
itemObj->MoveFrom(std::get<std::shared_ptr<Object>>(item));
itemObj->SetRemoteUrl(path + _XPLATSTR("/") + itemObj->GetUid());
arr.push_back(itemObj);
}
}
else
{
throw Exception(500, _XPLATSTR("Invalid server response."));
}
return arr;
});
}
pplx::task<std::shared_ptr<T>> Create(const utility::string_t& p, std::shared_ptr<T> obj)
{
// Check the URI for parameters. If there are any we need to fill them in based on the provided object.
utility::string_t path = p;
std::vector<utility::string_t> uriParams = utils::strings::GetParameters(path);
if (uriParams.size() > 0)
{
for (auto uriParam : uriParams)
{
if (obj->HasProperty(uriParam))
{
utility::string_t val = std::get<utility::string_t>(obj->GetProperty(uriParam));
utils::strings::ReplaceAll(path, uriParam, val);
}
}
}
std::map<utility::string_t, utility::string_t> headerParams;
return m_apiClient->Post(path, obj, headerParams).then([=](Variant result)
{
if (3 == result.index())
{
std::shared_ptr<T> obj = std::make_shared<T>();
obj->MoveFrom(std::get<std::shared_ptr<Object>>(result));
obj->SetRemoteUrl(path + _XPLATSTR("/") + obj->GetUid());
return obj;
}
else
{
throw Exception(500, _XPLATSTR("Invalid server response."));
}
});
}
pplx::task<uint64_t> Count(
const utility::string_t& path,
const std::map<utility::string_t, utility::string_t>* searchParams = nullptr,
const uint16_t startIndex = 0,
const uint16_t maxResults = 1000
)
{
std::map<utility::string_t, utility::string_t> headerParams;
std::map<utility::string_t, utility::string_t> queryParams;
// Add default query parameters
queryParams[_XPLATSTR("page")] = utility::conversions::to_string_t(std::to_string(startIndex));
queryParams[_XPLATSTR("limit")] = utility::conversions::to_string_t(std::to_string(maxResults));
// Add all search parameters as query parameters
if (searchParams != nullptr)
{
for (auto iter = searchParams->cbegin(); iter != searchParams->cend(); iter++)
{
queryParams[iter->first] = iter->second;
}
}
return m_apiClient->Head(path, queryParams, headerParams);
}
pplx::task<uint64_t> CountLegacy(
const utility::string_t& path,
const std::map<utility::string_t, utility::string_t>* searchParams = nullptr,
const uint16_t startIndex = 0,
const uint16_t maxResults = 1000
)
{
std::map<utility::string_t, utility::string_t> headerParams;
std::map<utility::string_t, utility::string_t> queryParams;
// Add default query parameters
queryParams[_XPLATSTR("page")] = utility::conversions::to_string_t(std::to_string(startIndex));
queryParams[_XPLATSTR("limit")] = utility::conversions::to_string_t(std::to_string(maxResults));
// Add all search parameters as query parameters
if (searchParams != nullptr)
{
for (auto iter = searchParams->cbegin(); iter != searchParams->cend(); iter++)
{
queryParams[iter->first] = iter->second;
}
}
return m_apiClient->Get(path, queryParams, headerParams).then([=](Variant result)
{
auto const count = std::get<int64_t>(result);
return uint64_t(count);
});
}
pplx::task<std::shared_ptr<T>> FindById(const utility::string_t& path)
{
std::map<utility::string_t, utility::string_t> headerParams;
std::map<utility::string_t, utility::string_t> queryParams;
return m_apiClient->Get(path, queryParams, headerParams).then([=](Variant result)
{
if (3 == result.index())
{
std::shared_ptr<T> obj = std::make_shared<T>();
obj->MoveFrom(std::get<std::shared_ptr<Object>>(result));
obj->SetRemoteUrl(path);
return obj;
}
else
{
throw Exception(500, _XPLATSTR("Invalid server response."));
}
});
}
pplx::task<std::shared_ptr<T>> Update(const utility::string_t& p, std::shared_ptr<T> obj)
{
// Check the URI for parameters. If there are any we need to fill them in based on the provided object.
utility::string_t path = p;
std::vector<utility::string_t> uriParams = utils::strings::GetParameters(p);
if (uriParams.size() > 0)
{
for (auto uriParam : uriParams)
{
if (obj->HasProperty(uriParam))
{
utility::string_t val = std::get<utility::string_t>(obj->GetProperty(uriParam));
utils::strings::ReplaceAll(path, uriParam, val);
}
}
}
std::map<utility::string_t, utility::string_t> headerParams;
return m_apiClient->Put(path, obj, headerParams).then([=](Variant result)
{
if (3 == result.index())
{
std::shared_ptr<T> obj = std::make_shared<T>();
obj->MoveFrom(std::get<std::shared_ptr<Object>>(result));
obj->SetRemoteUrl(path);
return obj;
}
else
{
throw Exception(500, _XPLATSTR("Invalid server response."));
}
});
}
pplx::task<void> Delete(const utility::string_t& path)
{
std::map<utility::string_t, utility::string_t> headerParams;
std::map<utility::string_t, utility::string_t> queryParams;
return m_apiClient->Delete(path, queryParams, headerParams);
}
pplx::task<void> Truncate(const utility::string_t& path, const std::map<utility::string_t, utility::string_t>* searchParams = nullptr)
{
std::map<utility::string_t, utility::string_t> headerParams;
std::map<utility::string_t, utility::string_t> queryParams;
// Add all search parameters as query parameters
if (searchParams != nullptr)
{
for (auto iter = searchParams->cbegin(); iter != searchParams->cend(); iter++)
{
queryParams[iter->first] = iter->second;
}
}
return m_apiClient->Delete(path, queryParams, headerParams);
}
std::shared_ptr<net::IApiClient> m_apiClient;
std::shared_ptr<Configuration> m_config;
};
} // namespace axr
} // namespace sdk