Add report workflow

This commit is contained in:
gabdevele
2026-06-02 20:04:59 +02:00 Unverified
parent 54aa4cb73e
commit bff22ea83a
9 changed files with 295 additions and 52 deletions
+67 -2
View File
@@ -62,6 +62,28 @@ void sendService(Json::Value body,
: drogon::k400BadRequest;
callback(visione::http::json(std::move(body), status));
}
bool isAllowedImage(const drogon::HttpFile &file)
{
const auto type = file.getContentType();
return type == drogon::CT_IMAGE_JPG || type == drogon::CT_IMAGE_PNG ||
type == drogon::CT_IMAGE_WEBP;
}
std::string imageContentType(const drogon::HttpFile &file)
{
switch (file.getContentType())
{
case drogon::CT_IMAGE_JPG:
return "image/jpeg";
case drogon::CT_IMAGE_PNG:
return "image/png";
case drogon::CT_IMAGE_WEBP:
return "image/webp";
default:
return "application/octet-stream";
}
}
} // namespace
void ReportController::create(
@@ -131,6 +153,20 @@ void ReportController::updateStatus(
sendService(service.updateStatus(*user, reportId, body), std::move(callback));
}
void ReportController::takeReport(
const drogon::HttpRequestPtr &req,
std::function<void(const HttpResponsePtr &)> &&callback,
long long reportId)
{
auto user = requireUser(req, callback);
if (!user || blockPasswordChangeRequired(*user, callback))
{
return;
}
visione::services::ReportService service;
sendService(service.takeReport(*user, reportId), std::move(callback));
}
void ReportController::addMessage(
const drogon::HttpRequestPtr &req,
std::function<void(const HttpResponsePtr &)> &&callback,
@@ -216,9 +252,33 @@ void ReportController::uploadPhotos(
const auto reportDir =
std::filesystem::path(reportsPath) / std::to_string(reportId);
std::filesystem::create_directories(reportDir);
visione::services::ReportService service;
auto allowed = service.canAddPhoto(*user, reportId);
if (!allowed.get("ok", false).asBool())
{
callback(visione::http::json(std::move(allowed), drogon::k403Forbidden));
return;
}
if (parser.getFiles().size() >
static_cast<size_t>(allowed.get("remaining_photo_slots", 0).asInt()))
{
callback(visione::http::error("too_many_photos", drogon::k400BadRequest));
return;
}
for (const auto &file : parser.getFiles())
{
if (!isAllowedImage(file))
{
callback(visione::http::error("unsupported_photo_type",
drogon::k400BadRequest));
return;
}
}
std::filesystem::create_directories(reportDir);
Json::Value response;
response["ok"] = true;
response["photos"] = Json::arrayValue;
@@ -241,7 +301,12 @@ void ReportController::uploadPhotos(
const auto url = publicBasePath + "/reports/" + std::to_string(reportId) +
"/" + fileName;
auto saved = service.addPhoto(*user, reportId, url);
auto saved = service.addPhoto(*user,
reportId,
url,
file.getFileName(),
imageContentType(file),
file.fileLength());
if (!saved.get("ok", false).asBool())
{
callback(visione::http::json(std::move(saved), drogon::k403Forbidden));
+7
View File
@@ -12,6 +12,9 @@ class ReportController : public drogon::HttpController<ReportController>
ADD_METHOD_TO(ReportController::updateStatus,
"/api/v1/reports/{1}/status",
drogon::Patch);
ADD_METHOD_TO(ReportController::takeReport,
"/api/v1/reports/{1}/take",
drogon::Post);
ADD_METHOD_TO(ReportController::addMessage,
"/api/v1/reports/{1}/messages",
drogon::Post);
@@ -40,6 +43,10 @@ class ReportController : public drogon::HttpController<ReportController>
const drogon::HttpRequestPtr &req,
std::function<void(const drogon::HttpResponsePtr &)> &&callback,
long long reportId);
void takeReport(
const drogon::HttpRequestPtr &req,
std::function<void(const drogon::HttpResponsePtr &)> &&callback,
long long reportId);
void addMessage(
const drogon::HttpRequestPtr &req,
std::function<void(const drogon::HttpResponsePtr &)> &&callback,