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
+70 -10
View File
@@ -16,6 +16,9 @@ namespace visione::services
{
namespace
{
using repositories::JsonFieldType;
using repositories::JsonRowSchema;
Json::Value failure(const std::string &code)
{
Json::Value body;
@@ -152,6 +155,57 @@ int boundedPerPage(const std::optional<std::string> &value)
}
}
const JsonRowSchema &reportSchema()
{
static const JsonRowSchema schema{
{"id", JsonFieldType::UInt64},
{"user_id", JsonFieldType::UInt64},
{"category_id", JsonFieldType::UInt64},
{"area_id", JsonFieldType::UInt64},
{"assigned_operator_id", JsonFieldType::UInt64},
{"latitude", JsonFieldType::Double},
{"longitude", JsonFieldType::Double}};
return schema;
}
const JsonRowSchema &reportHistorySchema()
{
static const JsonRowSchema schema{
{"id", JsonFieldType::UInt64},
{"report_id", JsonFieldType::UInt64},
{"changed_by_user_id", JsonFieldType::UInt64}};
return schema;
}
const JsonRowSchema &reportMediaSchema()
{
static const JsonRowSchema schema{
{"id", JsonFieldType::UInt64},
{"report_id", JsonFieldType::UInt64},
{"size_bytes", JsonFieldType::UInt64}};
return schema;
}
const JsonRowSchema &messageSchema()
{
static const JsonRowSchema schema{
{"id", JsonFieldType::UInt64},
{"report_id", JsonFieldType::UInt64},
{"user_id", JsonFieldType::UInt64}};
return schema;
}
const JsonRowSchema &openDataReportSchema()
{
static const JsonRowSchema schema{
{"id", JsonFieldType::UInt64},
{"category_id", JsonFieldType::UInt64},
{"area_id", JsonFieldType::UInt64},
{"latitude", JsonFieldType::Double},
{"longitude", JsonFieldType::Double}};
return schema;
}
Json::Value pagedReportResponse(const drogon::orm::Result &result,
int page,
int perPage)
@@ -159,7 +213,7 @@ Json::Value pagedReportResponse(const drogon::orm::Result &result,
auto response = success();
response["page"] = page;
response["per_page"] = perPage;
response["reports"] = repositories::resultToJson(result);
response["reports"] = repositories::resultToJson(result, reportSchema());
return response;
}
@@ -335,7 +389,7 @@ Json::Value ReportService::listReports(const auth::UserContext &user,
}
auto response = success();
response["reports"] = repositories::resultToJson(result);
response["reports"] = repositories::resultToJson(result, reportSchema());
return response;
}
@@ -429,13 +483,15 @@ Json::Value ReportService::reportDetail(const auth::UserContext &user,
}
auto response = success();
response["report"] = repositories::rowToJson(report[0]);
response["report"] = repositories::rowToJson(report[0], reportSchema());
response["history"] = repositories::resultToJson(db->execSqlSync(
"SELECT * FROM report_status_history WHERE report_id = ? ORDER BY id",
reportId));
reportId),
reportHistorySchema());
response["media"] = repositories::resultToJson(db->execSqlSync(
"SELECT * FROM report_photos WHERE report_id = ? ORDER BY id",
reportId));
reportId),
reportMediaSchema());
return response;
}
@@ -464,15 +520,17 @@ Json::Value ReportService::interventionSummary(const auth::UserContext &user,
return failure("report_not_found");
}
auto response = success();
response["summary"] = repositories::rowToJson(report[0]);
response["summary"] = repositories::rowToJson(report[0], reportSchema());
response["media"] = repositories::resultToJson(db->execSqlSync(
"SELECT * FROM report_photos WHERE report_id = ? ORDER BY id",
reportId));
reportId),
reportMediaSchema());
response["latest_messages"] = repositories::resultToJson(db->execSqlSync(
"SELECT m.id, m.user_id, u.first_name, u.last_name, m.body, m.created_at "
"FROM messages m JOIN users u ON u.id = m.user_id "
"WHERE m.report_id = ? ORDER BY m.created_at DESC LIMIT 5",
reportId));
reportId),
messageSchema());
return response;
}
@@ -628,7 +686,8 @@ Json::Value ReportService::listMessages(const auth::UserContext &user,
"SELECT m.*, u.first_name, u.last_name FROM messages m "
"JOIN users u ON u.id = m.user_id WHERE m.report_id = ? "
"ORDER BY m.created_at",
reportId));
reportId),
messageSchema());
return response;
}
@@ -802,7 +861,8 @@ Json::Value ReportService::openDataReports(const std::optional<std::string> &pag
"WHERE r.status IN ('RESOLVED', 'CLOSED') "
"ORDER BY r.updated_at DESC LIMIT ? OFFSET ?",
perPageValue,
offset));
offset),
openDataReportSchema());
return response;
}