// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "EventsRecord.hpp" #include "module-db/queries/calendar/QueryEventsGet.hpp" #include "module-db/queries/calendar/QueryEventsGetAll.hpp" #include "module-db/queries/calendar/QueryEventsAdd.hpp" #include "module-db/queries/calendar/QueryEventsRemove.hpp" #include "module-db/queries/calendar/QueryEventsEdit.hpp" #include #include #include #include #include #include #include #include EventsRecord::EventsRecord(const EventsTableRow &tableRow) : Record{tableRow.ID}, title{tableRow.title}, date_from{tableRow.date_from}, date_till{tableRow.date_till}, reminder{tableRow.reminder}, repeat{tableRow.repeat}, reminder_fired{tableRow.reminder_fired} {} EventsRecordInterface::EventsRecordInterface(EventsDB *eventsDb) : eventsDb(eventsDb) {} bool EventsRecordInterface::Add(const EventsRecord &rec) { auto entry = EventsTableRow{{.ID = rec.ID}, .title = rec.title, .date_from = rec.date_from, .date_till = rec.date_till, .reminder = rec.reminder, .repeat = rec.repeat, .reminder_fired = rec.reminder_fired}; switch (RepeatOption(rec.repeat)) { case RepeatOption::Never: { return eventsDb->events.add(entry); } case RepeatOption::Daily: { return eventsDb->events.addDaily(entry); } case RepeatOption::Weekly: { return eventsDb->events.addWeekly(entry); } case RepeatOption::TwoWeeks: { return eventsDb->events.addTwoWeeks(entry); } case RepeatOption::Month: { return eventsDb->events.addMonth(entry); } case RepeatOption::Year: { return eventsDb->events.addYear(entry); } default: { return eventsDb->events.addCustom(entry); } } } std::unique_ptr> EventsRecordInterface::Select(TimePoint filter_from, TimePoint filter_till, uint32_t offset, uint32_t limit) { auto rows = eventsDb->events.selectByDatePeriod(filter_from, filter_till, offset, limit); auto records = std::make_unique>(); for (auto &r : rows) { records->push_back(r); } return records; } std::unique_ptr> EventsRecordInterface::GetLimitOffsetByField(uint32_t offset, uint32_t limit, EventsRecordField field, const char *str) { assert(0 && "Not implemented"); return GetLimitOffset(offset, limit); } std::unique_ptr> EventsRecordInterface::GetLimitOffset(uint32_t offset, uint32_t limit) { if (limit == 0) { limit = GetCount(); } auto rows = eventsDb->events.getLimitOffset(offset, limit); auto records = std::make_unique>(); for (auto &r : rows) { records->push_back(r); } return records; } std::unique_ptr> EventsRecordInterface::GetLimitOffsetByDate(uint32_t offset, uint32_t limit) { if (limit == 0) { limit = GetCount(); } auto rows = eventsDb->events.getLimitOffsetByDate(offset, limit); auto records = std::make_unique>(); for (auto &r : rows) { records->push_back(r); } return records; } bool EventsRecordInterface::Update(const EventsRecord &rec) { auto record = eventsDb->events.getById(rec.ID); if (!record.isValid()) { LOG_DEBUG("IS NOT VALID"); return false; } auto entry = EventsTableRow{{.ID = rec.ID}, .title = rec.title, .date_from = rec.date_from, .date_till = rec.date_till, .reminder = rec.reminder, .repeat = rec.repeat, .reminder_fired = rec.reminder_fired}; bool result = eventsDb->events.update(entry); switch (RepeatOption(rec.repeat)) { case RepeatOption::Never: { return (eventsDb->events.add(entry) && result); } case RepeatOption::Daily: { return (eventsDb->events.addDaily(entry) && result); } case RepeatOption::Weekly: { return (eventsDb->events.addWeekly(entry) && result); } case RepeatOption::TwoWeeks: { return (eventsDb->events.addTwoWeeks(entry) && result); } case RepeatOption::Month: { return (eventsDb->events.addMonth(entry) && result); } case RepeatOption::Year: { return (eventsDb->events.addYear(entry) && result); } default: { return eventsDb->events.addCustom(entry); } } } bool EventsRecordInterface::RemoveByID(uint32_t id) { return eventsDb->events.removeById(id); } bool EventsRecordInterface::RemoveByField(EventsRecordField field, const char *str) { assert(0 && "Not implemented"); return false; } EventsRecord EventsRecordInterface::GetByID(uint32_t id) { EventsRecord event = static_cast(eventsDb->events.getById(id)); return event; } uint32_t EventsRecordInterface::GetCount() { return eventsDb->events.count(); } uint32_t EventsRecordInterface::GetCountFiltered(TimePoint from, TimePoint till) { return eventsDb->events.countFromFilter(from, till); } std::unique_ptr> EventsRecordInterface::SelectFirstUpcoming(TimePoint filter_from, TimePoint filter_till) { auto rows = eventsDb->events.SelectFirstUpcoming(filter_from, filter_till); auto records = std::make_unique>(); for (auto &r : rows) { records->push_back(r); } return records; } std::unique_ptr EventsRecordInterface::runQuery(std::shared_ptr query) { if (typeid(*query) == typeid(db::query::events::Get)) { return runQueryImplGetResult(query); } if (typeid(*query) == typeid(db::query::events::GetAll)) { return runQueryImplGetAllResult(query); } if (typeid(*query) == typeid(db::query::events::GetAllLimited)) { return runQueryImplGetAllLimitedResult(query); } if (typeid(*query) == typeid(db::query::events::GetFiltered)) { return runQueryImplGetFilteredResult(query); } if (typeid(*query) == typeid(db::query::events::Add)) { return runQueryImplAdd(query); } if (typeid(*query) == typeid(db::query::events::Remove)) { return runQueryImplRemove(query); } if (typeid(*query) == typeid(db::query::events::Edit)) { return runQueryImplEdit(query); } if (typeid(*query) == typeid(db::query::events::SelectFirstUpcoming)) { return runQueryImplSelectFirstUpcoming(query); } return nullptr; } std::unique_ptr EventsRecordInterface::runQueryImplGetResult( std::shared_ptr query) { auto getQuery = dynamic_cast(query.get()); assert(getQuery != nullptr); auto records = GetByID(getQuery->id); auto response = std::make_unique(records); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplGetAllResult( std::shared_ptr query) { auto numberOfEvents = GetCount(); auto records = GetLimitOffset(0, numberOfEvents); auto response = std::make_unique(std::move(records)); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplGetAllLimitedResult( std::shared_ptr query) { auto getAllLimitedQuery = dynamic_cast(query.get()); assert(getAllLimitedQuery != nullptr); auto records = GetLimitOffsetByDate(getAllLimitedQuery->offset, getAllLimitedQuery->limit); auto count = GetCount(); auto response = std::make_unique(std::move(records), std::make_unique(count)); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplGetFilteredResult( std::shared_ptr query) { auto getFilteredQuery = dynamic_cast(query.get()); assert(getFilteredQuery != nullptr); auto records = Select(getFilteredQuery->filter_from, getFilteredQuery->filter_till, getFilteredQuery->offset, getFilteredQuery->limit); auto numberOfEvents = GetCountFiltered(getFilteredQuery->filter_from, getFilteredQuery->filter_till); auto response = std::make_unique(std::move(records), numberOfEvents); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplAdd(std::shared_ptr query) { auto addQuery = dynamic_cast(query.get()); assert(addQuery != nullptr); bool ret = Add(addQuery->getRecord()); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplRemove( std::shared_ptr query) { auto removeQuery = dynamic_cast(query.get()); assert(removeQuery != nullptr); bool ret = RemoveByID(removeQuery->id); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplEdit(std::shared_ptr query) { auto editQuery = dynamic_cast(query.get()); assert(editQuery != nullptr); bool ret = Update(editQuery->getRecord()); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplSelectFirstUpcoming( std::shared_ptr query) { auto getFirstUpcomingQuery = dynamic_cast(query.get()); assert(getFirstUpcomingQuery != nullptr); auto records = SelectFirstUpcoming(getFirstUpcomingQuery->filter_from, getFirstUpcomingQuery->filter_till); auto response = std::make_unique(std::move(records)); response->setRequestQuery(query); return response; }