colnod-connector/src/colnod/colnodapi.cpp
2019-11-18 17:07:39 +01:00

223 lines
6.1 KiB
C++

#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);
}
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> data)
{
setTokens(data->updatedTokens);
deleteTokens(data->deletedTokens);
}
std::shared_ptr<serversdk::Request> 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->setToken(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->setToken(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->setToken(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->setToken(authToken);
mReqMan->processRequest(request);
connect(request.get(), &serversdk::Request::finished, [=](){
saveDeletedSubjects(request->responseData());
emit partOfDataReady();
});
}
void ColnodAPI::setTokens(const QHash<QString, std::shared_ptr<Token>> &tokens)
{
auto request = composeRequest("/TokenManager/setTokens", Token::tokensToJSON(tokens));
request->setToken(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<QString> &ids)
{
auto request = composeRequest("/TokenManager/deleteTokens", Token::idsToJSON(ids));
request->setToken(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<serversdk::Request> ColnodAPI::composeRequest(const QString &endpoint, const QByteArray &data)
{
QString url = mHost + endpoint;
return std::make_shared<serversdk::Request>("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<Data>();
}
bool ColnodAPI::checkResponse(const QByteArray &responseData)
{
QJsonDocument doc = QJsonDocument::fromJson(responseData);
return doc.object().contains("items");
}