// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "SMSTemplateRecord.hpp" #include "queries/messages/templates/QuerySMSTemplateGetByID.hpp" #include "queries/messages/templates/QuerySMSTemplateGet.hpp" #include "queries/messages/templates/QuerySMSTemplateAdd.hpp" #include "queries/messages/templates/QuerySMSTemplateGetCount.hpp" #include "queries/messages/templates/QuerySMSTemplateRemove.hpp" #include "queries/messages/templates/QuerySMSTemplateUpdate.hpp" #include #include #include SMSTemplateRecord::SMSTemplateRecord(const SMSTemplateTableRow &w) { ID = w.ID; text = w.text; lastUsageTimestamp = w.lastUsageTimestamp; order = w.order; } SMSTemplateRecordInterface::SMSTemplateRecordInterface(SmsDB *smsDb) : smsDB(smsDb) {} bool SMSTemplateRecordInterface::Add(const SMSTemplateRecord &rec) { return smsDB->templates.add( SMSTemplateTableRow{Record(rec.ID), .text = rec.text, .lastUsageTimestamp = rec.lastUsageTimestamp}); } uint32_t SMSTemplateRecordInterface::GetCount() { return smsDB->templates.count(); } std::unique_ptr> SMSTemplateRecordInterface::GetLimitOffsetByField( uint32_t offset, uint32_t limit, SMSTemplateRecordField /*field*/, const char * /*str*/) { assert(0 && "need proper implementation"); return GetLimitOffset(offset, limit); } std::unique_ptr> SMSTemplateRecordInterface::GetLimitOffset(uint32_t offset, uint32_t limit) { auto templates = smsDB->templates.getLimitOffset(offset, limit); return std::make_unique>(templates.begin(), templates.end()); } bool SMSTemplateRecordInterface::Update(const SMSTemplateRecord &rec) { const auto templ = smsDB->templates.getById(rec.ID); if (templ.ID == DB_ID_NONE) { return false; } const auto templateText = rec.text.empty() ? templ.text : rec.text; const auto templateOrder = rec.order == 0 ? templ.order : rec.order; return smsDB->templates.update(SMSTemplateTableRow{ Record(rec.ID), .text = templateText, .lastUsageTimestamp = rec.lastUsageTimestamp, .order = templateOrder}); } bool SMSTemplateRecordInterface::RemoveByID(uint32_t id) { auto templ = smsDB->templates.getById(id); if (templ.ID == 0) { return false; } return smsDB->templates.removeById(id); } bool SMSTemplateRecordInterface::RemoveByField(SMSTemplateRecordField /*field*/, const char * /*str*/) { assert(0 && "need implementation"); return false; } SMSTemplateRecord SMSTemplateRecordInterface::GetByID(uint32_t id) { auto templ = smsDB->templates.getById(id); return SMSTemplateRecord{templ}; } std::unique_ptr SMSTemplateRecordInterface::runQuery(std::shared_ptr query) { if (typeid(*query) == typeid(db::query::SMSTemplateGetByID)) { return getByIDQuery(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateGet)) { return getQuery(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateGetWithTotalCount)) { return getQueryWithTotalCount(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateGetForList)) { return getForListQuery(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateGetCount)) { return getCountQuery(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateAdd)) { return addQuery(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateRemove)) { return removeQuery(query); } else if (typeid(*query) == typeid(db::query::SMSTemplateUpdate)) { return updateQuery(query); } else { return getByIDQuery(query); } } std::unique_ptr SMSTemplateRecordInterface::getByIDQuery(const std::shared_ptr &query) { const auto local_query = static_cast(query.get()); auto smsTemplate = smsDB->templates.getById(local_query->id); auto response = std::make_unique(std::move(smsTemplate)); response->setRequestQuery(query); return response; } auto SMSTemplateRecordInterface::getQueryRecords(const std::shared_ptr &query) -> std::vector { const auto localQuery = static_cast(query.get()); auto dbResult = smsDB->templates.getLimitOffset(localQuery->offset, localQuery->limit); return std::vector(dbResult.begin(), dbResult.end()); } auto SMSTemplateRecordInterface::getQuery(const std::shared_ptr &query) -> std::unique_ptr { auto response = std::make_unique(getQueryRecords(query)); response->setRequestQuery(query); return response; } auto SMSTemplateRecordInterface::getQueryWithTotalCount(const std::shared_ptr &query) -> std::unique_ptr { auto response = std::make_unique(getQueryRecords(query), smsDB->templates.count()); response->setRequestQuery(query); return response; } std::unique_ptr SMSTemplateRecordInterface::getForListQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); auto dbResult = smsDB->templates.getLimitOffset(localQuery->offset, localQuery->limit); auto recordVector = std::vector(dbResult.begin(), dbResult.end()); auto count = smsDB->templates.count(); auto response = std::make_unique(std::move(recordVector), count); response->setRequestQuery(query); return response; } std::unique_ptr SMSTemplateRecordInterface::getCountQuery(const std::shared_ptr &query) { auto response = std::make_unique(smsDB->templates.count()); response->setRequestQuery(query); return response; } std::unique_ptr SMSTemplateRecordInterface::addQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); auto record = localQuery->rec; auto ret = SMSTemplateRecordInterface::Add(record); if (ret) { record.ID = smsDB->templates.getLastId(); } auto response = std::make_unique(ret, record.ID); response->setRequestQuery(query); return response; } std::unique_ptr SMSTemplateRecordInterface::removeQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); auto ret = smsDB->templates.removeById(localQuery->id); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr SMSTemplateRecordInterface::updateQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); auto ret = SMSTemplateRecordInterface::Update(localQuery->rec); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; }