drogon
C++14/17-based HTTP application framework
Loading...
Searching...
No Matches
RestfulController.h
Go to the documentation of this file.
1
14
15#pragma once
16
17#include <drogon/exports.h>
18#include <drogon/drogon.h>
19#include <drogon/orm/DbClient.h>
20#include <drogon/orm/Mapper.h>
21#include <trantor/utils/NonCopyable.h>
22#include <string>
23#include <functional>
24#include <vector>
25
26namespace drogon
27{
32class DROGON_EXPORT RestfulController : trantor::NonCopyable
33{
34 public:
35 void enableMasquerading(const std::vector<std::string> &pMasqueradingVector)
36 {
37 masquerading_ = true;
38 masqueradingVector_ = pMasqueradingVector;
39 for (size_t i = 0; i < masqueradingVector_.size(); ++i)
40 {
41 masqueradingMap_.insert(
42 std::pair<std::string, size_t>{masqueradingVector_[i], i});
43 }
44 }
45
46 void disableMasquerading()
47 {
48 masquerading_ = false;
49 masqueradingVector_ = columnsVector_;
50 for (size_t i = 0; i < masqueradingVector_.size(); ++i)
51 {
52 masqueradingMap_.insert(
53 std::pair<std::string, size_t>{masqueradingVector_[i], i});
54 }
55 }
56
57 void registerAJsonValidator(
58 const std::string &fieldName,
59 const std::function<bool(const Json::Value &, std::string &)>
60 &validator)
61 {
62 validators_.emplace_back(fieldName, validator);
63 }
64
65 void registerAJsonValidator(
66 const std::string &fieldName,
67 std::function<bool(const Json::Value &, std::string &)> &&validator)
68 {
69 validators_.emplace_back(fieldName, std::move(validator));
70 }
71
91
92 orm::Criteria makeCriteria(const Json::Value &pJson) noexcept(false);
93
94 protected:
95 RestfulController(const std::vector<std::string> &columnsVector)
96 : columnsVector_(columnsVector)
97 {
98 }
99
100 std::vector<std::string> fieldsSelector(const std::set<std::string> &fields)
101 {
102 std::vector<std::string> ret;
103 for (auto &field : masqueradingVector_)
104 {
105 if (!field.empty() && fields.find(field) != fields.end())
106 {
107 ret.emplace_back(field);
108 }
109 else
110 {
111 ret.emplace_back(std::string{});
112 }
113 }
114 return ret;
115 }
116
117 template <typename T>
118 Json::Value makeJson(const HttpRequestPtr &req, const T &obj)
119 {
120 auto &queryParams = req->parameters();
121 auto iter = queryParams.find("fields");
122 if (masquerading_)
123 {
124 if (iter != queryParams.end())
125 {
126 auto fields = utils::splitStringToSet(iter->second, ",");
127 return obj.toMasqueradedJson(fieldsSelector(fields));
128 }
129 else
130 {
131 return obj.toMasqueradedJson(masqueradingVector_);
132 }
133 }
134 else
135 {
136 if (iter != queryParams.end())
137 {
138 auto fields = utils::splitString(iter->second, ",");
139 return obj.toMasqueradedJson(fields);
140 }
141 else
142 {
143 return obj.toJson();
144 }
145 }
146 }
147
148 bool doCustomValidations(const Json::Value &pJson, std::string &err)
149 {
150 for (auto &validator : validators_)
151 {
152 if (pJson.isMember(validator.first))
153 {
154 if (!validator.second(pJson[validator.first], err))
155 {
156 return false;
157 }
158 }
159 }
160 return true;
161 }
162
163 bool isMasquerading() const
164 {
165 return masquerading_;
166 }
167
168 const std::vector<std::string> &masqueradingVector() const
169 {
170 return masqueradingVector_;
171 }
172
173 private:
174 bool masquerading_{true};
175 std::vector<std::string> masqueradingVector_;
176 std::vector<
177 std::pair<std::string,
178 std::function<bool(const Json::Value &, std::string &)>>>
179 validators_;
180 std::unordered_map<std::string, size_t> masqueradingMap_;
181 const std::vector<std::string> columnsVector_;
182};
183} // namespace drogon
orm::Criteria makeCriteria(const Json::Value &pJson) noexcept(false)
make a criteria object for searching by ORM.
this class represents a comparison condition.
Definition Criteria.h:74
Drogon Test is a minimal effort test framework developed because the major C++ test frameworks doesn'...
Definition Attribute.h:23