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 +1 -1
- package/backend/package.json +1 -2
- package/backend/prisma/migrations/20250614085849_add_bot_note/migration.sql +126 -126
- package/backend/prisma/migrations/20250614153037_add_plugin_installed_date/migration.sql +27 -27
- package/backend/prisma/migrations/20250615232848_add_scheduled_tasks/migration.sql +13 -13
- package/backend/prisma/migrations/20250617133815_add_panel_users_and_roles/migration.sql +26 -26
- package/backend/prisma/migrations/migration_lock.toml +2 -2
- package/backend/src/api/middleware/auth.js +24 -16
- package/backend/src/api/routes/bots.js +32 -9
- package/backend/src/api/routes/search.js +55 -0
- package/backend/src/core/BotManager.js +45 -0
- package/backend/src/core/BotProcess.js +46 -3
- package/backend/src/core/utils/crypto.js +17 -12
- package/backend/src/server.js +2 -0
- package/frontend/dist/assets/index-BGh31hwx.js +8179 -0
- package/frontend/dist/assets/index-CKAIPNvH.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +1 -0
- package/package.json +3 -2
- package/frontend/dist/assets/index-BKT73TwN.css +0 -1
- package/frontend/dist/assets/index-eIaThNXb.js +0 -8179
package/backend/cli.js
CHANGED
package/backend/package.json
CHANGED
|
@@ -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
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
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({
|
|
524
|
-
|
|
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({
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|