AutoCatGnome/services/Api.cpp

85 lines
2.6 KiB
C++

//
// Created by selim on 03.01.2022.
//
#include "Api.h"
#include "Settings.h"
#include <memory>
const std::string Api::_baseUrl = "http://127.0.0.1:3000/"; //"https://vps.aliencat.pro:8443/";
SoupSession* Api::_session = soup_session_new();
template<typename T>
void callback(SoupSession* session, SoupMessage* message, gpointer userData) {
auto promise = reinterpret_cast<cc::result_promise<T>*>(userData);
if(message->status_code >= 200 && message->status_code < 300) {
auto responseString = std::string(message->response_body->data, message->response_body->length);
auto json = nlohmann::json::parse(responseString);
if(json["success"].get<bool>()) {
//std::cout << "response: " << responseString << std::endl;
auto data = json["data"].get<T>();
promise->set_result(data);
} else {
auto error = json["error"].get<std::string>();
promise->set_exception(std::make_exception_ptr(std::runtime_error(error)));
}
} else {
promise->set_exception(std::make_exception_ptr(std::runtime_error(message->reason_phrase)));
}
delete promise;
}
template<typename T>
cc::result<T> Api::post(const std::string &method, const nlohmann::json& params) {
std::string url = _baseUrl + method;
auto msg = soup_message_new(SOUP_METHOD_POST, url.c_str());
auto token = Settings::instance().user().token;
if(!token.empty()) {
auto authHeader = "Bearer " + token;
soup_message_headers_append(msg->request_headers, "Authorization", authHeader.c_str());
}
auto promise = new cc::result_promise<T>();
auto result = promise->get_result();
auto jsonStr = params.dump();
soup_message_set_request(msg, "application/json",
SOUP_MEMORY_COPY,
jsonStr.c_str(),
jsonStr.size());
soup_session_queue_message(_session, msg, callback<T>, promise);
return result;
}
cc::result<User> Api::login(std::string email, std::string password) {
nlohmann::json params = {
{ "email", email },
{ "password", password }
};
auto user = Settings::instance().user();
auto result = co_await post<User>("user/login", params);
user.email = result.email;
user.token = result.token;
Settings::instance().setUser(user);
co_return user;
}
cc::result<Vehicle> Api::check(const std::string& number, bool force) {
nlohmann::json params = {
{ "number", number },
{ "forceUpdate", force }
};
return post<Vehicle>("vehicles/check", params);
}