# База данных проекта Проект использует базу данных **CouchDB** для хранения информации о пользователях, QR-кодах и сообщениях, что позволяет организовать взаимодействие между владельцами QR-кодов и гостями. CouchDB, распределенная NoSQL база данных, которая работает по протоколу HTTP и хранит данные в формате JSON. Это делает её удобной для интеграции с веб-приложениями и клиентскими библиотеками, такими как **PouchDB**. --- ## Доступ к тестовому серверу CouchDB Тестовый сервер CouchDB для проекта "НаСвязи" доступен по следующему адресу: - **URL**: [https://hereconnect.condev.ru/api/](https://hereconnect.condev.ru/api/) Для управления базой данных и выполнения административных задач доступен встроенный интерфейс CouchDB — **Fauxton**: - **Админ-панель Fauxton**: [https://hereconnect.condev.ru/api/_utils/](https://hereconnect.condev.ru/api/_utils/) --- ## Использование админ-панели Fauxton **Fauxton** — это встроенный веб-интерфейс CouchDB, предоставляющий доступ к функциям управления базой данных, работы с документами, настройки безопасности и мониторинга изменений. ### Основные действия в Fauxton 1. **Открытие Fauxton**: - Перейдите по адресу [https://hereconnect.condev.ru/api/_utils/](https://hereconnect.condev.ru/api/_utils/). - Введите логин `admin` и пароль `e1oQrcN4QN`, чтобы получить доступ к панели управления. 2. **Создание базы данных**: - На главной странице выберите **"Databases"** в боковом меню. - Нажмите **"Create Database"**. - Введите имя новой базы данных и нажмите **"Create"**, чтобы завершить создание. 3. **Работа с документами**: - Перейдите в нужную базу данных. - Чтобы создать новый документ, нажмите **"Add Document"**. Введите данные документа в формате JSON и нажмите **"Save Document"**. - Чтобы отредактировать документ, выберите его из списка, внесите изменения и нажмите **"Save Document"**. CouchDB создаст новую **ревизию** документа, сохранив изменения. 4. **Просмотр журнала изменений (Changes)**: - Внутри выбранной базы данных нажмите **"Changes"**, чтобы увидеть все изменения (добавления, обновления или удаления документов). - Журнал изменений позволяет отслеживать версию каждого документа, что полезно при синхронизации данных и работе с автономными приложениями. 5. **Настройка безопасности**: - В разделе **"Permissions"** можно настроить доступ к базе ## Подключение к базе данных с помощью PouchDB **[PouchDB](https://pouchdb.com/)** — это клиентская библиотека для работы с CouchDB, которая позволяет использовать базу данных как на стороне клиента (в браузере), так и на сервере через HTTP. PouchDB обеспечивает совместимость с CouchDB, так что работа с локальной базой не отличается от работы с удаленной. ### Основные операции с PouchDB ```bash npm install pouchdb ```js // Импорт PouchDB import PouchDB from 'pouchdb-browser'; // Подключение к базе данных const db = new PouchDB('https://hereconnect.condev.ru/api/qr', {skip_setup: true}); // или можно использовать локальную базу данных // const db = new PouchDB('qr'); const qr_code_uri = '4n8x9z7q'; try { // Создание документа QR-кода await db.put({ _id: `qr_code:${qr_code_uri}`, type: 'qr_code', uri: qr_code_uri, user_uuid: '01931a8b-220c-76df-943c-ea23313c7c65', name: 'Мой автомобиль', actions: ['send_message', 'share_location'], url: `https://hereconnect.condev.ru/${qr_code_uri}`, created_at: new Date().toISOString() }); console.log('QR-код успешно создан'); } catch (error) { if (error.status === 409) { // Статус 409 означает конфликт (документ уже существует) console.log(`QR-код с идентификатором ${qr_code_uri} уже существует.`); } else { console.error('Ошибка при создании QR-кода:', error); } } // Получение документа QR-кода const qrCodeDoc = await db.get(`qr_code:${qr_code_uri}`); console.log('QR-код:', qrCodeDoc); // Обновление документа QR-кода (например, изменение имени) const qrCodeForUpdate = await db.get(`qr_code:${qr_code_uri}`); qrCodeForUpdate.name = 'Обновленное название объекта'; await db.put(qrCodeForUpdate); // Удаление документа QR-кода const qrCodeForDelete = await db.get(`qr_code:${qr_code_uri}`); await db.remove(qrCodeForDelete); // Создание документа сообщения от гостя await db.put({ _id: `message:${qr_code_uri}:1731317710358:1731317710358`, type: 'message', qr_code: qr_code_uri, chat: '1731317710358', created_at: '1731317710358', from: 'guest', content: 'Ваша машина мешает проезду', location: { lat: 55.7558, lng: 37.6176 } }); // Получение всех сообщений для конкретного QR-кода const messages = await db.allDocs({ startkey: `message:${qr_code_uri}:`, endkey: `message:${qr_code_uri}:\ufff0`, include_docs: true }); messages.rows.forEach(row => console.log('Сообщение:', row.doc)); / Отслеживание изменений в базе данных db.changes({ since: 'now', live: true }).on('change', change => { console.log('Изменение в базе данных:', change); }); // Синхронизация локальной и удаленной базы данных const remoteDB = new PouchDB('https://hereconnect.condev.ru/api/qr'); db.sync(remoteDB, { live: true, retry: true }).on('change', info => { console.log('Синхронизация: изменения обнаружены', info); }); ``` ## Ревизии документов CouchDB использует ревизии (`_rev`) для отслеживания версий каждого документа. Каждое обновление документа создает новую ревизию, которая включает уникальный идентификатор. Это позволяет разрешать конфликты при синхронизации и помогает управлять историей изменений. Создание новой ревизии происходит при каждом обновлении документа. Ревизия представлена в виде строки, состоящей из номера и хеша (например, 1-9c65296036141e575d32ba9c034dd3ee). Конфликты ревизий возникают при параллельных изменениях одного документа. CouchDB сохраняет обе версии, и конфликт можно разрешить вручную. #### Как работают ревизии - **Создание новой ревизии**: При каждом обновлении документа создается новая ревизия. CouchDB использует номера ревизий, которые включают префикс, указывающий версию изменения и хэш-значение, представляющее текущую версию данных. Например, ревизия может выглядеть как `1-9c65296036141e575d32ba9c034dd3ee`, где `1` — версия, а `9c65296036141e575d32ba9c034dd3ee` — уникальный хэш. Использование _rev является **обязательным** для всех операций обновления и удаления документов, так как CouchDB требует указания текущей ревизии для предотвращения конфликтов данных. При создании нового документа указывать ревизию не требуется. CouchDB автоматически создает поле `_rev` для нового документа и присваивает ему начальную ревизию, которая обычно выглядит как `1-<хэш>` (например, `1-9c65296036141e575d32ba9c034dd3ee`). - **Отслеживание изменений**: `_rev` обновляется при каждом изменении документа. Для того чтобы внести изменения в документ, необходимо указать его текущую ревизию, иначе CouchDB вернет ошибку `409 Conflict`, так как ожидает последнюю известную версию документа. #### Пример использования ревизий ```javascript import PouchDB from 'pouchdb-browser'; const db = new PouchDB('https://hereconnect.condev.ru/api/qr', { skip_setup: true }); try { // Получение текущей версии документа const doc = await db.get(docId); // Изменение данных документа doc.name = 'Обновленное название объекта'; // Сохранение документа с новой ревизией const response = await db.put(doc); console.log('Документ обновлен:', response); } catch (error) { if (error.status === 409) { console.log('Конфликт: требуется обновить ревизию.'); } else { console.error('Ошибка при обновлении документа:', error); } } ``` Ревизии в CouchDB помогают обеспечить контроль версий документов, особенно при синхронизации данных и в распределенных системах.