Class RestfulController

Synopsis

#include <orm_lib/inc/drogon/orm/RestfulController.h>

class RestfulController : trantor::NonCopyable

Description

this class is a helper class for the implementation of restful api controllers generated by the drogon_ctl command.

Inheritance

Ancestors: NonCopyable

Methods

RestfulController
disableMasquerading
doCustomValidations
enableMasquerading
fieldsSelector
isMasquerading
makeCriteriamake a criteria object for searching by ORM.
makeJson
masqueradingVector
registerAJsonValidator

Source

Lines 31-172 in orm_lib/inc/drogon/orm/RestfulController.h. Line 32 in orm_lib/inc/drogon/orm/RestfulController.h.

class RestfulController : trantor::NonCopyable
{
  public:
    void enableMasquerading(const std::vector<std::string> &pMasqueradingVector)
    {
        masquerading_ = true;
        masqueradingVector_ = pMasqueradingVector;
        for (size_t i = 0; i < masqueradingVector_.size(); ++i)
        {
            masqueradingMap_.insert(
                std::pair<std::string, size_t>{masqueradingVector_[i], i});
        }
    }
    void disableMasquerading()
    {
        masquerading_ = false;
        masqueradingVector_ = columnsVector_;
        for (size_t i = 0; i < masqueradingVector_.size(); ++i)
        {
            masqueradingMap_.insert(
                std::pair<std::string, size_t>{masqueradingVector_[i], i});
        }
    }
    void registerAJsonValidator(
        const std::string &fieldName,
        const std::function<bool(const Json::Value &, std::string &)>
            &validator)
    {
        validators_.emplace_back(fieldName, validator);
    }
    void registerAJsonValidator(
        const std::string &fieldName,
        std::function<bool(const Json::Value &, std::string &)> &&validator)
    {
        validators_.emplace_back(fieldName, std::move(validator));
    }

    /**
     * @brief make a criteria object for searching by ORM.
     *
     * @param pJson the json object presenting search criterias.
     * The json object must be an array of depth 3.
     * for example:
     * [
     *    [
     *       ["color","=","red"], //AND
     *       ["price","<",1000]
     *    ], //OR
     *    [
     *        ["color","=","white"], //AND
     *        ["price","<",800],  //AND
     *        ["brand","!=",null]
     *    ]
     * ]
     * @return orm::Criteria
     */
    orm::Criteria makeCriteria(const Json::Value &pJson) noexcept(false);

  protected:
    RestfulController(const std::vector<std::string> &columnsVector)
        : columnsVector_(columnsVector)
    {
    }
    std::vector<std::string> fieldsSelector(const std::set<std::string> &fields)
    {
        std::vector<std::string> ret;
        for (auto &field : masqueradingVector_)
        {
            if (!field.empty() && fields.find(field) != fields.end())
            {
                ret.emplace_back(field);
            }
            else
            {
                ret.emplace_back(std::string{});
            }
        }
        return ret;
    }
    template <typename T>
    Json::Value makeJson(const HttpRequestPtr &req, const T &obj)
    {
        auto &queryParams = req->parameters();
        auto iter = queryParams.find("fields");
        if (masquerading_)
        {
            if (iter != queryParams.end())
            {
                auto fields = utils::splitStringToSet(iter->second, ",");
                return obj.toMasqueradedJson(fieldsSelector(fields));
            }
            else
            {
                return obj.toMasqueradedJson(masqueradingVector_);
            }
        }
        else
        {
            if (iter != queryParams.end())
            {
                auto fields = utils::splitString(iter->second, ",");
                return obj.toMasqueradedJson(fields);
            }
            else
            {
                return obj.toJson();
            }
        }
    }
    bool doCustomValidations(const Json::Value &pJson, std::string &err)
    {
        for (auto &validator : validators_)
        {
            if (pJson.isMember(validator.first))
            {
                if (!validator.second(pJson[validator.first], err))
                {
                    return false;
                }
            }
        }
        return true;
    }
    bool isMasquerading() const
    {
        return masquerading_;
    }
    const std::vector<std::string> &masqueradingVector() const
    {
        return masqueradingVector_;
    }

  private:
    bool masquerading_{true};
    std::vector<std::string> masqueradingVector_;
    std::vector<
        std::pair<std::string,
                  std::function<bool(const Json::Value &, std::string &)>>>
        validators_;
    std::unordered_map<std::string, size_t> masqueradingMap_;
    const std::vector<std::string> columnsVector_;
};





Add Discussion as Guest

Log in to DocsForge