94 lines
3.0 KiB
C++
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));
|
|
}
|
|
}
|