Files

8.6 KiB

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;
}