~aleteoryx/muditaos

2aaed62bd8ae5ab848f84fd7ba9f78a7d992d272 — KacperLewandowski 5 years ago 99b0c8e
[EGD-3699] Add notifications handling in calendar.
M changelog.md => changelog.md +7 -0
@@ 1,5 1,12 @@
# Mudita PurePhone changelog

## [Current release]

### Added

* `[calendar]` Add notifications from database handling.


## [0.39.1 2020-09-25]

### Added

M module-apps/application-calendar/ApplicationCalendar.cpp => module-apps/application-calendar/ApplicationCalendar.cpp +28 -3
@@ 12,6 12,7 @@
#include <module-services/service-db/api/DBServiceAPI.hpp>
#include <module-db/queries/calendar/QueryEventsAdd.hpp>
#include <module-services/service-db/messages/QueryMessage.hpp>
#include <module-services/service-db/messages/DBNotificationMessage.hpp>

namespace app
{


@@ 41,7 42,9 @@ namespace app
                                             uint32_t stackDepth,
                                             sys::ServicePriority priority)
        : Application(name, parent, false, stackDepth, priority)
    {}
    {
        busChannels.push_back(sys::BusChannels::ServiceDBNotifications);
    }

    sys::Message_t ApplicationCalendar::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {


@@ 50,6 53,19 @@ namespace app
        if (retMsg && (dynamic_cast<sys::ResponseMessage *>(retMsg.get())->retCode == sys::ReturnCodes::Success)) {
            return retMsg;
        }

        auto msg = dynamic_cast<db::NotificationMessage *>(msgl);
        if (msg != nullptr) {
            LOG_DEBUG("Received notification");
            // window-specific actions
            if (msg->interface == db::Interface::Name::Events) {
                for (auto &[name, window] : windows) {
                    window->onDatabaseMessage(msg);
                }
            }
            return std::make_shared<sys::ResponseMessage>();
        }

        // this variable defines whether message was processed.
        bool handled = false;
        // handle database response


@@ 57,8 73,17 @@ namespace app
            handled = true;
            switch (resp->responseTo) {
            case MessageType::DBQuery: {
                if (getCurrentWindow()->onDatabaseMessage(resp))
                    refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);

                if (auto queryResponse = dynamic_cast<db::QueryResponse *>(resp)) {
                    auto result = queryResponse->getResult();
                    LOG_DEBUG("queryResponse != nullptr");
                    if (result->hasListener()) {
                        LOG_DEBUG("Has listener");
                        if (result->handle()) {
                            refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);
                        }
                    }
                }
            } break;
            default:
                break;

M module-apps/application-calendar/models/AllEventsModel.cpp => module-apps/application-calendar/models/AllEventsModel.cpp +21 -2
@@ 2,6 2,7 @@
#include "application-calendar/widgets/AllEventsItem.hpp"
#include "application-calendar/widgets/CalendarStyle.hpp"
#include "module-apps/application-calendar/data/CalendarData.hpp"
#include "module-apps/application-calendar/ApplicationCalendar.hpp"
#include <ListView.hpp>
#include <module-services/service-db/api/DBServiceAPI.hpp>
#include <queries/calendar/QueryEventsGetAllLimited.hpp>


@@ 20,6 21,8 @@ unsigned int AllEventsModel::requestRecordsCount()
void AllEventsModel::requestRecords(const uint32_t offset, const uint32_t limit)
{
    auto query = std::make_unique<db::query::events::GetAllLimited>(offset, limit);
    query->setQueryListener(
        db::QueryCallback::fromFunction([this](auto response) { return handleQueryResponse(response); }));
    DBServiceAPI::GetQuery(application, db::Interface::Name::Events, std::move(query));
}



@@ 56,7 59,23 @@ bool AllEventsModel::updateRecords(std::unique_ptr<std::vector<EventsRecord>> re
    list->onProviderDataUpdate();
    return true;
}
void AllEventsModel::setRecordsCount(const uint32_t count)

auto AllEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool
{
    list->setElementsCount(count);
    auto response = dynamic_cast<db::query::events::GetAllLimitedResult *>(queryResult);
    assert(response != nullptr);

    auto records_data = response->getResult();
    list->setElementsCount(*response->getCountResult());
    auto records = std::make_unique<std::vector<EventsRecord>>(records_data->begin(), records_data->end());

    if (records->empty()) {
        auto app = dynamic_cast<app::ApplicationCalendar *>(application);
        assert(application != nullptr);
        auto filter = std::chrono::system_clock::now();
        app->switchToNoEventsWindow(
            utils::localize.get("app_calendar_title_main"), filter, style::window::calendar::name::all_events_window);
    }

    return this->updateRecords(std::move(records));
}

M module-apps/application-calendar/models/AllEventsModel.hpp => module-apps/application-calendar/models/AllEventsModel.hpp +2 -2
@@ 1,9 1,9 @@
#pragma once

#include "Application.hpp"
#include <ListItemProvider.hpp>
#include <DatabaseModel.hpp>
#include <module-db/Interface/EventsRecord.hpp>
#include <module-db/Common/Query.hpp>

class AllEventsModel : public app::DatabaseModel<EventsRecord>, public gui::ListItemProvider
{


@@ 13,10 13,10 @@ class AllEventsModel : public app::DatabaseModel<EventsRecord>, public gui::List
    AllEventsModel(app::Application *app);
    virtual ~AllEventsModel() override = default;

    void setRecordsCount(const uint32_t count);
    void requestRecords(const uint32_t offset, const uint32_t limit) override;
    bool updateRecords(std::unique_ptr<std::vector<EventsRecord>> records) override;

    auto handleQueryResponse(db::QueryResult *) -> bool;
    // virtual methods for ListViewProvider
    [[nodiscard]] unsigned int getMinimalItemHeight() const override;
    gui::ListItem *getItem(gui::Order order) override;

M module-apps/application-calendar/widgets/CalendarStyle.hpp => module-apps/application-calendar/widgets/CalendarStyle.hpp +2 -2
@@ 82,11 82,11 @@ namespace style

                namespace eventDetail
                {
                    const inline int height_min    = 90;
                    const inline int height_min        = 90;
                    const inline int height_max        = 155;
                    const inline int margin_top        = 2 * style::margins::big;
                    const inline int event_time_margin = 25;
                    const inline int title_h       = 20;
                    const inline int title_h           = 20;
                    const inline int label_h           = 35;
                } // namespace eventDetail


M module-apps/application-calendar/windows/AllEventsWindow.cpp => module-apps/application-calendar/windows/AllEventsWindow.cpp +9 -24
@@ 1,5 1,4 @@
#include "AllEventsWindow.hpp"
#include "module-apps/application-calendar/ApplicationCalendar.hpp"
#include "module-apps/application-calendar/data/CalendarData.hpp"
#include <gui/widgets/Window.hpp>
#include <gui/widgets/BottomBar.hpp>


@@ 10,6 9,7 @@
#include <module-db/queries/calendar/QueryEventsGetAllLimited.hpp>
#include <module-services/service-db/api/DBServiceAPI.hpp>
#include <time/time_conversion.hpp>
#include <module-services/service-db/messages/DBNotificationMessage.hpp>

namespace gui
{


@@ 53,7 53,6 @@ namespace gui

    void AllEventsWindow::onBeforeShow(gui::ShowMode mode, gui::SwitchData *data)
    {
        allEventsList->rebuildList();
        auto dataReceived = dynamic_cast<PrevWindowData *>(data);
        if (dataReceived != nullptr) {
            if (dataReceived->getData() == PrevWindowData::PrevWindow::Delete) {


@@ 81,7 80,7 @@ namespace gui
        if (inputEvent.keyCode == gui::KeyCode::KEY_LEFT) {
            LOG_DEBUG("Switch to new event window");
            std::unique_ptr<EventRecordData> data = std::make_unique<EventRecordData>();
            data->setDescription("New");
            data->setDescription(style::window::calendar::new_event);
            auto event       = std::make_shared<EventsRecord>();
            event->date_from = TimePointNow();
            event->date_till = TimePointNow();


@@ 103,30 102,16 @@ namespace gui

    bool AllEventsWindow::onDatabaseMessage(sys::Message *msgl)
    {
        auto msg = dynamic_cast<db::QueryResponse *>(msgl);
        if (msg != nullptr) {
            auto temp = msg->getResult();
            if (auto response = dynamic_cast<db::query::events::GetAllLimitedResult *>(temp.get())) {
                auto records_data = response->getResult();
                allEventsModel->setRecordsCount(*response->getCountResult());
                auto records = std::make_unique<std::vector<EventsRecord>>(records_data->begin(), records_data->end());
                if (checkEmpty) {
                    if (records->size() == 0) {
                        auto app = dynamic_cast<app::ApplicationCalendar *>(application);
                        assert(application != nullptr);
                        auto filter = std::chrono::system_clock::now();
                        app->switchToNoEventsWindow(utils::localize.get("app_calendar_title_main"),
                                                    filter,
                                                    style::window::calendar::name::all_events_window);
                    }
        auto *msgNotification = dynamic_cast<db::NotificationMessage *>(msgl);
        if (msgNotification != nullptr) {
            if (msgNotification->interface == db::Interface::Name::Events) {
                if (msgNotification->dataModified()) {
                    allEventsList->rebuildList(style::listview::RebuildType::InPlace);
                    return true;
                }
                application->refreshWindow(RefreshModes::GUI_REFRESH_FAST);
                return allEventsModel->updateRecords(std::move(records));
            }
            LOG_DEBUG("Response False");
            return false;
        }
        LOG_DEBUG("AllEventsWindow DB Message != QueryResponse");

        return false;
    }
} /* namespace gui */

M module-apps/application-calendar/windows/CalendarMainWindow.cpp => module-apps/application-calendar/windows/CalendarMainWindow.cpp +32 -35
@@ 177,8 177,10 @@ namespace gui
        }

        if (inputEvent.keyCode == gui::KeyCode::KEY_LF) {
            DBServiceAPI::GetQuery(
                application, db::Interface::Name::Events, std::make_unique<db::query::events::GetAll>());
            auto query = std::make_unique<db::query::events::GetAll>();
            query->setQueryListener(
                db::QueryCallback::fromFunction([this](auto response) { return handleQueryResponse(response); }));
            DBServiceAPI::GetQuery(application, db::Interface::Name::Events, std::move(query));
            return true;
        }



@@ 192,46 194,41 @@ namespace gui
        auto filter_from       = TimePointFromYearMonthDay(date_from);
        auto filter_till       = TimePointFromYearMonthDay(date_till);
        LOG_DEBUG("filter:  %s", TimePointToString(filter_till).c_str());
        DBServiceAPI::GetQuery(application,
                               db::Interface::Name::Events,
                               std::make_unique<db::query::events::GetFiltered>(filter_from, filter_till));
        auto query = std::make_unique<db::query::events::GetFiltered>(filter_from, filter_till);
        query->setQueryListener(
            db::QueryCallback::fromFunction([this](auto response) { return handleQueryResponse(response); }));
        DBServiceAPI::GetQuery(application, db::Interface::Name::Events, std::move(query));
    }

    bool CalendarMainWindow::onDatabaseMessage(sys::Message *msgl)
    auto CalendarMainWindow::handleQueryResponse(db::QueryResult *queryResult) -> bool
    {
        std::fill(begin(isDayEmpty), end(isDayEmpty), true);
        auto msg = dynamic_cast<db::QueryResponse *>(msgl);
        if (msg != nullptr) {
            auto temp = msg->getResult();
            if (auto response = dynamic_cast<db::query::events::GetFilteredResult *>(temp.get())) {
                unique_ptr<vector<EventsRecord>> records = response->getResult();
                for (auto &rec : *records) {
                    date::year_month_day recordDate = TimePointToYearMonthDay(rec.date_from);
                    uint32_t dayNumb                = static_cast<unsigned>(recordDate.day());
                    isDayEmpty[dayNumb - 1]         = false;
                }
                refresh();
                return true;
        if (auto response = dynamic_cast<db::query::events::GetFilteredResult *>(queryResult)) {
            const auto records = response->getResult();
            for (auto &rec : *records) {
                date::year_month_day recordDate = TimePointToYearMonthDay(rec.date_from);
                uint32_t dayNumb                = static_cast<unsigned>(recordDate.day());
                isDayEmpty[dayNumb - 1]         = false;
            }
            if (auto response = dynamic_cast<db::query::events::GetAllResult *>(temp.get())) {
                unique_ptr<vector<EventsRecord>> records = response->getResult();
                if (records->size() != 0) {
                    application->switchWindow(style::window::calendar::name::all_events_window);
                }
                else {
                    auto appCalendar = dynamic_cast<app::ApplicationCalendar *>(application);
                    assert(appCalendar != nullptr);
                    auto filter = TimePointFromYearMonthDay(actualDate);
                    appCalendar->switchToNoEventsWindow(utils::localize.get("app_calendar_title_main"),
                                                        filter,
                                                        style::window::calendar::name::all_events_window);
                }
                return true;
            refresh();
            return true;
        }
        if (auto response = dynamic_cast<db::query::events::GetAllResult *>(queryResult)) {
            const auto records = response->getResult();
            if (!records->empty()) {
                application->switchWindow(style::window::calendar::name::all_events_window);
            }
            LOG_DEBUG("Response False");
            return false;
            else {
                auto appCalendar = dynamic_cast<app::ApplicationCalendar *>(application);
                assert(appCalendar != nullptr);
                auto filter = TimePointFromYearMonthDay(actualDate);
                appCalendar->switchToNoEventsWindow(utils::localize.get("app_calendar_title_main"),
                                                    filter,
                                                    style::window::calendar::name::all_events_window);
            }
            return true;
        }
        LOG_DEBUG("Calendar MainWindow DB Message != QueryResponse");
        LOG_DEBUG("Response False");
        return false;
    }


M module-apps/application-calendar/windows/CalendarMainWindow.hpp => module-apps/application-calendar/windows/CalendarMainWindow.hpp +1 -1
@@ 41,8 41,8 @@ namespace gui
        void buildInterface() override;
        void destroyInterface() override;
        bool onInput(const gui::InputEvent &inputEvent) override;
        bool onDatabaseMessage(sys::Message *msgl) override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
        auto handleQueryResponse(db::QueryResult *queryResult) -> bool;
        std::unique_ptr<MonthModel> getMonthModel()
        {
            return std::move(monthModel);

M module-apps/application-calendar/windows/DayEventsWindow.cpp => module-apps/application-calendar/windows/DayEventsWindow.cpp +32 -24
@@ 11,6 11,7 @@
#include <module-services/service-db/messages/QueryMessage.hpp>
#include <module-db/queries/calendar/QueryEventsGetFiltered.hpp>
#include <module-services/service-db/api/DBServiceAPI.hpp>
#include <module-services/service-db/messages/DBNotificationMessage.hpp>

namespace gui
{


@@ 29,9 30,10 @@ namespace gui
    void DayEventsWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        auto filterTill = filterFrom + std::chrono::hours(style::window::calendar::time::max_hour_24H_mode + 1);
        DBServiceAPI::GetQuery(application,
                               db::Interface::Name::Events,
                               std::make_unique<db::query::events::GetFiltered>(filterFrom, filterTill));
        auto query      = std::make_unique<db::query::events::GetFiltered>(filterFrom, filterTill);
        query->setQueryListener(
            db::QueryCallback::fromFunction([this](auto response) { return handleQueryResponse(response); }));
        DBServiceAPI::GetQuery(application, db::Interface::Name::Events, std::move(query));
        setTitle(dayMonthTitle);
        auto dataReceived = dynamic_cast<PrevWindowData *>(data);
        if (dataReceived != nullptr) {


@@ 100,7 102,7 @@ namespace gui
        if (inputEvent.keyCode == gui::KeyCode::KEY_LEFT) {
            LOG_DEBUG("Switch to new window - edit window");
            std::unique_ptr<EventRecordData> data = std::make_unique<EventRecordData>();
            data->setDescription("New");
            data->setDescription(style::window::calendar::new_event);
            auto rec       = new EventsRecord();
            rec->date_from = filterFrom;
            rec->date_till = filterFrom;


@@ 114,31 116,37 @@ namespace gui
        return false;
    }

    bool DayEventsWindow::onDatabaseMessage(sys::Message *msgl)
    auto DayEventsWindow::handleQueryResponse(db::QueryResult *queryResult) -> bool
    {
        auto msg = dynamic_cast<db::QueryResponse *>(msgl);
        if (msg != nullptr) {
            auto temp = msg->getResult();
            if (auto response = dynamic_cast<db::query::events::GetFilteredResult *>(temp.get())) {
                unique_ptr<vector<EventsRecord>> records = response->getResult();
                for (auto &rec : *records) {
                    LOG_DEBUG("record: %s", rec.title.c_str());
        if (const auto response = dynamic_cast<db::query::events::GetFilteredResult *>(queryResult)) {
            unique_ptr<vector<EventsRecord>> records = response->getResult();
            if (checkEmpty) {
                if (records->empty()) {
                    auto app = dynamic_cast<app::ApplicationCalendar *>(application);
                    assert(application != nullptr);
                    auto name = dayMonthTitle;
                    app->switchToNoEventsWindow(name, filterFrom, style::window::calendar::name::day_events_window);
                }
                if (checkEmpty) {
                    if (records->size() == 0) {
                        auto app = dynamic_cast<app::ApplicationCalendar *>(application);
                        assert(application != nullptr);
                        auto name = dayMonthTitle;
                        app->switchToNoEventsWindow(name, filterFrom, style::window::calendar::name::day_events_window);
                    }
            }
            dayEventsModel->loadData(std::move(records));
            application->refreshWindow(RefreshModes::GUI_REFRESH_FAST);
            return true;
        }
        LOG_DEBUG("Response False");
        return false;
    }

    bool DayEventsWindow::onDatabaseMessage(sys::Message *msgl)
    {
        auto *msgNotification = dynamic_cast<db::NotificationMessage *>(msgl);
        if (msgNotification != nullptr) {
            if (msgNotification->interface == db::Interface::Name::Events) {
                if (msgNotification->dataModified()) {
                    dayEventsList->rebuildList(style::listview::RebuildType::InPlace);
                    return true;
                }
                dayEventsModel->loadData(std::move(records));
                application->refreshWindow(RefreshModes::GUI_REFRESH_FAST);
            }
            LOG_DEBUG("Response False");
            return false;
        }
        LOG_DEBUG("DayWindow DB Message != QueryResponse");
        return false;
    }
} /* namespace gui */

M module-apps/application-calendar/windows/DayEventsWindow.hpp => module-apps/application-calendar/windows/DayEventsWindow.hpp +1 -0
@@ 30,6 30,7 @@ namespace gui
        void rebuild() override;
        void buildInterface() override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;
        auto handleQueryResponse(db::QueryResult *queryResult) -> bool;

        bool checkEmpty = false;
    };

M module-db/Interface/EventsRecord.cpp => module-db/Interface/EventsRecord.cpp +60 -39
@@ 180,81 180,102 @@ uint32_t EventsRecordInterface::GetCount()
std::unique_ptr<db::QueryResult> EventsRecordInterface::runQuery(std::shared_ptr<db::Query> query)
{
    if (typeid(*query) == typeid(db::query::events::Get)) {
        const auto local_query = dynamic_cast<const db::query::events::Get *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplGetResult(query);
    }
    if (typeid(*query) == typeid(db::query::events::GetAll)) {
        const auto local_query = dynamic_cast<const db::query::events::GetAll *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplGetAllResult(query);
    }
    if (typeid(*query) == typeid(db::query::events::GetAllLimited)) {
        const auto local_query = dynamic_cast<const db::query::events::GetAllLimited *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplGetAllLimitedResult(query);
    }
    if (typeid(*query) == typeid(db::query::events::GetFiltered)) {
        const auto local_query = dynamic_cast<const db::query::events::GetFiltered *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplGetFilteredResult(query);
    }
    if (typeid(*query) == typeid(db::query::events::Add)) {
        const auto local_query = dynamic_cast<const db::query::events::Add *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplAdd(query);
    }
    if (typeid(*query) == typeid(db::query::events::Remove)) {
        const auto local_query = dynamic_cast<const db::query::events::Remove *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplRemove(query);
    }
    if (typeid(*query) == typeid(db::query::events::Edit)) {
        const auto local_query = dynamic_cast<const db::query::events::Edit *>(query.get());
        return runQueryImpl(local_query);
        return runQueryImplEdit(query);
    }
    return nullptr;
}

std::unique_ptr<db::query::events::GetResult> EventsRecordInterface::runQueryImpl(const db::query::events::Get *query)
std::unique_ptr<db::query::events::GetResult> EventsRecordInterface::runQueryImplGetResult(
    std::shared_ptr<db::Query> query)
{
    auto value = GetByID(query->id);
    return std::make_unique<db::query::events::GetResult>(value);
    auto getQuery = dynamic_cast<db::query::events::Get *>(query.get());
    assert(getQuery != nullptr);
    auto records  = GetByID(getQuery->id);
    auto response = std::make_unique<db::query::events::GetResult>(records);
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::query::events::GetAllResult> EventsRecordInterface::runQueryImpl(
    const db::query::events::GetAll *query)
std::unique_ptr<db::query::events::GetAllResult> EventsRecordInterface::runQueryImplGetAllResult(
    std::shared_ptr<db::Query> query)
{
    auto numberOfEvents = GetCount();
    auto records        = GetLimitOffset(0, numberOfEvents);
    return std::make_unique<db::query::events::GetAllResult>(std::move(records));
    auto response       = std::make_unique<db::query::events::GetAllResult>(std::move(records));
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::query::events::GetAllLimitedResult> EventsRecordInterface::runQueryImpl(
    const db::query::events::GetAllLimited *query)
std::unique_ptr<db::query::events::GetAllLimitedResult> EventsRecordInterface::runQueryImplGetAllLimitedResult(
    std::shared_ptr<db::Query> query)
{

    auto getAllLimitedQuery = dynamic_cast<db::query::events::GetAllLimited *>(query.get());
    assert(getAllLimitedQuery != nullptr);
    auto records = GetLimitOffsetByDate(getAllLimitedQuery->offset, getAllLimitedQuery->limit);
    auto count   = GetCount();
    auto records = GetLimitOffsetByDate(query->offset, query->limit);
    return std::make_unique<db::query::events::GetAllLimitedResult>(std::move(records),
                                                                    std::make_unique<uint32_t>(count));
    auto response =
        std::make_unique<db::query::events::GetAllLimitedResult>(std::move(records), std::make_unique<uint32_t>(count));
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::query::events::GetFilteredResult> EventsRecordInterface::runQueryImpl(
    const db::query::events::GetFiltered *query)
std::unique_ptr<db::query::events::GetFilteredResult> EventsRecordInterface::runQueryImplGetFilteredResult(
    std::shared_ptr<db::Query> query)
{
    auto records = Select(query->filter_from, query->filter_till);
    return std::make_unique<db::query::events::GetFilteredResult>(std::move(records));
    auto getFilteredQuery = dynamic_cast<db::query::events::GetFiltered *>(query.get());
    assert(getFilteredQuery != nullptr);
    auto records  = Select(getFilteredQuery->filter_from, getFilteredQuery->filter_till);
    auto response = std::make_unique<db::query::events::GetFilteredResult>(std::move(records));
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::query::events::AddResult> EventsRecordInterface::runQueryImpl(const db::query::events::Add *query)
std::unique_ptr<db::query::events::AddResult> EventsRecordInterface::runQueryImplAdd(std::shared_ptr<db::Query> query)
{
    bool ret = Add(query->getRecord());
    return std::make_unique<db::query::events::AddResult>(ret);
    auto addQuery = dynamic_cast<db::query::events::Add *>(query.get());
    assert(addQuery != nullptr);
    bool ret      = Add(addQuery->getRecord());
    auto response = std::make_unique<db::query::events::AddResult>(ret);
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::query::events::RemoveResult> EventsRecordInterface::runQueryImpl(
    const db::query::events::Remove *query)
std::unique_ptr<db::query::events::RemoveResult> EventsRecordInterface::runQueryImplRemove(
    std::shared_ptr<db::Query> query)
{
    bool ret = RemoveByID(query->id);
    return std::make_unique<db::query::events::RemoveResult>(ret);
    auto removeQuery = dynamic_cast<db::query::events::Remove *>(query.get());
    assert(removeQuery != nullptr);
    bool ret      = RemoveByID(removeQuery->id);
    auto response = std::make_unique<db::query::events::RemoveResult>(ret);
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::query::events::EditResult> EventsRecordInterface::runQueryImpl(const db::query::events::Edit *query)
std::unique_ptr<db::query::events::EditResult> EventsRecordInterface::runQueryImplEdit(std::shared_ptr<db::Query> query)
{
    bool ret = Update(query->getRecord());
    return std::make_unique<db::query::events::EditResult>(ret);
    auto editQuery = dynamic_cast<db::query::events::Edit *>(query.get());
    assert(editQuery != nullptr);
    bool ret      = Update(editQuery->getRecord());
    auto response = std::make_unique<db::query::events::EditResult>(ret);
    response->setRequestQuery(query);
    return response;
}

M module-db/Interface/EventsRecord.hpp => module-db/Interface/EventsRecord.hpp +9 -7
@@ 83,11 83,13 @@ class EventsRecordInterface : public RecordInterface<EventsRecord, EventsRecordF
  private:
    EventsDB *eventsDb = nullptr;

    std::unique_ptr<db::query::events::GetResult> runQueryImpl(const db::query::events::Get *query);
    std::unique_ptr<db::query::events::GetAllResult> runQueryImpl(const db::query::events::GetAll *query);
    std::unique_ptr<db::query::events::GetAllLimitedResult> runQueryImpl(const db::query::events::GetAllLimited *query);
    std::unique_ptr<db::query::events::GetFilteredResult> runQueryImpl(const db::query::events::GetFiltered *query);
    std::unique_ptr<db::query::events::AddResult> runQueryImpl(const db::query::events::Add *query);
    std::unique_ptr<db::query::events::RemoveResult> runQueryImpl(const db::query::events::Remove *query);
    std::unique_ptr<db::query::events::EditResult> runQueryImpl(const db::query::events::Edit *query);
    std::unique_ptr<db::query::events::GetResult> runQueryImplGetResult(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::query::events::GetAllResult> runQueryImplGetAllResult(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::query::events::GetAllLimitedResult> runQueryImplGetAllLimitedResult(
        std::shared_ptr<db::Query> query);
    std::unique_ptr<db::query::events::GetFilteredResult> runQueryImplGetFilteredResult(
        std::shared_ptr<db::Query> query);
    std::unique_ptr<db::query::events::AddResult> runQueryImplAdd(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::query::events::RemoveResult> runQueryImplRemove(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::query::events::EditResult> runQueryImplEdit(std::shared_ptr<db::Query> query);
};

M module-db/Tables/EventsTable.cpp => module-db/Tables/EventsTable.cpp +1 -1
@@ 375,7 375,7 @@ EventsTableRow EventsTable::getById(uint32_t id)
std::vector<EventsTableRow> EventsTable::selectByDatePeriod(TimePoint date_filter, TimePoint filter_till)
{
    auto retQuery =
        db->query("SELECT * FROM events WHERE date_from >= date('%q') AND date_till < date('%q', 'start of day');",
        db->query("SELECT * FROM events WHERE date_from >= date('%q') AND date_from < date('%q', 'start of day');",
                  TimePointToString(date_filter).c_str(),
                  TimePointToString(filter_till).c_str());