@andrey4emk/npm-app-back-b24 0.2.4

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.
Files changed (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/b24.js +140 -0
  4. package/package.json +30 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 andrey4emk
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # npm_appBackB24
2
+
3
+ Утилиты для работы с Bitrix24 OAuth на основе `@bitrix24/b24jssdk`.
4
+
5
+ ## Установка
6
+
7
+ ```bash
8
+ npm install @andrey4emk/npm-appbackb24
9
+ ```
10
+
11
+ ## Использование
12
+
13
+ ```js
14
+ import { create, refresh, save } from "@andrey4emk/npm-appbackb24";
15
+ import { AuthB24Model } from "./models/AuthB24.js"; // пример модели
16
+
17
+ const b24Client = await create(AuthB24Model);
18
+ const refreshResult = await refresh(AuthB24Model);
19
+
20
+ app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
21
+ ```
22
+
23
+ ## API
24
+
25
+ - `create(AuthB24Model)` — создаёт клиента `B24OAuth` с использованием сохранённых в БД токенов.
26
+ - `refresh(AuthB24Model)` — продлевает токены через Bitrix24 и обновляет запись в БД.
27
+ - `save(req, res, AuthB24Model)` — HTTP-обработчик для сохранения набора токенов из `req.body`.
28
+
29
+ - `error({ dataTask, $b24 })` — утилита для создания служебной задачи в Bitrix24 при ошибках/событиях. Сначала проверяет, сколько задач с таким `TITLE` уже создано (через `tasks.task.list`), и если их меньше чем `maxTasks`, создаёт новую задачу (`tasks.task.add`).
30
+
31
+ ### Возвращаемые значения
32
+
33
+ - [`makeAuthParams`](b24.js) — промис, который резолвится объектом `{ AuthParams, secret }` для Bitrix24 SDK.
34
+ - [`create`](b24.js) — промис с экземпляром `B24OAuth`, готовым к вызовам REST API.
35
+ - [`refresh`](b24.js) — промис с объектом `{ error: boolean, message: string }`, описывающим статус продления.
36
+ - [`save`](b24.js) — HTTP-ответ, отправляющий JSON `{ status, message }` с кодом `201` при успехе или `400/500` при ошибках.
37
+ - [`error`](b24.js) — промис с объектом `{ error: boolean, message: string, result? }`.
38
+ - В случае успеха возвращает `{ error: false, message: 'Задача создана в Битрикс24.', result }`, где `result` — ответ API `tasks.task.add`.
39
+ - Если задач уже больше или равно `maxTasks`, возвращает `{ error: false, message: 'Превышено максимальное количество задач...' }` и не создаёт новую задачу.
40
+ - В случае ошибки возвращает `{ error: true, message: 'Не удалось создать задачу в Битрикс24: <текст ошибки>' }`.
41
+
42
+ Параметры функции `error` (передаются как один объект):
43
+
44
+ - `dataTask` — объект с настройками задачи. Поддерживаемые поля:
45
+
46
+ - `title` (string) — заголовок задачи (обязательное).
47
+ - `description` (string) — описание (опционально).
48
+ - `createdBy` (number) — ID создателя (по умолчанию `138`).
49
+ - `responsibleId` (number) — ID ответственного (по умолчанию `1`).
50
+ - `deadline` (ISO string) — дедлайн задачи; если не задан, используется `DateTime.now().plus({ days: 1 })`.
51
+ - `groupId` (number|null) — группа, опционально.
52
+ - `accomplices` (array) — массив соисполнителей.
53
+ - `maxTasks` (number) — максимум существующих задач с таким названием (по умолчанию `100`).
54
+ - `entityTypeAbbr` (string) — код CRM сущности для `UF_CRM_TASK`.
55
+
56
+ - `$b24` — экземпляр SDK/клиента Bitrix24 с методом `callMethod(method, params)`.
57
+
58
+ Побочные эффекты:
59
+
60
+ - Функция вызывает методы Bitrix24 через `$b24.callMethod` и может создавать задачи в вашей облачной системе Bitrix24.
61
+ - Убедитесь, что `$b24` авторизован и имеет доступ на создание задач.
62
+
63
+ ### Переменные окружения
64
+
65
+ - `APP_B24_DOMEN`
66
+ - `APP_B24_CLIENT_ID`, `APP_B24_CLIENT_SECRET`
67
+ - `APP_B24_CLIENT_ID_DEV`, `APP_B24_CLIENT_SECRET_DEV`
68
+ - `APP_ENV` (`DEV` или иное значение)
69
+
70
+ Дополнительные переменные (имена совпадают с теми, что используются в `b24.js`):
71
+
72
+ - `APP_NAME` — название приложения, используется при создании задач через `error`.
73
+
74
+ Назначение переменных:
75
+
76
+ - `APP_B24_DOMEN` — домен Bitrix24, для которого хранится запись авторизации в БД.
77
+ - `APP_B24_CLIENT_ID`, `APP_B24_CLIENT_SECRET` — клиентские креденшелы для рабочего (production) приложения.
78
+ - `APP_B24_CLIENT_ID_DEV`, `APP_B24_CLIENT_SECRET_DEV` — креденшелы для DEV окружения, используются при `APP_ENV == 'DEV'`.
79
+ - `APP_ENV` — определяет, какие креденшелы использовать (например, `DEV`).
80
+ - `APP_NAME` — читабельное имя приложения, добавляется в описание задач, создаваемых функцией `error`.
81
+
82
+ Настройте их перед использованием.
83
+
84
+ ## Скрипты
85
+
86
+ - `npm run test` — заглушка тестов.
87
+ - `npm run pack:dry` — предпросмотр содержимого пакета.
package/b24.js ADDED
@@ -0,0 +1,140 @@
1
+ import { B24OAuth, AuthOAuthManager } from "@bitrix24/b24jssdk";
2
+ import { DateTime } from "luxon";
3
+ import dotEnv from "dotenv";
4
+
5
+ dotEnv.config();
6
+
7
+ // Environment variables (copied here to make code easier to test/mocking)
8
+ // Сохраняем имена переменных точь-в-точь, но без process.env
9
+ const APP_B24_DOMEN = process.env.APP_B24_DOMEN;
10
+ const APP_ENV = process.env.APP_ENV;
11
+ const APP_B24_CLIENT_ID_DEV = process.env.APP_B24_CLIENT_ID_DEV;
12
+ const APP_B24_CLIENT_ID = process.env.APP_B24_CLIENT_ID;
13
+ const APP_B24_CLIENT_SECRET_DEV = process.env.APP_B24_CLIENT_SECRET_DEV;
14
+ const APP_B24_CLIENT_SECRET = process.env.APP_B24_CLIENT_SECRET;
15
+ const APP_NAME = process.env.APP_NAME;
16
+
17
+ async function makeAuthParams(AuthB24Model) {
18
+ let authSql = await AuthB24Model.findOne({
19
+ where: {
20
+ domain: APP_B24_DOMEN,
21
+ },
22
+ raw: true,
23
+ });
24
+ if (!authSql) {
25
+ // Явно выбрасываем ошибку — caller может её поймать и вернуть понятный ответ
26
+ throw new Error(`Auth record not found for domain: ${APP_B24_DOMEN}`);
27
+ }
28
+ // Формируем параметры авторизации для SDK
29
+ let AuthParams = {
30
+ applicationToken: "", // если нет — можно '' (см. примечание ниже)
31
+ userId: 0, // если неизвестен — 0
32
+ memberId: authSql.member_id,
33
+ accessToken: authSql.access_token,
34
+ refreshToken: authSql.refresh_token,
35
+ expires: authSql.expires_in,
36
+ expiresIn: 1800,
37
+ scope: "", // если нет строки scope — оставьте пусто
38
+ domain: authSql.domain,
39
+ clientEndpoint: `https://${authSql.domain}/rest/`,
40
+ serverEndpoint: "https://oauth.bitrix.info/rest/",
41
+ status: "L", // Local — для локальных приложений; подставьте свой вариант
42
+ issuer: "store", // опционально
43
+ };
44
+ let secret = {
45
+ clientId: APP_ENV == "DEV" ? APP_B24_CLIENT_ID_DEV : APP_B24_CLIENT_ID,
46
+ clientSecret: APP_ENV == "DEV" ? APP_B24_CLIENT_SECRET_DEV : APP_B24_CLIENT_SECRET,
47
+ };
48
+ return { AuthParams, secret };
49
+ }
50
+
51
+ export async function create(AuthB24Model) {
52
+ let { AuthParams, secret } = await makeAuthParams(AuthB24Model);
53
+ return new B24OAuth(AuthParams, secret);
54
+ }
55
+
56
+ // Функция продления токена битрикс24 и сохранения в БД
57
+ export async function refresh(AuthB24Model) {
58
+ try {
59
+ let { AuthParams, secret } = await makeAuthParams(AuthB24Model);
60
+ let newToken = await new AuthOAuthManager(AuthParams, secret).refreshAuth();
61
+ if (!newToken) {
62
+ return { error: true, message: "В refresh не получили токен" };
63
+ }
64
+
65
+ await AuthB24Model.upsert({
66
+ access_token: newToken.access_token,
67
+ refresh_token: newToken.refresh_token,
68
+ domain: newToken.domain,
69
+ expires_in: newToken.expires,
70
+ member_id: newToken.member_id,
71
+ });
72
+ return { error: false, message: "Токены битрикс24 успешно обновлены." };
73
+ } catch (error) {
74
+ return { error: true, message: "Не удалось продлить авторизацию." };
75
+ }
76
+ }
77
+
78
+ export async function save(req, res, AuthB24Model) {
79
+ try {
80
+ const { access_token, refresh_token, domain, expires_in, member_id } = req.body;
81
+ if (!access_token || !refresh_token || !domain || !expires_in || !member_id) {
82
+ return res.status(400).json({ status: "error", message: "Не заполнены обязательные поля." });
83
+ }
84
+ const authData = await AuthB24Model.upsert({
85
+ access_token: access_token,
86
+ refresh_token: refresh_token,
87
+ domain: domain,
88
+ expires_in: expires_in,
89
+ member_id: member_id,
90
+ });
91
+ res.status(201).json({ status: "ok", message: "Сохранили токены" });
92
+ } catch (error) {
93
+ res.status(500).json({ status: "error", message: "Не удалось сохранить токен." });
94
+ }
95
+ }
96
+
97
+ export async function error({ dataTask, $b24 }) {
98
+ try {
99
+ let appName = process.env.APP_NAME || "Задай название приложения в .env";
100
+ let title = dataTask.title;
101
+ let description = dataTask.description || "";
102
+ let createdBy = dataTask.createdBy || 138;
103
+ let responsibleId = dataTask.responsibleId || 1;
104
+ let deadline = dataTask.deadline || DateTime.now().plus({ days: 1 }).toISO();
105
+ let groupId = dataTask.groupId || null; // Группа
106
+ let accomplices = dataTask.accomplices || []; // Соисполнители
107
+ let maxTasks = dataTask.maxTasks || 100;
108
+ let entityTypeAbbr = dataTask.entityTypeAbbr || "";
109
+ // Проверяем сколько создано таких задач. Если их уже больше 10, то не создаем новую
110
+ let resTasks = await $b24.callMethod("tasks.task.list", {
111
+ filter: {
112
+ TITLE: title,
113
+ "<STATUS": 4,
114
+ },
115
+ select: ["ID", "STATUS"],
116
+ });
117
+ resTasks = resTasks.getData().result.tasks;
118
+
119
+ if (resTasks && resTasks.length >= maxTasks) {
120
+ return { error: false, message: `Превышено максимальное количество задач с таким названием (${maxTasks}). Новая задача не создана.` };
121
+ } else {
122
+ // Создаем задачу в б24 на проверить. Если не смогли получить события
123
+ let resCreateTask = await $b24.callMethod("tasks.task.add", {
124
+ fields: {
125
+ TITLE: title,
126
+ DESCRIPTION: `${appName} \n\n ${description}`,
127
+ CREATED_BY: createdBy,
128
+ RESPONSIBLE_ID: responsibleId,
129
+ DEADLINE: deadline,
130
+ UF_CRM_TASK: entityTypeAbbr,
131
+ GROUP_ID: groupId,
132
+ ACCOMPLICES: accomplices,
133
+ },
134
+ });
135
+ return { error: false, message: "Задача создана в Битрикс24.", result: resCreateTask.getData().result };
136
+ }
137
+ } catch (error) {
138
+ return { error: true, message: `Не удалось создать задачу в Битрикс24: ${error.message}` };
139
+ }
140
+ }
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@andrey4emk/npm-app-back-b24",
3
+ "version": "0.2.4",
4
+ "description": "Bitrix24 OAuth helpers for Node.js projects",
5
+ "main": "b24.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "test": "echo \"No tests\" && exit 0",
9
+ "pack:dry": "npm pack --dry-run"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+ssh://git@github.com/andrey4emk/npm_appBackB24.git"
14
+ },
15
+ "keywords": [],
16
+ "author": "andrey4emk",
17
+ "license": "MIT",
18
+ "bugs": {
19
+ "url": "https://github.com/andrey4emk/npm_appBackB24/issues"
20
+ },
21
+ "homepage": "https://github.com/andrey4emk/npm_appBackB24#readme",
22
+ "files": [
23
+ "b24.js"
24
+ ],
25
+ "dependencies": {
26
+ "@bitrix24/b24jssdk": "^0.5.1",
27
+ "luxon": "^3.4.4",
28
+ "dotenv": "^17.2.3"
29
+ }
30
+ }