mirror of
https://gitlab.com/spaceti-app/integrations/acs/colnod-connector.git
synced 2026-07-12 13:00:41 +02:00
236 lines
6.5 KiB
C++
236 lines
6.5 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);
|
|
data = std::make_shared<Data>();
|
|
|
|
// -----------------------------------
|
|
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> data)
|
|
{
|
|
if ( !data->updatedTokens.isEmpty()) {
|
|
setTokens(data->updatedTokens);
|
|
} else {
|
|
emit partOfDataProcessFinished();
|
|
}
|
|
if ( !data->deletedTokens.isEmpty()) {
|
|
deleteTokens(data->deletedTokens);
|
|
} else {
|
|
emit partOfDataProcessFinished();
|
|
}
|
|
}
|
|
|
|
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->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<QString, std::shared_ptr<Token>> &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<QString> &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<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");
|
|
}
|