clanz and error handling

This commit is contained in:
Ondřej Fischer 2019-12-04 18:32:57 +01:00
parent b405d95320
commit 08afae47aa
9 changed files with 43 additions and 66 deletions

View File

@ -31,14 +31,14 @@ void ColnodAPI::downloadData(const qint64 &time)
return;
}
AuthToken token;
auto responseData = login->responseData();
if (responseData.isEmpty()) {
if (checkResponse(login->responseData())) {
qCWarning(colnod) << "empty response data when logging in";
emit downloadDataFinished(nullptr);
return;
}
token.fromJson(responseData);
token.fromJson(login->responseData());
authToken = token.id();
if (authToken.isEmpty()) {
qCCritical(colnod) << "Token uuid is empty";
@ -52,11 +52,12 @@ void ColnodAPI::downloadData(const qint64 &time)
if (!checkRequest(request)) {
qWarning(colnod) << "ERROR during calling" << request->url() << ", request unsuccessful";
mValid = false;
emit downloadDataFinished(nullptr); // TODO: think about it, will the other if passed?
emit downloadDataFinished(nullptr);
}
else if (!checkResponse(request->responseData())) {
qWarning(colnod) << "Data from" << request->url() << "are invalid";
mValid = false;
emit downloadDataFinished(nullptr);
}
};
@ -99,12 +100,6 @@ void ColnodAPI::downloadData(const qint64 &time)
void ColnodAPI::processData(const std::shared_ptr<Data> &data)
{
for (const auto &token : data->updatedTokens) {
qInfo(colnod).noquote() << Message::massageTemplate("Updating", "token", "colnod", token->name());
}
for (const auto &id : data->deletedTokens) {
qInfo(colnod).noquote() << Message::massageTemplate("Deleting", "token", "colnod", id);
}
if (!data->updatedTokens.isEmpty() || !data->deletedTokens.isEmpty()) {
qInfo(colnod) << dash;
}
@ -188,15 +183,18 @@ std::shared_ptr<serversdk::Request> ColnodAPI::setTokens(const QHash<QString, st
connect(request.get(), &serversdk::Request::finished, [=](){
if (!checkRequest(request)) {
qCritical(colnod) << "ERROR during calling /TokenManager/setTokens, request unsuccessful. EXIT";
emit error(); // TODO: retyrn nullptr and check here
}
if (checkResponse(request->responseData())) {
for (const auto &token : tokens) {
qInfo(colnod).noquote() << Message::massageTemplate("Updating", "token", "colnod", token->name());
}
emit partOfDataProcessFinished();
}
else {
qWarning(colnod) << "Tokens wasn't updated";
mValid = false;
emit partOfDataProcessFinished();
emit partOfDataProcessFinished(false);
}
});
return request;
@ -210,15 +208,17 @@ std::shared_ptr<serversdk::Request> ColnodAPI::deleteTokens(const QList<QString>
connect(request.get(), &serversdk::Request::finished, [=](){
if (!checkRequest(request)) {
qCritical(colnod) << "ERROR during calling /TokenManager/deleteTokens, request unsuccessful. EXIT";
emit error(); // TODO: return nullptr and check it
}
if (checkResponse(request->responseData())) {
for (const auto &id : ids) {
qInfo(colnod).noquote() << Message::massageTemplate("Deleting", "token", "colnod", id);
}
emit partOfDataProcessFinished();
}
else {
qWarning(colnod) << "Tokens wasn't deleted";
mValid = false;
emit partOfDataProcessFinished();
emit partOfDataProcessFinished(false);
}
});
return request;
@ -276,10 +276,13 @@ void ColnodAPI::areDataReady(const std::shared_ptr<Data> &data)
}
}
void ColnodAPI::isDataProcessFinished()
void ColnodAPI::isDataProcessFinished(bool success)
{
if (!success) {
mSuccess = false;
}
if (++amountProccessesFinished == 2) {
emit dataProcessFinished();
emit dataProcessFinished(mSuccess);
}
}

View File

@ -66,7 +66,7 @@ public:
private:
Q_SLOT void areDataReady(const std::shared_ptr<Data>& data);
Q_SLOT void isDataProcessFinished();
Q_SLOT void isDataProcessFinished(bool success);
private:
void saveUpdatedTokens(const std::shared_ptr<Data>& data, const QByteArray &responseData);
@ -84,8 +84,8 @@ private:
signals:
void downloadDataFinished(std::shared_ptr<Data> = std::shared_ptr<Data>());
void partOfDataReady(std::shared_ptr<Data> = std::shared_ptr<Data>());
void partOfDataProcessFinished();
void dataProcessFinished();
void partOfDataProcessFinished(bool success = true);
void dataProcessFinished(bool success = true);
void error();
@ -97,6 +97,7 @@ private:
Timestamp mLastSync;
bool mDryMode = false;
bool mValid = true;
bool mSuccess = true;
QString authToken;
qint16 amountData = 0;

View File

@ -44,7 +44,7 @@ struct PreparedData
public:
PreparedData() = default;
PreparedData(const std::shared_ptr<Data> &database, const std::shared_ptr<Data> &colnod)
:databaseData(std::move(database)), colnodData(std::move(colnod))
:databaseData(database), colnodData(colnod)
{
}

View File

@ -46,17 +46,23 @@ std::shared_ptr<Data> DatabaseAPI::downloadData()
}
return composeData(updatedQuery, deletedQuery);
// TODO: why emiting signal??
// this can return Strucutre
//emit downloadDataFinished(composeData(updatedQuery, deletedQuery));
}
bool DatabaseAPI::processData(const std::shared_ptr<Data> &data)
{
uploadTokens(data->updatedTokens);
uploadSubjects(data->updatedSubjects);
deleteItems(data->deletedTokens, "colnod_token");
deleteItems(data->deletedSubjects, "colnod_subject");
bool res = true;
if (!uploadTokens(data->updatedTokens)) {
res = false;
}
if (uploadSubjects(data->updatedSubjects)) {
res = false;
}
if (deleteItems(data->deletedTokens, "colnod_token")) {
res = false;
}
if (deleteItems(data->deletedSubjects, "colnod_subject")) {
res = false;
}
if ( !data->updatedTokens.isEmpty() ||
!data->updatedSubjects.isEmpty() ||
!data->deletedTokens.isEmpty() ||
@ -70,8 +76,7 @@ bool DatabaseAPI::processData(const std::shared_ptr<Data> &data)
qInfo(database) << tab << tab << data->deletedSubjects.size() << "SUBJECTS DELETED";
qInfo(database) << dash;
// TODO: add error handling
return true;
return res;
}
@ -222,6 +227,7 @@ bool DatabaseAPI::deleteItems(const QList<QString> &ids, const QString &tableNam
query.bindValue(":now", nowString);
if (!executeQuery(query)) {
qWarning(database) << "ERROR during marking token as deleted:" << id;
mValid = false;
return false;
}
}
@ -235,7 +241,6 @@ std::shared_ptr<Token> DatabaseAPI::getToken(const QString &id)
query.bindValue(":id", id);
if (!executeQuery(query)) {
qCritical(database) << "ERROR during accessing existing tokens. EXIT";
emit error();
return nullptr;
}
auto list = utils->tableFromQuery<Token>(query);

View File

@ -13,7 +13,6 @@ class SubjectAttribute : public serversdk::DatabaseTable {
TABLE_PROPERTY(QString, subjectId, setSubjectId, "")
};
class Subject : public serversdk::DatabaseTable {
Q_OBJECT
TABLE_PROPERTY(QString, id, setId, QString())
@ -24,7 +23,6 @@ class Subject : public serversdk::DatabaseTable {
TABLE_PROPERTY(QDateTime, lastModified, setLastModified, QDateTime())
TABLE_PROPERTY(bool, deleted, setDeleted, false)
public:
Subject() = default;
explicit Subject(const QString& name);
@ -32,7 +30,6 @@ public:
bool fromJson(const QByteArray &data) override;
QList<std::shared_ptr <SubjectAttribute>> getAttributes();
private:
QList<std::shared_ptr <SubjectAttribute>> attributes;
};

View File

@ -60,7 +60,7 @@ bool SyncManager::startSynchronization()
// NOW I HAVE DATA FROM DATABASE
colnod->downloadData(mlastSync.timestamp());
connect(colnod.get(), &ColnodAPI::downloadDataFinished, [=](std::shared_ptr<Data> colnodData) {
connect(colnod.get(), &ColnodAPI::downloadDataFinished, [=](const std::shared_ptr<Data> &colnodData) {
if (!colnodData) {
qCritical(syncmanager) << "Not possible to get correct data from colnod";
QCoreApplication::exit(-1);
@ -90,7 +90,7 @@ bool SyncManager::startSynchronization()
}
// data is processed to other sides
connect(colnod.get(), &ColnodAPI::dataProcessFinished, [&](bool success){
connect(colnod.get(), &ColnodAPI::dataProcessFinished, [&,syncBegin](bool success){
if (!success) {
qCritical(syncmanager) << "Not possible to upload data to colnod";
}

View File

@ -31,13 +31,6 @@ private:
private:
void initNewToken(const std::shared_ptr<Token>& token);
void updateLastUpdate(qint64 syncBegin);
signals:
void syncFinished();
void error();
private:
std::shared_ptr<ColnodAPI> colnod;
std::shared_ptr<DatabaseAPI> database;

View File

@ -45,6 +45,7 @@ QByteArray Token::jsonData(const QSet<QString> &filters) const
QJsonDocument doc = QJsonDocument::fromVariant(variantMap);
return doc.toJson(QJsonDocument::Compact);
}
bool Token::fromJson(const QByteArray &data)
{
QJsonDocument doc = QJsonDocument::fromJson(data);
@ -81,24 +82,3 @@ QByteArray Token::idsToJSON(const QList<QString> &ids)
doc.setObject(items);
return doc.toJson();
}
void Token::fromSQLRecord(const QSqlQuery& query)
{
setId(query.value(0).toString());
a_authErrors = query.value(1).toInt();
setDescription(query.value(2).toString());
setNoValidity(query.value(6).toBool());
setEnabled(query.value(3).toBool());
QDateTime date = query.value(4).toDateTime();
setLastUpdate(date);
setName(query.value(5).toString());
a_timeToLive = query.value(7).toInt();
a_tokenBits = query.value(8).toInt();
a_tokenData = query.value(9).toString();
a_tokenType = query.value(10).toString();
a_subjectId = query.value(11).toString();
date = query.value(12).toDateTime();
setLastModified(date);
setDeleted(query.value(13).toBool());
}

View File

@ -65,8 +65,6 @@ public:
lToken->subjectId() == rToken->subjectId();
}
void fromSQLRecord(const QSqlQuery& query);
static QByteArray tokensToColnodJson(const QHash<QString, std::shared_ptr<Token> > &tokens);
static QByteArray idsToJSON(const QList<QString> &ids);