149 lines
5.0 KiB
C++
149 lines
5.0 KiB
C++
#include "parser.hpp"
|
|
#include "menu.hpp"
|
|
#include "meal.hpp"
|
|
#include "parsers/parsers.hpp"
|
|
|
|
#include <iostream>
|
|
#include <memory>
|
|
#include <restbed>
|
|
#include <sstream>
|
|
|
|
std::vector<std::string> days = {"MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"};
|
|
std::vector<std::unique_ptr<LunchRest::Parser>> parsers;
|
|
|
|
void get_all( const std::shared_ptr< restbed::Session > session ) {
|
|
std::stringstream ss{};
|
|
bool atleastonerest = false;
|
|
ss << "[";
|
|
for(auto &x : parsers) {
|
|
atleastonerest = true;
|
|
ss << "{\"restaurant\": \"" << x->getRestaurant() << "\", \"menus\": [";
|
|
bool atleastonemenu = false;
|
|
for(const auto &y : x->getMenus()) {
|
|
atleastonemenu = true;
|
|
ss << y.jsonify() << ",";
|
|
}
|
|
if(atleastonemenu)
|
|
ss.seekp(-1, ss.cur);
|
|
ss << "]},";
|
|
}
|
|
if(atleastonerest)
|
|
ss.seekp(-1, ss.cur);
|
|
ss << "]";
|
|
auto res = ss.str();
|
|
session->close(restbed::OK, res, { { "Content-Length", std::to_string(res.length()) } });
|
|
}
|
|
|
|
void get( const std::shared_ptr< restbed::Session > session ) {
|
|
// TODO better
|
|
int day = -1;
|
|
int restaurant = -1;
|
|
auto request = session->get_request();
|
|
for(const auto query_param : request->get_query_parameters()) {
|
|
if(query_param.first == "day") {
|
|
if(query_param.second == "monday") {
|
|
day = 0;
|
|
} else if(query_param.second == "tuesday") {
|
|
day = 1;
|
|
} else if(query_param.second == "wednesday") {
|
|
day = 2;
|
|
} else if(query_param.second == "thursday") {
|
|
day = 3;
|
|
} else {
|
|
day = 4;
|
|
}
|
|
}
|
|
if(query_param.first == "restaurant") {
|
|
if(query_param.second == "udrevaka") {
|
|
restaurant = 0;
|
|
} else if(query_param.second == "padagali") {
|
|
restaurant = 1;
|
|
} else if(query_param.second == "lightofindia") {
|
|
restaurant = 2;
|
|
} else if(query_param.second == "ukarla") {
|
|
restaurant = 3;
|
|
} else {
|
|
restaurant = 4;
|
|
}
|
|
}
|
|
}
|
|
std::string error = "DIDN'T SPECIFY DAY OR RESTAURANT";
|
|
if(day == -1 && restaurant == -1) {
|
|
session->close(restbed::OK, error, { { "Content-Length", std::to_string(error.length()) } });
|
|
return;
|
|
}
|
|
|
|
std::stringstream ss{};
|
|
if(day != -1 && restaurant != -1) {
|
|
auto &x = parsers[restaurant];
|
|
ss << "[{\"restaurant\": \"" << x->getRestaurant() << "\", \"menus\": [";
|
|
ss << x->getMenus()[day].jsonify();
|
|
ss << "]}]";
|
|
} else if(day != -1) {
|
|
ss << "[";
|
|
bool atleastone = false;
|
|
for(auto &x : parsers) {
|
|
atleastone = true;
|
|
ss << "{\"restaurant\": \"" << x->getRestaurant() << "\", \"menus\": [";
|
|
ss << x->getMenus()[day].jsonify();
|
|
ss << "]},";
|
|
}
|
|
if(atleastone)
|
|
ss.seekp(-1, ss.cur);
|
|
ss << "]";
|
|
} else if(restaurant != -1) {
|
|
auto &x = parsers[restaurant];
|
|
ss << "[{\"restaurant\": \"" << x->getRestaurant() << "\", \"menus\": [";
|
|
bool atleastone = false;
|
|
for(auto &y : x->getMenus()) {
|
|
atleastone = true;
|
|
ss << y.jsonify() << ",";
|
|
}
|
|
if(atleastone)
|
|
ss.seekp(-1, ss.cur);
|
|
ss << "]}]";
|
|
}
|
|
auto res = ss.str();
|
|
session->close(restbed::OK, res, { { "Content-Length", std::to_string(res.length()) } });
|
|
}
|
|
|
|
int main() {
|
|
parsers.emplace_back(new LunchRest::UDrevakaParser());
|
|
parsers.emplace_back(new LunchRest::PadagaliParser());
|
|
parsers.emplace_back(new LunchRest::LightOfIndiaParser());
|
|
parsers.emplace_back(new LunchRest::UKarlaParser());
|
|
parsers.emplace_back(new LunchRest::AlCaponeParser());
|
|
std::cout << "Initial parsing" << std::endl;
|
|
for(auto &x : parsers)
|
|
x->parse();
|
|
std::cout << "Finished parsing" << std::endl;
|
|
|
|
restbed::Service service;
|
|
|
|
auto getallserv = std::make_shared< restbed::Resource >();
|
|
getallserv->set_path("/get_all");
|
|
getallserv->set_method_handler( "GET", get_all );
|
|
service.publish(getallserv);
|
|
|
|
auto getserv = std::make_shared< restbed::Resource >();
|
|
getserv->set_path("/get");
|
|
getserv->set_method_handler( "GET", get );
|
|
service.publish(getserv);
|
|
|
|
auto ssl_settings = std::make_shared<restbed::SSLSettings>();
|
|
ssl_settings->set_http_disabled(true);
|
|
ssl_settings->set_private_key(restbed::Uri("file:///home/zvon/data/programming/lunch-rest/example.key"));
|
|
ssl_settings->set_certificate(restbed::Uri("file:///home/zvon/data/programming/lunch-rest/example.crt"));
|
|
ssl_settings->set_temporary_diffie_hellman(restbed::Uri("file:///home/zvon/data/programming/lunch-rest/dhparams.pem"));
|
|
ssl_settings->set_port(1985);
|
|
|
|
auto settings = std::make_shared< restbed::Settings >();
|
|
settings->set_port(1984);
|
|
settings->set_default_header( "Connection", "close" );
|
|
settings->set_ssl_settings(ssl_settings);
|
|
|
|
service.start(settings);
|
|
|
|
return 0;
|
|
}
|