Add report workflow
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user