// 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/QueryEventsRemoveICS.hpp" #include "module-db/queries/calendar/QueryEventsEdit.hpp" #include #include #include #include #include #include #include #include #include EventsRecord::EventsRecord(const EventsTableRow &tableRow) : Record{tableRow.ID}, UID{tableRow.UID}, title{tableRow.title}, date_from{tableRow.date_from}, date_till{tableRow.date_till}, reminder{tableRow.reminder}, repeat{tableRow.repeat}, reminder_fired{tableRow.reminder_fired}, provider_type{tableRow.provider_type}, provider_id{tableRow.provider_id}, provider_iCalUid{tableRow.provider_iCalUid} {} EventsRecordInterface::EventsRecordInterface(EventsDB *eventsDb) : eventsDb(eventsDb) {} bool EventsRecordInterface::Add(const EventsRecord &rec) { auto entry = EventsTableRow{{rec.ID}, .UID = rec.UID, .title = rec.title, .date_from = rec.date_from, .date_till = rec.date_till, .reminder = rec.reminder, .repeat = rec.repeat, .reminder_fired = rec.reminder_fired, .provider_type = rec.provider_type, .provider_id = rec.provider_id, .provider_iCalUid = rec.provider_iCalUid}; Repeat repeatOption = Repeat(rec.repeat); if (repeatOption > Repeat::yearly) { return (eventsDb->events.addCustom(entry)); } switch (repeatOption) { case Repeat::never: { return eventsDb->events.add(entry); } case Repeat::daily: { return eventsDb->events.addDaily(entry); } case Repeat::weekly: { return eventsDb->events.addWeekly(entry); } case Repeat::biweekly: { return eventsDb->events.addTwoWeeks(entry); } case Repeat::monthly: { return eventsDb->events.addMonth(entry); } case Repeat::yearly: { return eventsDb->events.addYear(entry); } } return false; } std::vector 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::vector(); for (auto &r : rows) { records.push_back(r); } return records; } std::vector EventsRecordInterface::Select(TimePoint date, uint32_t offset, uint32_t limit) { auto rows = eventsDb->events.selectByDate(date, offset, limit); auto records = std::vector(); 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::vector EventsRecordInterface::GetLimitOffsetByDate(uint32_t offset, uint32_t limit) { if (limit == 0) { limit = GetCount(); } auto rows = eventsDb->events.getLimitOffsetByDate(offset, limit); auto records = std::vector(); 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("Event record is not valid"); return false; } auto entry = EventsTableRow{{rec.ID}, .UID = rec.UID, .title = rec.title, .date_from = rec.date_from, .date_till = rec.date_till, .reminder = rec.reminder, .repeat = rec.repeat, .reminder_fired = rec.reminder_fired, .provider_type = rec.provider_type, .provider_id = rec.provider_id, .provider_iCalUid = rec.provider_iCalUid}; bool result = eventsDb->events.update(entry); Repeat repeatOption = Repeat(rec.repeat); if (repeatOption > Repeat::yearly) { return (eventsDb->events.addCustom(entry) && result); } switch (repeatOption) { case Repeat::never: { return result; } case Repeat::daily: { return (eventsDb->events.addDaily(entry) && result); } case Repeat::weekly: { return (eventsDb->events.addWeekly(entry) && result); } case Repeat::biweekly: { return (eventsDb->events.addTwoWeeks(entry) && result); } case Repeat::monthly: { return (eventsDb->events.addMonth(entry) && result); } case Repeat::yearly: { return (eventsDb->events.addYear(entry) && result); } } return false; } bool EventsRecordInterface::UpdateByUID(const EventsRecord &rec) { auto record = eventsDb->events.getByUID(rec.UID); if (!record.isValid()) { LOG_DEBUG("Event record is not valid"); return false; } auto entry = EventsTableRow{{rec.ID}, .UID = rec.UID, .title = rec.title, .date_from = rec.date_from, .date_till = rec.date_till, .reminder = rec.reminder, .repeat = rec.repeat, .reminder_fired = rec.reminder_fired, .provider_type = rec.provider_type, .provider_id = rec.provider_id, .provider_iCalUid = rec.provider_iCalUid}; bool result = eventsDb->events.updateByUID(entry); Repeat repeatOption = Repeat(rec.repeat); if (repeatOption > Repeat::yearly) { return (eventsDb->events.addCustom(entry) && result); } switch (Repeat(rec.repeat)) { case Repeat::never: { return result; } case Repeat::daily: { return (eventsDb->events.addDaily(entry) && result); } case Repeat::weekly: { return (eventsDb->events.addWeekly(entry) && result); } case Repeat::biweekly: { return (eventsDb->events.addTwoWeeks(entry) && result); } case Repeat::monthly: { return (eventsDb->events.addMonth(entry) && result); } case Repeat::yearly: { return (eventsDb->events.addYear(entry) && result); } } return false; } bool EventsRecordInterface::RemoveByID(uint32_t id) { return eventsDb->events.removeById(id); } bool EventsRecordInterface::RemoveByUID(const std::string &UID) { return eventsDb->events.removeByUID(UID); } bool EventsRecordInterface::RemoveByField(EventsRecordField field, const char *str) { assert(0 && "Not implemented"); return false; } EventsRecord EventsRecordInterface::GetByID(uint32_t id) { EventsRecord event{eventsDb->events.getById(id)}; return event; } EventsRecord EventsRecordInterface::GetByUID(const std::string &uid) { EventsRecord event{eventsDb->events.getByUID(uid)}; return event; } uint32_t EventsRecordInterface::GetCount() { return eventsDb->events.count(); } uint32_t EventsRecordInterface::GetCountFiltered(TimePoint from, TimePoint till) { return eventsDb->events.countFromFilter(from, till); } uint32_t EventsRecordInterface::GetCountFilteredByDay(TimePoint filter) { return eventsDb->events.countFromDayFilter(filter); } std::vector EventsRecordInterface::SelectFirstUpcoming(TimePoint filter_from, TimePoint filter_till) { auto rows = eventsDb->events.SelectFirstUpcoming(filter_from, filter_till); auto records = std::vector(); 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::GetFilteredByDay)) { return runQueryImplGetFilteredByDayResult(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::RemoveICS)) { return runQueryImplRemoveICS(query); } if (typeid(*query) == typeid(db::query::events::Edit)) { return runQueryImplEdit(query); } if (typeid(*query) == typeid(db::query::events::EditICS)) { return runQueryImplEditICS(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 = static_cast(query.get()); 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(*records); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplGetAllLimitedResult( std::shared_ptr query) { auto getAllLimitedQuery = static_cast(query.get()); auto records = GetLimitOffsetByDate(getAllLimitedQuery->offset, getAllLimitedQuery->limit); auto count = GetCount(); auto response = std::make_unique(std::move(records), count); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplGetFilteredResult( std::shared_ptr query) { auto getFilteredQuery = static_cast(query.get()); 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::runQueryImplGetFilteredByDayResult( std::shared_ptr query) { auto getFilteredQuery = static_cast(query.get()); auto records = Select(getFilteredQuery->filterDate, getFilteredQuery->offset, getFilteredQuery->limit); auto numberOfEvents = GetCountFilteredByDay(getFilteredQuery->filterDate); 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 = static_cast(query.get()); 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 = static_cast(query.get()); bool ret = RemoveByID(removeQuery->id); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplRemoveICS( std::shared_ptr query) { auto removeQuery = static_cast(query.get()); bool ret = RemoveByUID(removeQuery->UID); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::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 EventsRecordInterface::runQueryImplEditICS( std::shared_ptr query) { auto editQuery = static_cast(query.get()); bool ret = UpdateByUID(editQuery->getRecord()); auto response = std::make_unique(ret); response->setRequestQuery(query); return response; } std::unique_ptr EventsRecordInterface::runQueryImplSelectFirstUpcoming( std::shared_ptr query) { auto getFirstUpcomingQuery = static_cast(query.get()); auto records = SelectFirstUpcoming(getFirstUpcomingQuery->filter_from, getFirstUpcomingQuery->filter_till); auto response = std::make_unique(records); response->setRequestQuery(query); return response; }