#include "colnodapi.h" ColnodAPI::ColnodAPI() { } ColnodAPI::ColnodAPI(serversdk::RequestManager* reqMan, qint64 lastSync, QString userName, QString password) :mReqMan(reqMan), mUserName(userName), mPassword(password) { mLastSync.set_timestamp(lastSync); data = std::make_shared(); // ----------------------------------- mReqMan->setIgnoreSsl(true); // ----------------------------------- } void ColnodAPI::downloadData() { // Have to get Login auto login = requestLogin(); connect(login.get(), &serversdk::Request::finished, this, [=](){ // TODO: error handling // Get token AuthToken token; token.fromJson(login->responseData()); authToken = token.idWithoutCurlyBraces(); // if I have all data emit downloadDataFinished connect(this, &ColnodAPI::partOfDataReady, this, &ColnodAPI::areDataReady); getTokensUpdated(mLastSync); getTokensDeleted(mLastSync); getSubjectsUpdated(mLastSync); getSubjectsDeleted(mLastSync); }); } void ColnodAPI::processData(std::shared_ptr data) { if ( !data->updatedTokens.isEmpty()) { setTokens(data->updatedTokens); } else { emit partOfDataProcessFinished(); } if ( !data->deletedTokens.isEmpty()) { deleteTokens(data->deletedTokens); } else { emit partOfDataProcessFinished(); } } std::shared_ptr ColnodAPI::requestLogin() { Q_ASSERT(mReqMan); LoginResp login; login.set_username(userName()); // password QString encodedPassword = QCryptographicHash::hash( password().toLocal8Bit(), // -> bytearray QCryptographicHash::Sha512 // SHA 512 ).toHex().toUpper(); login.set_password(encodedPassword); auto loginRequest = composeRequest("/AaaManager/authSession", login.jsonData()); loginRequest->setUserName(login.username()); loginRequest->setPassword(login.password()); mReqMan->processRequest(loginRequest); return loginRequest; } void ColnodAPI::getTokensUpdated(const Timestamp &time) { auto request = composeRequest("/TokenManager/getTokensUpdated", time.jsonData()); request->setUserName(authToken); mReqMan->processRequest(request); connect(request.get(), &serversdk::Request::finished, [=](){ saveUpdatedTokens(request->responseData()); emit partOfDataReady(data); }); } void ColnodAPI::getTokensDeleted(const Timestamp &time) { auto request = composeRequest("/TokenManager/getTokensDeleted", time.jsonData()); request->setUserName(authToken); mReqMan->processRequest(request); connect(request.get(), &serversdk::Request::finished, [=](){ saveDeletedTokens(request->responseData()); emit partOfDataReady(); }); } void ColnodAPI::getSubjectsUpdated(const Timestamp &time) { auto request = composeRequest("/SubjectManager/getSubjectsUpdated", time.jsonData()); request->setUserName(authToken); mReqMan->processRequest(request); connect(request.get(), &serversdk::Request::finished, [=](){ saveUpdatedSubjects(request->responseData()); emit partOfDataReady(); }); } void ColnodAPI::getSubjectsDeleted(const Timestamp &time) { auto request = composeRequest("/SubjectManager/getSubjectsDeleted", time.jsonData()); request->setUserName(authToken); mReqMan->processRequest(request); connect(request.get(), &serversdk::Request::finished, [=](){ saveDeletedSubjects(request->responseData()); emit partOfDataReady(); }); } void ColnodAPI::setTokens(const QHash> &tokens) { auto request = composeRequest("/TokenManager/setTokens", Token::tokensToColnodJson(tokens)); request->setUserName(authToken); mReqMan->processRequest(request); connect(request.get(), &serversdk::Request::finished, [=](){ if (checkResponse(request->responseData())) { emit partOfDataProcessFinished(); } else { // TODO: error: data wasnt upload to colnod } }); } void ColnodAPI::deleteTokens(const QList &ids) { auto request = composeRequest("/TokenManager/deleteTokens", Token::idsToJSON(ids)); request->setUserName(authToken); mReqMan->processRequest(request); connect(request.get(), &serversdk::Request::finished, [=](){ if (checkResponse(request->responseData())) { emit partOfDataProcessFinished(); } else { // TODO: error: data wasnt upload to colnod } }); } std::shared_ptr ColnodAPI::composeRequest(const QString &endpoint, const QByteArray &data) { QString url = mHost + endpoint; return std::make_shared("POST", url, data); } QString ColnodAPI::password() const { return mPassword; } void ColnodAPI::setPassword(const QString &password) { mPassword = password; } qint64 ColnodAPI::lastSync() const { return mLastSync.timestamp(); } void ColnodAPI::setlastSync(const qint64 &lastSync) { mLastSync.set_timestamp(lastSync); } QString ColnodAPI::userName() const { return mUserName; } void ColnodAPI::setUserName(const QString &userName) { mUserName = userName; } void ColnodAPI::areDataReady() { if (++amountData == 4) { emit downloadDataFinished(data); newData(); } } void ColnodAPI::isDataProcessFinished() { if (++amountProccessesFinished == 2) emit dataProcessFinished(); } void ColnodAPI::saveUpdatedTokens(const QByteArray &responseData) { data->loadTokensFromJson(responseData); } void ColnodAPI::saveDeletedTokens(const QByteArray &responseData) { QJsonDocument doc = QJsonDocument::fromJson(responseData); QJsonArray items = doc.object()["items"].toArray(); for (QJsonValueRef item : items) { data->deletedTokens.append(item.toString()); } } void ColnodAPI::saveUpdatedSubjects(const QByteArray &responseData) { data->loadSubjectsFormJson(responseData); } void ColnodAPI::saveDeletedSubjects(const QByteArray &responseData) { QJsonDocument doc = QJsonDocument::fromJson(responseData); QJsonArray items = doc.object()["items"].toArray(); for (QJsonValueRef item : items) { data->deletedSubjects.append(item.toString()); } } void ColnodAPI::newData() { data = std::make_shared(); } bool ColnodAPI::checkResponse(const QByteArray &responseData) { QJsonDocument doc = QJsonDocument::fromJson(responseData); return doc.object().contains("items"); }