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