#include #include #include namespace Api { using Pistache::Http::Mime::Subtype; using Pistache::Http::Mime::Type; Util::Date ParseUtcDate(std::string const & date, Util::Date const & fallbackValue) { Util::Date result; if(!result.TryParse(date)) { return fallbackValue; } return result; } Util::Date ParseUtcDate(Pistache::Optional const & date, Util::Date const & fallbackValue) { if(date.isEmpty() || date.unsafeGet().size() != 10) { return fallbackValue; } return ParseUtcDate(date.unsafeGet(), fallbackValue); } void GetDay(Pistache::Http::Request const & request, Pistache::Http::ResponseWriter responseWrite) { Util::Date const start = ParseUtcDate(request.query().get("start"), Util::Date::UtcNow()); auto const stopQuery = request.query().get("stop"); if(stopQuery.isEmpty()) { responseWrite.send( Pistache::Http::Code::Ok, Configuration::Get().GetDatabaseConnection().GetEntireDay(start), MIME(Application, Json)); return; } Util::Date const stop = ParseUtcDate(request.query().get("stop"), start); if(!start.IsBefore(stop)) { responseWrite.send(Pistache::Http::Code::Bad_Request); return; } responseWrite.send( Pistache::Http::Code::Ok, Configuration::Get().GetDatabaseConnection().GetSummarizedPerDayRecords(start, stop), MIME(Application, Json)); } void GetMonth(Pistache::Http::Request const & request, Pistache::Http::ResponseWriter responseWrite) { auto const startQuery = request.query().get("start"); auto const stopQuery = request.query().get("stop"); if(startQuery.isEmpty() || stopQuery.isEmpty()) { responseWrite.send(Pistache::Http::Code::Bad_Request); return; } auto const start = Util::Date(startQuery.unsafeGet()); auto stop = Util::Date(stopQuery.unsafeGet()); if(!start.IsValid() || !stop.IsValid()) { responseWrite.send(Pistache::Http::Code::Bad_Request); return; } stop.SetDayToEndOfMonth(); if(stop.IsBefore(start)) { responseWrite.send(Pistache::Http::Code::Bad_Request); return; } responseWrite.send( Pistache::Http::Code::Ok, Configuration::Get().GetDatabaseConnection().GetSummarizedPerMonthRecords(start, stop), MIME(Application, Json)); } void SetupRouting(Pistache::Rest::Router & router) { Pistache::Rest::Routes::Get(router, "/day", Pistache::Rest::Routes::bind(&Api::GetDay)); Pistache::Rest::Routes::Get(router, "/month", Pistache::Rest::Routes::bind(&Api::GetMonth)); } }