85 lines
2.6 KiB
C++
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);
|
|
}
|