@andrey4emk/npm-app-back-b24 0.9.8 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,19 +2,26 @@
2
2
 
3
3
  Утилиты для работы с Bitrix24 OAuth на основе `@bitrix24/b24jssdk`.
4
4
 
5
+ **TypeScript-ready** — пакет полностью написан на TypeScript и включает типы.
6
+
5
7
  ## Содержание
6
8
 
7
- - [Установка](#установка)
8
- - [Использование](#использование)
9
- - [API](#api)
10
- - [OAuth функции](#oauth-функции)
11
- - [Утилиты](#утилиты)
12
- - [События](#события)
13
- - [ChatApp](#chatapp)
14
- - [Smsgold](#smsgold)
15
- - [Переменные окружения](#переменные-окружения)
16
- - [Скрипты](#скрипты)
17
- - [Лицензия](#лицензия)
9
+ - [Установка](#установка)
10
+ - [Использование](#использование)
11
+ - [TypeScript](#typescript)
12
+ - [API](#api)
13
+ - [B24Prepared](#b24prepared)
14
+ - [errTask](#errtask)
15
+ - [Event](#event)
16
+ - [ChatApp](#chatapp)
17
+ - [Wappi](#wappi)
18
+ - [Email](#email)
19
+ - [Smsgold](#smsgold)
20
+ - [Logs](#logs)
21
+ - [Типы](#типы)
22
+ - [Переменные окружения](#переменные-окружения)
23
+ - [Скрипты](#скрипты)
24
+ - [Лицензия](#лицензия)
18
25
 
19
26
  ## Установка
20
27
 
@@ -24,509 +31,431 @@ npm install @andrey4emk/npm-app-back-b24
24
31
 
25
32
  ## Использование
26
33
 
27
- ```js
28
- import { create, refresh, save, errTask, Event } from "@andrey4emk/npm-app-back-b24";
29
- import { chatApp, smsgold } from "@andrey4emk/npm-app-back-b24";
30
- import { AuthB24Model } from "./models/AuthB24.js"; // пример модели
34
+ ```typescript
35
+ import { B24Prepared, errTask, Event, ChatApp, Wappi, Email, Smsgold, logs } from "@andrey4emk/npm-app-back-b24";
36
+
37
+ // Импорт типов
38
+ import type { B24Client, TaskData, MessageData, ApiResult } from "@andrey4emk/npm-app-back-b24";
39
+ ```
40
+
41
+ ### Пример работы с Bitrix24
42
+
43
+ ```typescript
44
+ import { B24Prepared, errTask, Event } from "@andrey4emk/npm-app-back-b24";
45
+ import { B24OAuth } from "@bitrix24/b24jssdk";
46
+
47
+ // Подготовка авторизации
48
+ const b24Prepared = new B24Prepared();
49
+ const authResult = await b24Prepared.makeAuthParams();
31
50
 
32
- // OAuth функции
33
- const b24Client = await create(AuthB24Model);
34
- const refreshResult = await refresh(AuthB24Model);
51
+ if (authResult.error) {
52
+ console.error(authResult.message);
53
+ process.exit(1);
54
+ }
35
55
 
36
- app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
56
+ const { AuthParams, secret } = authResult.data!;
37
57
 
38
- // Создание служебной задачи при ошибке
39
- await errTask(b24Client, {
58
+ // Создание клиента B24
59
+ const $b24 = new B24OAuth(AuthParams, secret);
60
+ await $b24.init();
61
+
62
+ // Создание задачи при ошибке
63
+ await errTask($b24, {
40
64
  title: "Ошибка синхронизации",
41
- description: "Детали ошибки здесь",
65
+ description: "Детали ошибки",
66
+ responsibleId: 1,
42
67
  });
43
68
 
44
69
  // Работа с событиями
45
- const eventHandler = new Event(b24Client);
46
- const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
70
+ const eventHandler = new Event($b24);
71
+ const result = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
47
72
 
48
- // Работа с ChatApp
49
- await chatApp.makeTokenChatApp();
50
- const result = await chatApp.sendMessageChatApp("whatsApp", {
51
- phone: "+1234567890",
52
- message: "Привет!",
53
- });
73
+ if (!result.error && result.data) {
74
+ console.log("ID сущностей:", result.data.entitysId);
75
+ }
76
+ ```
54
77
 
55
- // Работа с SMSGold
56
- await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
78
+ ## TypeScript
79
+
80
+ Пакет полностью типизирован. Все типы экспортируются из главного модуля:
81
+
82
+ ```typescript
83
+ import type {
84
+ // Общие
85
+ ApiResult,
86
+
87
+ // Bitrix24
88
+ B24AuthConfig,
89
+ B24AuthParams,
90
+ B24Secret,
91
+ B24Client,
92
+ TaskData,
93
+
94
+ // События
95
+ EventMessage,
96
+ EventsResult,
97
+ ConnectorMessage,
98
+ ConnectorEventsResult,
99
+
100
+ // Wappi
101
+ WappiAuth,
102
+ MessageData,
103
+ MessengerType,
104
+
105
+ // ChatApp
106
+ ChatAppMakeParams,
107
+ ChatAppAuthParams,
108
+ ChatAppTypeParams,
109
+ ChatAppMessengerType,
110
+
111
+ // Email
112
+ EmailAuth,
113
+ EmailData,
114
+
115
+ // SMSGold
116
+ SmsgoldAuth,
117
+ SmsData,
118
+
119
+ // Logs
120
+ LogLevel,
121
+ LogConfig,
122
+ } from "@andrey4emk/npm-app-back-b24";
57
123
  ```
58
124
 
59
125
  ## API
60
126
 
61
- ### OAuth функции
127
+ ### B24Prepared
62
128
 
63
- - **`create(AuthB24Model)`** создаёт клиента `B24OAuth` с использованием сохранённых в БД токенов.
129
+ Класс для подготовки авторизации Bitrix24.
64
130
 
65
- - **Параметры:**
66
- - `AuthB24Model` (Sequelize Model) модель для получения данных авторизации из БД.
67
- - **Возвращает:** промис с экземпляром `B24OAuth`, готовым к вызовам REST API.
68
- - **Ошибки:** выбрасывает `Error` если запись авторизации не найдена в БД.
131
+ ```typescript
132
+ import { B24Prepared } from "@andrey4emk/npm-app-back-b24";
69
133
 
70
- ```js
71
- const b24 = await create(AuthB24Model);
72
- const result = await b24.callMethod("crm.contact.list", { limit: 5 });
73
- ```
134
+ const b24Prepared = new B24Prepared();
135
+ ```
136
+
137
+ **Методы:**
74
138
 
75
- - **`refresh(AuthB24Model)`** — продлевает токены через Bitrix24 и обновляет запись в БД.
139
+ - **`makeAuthParams()`** — формирует параметры авторизации из конфига.
76
140
 
77
- - **Параметры:**
78
- - `AuthB24Model` (Sequelize Model) модель для обновления токенов.
79
- - **Возвращает:** промис с объектом `{ error: boolean, message: string }`.
141
+ ```typescript
142
+ const result = await b24Prepared.makeAuthParams();
143
+ // result: ApiResult<{ AuthParams: B24AuthParams; secret: B24Secret }>
80
144
 
81
- ```js
82
- const result = await refresh(AuthB24Model);
83
145
  if (!result.error) {
84
- console.log("Токены обновлены:", result.message);
146
+ const { AuthParams, secret } = result.data!;
147
+ // Используйте с @bitrix24/b24jssdk
85
148
  }
86
149
  ```
87
150
 
88
- - **`save(req, res, AuthB24Model)`** — HTTP-обработчик для сохранения набора токенов из `req.body`.
89
-
90
- - **Параметры:**
91
- - `req` (Express Request) — объект запроса с полем `body`.
92
- - `res` (Express Response) объект ответа.
93
- - `AuthB24Model` (Sequelize Model) — модель для сохранения.
94
- - **Тело запроса (req.body):**
95
- ```json
96
- {
97
- "access_token": "string",
98
- "refresh_token": "string",
99
- "domain": "string",
100
- "expires_in": "number",
101
- "member_id": "number"
102
- }
103
- ```
104
- - **Возвращает:** HTTP-ответ с JSON `{ status, message }` (код `201` при успехе, `400`/`500` при ошибках).
105
-
106
- ```js
107
- app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
108
- ```
151
+ - **`save(req, res, $b24)`** — сохраняет токены из фронта или обновляет из бэка.
152
+
153
+ ```typescript
154
+ // Из Express endpoint
155
+ app.post("/b24/auth", (req, res) => b24Prepared.save(req, res));
109
156
 
110
- ### Утилиты
111
-
112
- - **`errTask(b24, dataTask)`** — создаёт служебную задачу в Bitrix24 при ошибках/событиях.
113
-
114
- - **Алгоритм:**
115
-
116
- 1. Сначала проверяет, сколько задач с таким `TITLE` уже создано (через `tasks.task.list`).
117
- 2. Если их меньше чем `maxTasks`, создаёт новую задачу (`tasks.task.add`).
118
-
119
- - **Параметры:**
120
-
121
- - `b24` (B24OAuth) — экземпляр клиента Bitrix24.
122
- - `dataTask` (object) — объект с параметрами задачи (см. ниже).
123
-
124
- - **Возвращает:** промис с объектом:
125
- ```js
126
- {
127
- error: false,
128
- message: "Задача создана в Битрикс24.",
129
- result: { /* API response */ }
130
- }
131
- ```
132
- или при превышении лимита:
133
- ```js
134
- {
135
- error: false,
136
- message: "Превышено максимальное количество задач с таким названием (100). Новая задача не создана."
137
- }
138
- ```
139
- или при ошибке:
140
- ```js
141
- {
142
- error: true,
143
- message: "Не удалось создать задачу в Битрикс24: <текст ошибки>"
144
- }
145
- ```
146
-
147
- **Параметры `dataTask`:**
148
-
149
- | Параметр | Тип | По умолчанию | Описание |
150
- | ---------------- | ------------ | ------------------------- | --------------------------------------------- |
151
- | `title` | string | **обязательно** | Заголовок задачи |
152
- | `description` | string | `""` | Описание задачи |
153
- | `createdBy` | number | `138` | ID создателя |
154
- | `responsibleId` | number | `1` | ID ответственного |
155
- | `deadline` | ISO string | `DateTime.now() + 1 день` | Дедлайн в ISO формате |
156
- | `groupId` | number\|null | `null` | ID группы (опционально) |
157
- | `accomplices` | array | `[]` | Массив ID соисполнителей |
158
- | `maxTasks` | number | `100` | Максимум существующих задач с таким названием |
159
- | `entityTypeAbbr` | string | `""` | Код CRM сущности для `UF_CRM_TASK` |
160
-
161
- ```js
162
- await errTask(b24, {
163
- title: "Ошибка синхронизации",
164
- description: "Не удалось подключиться к API",
165
- responsibleId: 42,
166
- deadline: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString(),
167
- maxTasks: 50,
168
- });
157
+ // Из бэка для пересохранения
158
+ await b24Prepared.save(null, null, $b24);
169
159
  ```
170
160
 
171
- ### События
161
+ ### errTask
172
162
 
173
- - **`Event`** класс для работы с офлайн-событиями Bitrix24.
163
+ Создаёт служебную задачу в Bitrix24 при ошибках.
174
164
 
175
- ```js
176
- import { Event } from "@andrey4emk/npm-app-back-b24";
165
+ ```typescript
166
+ import { errTask } from "@andrey4emk/npm-app-back-b24";
167
+ import type { TaskData, B24Client } from "@andrey4emk/npm-app-back-b24";
177
168
 
178
- const eventHandler = new Event(b24);
179
- ```
169
+ const taskData: TaskData = {
170
+ title: "Ошибка синхронизации",
171
+ description: "Не удалось подключиться к API",
172
+ responsibleId: 42,
173
+ maxTasks: 50,
174
+ };
175
+
176
+ const result = await errTask($b24, taskData);
177
+ ```
178
+
179
+ **Параметры `TaskData`:**
180
+
181
+ | Параметр | Тип | По умолчанию | Описание |
182
+ | ---------------- | -------------- | --------------- | -------------------------------- |
183
+ | `title` | `string` | **обязательно** | Заголовок задачи |
184
+ | `description` | `string` | `""` | Описание задачи |
185
+ | `createdBy` | `number` | `138` | ID создателя |
186
+ | `responsibleId` | `number` | `1` | ID ответственного |
187
+ | `deadline` | `string` | `+1 день` | Дедлайн в ISO формате |
188
+ | `groupId` | `number\|null` | `null` | ID группы |
189
+ | `accomplices` | `number[]` | `[]` | Массив ID соисполнителей |
190
+ | `maxTasks` | `number` | `100` | Макс. задач с таким названием |
191
+ | `entityTypeAbbr` | `string` | `""` | Код CRM сущности для UF_CRM_TASK |
180
192
 
181
- **Методы:**
182
-
183
- - **`get(eventName)`** получить события по названию.
184
-
185
- - **Параметры:**
186
-
187
- - `eventName` (string) — название события (например, `'ONCRMDYNAMICITEMUPDATE_149'`).
188
-
189
- - **Возвращает:** промис с объектом:
190
-
191
- ```js
192
- {
193
- error: false,
194
- events: {
195
- processId: "12345",
196
- entitysId: [101, 102, 103],
197
- arrMessageIdAndEntityId: [
198
- { messageId: "msg_1", entityId: 101 },
199
- { messageId: "msg_2", entityId: 102 },
200
- { messageId: "msg_3", entityId: 103 }
201
- ]
202
- }
203
- }
204
- ```
205
-
206
- или при ошибке:
207
-
208
- ```js
209
- {
210
- error: true,
211
- status: "error",
212
- message: "Не удалось получить события. <текст ошибки>"
213
- }
214
- ```
215
-
216
- - **Особенности:**
217
- - Автоматически фильтрует и удаляет события от пользователя с `user_id: '138'`.
218
- - Если событий нет, возвращает `events` с пустыми массивами.
219
-
220
- ```js
221
- const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
222
- if (!error && events.entitysId.length > 0) {
223
- console.log("Обработанные ID сущностей:", events.entitysId);
224
- // events.processId — идентификатор процесса для очистки
225
- // events.arrMessageIdAndEntityId — данные для методов clear() и deleteMessageId()
226
- }
227
- ```
228
-
229
- - **`clear(processId, messageId)`** — очистить события в Bitrix24.
230
-
231
- - **Параметры:**
232
-
233
- - `processId` (string|number) — ID процесса (получен из `get()`).
234
- - `messageId` (array|string) — ID или массив ID сообщений для очистки.
235
-
236
- - **Возвращает:** промис с объектом:
237
- ```js
238
- {
239
- error: false;
240
- }
241
- ```
242
- или при ошибке:
243
- ```js
244
- {
245
- error: true,
246
- status: "error",
247
- message: "Не удалось очистить события. <текст ошибки>"
248
- }
249
- ```
250
-
251
- ```js
252
- const { events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
253
- if (events.processId) {
254
- const messageIds = events.arrMessageIdAndEntityId.map((item) => item.messageId);
255
- await eventHandler.clear(events.processId, messageIds);
256
- }
257
- ```
258
-
259
- - **`deleteMessageId(entityId, arrMessageIdAndEntityId)`** — удалить запись события из массива (локально).
260
-
261
- - **Параметры:**
262
-
263
- - `entityId` (number) — ID сущности для удаления.
264
- - `arrMessageIdAndEntityId` (array) — исходный массив событий.
265
-
266
- - **Возвращает:** обновлённый массив без записей с указанным `entityId`.
267
-
268
- ```js
269
- const { events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
270
- const updated = eventHandler.deleteMessageId(101, events.arrMessageIdAndEntityId);
271
- // updated содержит все события, кроме entityId: 101
272
- ```
193
+ ### Event
194
+
195
+ Класс для работы с офлайн-событиями Bitrix24.
196
+
197
+ ```typescript
198
+ import { Event } from "@andrey4emk/npm-app-back-b24";
199
+
200
+ const eventHandler = new Event($b24);
201
+
202
+ // Получить события
203
+ const result = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
204
+
205
+ if (!result.error && result.data) {
206
+ const events = result.data;
207
+ console.log("Process ID:", events.processId);
208
+ console.log("Entity IDs:", events.entitysId);
209
+
210
+ // Очистить события
211
+ if (events.processId) {
212
+ const messageIds = events.arrMessageIdAndEntityId.map((e) => e.messageId);
213
+ await eventHandler.clear(events.processId, messageIds);
214
+ }
215
+ }
216
+ ```
217
+
218
+ **Методы:**
219
+
220
+ - **`get(eventName)`** — получить события по названию
221
+ - **`clear(processId, messageId)`** — очистить события в Bitrix24
273
222
 
274
223
  ### ChatApp
275
224
 
276
- - **`chatApp`** — готовый экземпляр класса `ChatApp` для работы с мессенджерами через платформу ChatApp Online.
225
+ Класс для работы с мессенджерами через ChatApp Online.
226
+
227
+ ```typescript
228
+ import { ChatApp } from "@andrey4emk/npm-app-back-b24";
229
+ import type { ChatAppMakeParams, ChatAppAuthParams, ChatAppTypeParams } from "@andrey4emk/npm-app-back-b24";
230
+
231
+ const makeParams: ChatAppMakeParams = {
232
+ email: "your-email@example.com",
233
+ pass: "your-password",
234
+ appId: "your-app-id",
235
+ };
236
+
237
+ const authParams: ChatAppAuthParams = {
238
+ accessToken: "",
239
+ accessTokenEndTime: "",
240
+ refreshToken: "",
241
+ refreshTokenEndTime: "",
242
+ };
243
+
244
+ const typeParams: ChatAppTypeParams = {
245
+ whatsApp: {
246
+ licenseId: "12345",
247
+ messenger: [{ type: "grWhatsApp" }],
248
+ },
249
+ telegram: {
250
+ licenseId: "67890",
251
+ messenger: [{ type: "telegram" }],
252
+ },
253
+ };
254
+
255
+ const chatApp = new ChatApp(makeParams, authParams, typeParams);
256
+
257
+ // Отправка сообщения
258
+ const result = await chatApp.sendMessageChatApp("whatsApp", {
259
+ phone: "+1234567890",
260
+ message: "Привет!",
261
+ });
277
262
 
278
- ```js
279
- import { chatApp } from "@andrey4emk/npm-app-back-b24";
280
- ```
263
+ // Отправка файла
264
+ await chatApp.sendFileChatApp("telegram", {
265
+ phone: "123456789",
266
+ message: "Документ",
267
+ fileUrl: "https://example.com/file.pdf",
268
+ fileName: "document.pdf",
269
+ });
270
+
271
+ // Проверка номера
272
+ const check = await chatApp.phoneCheckChatApp("whatsApp", "+1234567890");
273
+ ```
274
+
275
+ ### Wappi
276
+
277
+ Класс для работы с Wappi API (WhatsApp, Telegram, Max).
278
+
279
+ ```typescript
280
+ import { Wappi } from "@andrey4emk/npm-app-back-b24";
281
+ import type { WappiAuth, MessengerType } from "@andrey4emk/npm-app-back-b24";
282
+
283
+ const whatsAppAuth: WappiAuth = { token: "xxx", profile_id: "123" };
284
+ const telegramAuth: WappiAuth = { token: "yyy", profile_id: "456" };
285
+ const maxAuth: WappiAuth = { token: "zzz", profile_id: "789" };
286
+
287
+ const wappi = new Wappi(maxAuth, telegramAuth, whatsAppAuth);
281
288
 
282
- **Методы:**
289
+ // Отправка сообщения
290
+ const result = await wappi.sendMessageWappi("whatsApp", {
291
+ phone: "+1234567890",
292
+ message: "Привет!",
293
+ sendOpenLine: true, // Отображать в открытой линии Б24
294
+ });
295
+
296
+ // Отправка файла
297
+ await wappi.sendFileWappi("telegram", {
298
+ phone: "+1234567890",
299
+ message: "Документ",
300
+ fileUrl: "https://example.com/file.pdf",
301
+ fileName: "document.pdf",
302
+ });
303
+
304
+ // Проверка номера
305
+ const check = await wappi.phoneCheckWappi("whatsApp", "+1234567890");
306
+ if (!check.error && check.data?.check) {
307
+ console.log("Номер существует в WhatsApp");
308
+ }
309
+ ```
310
+
311
+ **Поддерживаемые мессенджеры (`MessengerType`):**
312
+
313
+ - `"whatsApp"`
314
+ - `"telegram"`
315
+ - `"max"`
316
+
317
+ ### Email
318
+
319
+ Класс для отправки email через Yandex SMTP.
283
320
 
284
- - **`makeTokenChatApp()`** — получить токены доступа для ChatApp API.
285
-
286
- - **Возвращает:** промис с объектом:
321
+ ```typescript
322
+ import { Email } from "@andrey4emk/npm-app-back-b24";
323
+ import type { EmailAuth, EmailData } from "@andrey4emk/npm-app-back-b24";
287
324
 
288
- ```js
289
- {
290
- error: false;
291
- }
292
- ```
293
-
294
- или при ошибке:
295
-
296
- ```js
297
- {
298
- error: true,
299
- message: "Не удалось получить токен ChatApp",
300
- data: { /* API response */ }
301
- }
302
- ```
303
-
304
- - **Особенности:**
305
- - Сохраняет полученные токены в свойствах экземпляра (`accessToken`, `refreshToken` и т.д.).
306
- - Требует переменные окружения: `CHATAPP_EMAIL`, `CHATAPP_PASS`, `CHATAPP_APP_ID`.
307
-
308
- ```js
309
- const result = await chatApp.makeTokenChatApp();
310
- if (!result.error) {
311
- console.log("Токены успешно получены");
312
- }
313
- ```
314
-
315
- - **`refreshTokenChatApp()`** — обновить токены доступа.
316
-
317
- - **Возвращает:** промис с объектом:
318
-
319
- ```js
320
- {
321
- error: false;
322
- }
323
- ```
324
-
325
- или при ошибке:
326
-
327
- ```js
328
- {
329
- error: true,
330
- message: "Не удалось обновить токен ChatApp",
331
- data: { /* API response */ }
332
- }
333
- ```
334
-
335
- - **Алгоритм:**
336
- 1. Пытается обновить токены через API.
337
- 2. Если обновление не удалось, автоматически получает новые токены через `makeTokenChatApp()`.
338
-
339
- ```js
340
- const result = await chatApp.refreshTokenChatApp();
341
- if (!result.error) {
342
- console.log("Токены обновлены");
343
- }
344
- ```
345
-
346
- - **`checkTokenChatApp()`** — проверить валидность текущего токена.
347
-
348
- - **Возвращает:** промис с объектом:
349
-
350
- ```js
351
- {
352
- error: false,
353
- message: "Токен действителен" // или "Токен обновлен"
354
- }
355
- ```
356
-
357
- или при ошибке:
358
-
359
- ```js
360
- {
361
- error: true,
362
- message: "<текст ошибки>",
363
- data: null
364
- }
365
- ```
366
-
367
- - **Особенности:**
368
- - Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
369
-
370
- ```js
371
- const result = await chatApp.checkTokenChatApp();
372
- console.log(result.message);
373
- ```
374
-
375
- - **`getLicensesChatApp()`** — получить список лицензий для текущего аккаунта.
376
-
377
- - **Возвращает:** промис с объектом:
378
-
379
- ```js
380
- {
381
- error: false,
382
- message: "Лицензии успешно получены",
383
- data: [ /* массив лицензий */ ]
384
- }
385
- ```
386
-
387
- или при ошибке:
388
-
389
- ```js
390
- {
391
- error: true,
392
- message: "Не удалось получить лицензии ChatApp",
393
- data: null
394
- }
395
- ```
396
-
397
- - **Структура лицензии в массиве:**
398
- ```js
399
- {
400
- id: 15779,
401
- licenseName: "*5787",
402
- messengers: [
403
- { type: "grWhatsApp", name: "[WEB] WhatsApp" }
404
- ]
405
- }
406
- ```
407
-
408
- ```js
409
- const result = await chatApp.getLicensesChatApp();
410
- if (!result.error) {
411
- console.log("Доступные лицензии:", result.data);
412
- }
413
- ```
414
-
415
- - **`sendMessageChatApp(messengerType, messageData)`** — отправить сообщение через мессенджер.
416
-
417
- - **Параметры:**
418
-
419
- - `messengerType` (string) — тип мессенджера: `"whatsApp"` или `"telegram"`.
420
- - `messageData` (object) — объект с данными сообщения:
421
- - `phone` (string) — номер телефона или ID чата получателя.
422
- - `message` (string) — текст сообщения.
423
-
424
- - **Возвращает:** промис с объектом:
425
-
426
- ```js
427
- {
428
- error: false,
429
- message: "Сообщение успешно отправлено в ChatApp через whatsApp",
430
- data: null
431
- }
432
- ```
433
-
434
- или при ошибке:
435
-
436
- ```js
437
- {
438
- error: true,
439
- message: "Ошибка при отправке сообщения в ChatApp через whatsApp",
440
- data: null
441
- }
442
- ```
443
-
444
- - **Особенности:**
445
- - Перед отправкой автоматически проверяет токен через `checkTokenChatApp()`.
446
- - Использует конфигурацию из [config.js](config.js) для получения ID лицензий и типов мессенджеров.
447
- - Поддерживает отправку сообщений в WhatsApp и Telegram.
448
-
449
- ```js
450
- const result = await chatApp.sendMessageChatApp("whatsApp", {
451
- phone: "+1234567890",
452
- message: "Это тестовое сообщение",
453
- });
454
-
455
- if (!result.error) {
456
- console.log(result.message);
457
- } else {
458
- console.error(result.message);
459
- }
460
- ```
461
-
462
- **Пример отправки в Telegram:**
463
-
464
- ```js
465
- const result = await chatApp.sendMessageChatApp("telegram", {
466
- phone: "123456789", // ID чата в Telegram
467
- message: "Привет из приложения!",
468
- });
469
- ```
325
+ const auth: EmailAuth = {
326
+ user: "your-email@yandex.ru",
327
+ pass: "app-password",
328
+ };
329
+
330
+ const email = new Email(auth);
331
+
332
+ const result = await email.send({
333
+ to: "recipient@example.com",
334
+ subject: "Тема письма",
335
+ text: "Текст письма",
336
+ html: "<p>HTML версия</p>",
337
+ fileUrl: "https://example.com/file.pdf", // Опционально
338
+ fileName: "document.pdf",
339
+ });
340
+ ```
470
341
 
471
342
  ### Smsgold
472
343
 
473
- - **`smsgold.sendSms(phone, message)`** отправляет SMS через сервис SMSGold.
344
+ Класс для отправки SMS через SMSGold.
474
345
 
475
- ```js
476
- import { smsgold } from "@andrey4emk/npm-app-back-b24";
346
+ ```typescript
347
+ import { Smsgold } from "@andrey4emk/npm-app-back-b24";
348
+ import type { SmsgoldAuth, SmsData } from "@andrey4emk/npm-app-back-b24";
477
349
 
478
- const result = await smsgold.sendSms("+79990000000", "Готово!");
479
- if (!result.error) {
480
- console.log(result.message);
481
- } else {
482
- console.error(result.result);
483
- }
484
- ```
350
+ const auth: SmsgoldAuth = {
351
+ user: "login",
352
+ pass: "password",
353
+ };
354
+
355
+ // Без Bitrix24 (без прикрепления файлов)
356
+ const smsgold = new Smsgold(auth);
357
+
358
+ // С Bitrix24 (для прикрепления файлов через диск)
359
+ const smsgoldWithB24 = new Smsgold(auth, $b24);
360
+
361
+ const result = await smsgold.sendSms({
362
+ phone: "+79990000000",
363
+ message: "Готово!",
364
+ });
485
365
 
486
- **Требуемые переменные окружения:**
366
+ // С файлом (требуется $b24)
367
+ await smsgoldWithB24.sendSms({
368
+ phone: "+79990000000",
369
+ message: "Ваш документ",
370
+ fileUrl: "https://example.com/file.pdf",
371
+ fileName: "document.pdf",
372
+ });
373
+ ```
374
+
375
+ ### Logs
376
+
377
+ Логирование с цветами и настройками.
378
+
379
+ ```typescript
380
+ import { logs } from "@andrey4emk/npm-app-back-b24";
381
+
382
+ logs.add("Информационное сообщение", "info");
383
+ logs.add("Отладочная информация", "debug", { key: "value" });
384
+ logs.add("Ошибка!", "error");
385
+ ```
386
+
387
+ **Уровни логирования (`LogLevel`):**
388
+
389
+ - `"info"` — зелёный (включен по умолчанию)
390
+ - `"debug"` — серый (выключен по умолчанию)
391
+ - `"error"` — красный (включен по умолчанию)
487
392
 
488
- | Переменная | Назначение |
489
- | -------------- | ---------------- |
490
- | `SMSGOLD_USER` | Логин в SMSGold |
491
- | `SMSGOLD_PASS` | Пароль в SMSGold |
393
+ Настройки хранятся в `config/log.json`.
492
394
 
493
- Метод возвращает объект `{ error, message, result }`, где в `result` содержатся статус-код HTTP и тело ответа сервиса.
395
+ ## Типы
396
+
397
+ ### ApiResult
398
+
399
+ Универсальный результат операций:
400
+
401
+ ```typescript
402
+ interface ApiResult<T = unknown> {
403
+ error: boolean;
404
+ message: string;
405
+ data?: T;
406
+ result?: T;
407
+ status?: string;
408
+ info?: T;
409
+ }
410
+ ```
411
+
412
+ ### MessageData
413
+
414
+ Данные сообщения для Wappi/ChatApp:
415
+
416
+ ```typescript
417
+ interface MessageData {
418
+ phone: string;
419
+ message: string;
420
+ fileUrl?: string;
421
+ fileName?: string;
422
+ sendOpenLine?: boolean;
423
+ }
424
+ ```
494
425
 
495
426
  ## Переменные окружения
496
427
 
497
- | Переменная | Назначение |
498
- | --------------------------- | ------------------------------------------------------------- |
499
- | `APP_B24_DOMEN` | Домен Bitrix24, для которого хранится запись авторизации в БД |
500
- | `APP_B24_CLIENT_ID` | Client ID для production |
501
- | `APP_B24_CLIENT_SECRET` | Client Secret для production |
502
- | `APP_B24_CLIENT_ID_DEV` | Client ID для DEV окружения |
503
- | `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV окружения |
504
- | `APP_ENV` | Определяет окружение (`DEV` или production) |
505
- | `APP_NAME` | Название приложения (используется в описании задач) |
506
- | `CHATAPP_EMAIL` | Email аккаунта ChatApp |
507
- | `CHATAPP_PASS` | Пароль аккаунта ChatApp |
508
- | `CHATAPP_APP_ID` | ID приложения в ChatApp |
428
+ | Переменная | Назначение |
429
+ | --------------------------- | ---------------------------- |
430
+ | `APP_ENV` | Окружение (`DEV` или `PROD`) |
431
+ | `APP_NAME` | Название приложения |
432
+ | `CONFIG_DIR` | Путь к папке с конфигами |
433
+ | `APP_B24_CLIENT_ID` | Client ID для production |
434
+ | `APP_B24_CLIENT_SECRET` | Client Secret для production |
435
+ | `APP_B24_CLIENT_ID_DEV` | Client ID для DEV |
436
+ | `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV |
509
437
 
510
438
  **Пример `.env`:**
511
439
 
512
440
  ```env
513
- APP_B24_DOMEN=mycompany.bitrix24.ru
514
441
  APP_ENV=DEV
442
+ APP_NAME=MyApp
443
+ CONFIG_DIR=../config
444
+
515
445
  APP_B24_CLIENT_ID_DEV=xxx
516
446
  APP_B24_CLIENT_SECRET_DEV=yyy
517
447
  APP_B24_CLIENT_ID=aaa
518
448
  APP_B24_CLIENT_SECRET=bbb
519
- APP_NAME=MyApp
520
-
521
- CHATAPP_EMAIL=your-email@example.com
522
- CHATAPP_PASS=your-password
523
- CHATAPP_APP_ID=your-app-id
524
449
  ```
525
450
 
526
451
  ## Скрипты
527
452
 
528
- - `npm run test` — запуск тестов (заглушка).
529
- - `npm run pack:dry` предпросмотр содержимого пакета перед публикацией.
453
+ ```bash
454
+ npm run build # Компиляция TypeScript
455
+ npm run build:watch # Компиляция в watch-режиме
456
+ npm run pack:dry # Предпросмотр содержимого пакета
457
+ npm test # Запуск тестов
458
+ ```
530
459
 
531
460
  ## Лицензия
532
461