Files
home-data-collection-tools/src/solar-server/api.cpp

94 lines
3.0 KiB
C++

#include <solar/server/api.hpp>
#include <solar/server/configuration.hpp>
#include <util/date.hpp>
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<std::string> 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));
}
}