// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "NotesRecord.hpp" #include "queries/notes/QueryNotesGet.hpp" #include "queries/notes/QueryNotesGetByText.hpp" #include "queries/notes/QueryNoteStore.hpp" #include "queries/notes/QueryNoteRemove.hpp" #include namespace { NotesTableFields toNotesTableFields(NotesRecordField field) { switch (field) { case NotesRecordField::Date: return NotesTableFields::Date; case NotesRecordField::Snippet: return NotesTableFields::Snippet; } throw std::invalid_argument{"Invalid notes record field passed."}; } } // namespace NotesRecordInterface::NotesRecordInterface(NotesDB *notesDb) : notesDB(notesDb) {} bool NotesRecordInterface::Add(const NotesRecord &rec) { return notesDB->notes.add(NotesTableRow{.date = rec.date, .snippet = rec.snippet}); } std::uint32_t NotesRecordInterface::GetCount() { return notesDB->notes.count(); } std::unique_ptr> NotesRecordInterface::GetLimitOffsetByField(std::uint32_t offset, std::uint32_t limit, NotesRecordField field, const char *str) { auto records = std::make_unique>(); const auto notes = notesDB->notes.getLimitOffsetByField(offset, limit, toNotesTableFields(field), str); for (const auto &w : notes) { NotesRecord record{w.ID, w.date, w.snippet}; records->push_back(std::move(record)); } return records; } std::unique_ptr> NotesRecordInterface::GetLimitOffset(std::uint32_t offset, std::uint32_t limit) { return std::make_unique>(getNotes(offset, limit)); } bool NotesRecordInterface::Update(const NotesRecord &rec) { auto note = notesDB->notes.getById(rec.ID); if (note.ID == DB_ID_NONE) { return false; } notesDB->notes.update(NotesTableRow{.ID = rec.ID, .date = rec.date, .snippet = rec.snippet}); return true; } bool NotesRecordInterface::RemoveAll() { return notesDB->notes.removeAll(); } bool NotesRecordInterface::RemoveByID(std::uint32_t id) { return notesDB->notes.removeById(id); } bool NotesRecordInterface::RemoveByField(NotesRecordField field, const char *str) { switch (field) { case NotesRecordField::Date: return notesDB->notes.removeByField(NotesTableFields::Date, str); default: return false; } } NotesRecord NotesRecordInterface::GetByID(std::uint32_t id) { auto note = notesDB->notes.getById(id); return NotesRecord{note.ID, note.date, note.snippet}; } std::vector NotesRecordInterface::getNotes(std::uint32_t offset, std::uint32_t limit) const { std::vector records; const auto ¬es = notesDB->notes.getLimitOffset(offset, limit); for (const auto ¬e : notes) { NotesRecord record{note.ID, note.date, note.snippet}; records.push_back(std::move(record)); } return records; } std::pair, unsigned int> NotesRecordInterface::getNotesByText(const std::string &text, unsigned int offset, unsigned int limit) const { std::vector records; auto [notes, count] = notesDB->notes.getByText(text, offset, limit); for (const auto ¬e : notes) { NotesRecord record{note.ID, note.date, note.snippet}; records.push_back(std::move(record)); } return {records, count}; } std::unique_ptr NotesRecordInterface::runQuery(std::shared_ptr query) { if (typeid(*query) == typeid(db::query::QueryNotesGet)) { return getQuery(query); } if (typeid(*query) == typeid(db::query::QueryNotesGetByText)) { return getByTextQuery(query); } if (typeid(*query) == typeid(db::query::QueryNoteStore)) { return storeQuery(query); } if (typeid(*query) == typeid(db::query::QueryNoteRemove)) { return removeQuery(query); } return nullptr; } std::unique_ptr NotesRecordInterface::getQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); const auto &records = getNotes(localQuery->getOffset(), localQuery->getLimit()); auto response = std::make_unique(records, GetCount()); response->setRequestQuery(query); return response; } std::unique_ptr NotesRecordInterface::getByTextQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); auto [records, count] = getNotesByText(localQuery->getText(), localQuery->getOffset(), localQuery->getLimit()); auto response = std::make_unique(records, count); response->setRequestQuery(query); return response; } std::unique_ptr NotesRecordInterface::storeQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); const auto &record = localQuery->getRecord(); bool isSuccess = false; std::uint32_t resultId = DB_ID_NONE; if (const auto id = notesDB->notes.getById(record.ID).ID; id != DB_ID_NONE) { // Already exists in the DB. isSuccess = Update(record); resultId = id; } else { isSuccess = Add(record); if (isSuccess) { resultId = notesDB->getLastInsertRowId(); } } auto response = std::make_unique(isSuccess, resultId); response->setRequestQuery(query); return response; } std::unique_ptr NotesRecordInterface::removeQuery(const std::shared_ptr &query) { const auto localQuery = static_cast(query.get()); const auto isSuccess = RemoveByID(localQuery->getRecordId()); auto response = std::make_unique(isSuccess); response->setRequestQuery(query); return response; }