Основной сервис для работы с базой данных. Все функции асинхронные и возвращают Promises.
executeQuery(query: string, params: any[] = [])- Автоматически определяет тип запроса (SELECT vs остальные)
- Для SELECT использует
getAllAsync - Для остальных использует
runAsync - Обрабатывает ошибки
createTopic(
parentId: number | null = null,
name: string,
orderIndex: number = 0
): Promise<number>Описание: Создает новую тему
Возвращает: ID созданной темы
Пример:
const topicId = await createTopic(null, "Новая тема", 0);
const subtopicId = await createTopic(topicId, "Подтема", 0);getChildTopics(parentTopicId: number): Promise<Topic[]>Описание: Получает все прямые дочерние темы указанной темы
Возвращает: Массив тем, отсортированных по order_index
Примечание: Не рекурсивно - только прямые дети
getTopicById(topicId: number): Promise<Topic | null>Описание: Получает тему по ID
Возвращает: Объект темы или null если не найдена
deleteTopic(topicId: number): Promise<void>Описание: Удаляет тему и все связанные данные (каскадное удаление)
Примечание: Автоматически удаляет все заметки и вкладки этой темы
createNote(
topicId: number,
content: string,
title: string = '',
orderIndex: number = 0,
isTask: boolean = false,
done: boolean = false
): Promise<number>Описание: Создает новую заметку или задачу в указанной теме
Возвращает: ID созданной заметки/задачи
Параметры:
isTask- еслиtrue, создается задача, иначе заметкаdone- статус выполнения задачи (актуально только для задач) Особенности:- Пустые строки для
titleиcontentавтоматически преобразуются вnull - Если
titleпустой или содержит только пробелы, сохраняется какnullПример:
const noteId = await createNote(1, "Содержимое заметки", "Заголовок", 0);
const taskId = await createNote(1, "Выполнить задачу", "Задача", 0, true, false);getNotesForTopic(parentTopicId: number): Promise<Note[]>Описание: Получает все заметки указанной темы
Возвращает: Массив заметок, отсортированных по order_index
getNoteById(noteId: number): Promise<Note | null>Описание: Получает заметку по ID
Возвращает: Объект заметки или null если не найдена
updateNote(
noteId: number,
content?: string,
title?: string,
done?: boolean
): Promise<void>Описание: Обновляет заметку или задачу (только указанные поля)
Параметры: Все опциональны, обновляются только переданные
done- статус выполнения задачи (актуально только для задач) Пример:
await updateNote(1, "Новое содержимое");
await updateNote(1, undefined, "Новый заголовок");
await updateNote(1, "Новое содержимое", "Новый заголовок");
await updateNote(1, undefined, undefined, true); // Отметить задачу как выполненнуюtoggleTaskDone(
taskId: number,
done: boolean
): Promise<void>Описание: Переключает статус выполнения задачи
Параметры:
taskId- ID задачиdone- новый статус выполнения (true= выполнена,false= не выполнена)
deleteNote(noteId: number): Promise<void>Описание: Удаляет заметку или задачу
addTab(
topicId: number,
orderIndex: number = 0
): Promise<number>Описание: Добавляет тему как вкладку (или обновляет существующую)
Возвращает: ID записи вкладки
Примечание: Использует INSERT OR REPLACE, поэтому безопасно вызывать повторно
removeTab(topicId: number): Promise<void>Описание: Удаляет тему из вкладок (открепляет)
Параметры: topicId - ID темы для открепления
getAllTabs(): Promise<Topic[]>Описание: Получает все закрепленные вкладки
Возвращает: Массив тем-вкладок с JOIN к таблице topics, отсортированных по order_index
Примечание: Возвращает полные объекты Topic с полями: id, name, parent_id, order_index, created_at
getDBConnection(): Promise<SQLiteDatabase>Описание: Получает соединение с БД (singleton pattern)
Функциональность:
- Если БД уже открыта, возвращает существующее соединение
- Если нет - открывает новую и создает таблицы
- Автоматически вызывает
createTables()при первом открытии
closeDBConnection(): Promise<void>Описание: Закрывает соединение с БД
deleteDB(): Promise<void>Описание: Удаляет файл базы данных (для разработки/сброса)
Все типы определены в src/types/index.ts:
Topic- тема с полями: id, name, parent_id, order_index, created_atNote- заметка с полями: id, topic_id, title, content, order_index, created_atTab- вкладка с полями: id, topic_id, order_index
Все функции сервиса:
- Логируют ошибки в консоль через
console.error - Пробрасывают ошибки выше для обработки в UI
- Используют try-catch блоки
Рекомендация: Обернуть вызовы API в try-catch на уровне компонентов для показа пользователю ошибок
// Создаем корневую тему
const rootId = await createTopic(null, "Работа", 0);
// Создаем подтему
const projectId = await createTopic(rootId, "Проект X", 0);
// Создаем подтему второго уровня
const taskId = await createTopic(projectId, "Задача 1", 0);// Создаем заметку
const noteId = await createNote(projectId, "Описание проекта", "Проект X", 0);
// Получаем все заметки темы
const notes = await getNotesForTopic(projectId);
// Обновляем заметку
await updateNote(noteId, "Обновленное описание", "Новый заголовок");// Закрепляем тему как вкладку
await addTab(rootId, 0);
// Получаем все вкладки
const tabs = await getAllTabs();
// Открепляем вкладку
await removeTab(rootId);