// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "AlarmsRecord.hpp" #include "queries/alarms/QueryAlarmsAdd.hpp" #include "queries/alarms/QueryAlarmsRemove.hpp" #include "queries/alarms/QueryAlarmsEdit.hpp" #include "queries/alarms/QueryAlarmsGet.hpp" #include "queries/alarms/QueryAlarmsGetLimited.hpp" #include "queries/alarms/QueryAlarmsTurnOffAll.hpp" AlarmsRecord::AlarmsRecord(const AlarmsTableRow &tableRow) : Record{tableRow.ID}, time{tableRow.time}, snooze{tableRow.snooze}, status{tableRow.status}, repeat{tableRow.repeat}, path{tableRow.path} {} AlarmsRecordInterface::AlarmsRecordInterface(AlarmsDB *alarmsDb) : alarmsDB(alarmsDb) {} AlarmsRecordInterface::~AlarmsRecordInterface() {} bool AlarmsRecordInterface::Add(const AlarmsRecord &rec) { // Create alarm alarmsDB->alarms.add(AlarmsTableRow(rec)); return true; } uint32_t AlarmsRecordInterface::GetCount() { return alarmsDB->alarms.count(); } std::unique_ptr> AlarmsRecordInterface::GetLimitOffsetByField(uint32_t offset, uint32_t limit, AlarmsRecordField field, const char *str) { auto records = std::make_unique>(); std::vector alarm; switch (field) { case AlarmsRecordField::Time: alarm = alarmsDB->alarms.getLimitOffsetByField(offset, limit, AlarmsTableFields::Time, str); break; case AlarmsRecordField::Snooze: alarm = alarmsDB->alarms.getLimitOffsetByField(offset, limit, AlarmsTableFields::Snooze, str); break; case AlarmsRecordField::Status: alarm = alarmsDB->alarms.getLimitOffsetByField(offset, limit, AlarmsTableFields::Status, str); break; default: return records; } return records; } std::unique_ptr> AlarmsRecordInterface::GetLimitOffset(uint32_t offset, uint32_t limit) { auto alarms = alarmsDB->alarms.getLimitOffset(offset, limit); auto records = std::make_unique>(); for (const auto &alarm : alarms) { records->push_back(AlarmsRecord(alarm)); } return records; } bool AlarmsRecordInterface::Update(const AlarmsRecord &rec) { auto alarm = alarmsDB->alarms.getById(rec.ID); if (alarm.ID == 0) { return false; } alarmsDB->alarms.update(AlarmsTableRow(rec)); return true; } bool AlarmsRecordInterface::RemoveByID(uint32_t id) { auto alarm = alarmsDB->alarms.getById(id); if (alarm.ID == 0) { return false; } // Remove alarm if (alarmsDB->alarms.removeById(id) == false) { return false; } return true; } bool AlarmsRecordInterface::RemoveByField(AlarmsRecordField field, const char *str) { switch (field) { case AlarmsRecordField::Time: return alarmsDB->alarms.removeByField(AlarmsTableFields::Time, str); default: return false; } } AlarmsRecord AlarmsRecordInterface::GetByID(uint32_t id) { return AlarmsRecord(alarmsDB->alarms.getById(id)); } bool AlarmsRecordInterface::TurnOffAll() { return alarmsDB->alarms.updateStatuses(AlarmStatus::Off); } std::unique_ptr AlarmsRecordInterface::runQuery(std::shared_ptr query) { if (typeid(*query) == typeid(db::query::alarms::Get)) { return runQueryImplGetResult(query); } if (typeid(*query) == typeid(db::query::alarms::GetLimited)) { return runQueryImplGetLimitedResult(query); } if (typeid(*query) == typeid(db::query::alarms::TurnOffAll)) { return runQueryImplTurnOffAll(query); } if (typeid(*query) == typeid(db::query::alarms::Add)) { return runQueryImplAdd(query); } if (typeid(*query) == typeid(db::query::alarms::Remove)) { return runQueryImplRemove(query); } if (typeid(*query) == typeid(db::query::alarms::Edit)) { return runQueryImplEdit(query); } return nullptr; } std::unique_ptr AlarmsRecordInterface::runQueryImplGetResult( std::shared_ptr query) { auto getQuery = static_cast(query.get()); auto records = GetByID(getQuery->id); auto response = std::make_unique(records); response->setRequestQuery(query); return response; } std::unique_ptr AlarmsRecordInterface::runQueryImplGetLimitedResult( std::shared_ptr query) { auto getLimitedQuery = static_cast(query.get()); auto records = GetLimitOffset(getLimitedQuery->offset, getLimitedQuery->limit); std::vector recordVector; for (const auto &alarm : *records) { recordVector.emplace_back(alarm); } auto response = std::make_unique(recordVector, GetCount()); response->setRequestQuery(query); return response; } std::unique_ptr AlarmsRecordInterface::runQueryImplAdd(std::shared_ptr query) { auto addQuery = static_cast(query.get()); bool ret = Add(addQuery->getRecord()); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr AlarmsRecordInterface::runQueryImplRemove( std::shared_ptr query) { auto removeQuery = static_cast(query.get()); bool ret = RemoveByID(removeQuery->id); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr AlarmsRecordInterface::runQueryImplEdit(std::shared_ptr query) { auto editQuery = static_cast(query.get()); bool ret = Update(editQuery->getRecord()); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr AlarmsRecordInterface::runQueryImplTurnOffAll( std::shared_ptr query) { auto result = TurnOffAll(); auto response = std::make_unique(result); response->setRequestQuery(query); return response; }