blockmine 1.4.4 → 1.4.7

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/backend/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  const fs = require('fs');
3
3
  const os = require('os');
4
4
  const path = require('path');
@@ -14,8 +14,7 @@
14
14
  "keywords": [],
15
15
  "author": "",
16
16
  "license": "ISC",
17
- "dependencies": {},
18
17
  "devDependencies": {
19
18
  "nodemon": "^3.1.2"
20
19
  }
21
- }
20
+ }
@@ -1,126 +1,126 @@
1
- -- CreateTable
2
- CREATE TABLE "Server" (
3
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
- "name" TEXT NOT NULL,
5
- "host" TEXT NOT NULL,
6
- "port" INTEGER NOT NULL DEFAULT 25565,
7
- "version" TEXT NOT NULL
8
- );
9
-
10
- -- CreateTable
11
- CREATE TABLE "Bot" (
12
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
13
- "username" TEXT NOT NULL,
14
- "password" TEXT,
15
- "prefix" TEXT DEFAULT '@',
16
- "note" TEXT,
17
- "serverId" INTEGER NOT NULL,
18
- "proxyHost" TEXT,
19
- "proxyPort" INTEGER,
20
- "proxyUsername" TEXT,
21
- "proxyPassword" TEXT,
22
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
- "updatedAt" DATETIME NOT NULL,
24
- CONSTRAINT "Bot_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "Server" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
25
- );
26
-
27
- -- CreateTable
28
- CREATE TABLE "InstalledPlugin" (
29
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
30
- "botId" INTEGER NOT NULL,
31
- "name" TEXT NOT NULL,
32
- "version" TEXT NOT NULL,
33
- "description" TEXT,
34
- "sourceType" TEXT NOT NULL,
35
- "sourceUri" TEXT,
36
- "path" TEXT NOT NULL,
37
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
38
- "manifest" TEXT,
39
- "settings" TEXT DEFAULT '{}',
40
- CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
41
- );
42
-
43
- -- CreateTable
44
- CREATE TABLE "Command" (
45
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
46
- "botId" INTEGER NOT NULL,
47
- "name" TEXT NOT NULL,
48
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
49
- "cooldown" INTEGER NOT NULL DEFAULT 0,
50
- "aliases" TEXT NOT NULL DEFAULT '[]',
51
- "description" TEXT,
52
- "owner" TEXT,
53
- "permissionId" INTEGER,
54
- "allowedChatTypes" TEXT NOT NULL DEFAULT '["chat", "private"]',
55
- CONSTRAINT "Command_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
56
- CONSTRAINT "Command_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE SET NULL ON UPDATE CASCADE
57
- );
58
-
59
- -- CreateTable
60
- CREATE TABLE "User" (
61
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
62
- "username" TEXT NOT NULL,
63
- "isBlacklisted" BOOLEAN NOT NULL DEFAULT false,
64
- "botId" INTEGER NOT NULL,
65
- CONSTRAINT "User_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
66
- );
67
-
68
- -- CreateTable
69
- CREATE TABLE "Group" (
70
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
71
- "name" TEXT NOT NULL,
72
- "owner" TEXT NOT NULL DEFAULT 'system',
73
- "botId" INTEGER NOT NULL,
74
- CONSTRAINT "Group_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
75
- );
76
-
77
- -- CreateTable
78
- CREATE TABLE "Permission" (
79
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
80
- "name" TEXT NOT NULL,
81
- "description" TEXT,
82
- "owner" TEXT NOT NULL DEFAULT 'system',
83
- "botId" INTEGER NOT NULL,
84
- CONSTRAINT "Permission_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
85
- );
86
-
87
- -- CreateTable
88
- CREATE TABLE "UserGroup" (
89
- "userId" INTEGER NOT NULL,
90
- "groupId" INTEGER NOT NULL,
91
-
92
- PRIMARY KEY ("userId", "groupId"),
93
- CONSTRAINT "UserGroup_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
94
- CONSTRAINT "UserGroup_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE
95
- );
96
-
97
- -- CreateTable
98
- CREATE TABLE "GroupPermission" (
99
- "groupId" INTEGER NOT NULL,
100
- "permissionId" INTEGER NOT NULL,
101
-
102
- PRIMARY KEY ("groupId", "permissionId"),
103
- CONSTRAINT "GroupPermission_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
104
- CONSTRAINT "GroupPermission_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE CASCADE ON UPDATE CASCADE
105
- );
106
-
107
- -- CreateIndex
108
- CREATE UNIQUE INDEX "Server_name_key" ON "Server"("name");
109
-
110
- -- CreateIndex
111
- CREATE UNIQUE INDEX "Bot_username_key" ON "Bot"("username");
112
-
113
- -- CreateIndex
114
- CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
115
-
116
- -- CreateIndex
117
- CREATE UNIQUE INDEX "Command_botId_name_key" ON "Command"("botId", "name");
118
-
119
- -- CreateIndex
120
- CREATE UNIQUE INDEX "User_botId_username_key" ON "User"("botId", "username");
121
-
122
- -- CreateIndex
123
- CREATE UNIQUE INDEX "Group_botId_name_key" ON "Group"("botId", "name");
124
-
125
- -- CreateIndex
126
- CREATE UNIQUE INDEX "Permission_botId_name_key" ON "Permission"("botId", "name");
1
+ -- CreateTable
2
+ CREATE TABLE "Server" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "name" TEXT NOT NULL,
5
+ "host" TEXT NOT NULL,
6
+ "port" INTEGER NOT NULL DEFAULT 25565,
7
+ "version" TEXT NOT NULL
8
+ );
9
+
10
+ -- CreateTable
11
+ CREATE TABLE "Bot" (
12
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
13
+ "username" TEXT NOT NULL,
14
+ "password" TEXT,
15
+ "prefix" TEXT DEFAULT '@',
16
+ "note" TEXT,
17
+ "serverId" INTEGER NOT NULL,
18
+ "proxyHost" TEXT,
19
+ "proxyPort" INTEGER,
20
+ "proxyUsername" TEXT,
21
+ "proxyPassword" TEXT,
22
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
+ "updatedAt" DATETIME NOT NULL,
24
+ CONSTRAINT "Bot_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "Server" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
25
+ );
26
+
27
+ -- CreateTable
28
+ CREATE TABLE "InstalledPlugin" (
29
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
30
+ "botId" INTEGER NOT NULL,
31
+ "name" TEXT NOT NULL,
32
+ "version" TEXT NOT NULL,
33
+ "description" TEXT,
34
+ "sourceType" TEXT NOT NULL,
35
+ "sourceUri" TEXT,
36
+ "path" TEXT NOT NULL,
37
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
38
+ "manifest" TEXT,
39
+ "settings" TEXT DEFAULT '{}',
40
+ CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
41
+ );
42
+
43
+ -- CreateTable
44
+ CREATE TABLE "Command" (
45
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
46
+ "botId" INTEGER NOT NULL,
47
+ "name" TEXT NOT NULL,
48
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
49
+ "cooldown" INTEGER NOT NULL DEFAULT 0,
50
+ "aliases" TEXT NOT NULL DEFAULT '[]',
51
+ "description" TEXT,
52
+ "owner" TEXT,
53
+ "permissionId" INTEGER,
54
+ "allowedChatTypes" TEXT NOT NULL DEFAULT '["chat", "private"]',
55
+ CONSTRAINT "Command_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
56
+ CONSTRAINT "Command_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE SET NULL ON UPDATE CASCADE
57
+ );
58
+
59
+ -- CreateTable
60
+ CREATE TABLE "User" (
61
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
62
+ "username" TEXT NOT NULL,
63
+ "isBlacklisted" BOOLEAN NOT NULL DEFAULT false,
64
+ "botId" INTEGER NOT NULL,
65
+ CONSTRAINT "User_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
66
+ );
67
+
68
+ -- CreateTable
69
+ CREATE TABLE "Group" (
70
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
71
+ "name" TEXT NOT NULL,
72
+ "owner" TEXT NOT NULL DEFAULT 'system',
73
+ "botId" INTEGER NOT NULL,
74
+ CONSTRAINT "Group_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
75
+ );
76
+
77
+ -- CreateTable
78
+ CREATE TABLE "Permission" (
79
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
80
+ "name" TEXT NOT NULL,
81
+ "description" TEXT,
82
+ "owner" TEXT NOT NULL DEFAULT 'system',
83
+ "botId" INTEGER NOT NULL,
84
+ CONSTRAINT "Permission_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
85
+ );
86
+
87
+ -- CreateTable
88
+ CREATE TABLE "UserGroup" (
89
+ "userId" INTEGER NOT NULL,
90
+ "groupId" INTEGER NOT NULL,
91
+
92
+ PRIMARY KEY ("userId", "groupId"),
93
+ CONSTRAINT "UserGroup_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
94
+ CONSTRAINT "UserGroup_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE
95
+ );
96
+
97
+ -- CreateTable
98
+ CREATE TABLE "GroupPermission" (
99
+ "groupId" INTEGER NOT NULL,
100
+ "permissionId" INTEGER NOT NULL,
101
+
102
+ PRIMARY KEY ("groupId", "permissionId"),
103
+ CONSTRAINT "GroupPermission_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
104
+ CONSTRAINT "GroupPermission_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE CASCADE ON UPDATE CASCADE
105
+ );
106
+
107
+ -- CreateIndex
108
+ CREATE UNIQUE INDEX "Server_name_key" ON "Server"("name");
109
+
110
+ -- CreateIndex
111
+ CREATE UNIQUE INDEX "Bot_username_key" ON "Bot"("username");
112
+
113
+ -- CreateIndex
114
+ CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
115
+
116
+ -- CreateIndex
117
+ CREATE UNIQUE INDEX "Command_botId_name_key" ON "Command"("botId", "name");
118
+
119
+ -- CreateIndex
120
+ CREATE UNIQUE INDEX "User_botId_username_key" ON "User"("botId", "username");
121
+
122
+ -- CreateIndex
123
+ CREATE UNIQUE INDEX "Group_botId_name_key" ON "Group"("botId", "name");
124
+
125
+ -- CreateIndex
126
+ CREATE UNIQUE INDEX "Permission_botId_name_key" ON "Permission"("botId", "name");
@@ -1,27 +1,27 @@
1
- -- AlterTable
2
- ALTER TABLE "Bot" ADD COLUMN "owners" TEXT DEFAULT '';
3
-
4
- -- RedefineTables
5
- PRAGMA defer_foreign_keys=ON;
6
- PRAGMA foreign_keys=OFF;
7
- CREATE TABLE "new_InstalledPlugin" (
8
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
9
- "botId" INTEGER NOT NULL,
10
- "name" TEXT NOT NULL,
11
- "version" TEXT NOT NULL,
12
- "description" TEXT,
13
- "sourceType" TEXT NOT NULL,
14
- "sourceUri" TEXT,
15
- "path" TEXT NOT NULL,
16
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
17
- "manifest" TEXT,
18
- "settings" TEXT DEFAULT '{}',
19
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
20
- CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
21
- );
22
- INSERT INTO "new_InstalledPlugin" ("botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version") SELECT "botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version" FROM "InstalledPlugin";
23
- DROP TABLE "InstalledPlugin";
24
- ALTER TABLE "new_InstalledPlugin" RENAME TO "InstalledPlugin";
25
- CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
26
- PRAGMA foreign_keys=ON;
27
- PRAGMA defer_foreign_keys=OFF;
1
+ -- AlterTable
2
+ ALTER TABLE "Bot" ADD COLUMN "owners" TEXT DEFAULT '';
3
+
4
+ -- RedefineTables
5
+ PRAGMA defer_foreign_keys=ON;
6
+ PRAGMA foreign_keys=OFF;
7
+ CREATE TABLE "new_InstalledPlugin" (
8
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
9
+ "botId" INTEGER NOT NULL,
10
+ "name" TEXT NOT NULL,
11
+ "version" TEXT NOT NULL,
12
+ "description" TEXT,
13
+ "sourceType" TEXT NOT NULL,
14
+ "sourceUri" TEXT,
15
+ "path" TEXT NOT NULL,
16
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
17
+ "manifest" TEXT,
18
+ "settings" TEXT DEFAULT '{}',
19
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
20
+ CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
21
+ );
22
+ INSERT INTO "new_InstalledPlugin" ("botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version") SELECT "botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version" FROM "InstalledPlugin";
23
+ DROP TABLE "InstalledPlugin";
24
+ ALTER TABLE "new_InstalledPlugin" RENAME TO "InstalledPlugin";
25
+ CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
26
+ PRAGMA foreign_keys=ON;
27
+ PRAGMA defer_foreign_keys=OFF;
@@ -1,13 +1,13 @@
1
- -- CreateTable
2
- CREATE TABLE "ScheduledTask" (
3
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
- "name" TEXT NOT NULL,
5
- "cronPattern" TEXT NOT NULL,
6
- "action" TEXT NOT NULL,
7
- "targetBotIds" TEXT NOT NULL,
8
- "payload" TEXT DEFAULT '{}',
9
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
10
- "lastRun" DATETIME,
11
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
- "updatedAt" DATETIME NOT NULL
13
- );
1
+ -- CreateTable
2
+ CREATE TABLE "ScheduledTask" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "name" TEXT NOT NULL,
5
+ "cronPattern" TEXT NOT NULL,
6
+ "action" TEXT NOT NULL,
7
+ "targetBotIds" TEXT NOT NULL,
8
+ "payload" TEXT DEFAULT '{}',
9
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
10
+ "lastRun" DATETIME,
11
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+ "updatedAt" DATETIME NOT NULL
13
+ );
@@ -1,26 +1,26 @@
1
- -- CreateTable
2
- CREATE TABLE "PanelUser" (
3
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
- "uuid" TEXT NOT NULL,
5
- "username" TEXT NOT NULL,
6
- "passwordHash" TEXT NOT NULL,
7
- "roleId" INTEGER NOT NULL,
8
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
- CONSTRAINT "PanelUser_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "PanelRole" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
10
- );
11
-
12
- -- CreateTable
13
- CREATE TABLE "PanelRole" (
14
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
15
- "name" TEXT NOT NULL,
16
- "permissions" TEXT NOT NULL DEFAULT '[]'
17
- );
18
-
19
- -- CreateIndex
20
- CREATE UNIQUE INDEX "PanelUser_uuid_key" ON "PanelUser"("uuid");
21
-
22
- -- CreateIndex
23
- CREATE UNIQUE INDEX "PanelUser_username_key" ON "PanelUser"("username");
24
-
25
- -- CreateIndex
26
- CREATE UNIQUE INDEX "PanelRole_name_key" ON "PanelRole"("name");
1
+ -- CreateTable
2
+ CREATE TABLE "PanelUser" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "uuid" TEXT NOT NULL,
5
+ "username" TEXT NOT NULL,
6
+ "passwordHash" TEXT NOT NULL,
7
+ "roleId" INTEGER NOT NULL,
8
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
+ CONSTRAINT "PanelUser_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "PanelRole" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
10
+ );
11
+
12
+ -- CreateTable
13
+ CREATE TABLE "PanelRole" (
14
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
15
+ "name" TEXT NOT NULL,
16
+ "permissions" TEXT NOT NULL DEFAULT '[]'
17
+ );
18
+
19
+ -- CreateIndex
20
+ CREATE UNIQUE INDEX "PanelUser_uuid_key" ON "PanelUser"("uuid");
21
+
22
+ -- CreateIndex
23
+ CREATE UNIQUE INDEX "PanelUser_username_key" ON "PanelUser"("username");
24
+
25
+ -- CreateIndex
26
+ CREATE UNIQUE INDEX "PanelRole_name_key" ON "PanelRole"("name");
@@ -1,3 +1,3 @@
1
- # Please do not edit this file manually
2
- # It should be added in your version-control system (i.e. Git)
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (i.e. Git)
3
3
  provider = "sqlite"
@@ -1,17 +1,14 @@
1
-
2
1
  const jwt = require('jsonwebtoken');
3
2
  const config = require('../../config');
4
3
 
5
4
  const JWT_SECRET = config.security.jwtSecret;
6
5
 
7
- /**
8
- * Middleware для проверки JWT-токена.
9
- * Извлекает токен из заголовка Authorization, проверяет его подлинность
10
- * и добавляет расшифрованные данные (payload) в req.user.
11
- */
6
+ const tokenCache = new Map();
7
+ const CACHE_TTL = 5 * 60 * 1000;
8
+
9
+
12
10
  function authenticate(req, res, next) {
13
11
  const authHeader = req.header('Authorization');
14
-
15
12
  if (!authHeader) {
16
13
  return res.status(401).json({ error: 'Нет токена, доступ запрещен' });
17
14
  }
@@ -23,28 +20,39 @@ function authenticate(req, res, next) {
23
20
 
24
21
  const token = tokenParts[1];
25
22
 
23
+ if (tokenCache.has(token)) {
24
+ const cached = tokenCache.get(token);
25
+ if (Date.now() < cached.expires) {
26
+ req.user = cached.payload;
27
+ return next();
28
+ } else {
29
+ tokenCache.delete(token);
30
+ }
31
+ }
32
+
26
33
  try {
27
- const decoded = jwt.verify(token, JWT_SECRET);
34
+ const decoded = jwt.verify(token, JWT_SECRET, { algorithms: ['HS256'] });
28
35
  req.user = decoded;
36
+
37
+ tokenCache.set(token, {
38
+ payload: decoded,
39
+ expires: Date.now() + CACHE_TTL
40
+ });
41
+
29
42
  next();
30
43
  } catch (err) {
31
44
  res.status(401).json({ error: 'Невалидный токен' });
32
45
  }
33
46
  }
34
47
 
35
- /**
36
- * Middleware-фабрика для проверки прав доступа.
37
- * @param {string} requiredPermission - Право, необходимое для доступа к роуту (например, 'bot:delete').
38
- * @returns {function} - Express middleware.
39
- */
48
+
40
49
  function authorize(requiredPermission) {
41
50
  return (req, res, next) => {
42
- if (!req.user || !req.user.permissions) {
43
- return res.status(403).json({ error: 'Ошибка прав доступа: пользователь не аутентифицирован.' });
51
+ if (!req.user || !Array.isArray(req.user.permissions)) {
52
+ return res.status(403).json({ error: 'Ошибка прав доступа: пользователь не аутентифицирован или формат прав некорректен.' });
44
53
  }
45
54
 
46
55
  const userPermissions = req.user.permissions;
47
-
48
56
  if (userPermissions.includes('*') || userPermissions.includes(requiredPermission)) {
49
57
  next();
50
58
  } else {
@@ -518,13 +518,36 @@ router.get('/:botId/management-data', authorize('management:view'), async (req,
518
518
  };
519
519
  })
520
520
 
521
- const [groups, users, allPermissions] = await Promise.all([
521
+ const page = parseInt(req.query.page) || 1;
522
+ const pageSize = parseInt(req.query.pageSize) || 100;
523
+
524
+ const userSkip = (page - 1) * pageSize;
525
+
526
+ const [groups, users, allPermissions, usersCount] = await Promise.all([
522
527
  prisma.group.findMany({ where: { botId }, include: { permissions: { include: { permission: true } } }, orderBy: { name: 'asc' } }),
523
- prisma.user.findMany({ where: { botId }, include: { groups: { include: { group: true } } }, orderBy: { username: 'asc' } }),
524
- prisma.permission.findMany({ where: { botId }, orderBy: { name: 'asc' } })
528
+ prisma.user.findMany({
529
+ where: { botId },
530
+ include: { groups: { include: { group: true } } },
531
+ orderBy: { username: 'asc' },
532
+ take: pageSize,
533
+ skip: userSkip,
534
+ }),
535
+ prisma.permission.findMany({ where: { botId }, orderBy: { name: 'asc' } }),
536
+ prisma.user.count({ where: { botId } })
525
537
  ]);
526
538
 
527
- res.json({ groups, permissions: allPermissions, users, commands: finalCommands });
539
+ res.json({
540
+ groups,
541
+ permissions: allPermissions,
542
+ users: {
543
+ items: users,
544
+ total: usersCount,
545
+ page,
546
+ pageSize,
547
+ totalPages: Math.ceil(usersCount / pageSize),
548
+ },
549
+ commands: finalCommands
550
+ });
528
551
 
529
552
  } catch (error) {
530
553
  console.error(`[API Error] /management-data for bot ${req.params.botId}:`, error);
@@ -558,7 +581,7 @@ router.put('/:botId/commands/:commandId', authorize('management:edit'), async (r
558
581
  data: dataToUpdate,
559
582
  });
560
583
 
561
- BotManager.invalidateConfigCache(botId);
584
+ BotManager.reloadBotConfigInRealTime(botId);
562
585
 
563
586
  res.json(updatedCommand);
564
587
  } catch (error) {
@@ -582,7 +605,7 @@ router.post('/:botId/groups', authorize('management:edit'), async (req, res) =>
582
605
  }
583
606
  });
584
607
 
585
- BotManager.invalidateConfigCache(botId);
608
+ BotManager.reloadBotConfigInRealTime(botId);
586
609
 
587
610
 
588
611
  res.status(201).json(newGroup);
@@ -618,7 +641,7 @@ router.put('/:botId/groups/:groupId', authorize('management:edit'), async (req,
618
641
  BotManager.invalidateUserCache(botId, user.username);
619
642
  }
620
643
 
621
- BotManager.invalidateConfigCache(botId);
644
+ BotManager.reloadBotConfigInRealTime(botId);
622
645
 
623
646
  res.status(200).send();
624
647
  } catch (error) {
@@ -636,7 +659,7 @@ router.delete('/:botId/groups/:groupId', authorize('management:edit'), async (re
636
659
  return res.status(403).json({ error: `Нельзя удалить группу с источником "${group.owner}".` });
637
660
  }
638
661
  await prisma.group.delete({ where: { id: groupId } });
639
- BotManager.invalidateConfigCache(botId);
662
+ BotManager.reloadBotConfigInRealTime(botId);
640
663
 
641
664
 
642
665
  res.status(204).send();
@@ -652,7 +675,7 @@ router.post('/:botId/permissions', authorize('management:edit'), async (req, res
652
675
  data: { name, description, botId, owner: 'admin' }
653
676
  });
654
677
 
655
- BotManager.invalidateConfigCache(botId);
678
+ BotManager.reloadBotConfigInRealTime(botId);
656
679
 
657
680
  res.status(201).json(newPermission);
658
681
  } catch (error) {
@@ -0,0 +1,55 @@
1
+ const express = require('express');
2
+ const router = express.Router();
3
+ const { PrismaClient } = require('@prisma/client');
4
+ const prisma = new PrismaClient();
5
+
6
+ router.get('/', async (req, res) => {
7
+ const { query } = req.query;
8
+
9
+ if (!query) {
10
+ return res.status(400).json({ error: 'Query parameter is required' });
11
+ }
12
+
13
+ try {
14
+ const bots = await prisma.bot.findMany({
15
+ where: {
16
+ OR: [
17
+ { username: { contains: query } },
18
+ {
19
+ AND: [
20
+ { note: { not: null } },
21
+ { note: { contains: query } }
22
+ ]
23
+ },
24
+ ],
25
+ },
26
+ });
27
+
28
+ const users = await prisma.user.findMany({
29
+ where: {
30
+ username: {
31
+ contains: query,
32
+ },
33
+ },
34
+ });
35
+
36
+ const plugins = await prisma.installedPlugin.findMany({
37
+ where: {
38
+ name: {
39
+ contains: query,
40
+ },
41
+ },
42
+ });
43
+
44
+ res.json({
45
+ bots,
46
+ users,
47
+ plugins,
48
+ });
49
+ } catch (error) {
50
+ console.error('Search error:', error);
51
+ res.status(500).json({ error: 'Internal server error' });
52
+ }
53
+ });
54
+
55
+ module.exports = router;