some little refactor, deleting assets
This commit is contained in:
parent
7a116bfdf2
commit
5c4bd18cdc
@ -4,15 +4,11 @@
|
||||
set(HEADERS
|
||||
api.h
|
||||
codes.h
|
||||
finalaction.h
|
||||
helpers.h
|
||||
)
|
||||
|
||||
set(SOURCES
|
||||
api.cpp
|
||||
codes.cpp
|
||||
finalaction.cpp
|
||||
helpers.cpp
|
||||
)
|
||||
|
||||
target_sources(magpie PRIVATE ${SOURCES})
|
||||
|
38
API/api.cpp
38
API/api.cpp
@ -13,13 +13,13 @@
|
||||
#include "requests/poll.h"
|
||||
#include "requests/listassets.h"
|
||||
#include "requests/addasset.h"
|
||||
#include "requests/deleteasset.h"
|
||||
|
||||
API::API (Models::Magpie& magpie, QObject* parent):
|
||||
QObject(parent),
|
||||
idCounter(0),
|
||||
magpie(magpie),
|
||||
network(),
|
||||
pollReply(),
|
||||
requests()
|
||||
{}
|
||||
|
||||
@ -90,18 +90,6 @@ API::RequestId API::sendLogin (const QString& login, const QString& password, co
|
||||
return registerAndSend(std::move(log));
|
||||
}
|
||||
|
||||
API::RequestId API::addAsset (const QString& title, const QString& icon, const QJSValue& finished) {
|
||||
qDebug() << "Adding asset...";
|
||||
if (magpie.getState() != Models::Magpie::Authenticated)
|
||||
return callCallback(finished, "Can not add assets in current state"), 0;
|
||||
|
||||
auto add = std::make_unique<Request::AddAsset>(title, icon, QColor::fromString("black"), 1, magpie.getAddress());
|
||||
add->setAuthorizationToken(magpie.getAccessToken());
|
||||
connect(add.get(), &Request::AddAsset::success, std::bind(&API::callCallback, this, finished, QString(), QJSValueList{QJSValue(true)}));
|
||||
connect(add.get(), &Request::AddAsset::error, std::bind(&API::callCallback, this, finished, std::placeholders::_1, QJSValueList{QJSValue(false)}));
|
||||
return registerAndSend(std::move(add));
|
||||
}
|
||||
|
||||
API::RequestId API::requestAssets (const SuccessListHandler& success, const ErrorHandler& error) {
|
||||
qDebug() << "Requesting assets...";
|
||||
|
||||
@ -112,6 +100,30 @@ API::RequestId API::requestAssets (const SuccessListHandler& success, const Erro
|
||||
return registerAndSend(std::move(list));
|
||||
}
|
||||
|
||||
API::RequestId API::addAsset (const QString& title, const QString& icon, const QColor& color, const QJSValue& finished) {
|
||||
qDebug() << "Adding asset...";
|
||||
if (magpie.getState() != Models::Magpie::Authenticated)
|
||||
return callCallback(finished, "Can not add assets in current state"), 0;
|
||||
|
||||
auto add = std::make_unique<Request::AddAsset>(title, icon, color, 1, magpie.getAddress());
|
||||
add->setAuthorizationToken(magpie.getAccessToken());
|
||||
connect(add.get(), &Request::AddAsset::success, std::bind(&API::callCallback, this, finished, QString(), QJSValueList{QJSValue(true)}));
|
||||
connect(add.get(), &Request::AddAsset::error, std::bind(&API::callCallback, this, finished, std::placeholders::_1, QJSValueList{QJSValue(false)}));
|
||||
return registerAndSend(std::move(add));
|
||||
}
|
||||
|
||||
API::RequestId API::deleteAsset (unsigned int id, const QJSValue& finished) {
|
||||
qDebug() << "Deleting asset...";
|
||||
if (magpie.getState() != Models::Magpie::Authenticated)
|
||||
return callCallback(finished, "Can not delete assets in current state"), 0;
|
||||
|
||||
auto del = std::make_unique<Request::DeleteAsset>(id, magpie.getAddress());
|
||||
del->setAuthorizationToken(magpie.getAccessToken());
|
||||
connect(del.get(), &Request::DeleteAsset::success, std::bind(&API::callCallback, this, finished, QString(), QJSValueList{QJSValue(true)}));
|
||||
connect(del.get(), &Request::DeleteAsset::error, std::bind(&API::callCallback, this, finished, std::placeholders::_1, QJSValueList{QJSValue(false)}));
|
||||
return registerAndSend(std::move(del));
|
||||
}
|
||||
|
||||
API::RequestId API::poll (const SuccessMapHandler& success, const ErrorHandler& error, bool clear) {
|
||||
auto poll = std::make_unique<Request::Poll>(magpie.getAddress(), clear);
|
||||
poll->setAuthorizationToken(magpie.getAccessToken());
|
||||
|
@ -29,7 +29,6 @@ public:
|
||||
|
||||
explicit API(Models::Magpie& magpie, QObject* parent = nullptr);
|
||||
|
||||
|
||||
RequestId requestAssets(const SuccessListHandler& success, const ErrorHandler& error);
|
||||
RequestId poll(const SuccessMapHandler& success, const ErrorHandler& error, bool clear = false);
|
||||
|
||||
@ -40,7 +39,8 @@ public slots:
|
||||
RequestId test(const QString& path, const QJSValue& finished = QJSValue());
|
||||
RequestId sendRegister(const QString& login, const QString& password, const QJSValue& finished = QJSValue());
|
||||
RequestId sendLogin(const QString& login, const QString& password, const QJSValue& finished = QJSValue());
|
||||
RequestId addAsset(const QString& title, const QString& icon, const QJSValue& finished = QJSValue());
|
||||
RequestId addAsset(const QString& title, const QString& icon, const QColor& color, const QJSValue& finished = QJSValue());
|
||||
RequestId deleteAsset(unsigned int id, const QJSValue& finished = QJSValue());
|
||||
|
||||
private slots:
|
||||
void onRequestDone(RequestId id);
|
||||
@ -54,5 +54,4 @@ private:
|
||||
Models::Magpie& magpie;
|
||||
QNetworkAccessManager network;
|
||||
std::map<RequestId, std::unique_ptr<Request::Request>> requests;
|
||||
std::unique_ptr<QNetworkReply> pollReply;
|
||||
};
|
||||
|
@ -10,6 +10,7 @@ set(HEADERS
|
||||
poll.h
|
||||
listassets.h
|
||||
addasset.h
|
||||
deleteasset.h
|
||||
)
|
||||
|
||||
set(SOURCES
|
||||
@ -21,6 +22,7 @@ set(SOURCES
|
||||
poll.cpp
|
||||
listassets.cpp
|
||||
addasset.cpp
|
||||
deleteasset.cpp
|
||||
)
|
||||
|
||||
target_sources(magpie PRIVATE ${SOURCES})
|
||||
|
@ -4,7 +4,12 @@
|
||||
#include "addasset.h"
|
||||
|
||||
Request::AddAsset::AddAsset (const QString& title, const QString& icon, const QColor& color, unsigned int currency, const QUrl& baseUrl):
|
||||
Post(createUrl(baseUrl, "/addAsset"), {{"title", title}, {"icon", icon}, {"currency", std::to_string(currency).c_str()}, {"color", "0"}})
|
||||
Post(createUrl(baseUrl, "/addAsset"), {
|
||||
{"title", title},
|
||||
{"icon", icon},
|
||||
{"currency", std::to_string(currency).c_str()},
|
||||
{"color", std::to_string(color.rgba()).c_str()}
|
||||
})
|
||||
{
|
||||
emptyResult = true;
|
||||
}
|
||||
|
12
API/requests/deleteasset.cpp
Normal file
12
API/requests/deleteasset.cpp
Normal file
@ -0,0 +1,12 @@
|
||||
//SPDX-FileCopyrightText: 2023 Yury Gubich <blue@macaw.me>
|
||||
//SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "deleteasset.h"
|
||||
|
||||
Request::DeleteAsset::DeleteAsset(unsigned int id, const QUrl &baseUrl):
|
||||
Post(createUrl(baseUrl, "/deleteAsset"), {
|
||||
{"id", std::to_string(id).c_str()}
|
||||
})
|
||||
{
|
||||
emptyResult = true;
|
||||
}
|
20
API/requests/deleteasset.h
Normal file
20
API/requests/deleteasset.h
Normal file
@ -0,0 +1,20 @@
|
||||
//SPDX-FileCopyrightText: 2023 Yury Gubich <blue@macaw.me>
|
||||
//SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "post.h"
|
||||
|
||||
namespace Request {
|
||||
|
||||
class DeleteAsset : public Post {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DeleteAsset(unsigned int id, const QUrl& baseUrl);
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
#include "listassets.h"
|
||||
|
||||
#include "API/helpers.h"
|
||||
#include "utils/helpers.h"
|
||||
|
||||
Request::ListAssets::ListAssets (const QUrl& baseUrl):
|
||||
Request(createUrl(baseUrl, "/listAssets")) {}
|
||||
|
@ -60,6 +60,7 @@ endif()
|
||||
add_subdirectory(qml)
|
||||
add_subdirectory(API)
|
||||
add_subdirectory(models)
|
||||
add_subdirectory(utils)
|
||||
|
||||
target_include_directories(magpie PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_link_libraries(magpie PRIVATE
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
#include "assets.h"
|
||||
|
||||
#include "API/helpers.h"
|
||||
#include "utils/helpers.h"
|
||||
|
||||
Models::Assets::Assets (QObject* parent):
|
||||
QAbstractListModel(parent),
|
||||
@ -45,14 +45,11 @@ void Models::Assets::addAssets (const std::deque<Asset>& assets) {
|
||||
void Models::Assets::deleteAsset (unsigned int id) {
|
||||
QModelIndex index = getIndex(id);
|
||||
if (!index.isValid())
|
||||
throw std::runtime_error("An attempt to insert to delete non existing Asset from asset model");
|
||||
throw std::runtime_error("An attempt to delete non existing Asset from asset model");
|
||||
|
||||
int row = index.row();
|
||||
beginRemoveRows(QModelIndex(), row, row);
|
||||
records.erase(records.begin() + row);
|
||||
if (state == State::syncronized) //give a second thought
|
||||
state = State::initial;
|
||||
|
||||
endRemoveRows();
|
||||
}
|
||||
|
||||
@ -67,9 +64,9 @@ int Models::Assets::rowCount (const QModelIndex& parent) const {
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> Models::Assets::roleNames () const {
|
||||
static const QHash<int, QByteArray> roleNames{
|
||||
{Title, "title"}, {Icon, "icon"}, {Balance, "balance"}, {Archived, "archived"}, {Color, "color"}
|
||||
};
|
||||
static const QHash<int, QByteArray> roleNames({
|
||||
{Title, "title"}, {Icon, "icon"}, {Balance, "balance"}, {Archived, "archived"}, {Color, "color"}, {Id, "assetId"}
|
||||
});
|
||||
return roleNames;
|
||||
}
|
||||
|
||||
@ -103,6 +100,8 @@ QVariant Models::Assets::data (const QModelIndex& index, int role) const {
|
||||
return records[row].archived;
|
||||
case Color:
|
||||
return records[row].color;
|
||||
case Id:
|
||||
return records[row].id;
|
||||
}
|
||||
}
|
||||
|
||||
@ -122,8 +121,7 @@ bool Models::Assets::deserialize (const QVariantList& from, std::deque<Asset>& o
|
||||
asset.id = ser.value("id").toUInt();
|
||||
|
||||
uint32_t color = ser.value("color").toUInt();
|
||||
uint8_t* rgba = reinterpret_cast<uint8_t*>(&color);
|
||||
asset.color = QColor::fromRgb(rgba[0], rgba[1], rgba[2], rgba[3]);
|
||||
asset.color = QColor::fromRgba(color);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -33,7 +33,8 @@ public:
|
||||
Icon,
|
||||
Balance,
|
||||
Archived,
|
||||
Color
|
||||
Color,
|
||||
Id
|
||||
};
|
||||
|
||||
void clear();
|
||||
|
@ -6,8 +6,8 @@
|
||||
#include <QDebug>
|
||||
|
||||
#include "API/api.h"
|
||||
#include "API/helpers.h"
|
||||
#include "API/codes.h"
|
||||
#include "utils/helpers.h"
|
||||
|
||||
Models::Magpie::Magpie (QObject* parent):
|
||||
QObject(parent),
|
||||
@ -190,6 +190,17 @@ bool Models::Magpie::handleChanges (const QVariantMap& changes) {
|
||||
else
|
||||
Magpie::assets.addAssets(added);
|
||||
}
|
||||
|
||||
aItr = assets.constFind("removed");
|
||||
if (aItr != assets.constEnd() && aItr.value().canConvert<QVariantList>()) {
|
||||
const QVariantList rem = qast<QVariantList>(aItr.value());
|
||||
for (const QVariant& vId : rem) {
|
||||
if (vId.isValid() && vId.canConvert<unsigned int>())
|
||||
Magpie::assets.deleteAsset(vId.toUInt());
|
||||
else
|
||||
qDebug() << "Error deserializing removed assets";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -52,6 +52,7 @@ signals:
|
||||
void stateChanged(State state);
|
||||
|
||||
void storeTokens(const QString& access, const QString& renew);
|
||||
void displayError(const QString& err);
|
||||
|
||||
public:
|
||||
Assets assets;
|
||||
|
@ -4,7 +4,9 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
|
||||
import magpie
|
||||
import magpie.Forms as Forms
|
||||
import magpie.Components as Components
|
||||
|
||||
Item {
|
||||
StackView {
|
||||
@ -27,4 +29,17 @@ Item {
|
||||
onSuccess: stack.pop()
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: Magpie
|
||||
function onDisplayError (err) {
|
||||
modal.status = err;
|
||||
modal.open();
|
||||
}
|
||||
}
|
||||
|
||||
Components.Modal {
|
||||
id: modal
|
||||
closable: true
|
||||
}
|
||||
}
|
||||
|
@ -4,16 +4,21 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
|
||||
import magpie
|
||||
|
||||
Item {
|
||||
id: line
|
||||
required property string title
|
||||
required property string icon
|
||||
required property color color
|
||||
required property string balance
|
||||
required property int assetId
|
||||
|
||||
signal error (err:string)
|
||||
|
||||
Row {
|
||||
readonly property int iconSize: height
|
||||
readonly property int freespace: width - iconSize - spacing * children.length - 1
|
||||
readonly property int freespace: width - deleteButton.width - iconSize - spacing * children.length - 1
|
||||
|
||||
anchors.fill: parent
|
||||
spacing: 5
|
||||
@ -49,5 +54,16 @@ Item {
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
color: palette.text
|
||||
}
|
||||
|
||||
Button {
|
||||
id: deleteButton
|
||||
text: qsTr("Delete")
|
||||
flat: true
|
||||
height: parent.height
|
||||
onClicked: API.deleteAsset(line.assetId, function(err) {
|
||||
if (err)
|
||||
Magpie.displayError("Error deleting asset " + line.title + ": " + err);
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ Item {
|
||||
modal.status = qsTr("Creating new asset ") + " " + title + "...";
|
||||
modal.open();
|
||||
|
||||
API.addAsset(title, icon, function (err, result) {
|
||||
API.addAsset(title, icon, "blue", function (err, result) {
|
||||
if (!modal.inProgress)
|
||||
return;
|
||||
|
||||
|
14
utils/CMakeLists.txt
Normal file
14
utils/CMakeLists.txt
Normal file
@ -0,0 +1,14 @@
|
||||
# SPDX-FileCopyrightText: 2023 Yury Gubich <blue@macaw.me>
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
set(HEADERS
|
||||
finalaction.h
|
||||
helpers.h
|
||||
)
|
||||
|
||||
set(SOURCES
|
||||
finalaction.cpp
|
||||
helpers.cpp
|
||||
)
|
||||
|
||||
target_sources(magpie PRIVATE ${SOURCES})
|
Loading…
Reference in New Issue
Block a user