```ts import { Attachment } from 'pouchdb-core'; /** * Базовый интерфейс для всех документов в базе данных. * Содержит общие поля, такие как идентификатор, тип и дату создания. */ interface BaseDocument { /** Уникальный идентификатор документа */ _id: string; /** Тип документа */ type: string; /** Дата создания документа в формате ISO */ created_at: string; } /** * Интерфейс для документа пользователя. * Содержит данные, такие как имя пользователя, уникальный UUID, email и роли. */ export interface UserDocument extends BaseDocument { /** Тип документа, всегда 'user' */ type: 'user'; /** Имя пользователя */ name: string; /** Уникальный UUID пользователя, не связанный с _id */ user_uuid: string; /** Email пользователя */ email: string; /** Роли пользователя (например, ['admin', 'user']) */ roles: string[]; /** Пароль пользователя (должен храниться в зашифрованном виде) */ password: string; } /** * Интерфейс для документа QR-кода. * Представляет QR-код, созданный пользователем, и информацию о привязанном объекте. */ export interface QRCodeDocument extends BaseDocument { /** Тип документа, всегда 'qr_code' */ type: 'qr_code'; /** Уникальный URL для настройки и взаимодействия */ uri: string; /** Идентификатор пользователя, который создал QR-код */ user_uuid: string; /** Название объекта, для которого создан QR-код, например "Мой автомобиль" */ name: string; /** Доступные действия для гостей (например, ["send_message"]) */ actions: string[]; } /** * Интерфейс для документа сообщения. * Используется для хранения сообщений, отправленных через QR-код, с поддержкой вложений. */ export interface MessageDocument extends BaseDocument { /** Тип документа, всегда 'message' */ type: 'message'; /** Идентификатор QR-кода, к которому относится сообщение */ qr_code: string; /** Идентификатор чата для связывания сообщений */ chat: string; /** Отправитель сообщения ('guest' или 'owner') */ from: 'guest' | 'owner'; /** Содержимое сообщения */ body: string; /** Опциональная геопозиция (широта и долгота) */ location?: { lat: number; lng: number }; /** Вложения, такие как фото */ _attachments?: { [key: string]: Attachment; }; } /** * Интерфейс для документа уведомления. * Используется для хранения данных о push-уведомлениях и их статусе. */ export interface NotificationDocument extends BaseDocument { /** Тип документа, всегда 'notification' */ type: 'notification'; /** Идентификатор пользователя, которому отправлено уведомление */ user_uuid: string; /** Идентификатор QR-кода, связанного с уведомлением */ qr_code: string; /** Идентификатор сообщения, к которому привязано уведомление */ message_id: string; /** Статус уведомления ('sent', 'delivered', или 'read') */ status: 'sent' | 'delivered' | 'read'; /** Заголовок уведомления */ title: string; /** Содержание уведомления */ body: string; } /** * Интерфейс для документа чата. * Хранит информацию о чате и участниках для организации истории взаимодействий. */ export interface ChatDocument extends BaseDocument { /** Тип документа, всегда 'chat' */ type: 'chat'; /** Идентификатор QR-кода, к которому относится чат */ qr_code: string; /** Время последнего сообщения в чате */ last_message_at: string; /** Участники чата */ participants: { user_uuid: string, role: 'guest' | 'owner' }[]; } /** * Интерфейс для документа настроек. * Используется для хранения пользовательских настроек, таких как уведомления и конфиденциальность. */ export interface SettingsDocument extends BaseDocument { /** Тип документа, всегда 'settings' */ type: 'settings'; /** Идентификатор пользователя, которому принадлежат настройки */ user_uuid: string; /** Опциональный идентификатор QR-кода, если настройки специфичны для него */ qr_code?: string; /** Включены ли push-уведомления */ push_notifications: boolean; /** Разрешено ли прикрепление геопозиции к сообщениям */ allow_geolocation: boolean; /** Разрешены ли прикрепления фотографий */ allow_photo_attachments: boolean; } /** * Интерфейс для документа аналитики. * Используется для сбора данных о взаимодействиях с QR-кодом для анализа активности. */ export interface AnalyticsDocument extends BaseDocument { /** Тип документа, всегда 'analytics' */ type: 'analytics'; /** Идентификатор QR-кода, который был отсканирован */ qr_code: string; /** Действие пользователя ('scan', 'message_sent', 'photo_attached') */ action: 'scan' | 'message_sent' | 'photo_attached'; /** Идентификатор пользователя, если он авторизован (опционально) */ user_uuid?: string; /** Время действия */ timestamp: string; /** Опциональная геопозиция при сканировании */ location?: { lat: number; lng: number }; } /** * Интерфейс для документа подписки. * Используется для хранения подписок на push-уведомления. */ export interface SubscriptionDocument extends BaseDocument { /** Тип документа, всегда 'subscription' */ type: 'subscription'; /** Идентификатор пользователя, подписанного на уведомления */ user_uuid: string; /** URL конечной точки для отправки уведомлений */ endpoint: string; /** Ключи для шифрования и авторизации уведомлений */ keys: { p256dh: string; auth: string; }; /** Время истечения подписки, если доступно */ expirationTime?: number; } /** * Интерфейс для документа аудита. * Хранит записи действий пользователей для обеспечения безопасности и аудита. */ export interface AuditLogDocument extends BaseDocument { /** Тип документа, всегда 'audit_log' */ type: 'audit_log'; /** Идентификатор пользователя, совершившего действие (если авторизован) */ user_uuid?: string; /** Действие ('create_qr', 'send_message', 'read_message', 'delete_message') */ action: 'create_qr' | 'send_message' | 'read_message' | 'delete_message'; /** Опциональный идентификатор QR-кода, если действие связано с ним */ qr_code?: string; /** Дополнительная информация о действии */ details?: string; /** Время действия */ timestamp: string; } ```