#ifndef LIBREPOMGR_RENDER_H #define LIBREPOMGR_RENDER_H #include "./typedefs.h" #include #include #include #include namespace LibRepoMgr { namespace WebAPI { namespace Render { struct ChunkResponse { explicit ChunkResponse(); boost::beast::http::response response; boost::beast::http::response_serializer serializer; }; std::string escapeHtml(std::string_view unescapedStr); std::shared_ptr makeOptions(const Request &request, std::string_view origin = "*", std::string_view methods = "GET,POST", std::string_view headers = "Content-Type, Access-Control-Allow-Headers, Authorization, X-API-Key, X-Client-ID"); std::shared_ptr makeBadRequest(const Request &request, std::string_view why); std::shared_ptr makeBadRequest(const Request &request, RAPIDJSON_NAMESPACE::StringBuffer &&why); std::shared_ptr makeNotFound(const Request &request, std::string_view target); std::shared_ptr makeAuthRequired(const Request &request); std::shared_ptr makeForbidden(const Request &request); std::shared_ptr makeServerError(const Request &request, std::string_view what); std::shared_ptr makeData(const Request &request, const std::string &data, const char *mimeType); std::shared_ptr makeData(const Request &request, std::string &&data, const char *mimeType); std::shared_ptr makeData(const Request &request, RAPIDJSON_NAMESPACE::StringBuffer &&buffer, const char *mimeType); std::shared_ptr makeText(const Request &request, const std::string &text); std::shared_ptr makeText(const Request &request, std::string &&text); std::shared_ptr makeJson(const Request &request, std::string &&json); std::shared_ptr makeFile(const Request &request, const char *filePath, const char *mimeType, boost::beast::error_code &ec); std::shared_ptr makeChunkResponse(const Request &request, const char *mimeType); inline std::shared_ptr makeText(const Request &request, const std::string &text) { return makeData(request, text, "text/plain"); } inline std::shared_ptr makeText(const Request &request, std::string &&text) { return makeData(request, std::move(text), "text/plain"); } inline std::shared_ptr makeHtml(const Request &request, std::string &&text) { return makeData(request, std::move(text), "text/html"); } inline std::shared_ptr makeJson(const Request &request, std::string &&json) { return makeData(request, std::move(json), "application/json"); } inline std::shared_ptr makeJson(const Request &request, RAPIDJSON_NAMESPACE::StringBuffer &&buffer) { return makeData(request, std::move(buffer), "application/json"); } inline std::shared_ptr makeJson(const Request &request, const RAPIDJSON_NAMESPACE::Document &document, bool pretty = true) { RAPIDJSON_NAMESPACE::StringBuffer buffer; if (pretty) { RAPIDJSON_NAMESPACE::PrettyWriter writer(buffer); document.Accept(writer); } else { RAPIDJSON_NAMESPACE::Writer writer(buffer); document.Accept(writer); } return makeJson(request, std::move(buffer)); } template , ReflectiveRapidJSON::IsMapOrHash> * = nullptr> inline std::shared_ptr makeJson(const Request &request, const Type &serializable, bool pretty = true) { RAPIDJSON_NAMESPACE::Document document(RAPIDJSON_NAMESPACE::kObjectType); ReflectiveRapidJSON::JsonReflector::push(serializable, document, document.GetAllocator()); return makeJson(request, document, pretty); } template > * = nullptr> inline std::shared_ptr makeJson(const Request &request, const Type &serializable, bool pretty = true) { RAPIDJSON_NAMESPACE::Document document(RAPIDJSON_NAMESPACE::kArrayType); ReflectiveRapidJSON::JsonReflector::push(serializable, document, document.GetAllocator()); return makeJson(request, document, pretty); } } // namespace Render } // namespace WebAPI } // namespace LibRepoMgr #endif // LIBREPOMGR_RENDER_H