feat: enhance validation and serialization with fiscal code checks and JSON schema support

This commit is contained in:
gabdevele
2026-06-14 21:09:05 +02:00 Unverified
parent feef498d9a
commit 002f89bd73
10 changed files with 282 additions and 32 deletions
+41 -2
View File
@@ -6,7 +6,31 @@
namespace visione::repositories
{
Json::Value scalarToJson(JsonFieldType type, const drogon::orm::Field &field)
{
switch (type)
{
case JsonFieldType::String:
return Json::Value(field.as<std::string>());
case JsonFieldType::Int64:
return Json::Value(Json::Int64(field.as<long long>()));
case JsonFieldType::UInt64:
return Json::Value(Json::UInt64(field.as<unsigned long long>()));
case JsonFieldType::Double:
return Json::Value(field.as<double>());
case JsonFieldType::Bool:
return Json::Value(field.as<bool>());
}
return Json::nullValue;
}
Json::Value rowToJson(const drogon::orm::Row &row)
{
static const JsonRowSchema emptySchema;
return rowToJson(row, emptySchema);
}
Json::Value rowToJson(const drogon::orm::Row &row, const JsonRowSchema &schema)
{
Json::Value object(Json::objectValue);
for (const auto &field : row)
@@ -17,18 +41,33 @@ Json::Value rowToJson(const drogon::orm::Row &row)
}
else
{
object[field.name()] = field.as<std::string>();
const auto it = schema.find(field.name());
if (it == schema.end())
{
object[field.name()] = field.as<std::string>();
}
else
{
object[field.name()] = scalarToJson(it->second, field);
}
}
}
return object;
}
Json::Value resultToJson(const drogon::orm::Result &result)
{
static const JsonRowSchema emptySchema;
return resultToJson(result, emptySchema);
}
Json::Value resultToJson(const drogon::orm::Result &result,
const JsonRowSchema &schema)
{
Json::Value array(Json::arrayValue);
for (const auto &row : result)
{
array.append(rowToJson(row));
array.append(rowToJson(row, schema));
}
return array;
}
+16 -1
View File
@@ -4,11 +4,26 @@
#include <json/json.h>
#include <string>
#include <unordered_map>
namespace visione::repositories
{
enum class JsonFieldType
{
String,
Int64,
UInt64,
Double,
Bool
};
using JsonRowSchema = std::unordered_map<std::string, JsonFieldType>;
Json::Value scalarToJson(JsonFieldType type, const drogon::orm::Field &field);
Json::Value rowToJson(const drogon::orm::Row &row);
Json::Value rowToJson(const drogon::orm::Row &row, const JsonRowSchema &schema);
Json::Value resultToJson(const drogon::orm::Result &result);
Json::Value resultToJson(const drogon::orm::Result &result,
const JsonRowSchema &schema);
std::string nullableString(const Json::Value &value, const std::string &key);
} // namespace visione::repositories