npm package: @kiz8/inngest-service
Description: Сервис для обработки событий с использованием Inngest
Author: Kiz8
Latest version: 0.1.0

# @reputation-management/inngest-service

Сервис для обработки событий с использованием Inngest в системе управления репутацией.

## Установка

```bash
npm install @reputation-management/inngest-service
```

или

```bash
yarn add @reputation-management/inngest-service
```

## Использование

Этот пакет предоставляет сервис для обработки событий с использованием Inngest. Он может быть развернут как отдельное приложение или интегрирован в существующее приложение Next.js.

### Запуск как отдельное приложение

```bash
# Установка зависимостей
npm install

# Запуск в режиме разработки
npm run dev

# Сборка для продакшена
npm run build

# Запуск в продакшене
npm start
```

### Синхронизация функций Inngest

```bash
# Локальная синхронизация
npm run sync

# Синхронизация в продакшене
npm run sync:prod
```

## Структура проекта

- `app/` - Код приложения Next.js
- `functions/` - Функции Inngest для обработки событий
- `events/` - Определения событий

## Лицензия

MIT

# Inngest Service для Reputation Management

Выделенный микросервис для обработки Inngest событий и задач в приложении Reputation Management.

## Обзор

Этот микросервис обеспечивает:

- Единый API endpoint для Inngest (`/api/inngest`)
- Изолированную обработку фоновых и асинхронных задач
- Чистую интеграцию с Inngest Cloud
- Работу с базой данных через Prisma ORM

## Схема взаимодействия

```
┌───────────────┐         ┌──────────────────┐         ┌────────────────┐
│               │         │                  │         │                │
│  Web/Admin    │─────────▶ inngest-client   │─────────▶  Inngest Cloud │
│  Приложения   │         │  (общий пакет)   │         │                │
│               │         │                  │         │                │
└───────────────┘         └──────────────────┘         └────────┬───────┘
                                                              │
                                                              │
                                                              ▼
┌───────────────┐         ┌──────────────────┐         ┌────────────────┐
│               │         │                  │         │                │
│    Worker     │◀────────│  inngest-service │◀────────│  Триггеры и    │
│  (обработка   │         │  (микросервис)   │         │   события      │
│   данных)     │         │                  │         │                │
│               │         │                  │         │                │
└───────────────┘         └──────────────────┘         └────────────────┘
         │                         │
         │                         │
         ▼                         ▼
┌───────────────────────────────────────────────┐
│                                               │
│             Базы данных и API                 │
│             (PostgreSQL/Neon)                 │
│                                               │
└───────────────────────────────────────────────┘
```

### Поток данных

1. **Отправка событий**:

   - Фронтенд-приложения (Web/Admin) или серверные компоненты используют `@reputation-management/inngest-client` для отправки событий в Inngest
   - События включают: создание отзывов, запросы на анализ, запросы отчетов и т.д.

2. **Обработка событий**:

   - Inngest Cloud доставляет события микросервису `inngest-service`
   - Микросервис запускает соответствующие функции для обработки каждого события
   - Функции обрабатывают данные асинхронно и независимо от основного приложения

3. **Интеграция с Worker**:

   - Для сложной обработки данных используется Worker сервис
   - Worker может быть вызван через Inngest или напрямую

4. **Результаты обработки**:
   - После обработки события, микросервис может:
     - Отправить новые события в Inngest для дальнейшей обработки
     - Сохранить результаты в базу данных
     - Вызвать внешние API

## Функции

- **Анализ отзывов** - анализ текста отзывов, определение тональности и ключевых слов
- **Генерация отчетов** - создание отчетов по заведениям на основе собранных данных
- **Скрапинг данных** - сбор отзывов и информации о заведениях из различных источников

## Основные типы событий

| Название события           | Описание                            | Инициатор   | Обработчик           |
| -------------------------- | ----------------------------------- | ----------- | -------------------- |
| `review/created`           | Создание нового отзыва              | Web/Admin   | `analyze-review.ts`  |
| `review/analyze-requested` | Запрос на анализ отзыва             | Web/Admin   | `analyze-review.ts`  |
| `review/analyzed`          | Отзыв проанализирован               | Inngest Svc | Client apps          |
| `venue/scrape-requested`   | Запрос на скрапинг данных заведения | Web/Admin   | `scrape-venue.ts`    |
| `venue/scraped`            | Данные заведения собраны            | Inngest Svc | Client apps          |
| `report/requested`         | Запрос на генерацию отчета          | Web/Admin   | `generate-report.ts` |
| `report/generated`         | Отчет сгенерирован                  | Inngest Svc | Client apps          |
| `test/event`               | Тестовое событие                    | Web/Admin   | Любой обработчик     |

## Разработка

```bash
# Запуск в режиме разработки
pnpm dev

# Сборка
pnpm build

# Запуск тестов
pnpm test

# Проверка типов
pnpm typecheck
```

## Интеграция Prisma с Vercel

Для правильной работы Prisma в Vercel serverless-окружении внесены специальные настройки:

1. **Автоматическая генерация Prisma клиента** при каждом деплое:

   ```json
   "scripts": {
     "vercel-build": "prisma generate && next build",
     "postinstall": "prisma generate"
   }
   ```

2. **Плагин для монорепозитория**, который решает проблемы с отсутствием файлов Prisma engine:

   ```javascript
   // next.config.js
   import { PrismaPlugin } from "@prisma/nextjs-monorepo-workaround-plugin";

   const nextConfig = {
     // ...
     webpack: (config, { isServer }) => {
       if (isServer) {
         config.plugins = [...config.plugins, new PrismaPlugin()];
       }
       return config;
     },
   };
   ```

3. **Connection pooling** для эффективной работы в serverless-среде:
   - Используется `NEONDB_URL_POOLING` для пула соединений
   - Предотвращает исчерпание лимита соединений с базой данных

## Деплой

Сервис настроен для деплоя на Vercel. Переменные окружения в `vercel.json`:

```json
{
  "buildCommand": "pnpm run vercel-build",
  "env": {
    "INNGEST_SIGNING_KEY": "${INNGEST_SIGNING_KEY}",
    "INNGEST_EVENT_KEY": "${INNGEST_EVENT_KEY}",
    "NEXT_PUBLIC_VERCEL_URL": "${VERCEL_URL}",
    "NEONDB_URL": "${NEONDB_URL}",
    "DIRECT_DATABASE_URL": "${DIRECT_DATABASE_URL}",
    "NEONDB_URL_POOLING": "${NEONDB_URL_POOLING}"
  }
}
```

### Переменные окружения для базы данных

- `NEONDB_URL` - основное соединение с базой данных
- `DIRECT_DATABASE_URL` - для миграций и прямого доступа
- `NEONDB_URL_POOLING` - URL с пулом соединений для serverless-среды

## Синхронизация с Inngest Cloud

После деплоя на Vercel необходимо выполнить синхронизацию с Inngest Cloud:

```bash
# Локальная синхронизация
pnpm sync

# Синхронизация продакшн версии
pnpm sync:prod
```

## Интеграция с другими сервисами

Другие сервисы могут отправлять события в Inngest через общий клиент из пакета `@reputation-management/inngest-client`. Преимущества такого подхода:

- Единые типы событий и интерфейсы между всеми сервисами
- Централизованное управление событиями
- Типобезопасность при отправке и обработке событий
- Избегание дублирования кода

### Пример использования

```typescript
import { reviewEvents } from "@reputation-management/inngest-client";

// Отправка события
await reviewEvents.analyzeRequested({
  reviewId: "123",
  venueId: "456",
  text: "Отличное место, рекомендую!",
});
```

## Структура проекта

```
apps/inngest-service/
├── app/                   # Next.js приложение
│   ├── api/               # API endpoints
│   │   └── inngest/       # Основной Inngest endpoint
│   │       └── route.ts
├── client.ts              # Реэкспорт клиента из общего пакета
├── events/                # Реэкспорт событий из общего пакета
│   └── index.ts
├── functions/             # Inngest функции
│   ├── analyze-review.ts  # Анализ отзывов
│   ├── generate-report.ts # Генерация отчетов
│   ├── scrape-venue.ts    # Скрапинг данных заведений
│   └── index.ts           # Экспорт всех функций
├── types.ts               # Реэкспорт типов из общего пакета
├── next.config.js         # Конфигурация Next.js с Prisma плагином
├── vercel.json            # Конфигурация Vercel
└── package.json           # Зависимости и скрипты
```

## Зависимости

Основные зависимости:

- `@reputation-management/inngest-client`: workspace:\* - общий клиент для Inngest
- `@repo/database`: workspace:\* - пакет для работы с базой данных
- `@prisma/client`: ^5.10.2 - клиент Prisma ORM
- `prisma`: ^5.10.2 - инструменты Prisma CLI
- `@prisma/nextjs-monorepo-workaround-plugin`: ^5.10.2 - плагин для корректной работы в монорепозитории
- `inngest`: ^3.3.1 - библиотека для работы с Inngest
- `next`: ^14.0.4 - фреймворк для приложения