nextjs-cms 0.5.9 → 0.5.10
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/dist/api/axios/axiosInstance.d.ts +1 -1
- package/dist/api/axios/axiosInstance.js +8 -8
- package/dist/api/index.d.ts +855 -855
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +12 -12
- package/dist/api/lib/serverActions.d.ts +239 -239
- package/dist/api/lib/serverActions.d.ts.map +1 -1
- package/dist/api/lib/serverActions.js +834 -834
- package/dist/api/root.d.ts +828 -828
- package/dist/api/root.js +30 -30
- package/dist/api/routers/accountSettings.d.ts +60 -60
- package/dist/api/routers/accountSettings.js +108 -108
- package/dist/api/routers/admins.d.ts +105 -105
- package/dist/api/routers/admins.js +219 -219
- package/dist/api/routers/auth.d.ts +47 -47
- package/dist/api/routers/auth.js +25 -25
- package/dist/api/routers/categorySection.d.ts +103 -103
- package/dist/api/routers/categorySection.js +38 -38
- package/dist/api/routers/cmsSettings.d.ts +48 -48
- package/dist/api/routers/cmsSettings.js +51 -51
- package/dist/api/routers/cpanel.d.ts +83 -83
- package/dist/api/routers/cpanel.js +216 -216
- package/dist/api/routers/files.d.ts +47 -47
- package/dist/api/routers/files.js +23 -23
- package/dist/api/routers/gallery.d.ts +35 -35
- package/dist/api/routers/gallery.js +62 -62
- package/dist/api/routers/googleAnalytics.d.ts +30 -30
- package/dist/api/routers/googleAnalytics.js +7 -7
- package/dist/api/routers/hasItemsSection.d.ts +139 -139
- package/dist/api/routers/hasItemsSection.js +34 -34
- package/dist/api/routers/navigation.d.ts +51 -51
- package/dist/api/routers/navigation.js +11 -11
- package/dist/api/routers/simpleSection.d.ts +57 -57
- package/dist/api/routers/simpleSection.js +12 -12
- package/dist/api/trpc.d.ts +106 -106
- package/dist/api/trpc.js +72 -72
- package/dist/auth/axios/axiosInstance.d.ts +1 -1
- package/dist/auth/axios/axiosInstance.js +8 -8
- package/dist/auth/csrf.d.ts +29 -29
- package/dist/auth/csrf.js +76 -76
- package/dist/auth/hooks/index.d.ts +3 -3
- package/dist/auth/hooks/index.d.ts.map +1 -1
- package/dist/auth/hooks/index.js +3 -3
- package/dist/auth/hooks/useAxiosPrivate.d.ts +4 -4
- package/dist/auth/hooks/useAxiosPrivate.js +74 -74
- package/dist/auth/hooks/useRefreshToken.d.ts +6 -6
- package/dist/auth/hooks/useRefreshToken.js +79 -79
- package/dist/auth/index.d.ts +22 -22
- package/dist/auth/index.js +44 -44
- package/dist/auth/jwt.d.ts +5 -5
- package/dist/auth/jwt.js +25 -25
- package/dist/auth/lib/actions.d.ts +32 -32
- package/dist/auth/lib/actions.d.ts.map +1 -1
- package/dist/auth/lib/actions.js +209 -209
- package/dist/auth/lib/client.d.ts +3 -3
- package/dist/auth/lib/client.js +46 -46
- package/dist/auth/lib/index.d.ts +2 -2
- package/dist/auth/lib/index.d.ts.map +1 -1
- package/dist/auth/lib/index.js +2 -2
- package/dist/auth/react.d.ts +105 -105
- package/dist/auth/react.d.ts.map +1 -1
- package/dist/auth/react.js +347 -347
- package/dist/auth/trpc.d.ts +5 -5
- package/dist/auth/trpc.d.ts.map +1 -1
- package/dist/auth/trpc.js +81 -81
- package/dist/core/config/config-loader.d.ts +91 -91
- package/dist/core/config/config-loader.js +230 -230
- package/dist/core/config/index.d.ts +2 -2
- package/dist/core/config/index.d.ts.map +1 -1
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +42 -42
- package/dist/core/db/index.d.ts +1 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +1 -1
- package/dist/core/db/table-checker/DbTable.d.ts +5 -5
- package/dist/core/db/table-checker/DbTable.js +5 -5
- package/dist/core/db/table-checker/MysqlTable.d.ts +33 -33
- package/dist/core/db/table-checker/MysqlTable.d.ts.map +1 -1
- package/dist/core/db/table-checker/MysqlTable.js +94 -94
- package/dist/core/db/table-checker/index.d.ts +1 -1
- package/dist/core/db/table-checker/index.d.ts.map +1 -1
- package/dist/core/db/table-checker/index.js +1 -1
- package/dist/core/factories/FieldFactory.d.ts +123 -123
- package/dist/core/factories/FieldFactory.d.ts.map +1 -1
- package/dist/core/factories/FieldFactory.js +411 -411
- package/dist/core/factories/SectionFactory.d.ts +109 -109
- package/dist/core/factories/SectionFactory.d.ts.map +1 -1
- package/dist/core/factories/SectionFactory.js +415 -415
- package/dist/core/factories/index.d.ts +2 -2
- package/dist/core/factories/index.d.ts.map +1 -1
- package/dist/core/factories/index.js +2 -2
- package/dist/core/fields/checkbox.d.ts +62 -62
- package/dist/core/fields/checkbox.d.ts.map +1 -1
- package/dist/core/fields/checkbox.js +62 -62
- package/dist/core/fields/color.d.ts +83 -83
- package/dist/core/fields/color.d.ts.map +1 -1
- package/dist/core/fields/color.js +91 -91
- package/dist/core/fields/date.d.ts +99 -99
- package/dist/core/fields/date.d.ts.map +1 -1
- package/dist/core/fields/date.js +108 -108
- package/dist/core/fields/document.d.ts +179 -179
- package/dist/core/fields/document.d.ts.map +1 -1
- package/dist/core/fields/document.js +277 -277
- package/dist/core/fields/field-group.d.ts +17 -17
- package/dist/core/fields/field-group.d.ts.map +1 -1
- package/dist/core/fields/field-group.js +6 -6
- package/dist/core/fields/field.d.ts +125 -125
- package/dist/core/fields/field.d.ts.map +1 -1
- package/dist/core/fields/field.js +148 -148
- package/dist/core/fields/fileField.d.ts +14 -14
- package/dist/core/fields/fileField.d.ts.map +1 -1
- package/dist/core/fields/fileField.js +5 -5
- package/dist/core/fields/index.d.ts +64 -64
- package/dist/core/fields/index.d.ts.map +1 -1
- package/dist/core/fields/index.js +18 -18
- package/dist/core/fields/map.d.ts +166 -166
- package/dist/core/fields/map.d.ts.map +1 -1
- package/dist/core/fields/map.js +152 -152
- package/dist/core/fields/number.d.ts +185 -185
- package/dist/core/fields/number.d.ts.map +1 -1
- package/dist/core/fields/number.js +241 -241
- package/dist/core/fields/password.d.ts +108 -108
- package/dist/core/fields/password.d.ts.map +1 -1
- package/dist/core/fields/password.js +133 -133
- package/dist/core/fields/photo.d.ts +288 -288
- package/dist/core/fields/photo.d.ts.map +1 -1
- package/dist/core/fields/photo.js +410 -410
- package/dist/core/fields/richText.d.ts +294 -294
- package/dist/core/fields/richText.d.ts.map +1 -1
- package/dist/core/fields/richText.js +338 -338
- package/dist/core/fields/select.d.ts +365 -365
- package/dist/core/fields/select.d.ts.map +1 -1
- package/dist/core/fields/select.js +499 -499
- package/dist/core/fields/selectMultiple.d.ts +235 -235
- package/dist/core/fields/selectMultiple.d.ts.map +1 -1
- package/dist/core/fields/selectMultiple.js +417 -417
- package/dist/core/fields/tags.d.ts +130 -130
- package/dist/core/fields/tags.d.ts.map +1 -1
- package/dist/core/fields/tags.js +105 -105
- package/dist/core/fields/text.d.ts +135 -135
- package/dist/core/fields/text.d.ts.map +1 -1
- package/dist/core/fields/text.js +157 -157
- package/dist/core/fields/textArea.d.ts +106 -106
- package/dist/core/fields/textArea.d.ts.map +1 -1
- package/dist/core/fields/textArea.js +126 -126
- package/dist/core/fields/video.d.ts +147 -147
- package/dist/core/fields/video.d.ts.map +1 -1
- package/dist/core/fields/video.js +248 -248
- package/dist/core/helpers/entity.d.ts +7 -7
- package/dist/core/helpers/entity.js +27 -27
- package/dist/core/helpers/index.d.ts +4 -4
- package/dist/core/helpers/index.d.ts.map +1 -1
- package/dist/core/helpers/index.js +3 -3
- package/dist/core/index.d.ts +7 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/sections/category.d.ts +282 -282
- package/dist/core/sections/category.d.ts.map +1 -1
- package/dist/core/sections/category.js +147 -147
- package/dist/core/sections/hasItems.d.ts +631 -631
- package/dist/core/sections/hasItems.d.ts.map +1 -1
- package/dist/core/sections/hasItems.js +144 -144
- package/dist/core/sections/index.d.ts +4 -4
- package/dist/core/sections/index.d.ts.map +1 -1
- package/dist/core/sections/index.js +4 -4
- package/dist/core/sections/section.d.ts +225 -225
- package/dist/core/sections/section.d.ts.map +1 -1
- package/dist/core/sections/section.js +341 -341
- package/dist/core/sections/simple.d.ts +98 -98
- package/dist/core/sections/simple.d.ts.map +1 -1
- package/dist/core/sections/simple.js +95 -95
- package/dist/core/security/dom.d.ts +10 -10
- package/dist/core/security/dom.js +92 -92
- package/dist/core/submit/ItemEditSubmit.d.ts +75 -75
- package/dist/core/submit/ItemEditSubmit.js +186 -186
- package/dist/core/submit/NewItemSubmit.d.ts +13 -13
- package/dist/core/submit/NewItemSubmit.js +93 -93
- package/dist/core/submit/SimpleSectionSubmit.d.ts +12 -12
- package/dist/core/submit/SimpleSectionSubmit.js +93 -93
- package/dist/core/submit/index.d.ts +4 -4
- package/dist/core/submit/index.js +4 -4
- package/dist/core/submit/submit.d.ts +115 -115
- package/dist/core/submit/submit.js +479 -479
- package/dist/core/types/index.d.ts +279 -279
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js +1 -1
- package/dist/db/client.d.ts +8 -8
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +19 -19
- package/dist/db/config.d.ts +5 -5
- package/dist/db/config.js +22 -22
- package/dist/db/drizzle.config.d.ts +5 -5
- package/dist/db/drizzle.config.js +18 -18
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.js +3 -3
- package/dist/db/schema.d.ts +638 -638
- package/dist/db/schema.js +73 -73
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/translations/index.d.ts +2 -2
- package/dist/translations/index.js +15 -15
- package/dist/utils/CpanelApi.d.ts +24 -24
- package/dist/utils/CpanelApi.js +64 -64
- package/dist/utils/constants.d.ts +13 -13
- package/dist/utils/constants.js +61 -61
- package/dist/utils/index.d.ts +4 -4
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/utils.d.ts +59 -59
- package/dist/utils/utils.js +132 -132
- package/dist/validators/checkbox.d.ts +3 -3
- package/dist/validators/checkbox.d.ts.map +1 -1
- package/dist/validators/checkbox.js +12 -12
- package/dist/validators/color.d.ts +3 -3
- package/dist/validators/color.d.ts.map +1 -1
- package/dist/validators/color.js +7 -7
- package/dist/validators/date.d.ts +3 -3
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +5 -5
- package/dist/validators/document.d.ts +3 -3
- package/dist/validators/document.d.ts.map +1 -1
- package/dist/validators/document.js +57 -57
- package/dist/validators/index.d.ts +14 -14
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +14 -14
- package/dist/validators/map.d.ts +3 -3
- package/dist/validators/map.d.ts.map +1 -1
- package/dist/validators/map.js +5 -5
- package/dist/validators/number.d.ts +3 -3
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +20 -20
- package/dist/validators/password.d.ts +3 -3
- package/dist/validators/password.d.ts.map +1 -1
- package/dist/validators/password.js +11 -11
- package/dist/validators/photo.d.ts +3 -3
- package/dist/validators/photo.d.ts.map +1 -1
- package/dist/validators/photo.js +100 -100
- package/dist/validators/richText.d.ts +3 -3
- package/dist/validators/richText.d.ts.map +1 -1
- package/dist/validators/richText.js +8 -8
- package/dist/validators/select-multiple.d.ts +9 -9
- package/dist/validators/select-multiple.d.ts.map +1 -1
- package/dist/validators/select-multiple.js +20 -20
- package/dist/validators/select.d.ts +3 -3
- package/dist/validators/select.d.ts.map +1 -1
- package/dist/validators/select.js +5 -5
- package/dist/validators/text.d.ts +3 -3
- package/dist/validators/text.d.ts.map +1 -1
- package/dist/validators/text.js +7 -7
- package/dist/validators/textarea.d.ts +3 -3
- package/dist/validators/textarea.d.ts.map +1 -1
- package/dist/validators/textarea.js +7 -7
- package/dist/validators/video.d.ts +3 -3
- package/dist/validators/video.d.ts.map +1 -1
- package/dist/validators/video.js +57 -57
- package/package.json +2 -3
|
@@ -1,219 +1,219 @@
|
|
|
1
|
-
import { router, privateProcedure } from
|
|
2
|
-
import * as z from 'zod';
|
|
3
|
-
import { getAdminsList, getAllPrivileges } from
|
|
4
|
-
import { db } from
|
|
5
|
-
import { AdminPrivilegesTable, AdminsTable } from
|
|
6
|
-
import { eq } from 'drizzle-orm';
|
|
7
|
-
import { TRPCError } from '@trpc/server';
|
|
8
|
-
import bcrypt from 'bcrypt';
|
|
9
|
-
import { customAlphabet } from 'nanoid';
|
|
10
|
-
import getString from
|
|
11
|
-
import path from 'path';
|
|
12
|
-
import fs from 'fs';
|
|
13
|
-
import { getCMSConfig } from
|
|
14
|
-
export const adminsRouter = router({
|
|
15
|
-
list: privateProcedure.query(async () => {
|
|
16
|
-
const data = await Promise.all([getAdminsList(), getAllPrivileges()]);
|
|
17
|
-
const adminList = data[0];
|
|
18
|
-
const privileges = data[1];
|
|
19
|
-
return {
|
|
20
|
-
admins: adminList,
|
|
21
|
-
privileges: privileges,
|
|
22
|
-
};
|
|
23
|
-
}),
|
|
24
|
-
get: privateProcedure.input(z.string()).query(async (opts) => {
|
|
25
|
-
const data = await Promise.all([
|
|
26
|
-
db
|
|
27
|
-
.select({
|
|
28
|
-
id: AdminsTable.id,
|
|
29
|
-
user: AdminsTable.user,
|
|
30
|
-
})
|
|
31
|
-
.from(AdminsTable)
|
|
32
|
-
.where(eq(AdminsTable.id, opts.input)),
|
|
33
|
-
db
|
|
34
|
-
.select({
|
|
35
|
-
sectionName: AdminPrivilegesTable.sectionName,
|
|
36
|
-
operations: AdminPrivilegesTable.operations,
|
|
37
|
-
publisher: AdminPrivilegesTable.publisher,
|
|
38
|
-
})
|
|
39
|
-
.from(AdminPrivilegesTable)
|
|
40
|
-
.where(eq(AdminPrivilegesTable.adminId, opts.input)),
|
|
41
|
-
getAllPrivileges(),
|
|
42
|
-
]);
|
|
43
|
-
const adminRows = data[0];
|
|
44
|
-
const adminRoles = data[1];
|
|
45
|
-
const allRoles = data[2];
|
|
46
|
-
const adminData = adminRows[0];
|
|
47
|
-
if (!adminData) {
|
|
48
|
-
throw new TRPCError({
|
|
49
|
-
code: 'BAD_REQUEST',
|
|
50
|
-
message: 'Admin not found',
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
admin: adminData,
|
|
55
|
-
adminRoles: adminRoles,
|
|
56
|
-
allRoles: allRoles,
|
|
57
|
-
};
|
|
58
|
-
}),
|
|
59
|
-
create: privateProcedure
|
|
60
|
-
.input(z.object({
|
|
61
|
-
username: z.string(),
|
|
62
|
-
password: z.string(),
|
|
63
|
-
privileges: z.array(z.object({
|
|
64
|
-
sectionName: z.string(),
|
|
65
|
-
publisher: z.boolean().nullable(),
|
|
66
|
-
operations: z.string(),
|
|
67
|
-
})),
|
|
68
|
-
}))
|
|
69
|
-
.mutation(async ({ ctx, input }) => {
|
|
70
|
-
/**
|
|
71
|
-
* First, let's check if the username already exists
|
|
72
|
-
*/
|
|
73
|
-
const usernameExists = await db.select().from(AdminsTable).where(eq(AdminsTable.user, input.username));
|
|
74
|
-
/**
|
|
75
|
-
* If the username already exists, throw an error
|
|
76
|
-
*/
|
|
77
|
-
if (usernameExists.length > 0) {
|
|
78
|
-
throw new TRPCError({
|
|
79
|
-
code: 'BAD_REQUEST',
|
|
80
|
-
message: getString('adminAlreadyExists'),
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Let's filter the privileges to remove the ones that has operations set to 'none'
|
|
85
|
-
*/
|
|
86
|
-
const filteredPrivileges = input.privileges.filter((privilege) => privilege.operations !== 'none');
|
|
87
|
-
/**
|
|
88
|
-
* If the filtered privileges are empty, throw an error
|
|
89
|
-
*/
|
|
90
|
-
if (filteredPrivileges.length === 0) {
|
|
91
|
-
throw new TRPCError({
|
|
92
|
-
code: 'BAD_REQUEST',
|
|
93
|
-
message: getString('selectAtLeastOnePrivilege'),
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Hash password with bcrypt
|
|
98
|
-
*/
|
|
99
|
-
const hashedPassword = await bcrypt.hash(input.password, 10);
|
|
100
|
-
const id = customAlphabet('1234567890', 25)();
|
|
101
|
-
const adminCreation = await db.insert(AdminsTable).values({
|
|
102
|
-
id: id,
|
|
103
|
-
pass: hashedPassword,
|
|
104
|
-
user: input.username,
|
|
105
|
-
});
|
|
106
|
-
/**
|
|
107
|
-
* Now, let's prepare the rows to be inserted into the admin_privileges table
|
|
108
|
-
*/
|
|
109
|
-
const rows = filteredPrivileges.map((privilege) => ({
|
|
110
|
-
adminId: id,
|
|
111
|
-
sectionName: privilege.sectionName,
|
|
112
|
-
operations: privilege.operations,
|
|
113
|
-
publisher: privilege.publisher,
|
|
114
|
-
}));
|
|
115
|
-
/**
|
|
116
|
-
* Insert the privileges into the admin_privileges table
|
|
117
|
-
*/
|
|
118
|
-
await db.insert(AdminPrivilegesTable).values(rows);
|
|
119
|
-
return {
|
|
120
|
-
status: 'success',
|
|
121
|
-
};
|
|
122
|
-
}),
|
|
123
|
-
update: privateProcedure
|
|
124
|
-
.input(z.object({
|
|
125
|
-
id: z.string(),
|
|
126
|
-
privileges: z.array(z.object({
|
|
127
|
-
sectionName: z.string(),
|
|
128
|
-
publisher: z.boolean().nullable(),
|
|
129
|
-
operations: z.string(),
|
|
130
|
-
})),
|
|
131
|
-
}))
|
|
132
|
-
.mutation(async ({ ctx, input }) => {
|
|
133
|
-
/**
|
|
134
|
-
* First, let's check if the admin exists
|
|
135
|
-
*/
|
|
136
|
-
const usernameExists = await db.select().from(AdminsTable).where(eq(AdminsTable.id, input.id));
|
|
137
|
-
/**
|
|
138
|
-
* If the admin doens't exist, throw an error
|
|
139
|
-
*/
|
|
140
|
-
if (usernameExists.length === 0) {
|
|
141
|
-
throw new TRPCError({
|
|
142
|
-
code: 'BAD_REQUEST',
|
|
143
|
-
message: getString('adminDoesNotExist'),
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Let's filter the privileges to remove the ones that has operations set to 'none'
|
|
148
|
-
*/
|
|
149
|
-
const filteredPrivileges = input.privileges.filter((privilege) => privilege.operations !== 'none');
|
|
150
|
-
/**
|
|
151
|
-
* If the filtered privileges are empty, throw an error
|
|
152
|
-
*/
|
|
153
|
-
if (filteredPrivileges.length === 0) {
|
|
154
|
-
throw new TRPCError({
|
|
155
|
-
code: 'BAD_REQUEST',
|
|
156
|
-
message: getString('selectAtLeastOnePrivilege'),
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Now, let's prepare the rows to be inserted into the admin_privileges table
|
|
161
|
-
*/
|
|
162
|
-
const rows = filteredPrivileges.map((privilege) => ({
|
|
163
|
-
adminId: input.id,
|
|
164
|
-
sectionName: privilege.sectionName,
|
|
165
|
-
operations: privilege.operations,
|
|
166
|
-
publisher: privilege.publisher,
|
|
167
|
-
}));
|
|
168
|
-
/**
|
|
169
|
-
* Delete and then insert the privileges into the admin_privileges table
|
|
170
|
-
*/
|
|
171
|
-
await db.delete(AdminPrivilegesTable).where(eq(AdminPrivilegesTable.adminId, input.id));
|
|
172
|
-
await db.insert(AdminPrivilegesTable).values(rows);
|
|
173
|
-
return {
|
|
174
|
-
status: 'success',
|
|
175
|
-
};
|
|
176
|
-
}),
|
|
177
|
-
remove: privateProcedure
|
|
178
|
-
.input(z.object({
|
|
179
|
-
id: z.string(),
|
|
180
|
-
}))
|
|
181
|
-
.mutation(async ({ input }) => {
|
|
182
|
-
const uploadsFolder = getCMSConfig().files.upload.uploadPath;
|
|
183
|
-
/**
|
|
184
|
-
* Check if the admin is not the master admin
|
|
185
|
-
*/
|
|
186
|
-
if (input.id === '1') {
|
|
187
|
-
throw new TRPCError({
|
|
188
|
-
code: 'BAD_REQUEST',
|
|
189
|
-
message: getString('masterAdminCannotBeDeleted'),
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Check if the admin exists
|
|
194
|
-
*/
|
|
195
|
-
const adminResult = await db.select().from(AdminsTable).where(eq(AdminsTable.id, input.id));
|
|
196
|
-
const admin = adminResult[0];
|
|
197
|
-
if (!admin) {
|
|
198
|
-
throw new TRPCError({
|
|
199
|
-
code: 'BAD_REQUEST',
|
|
200
|
-
message: getString('adminNotFound'),
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Delete the admin roles from the admin_privileges table
|
|
205
|
-
*/
|
|
206
|
-
await db.delete(AdminPrivilegesTable).where(eq(AdminPrivilegesTable.adminId, input.id));
|
|
207
|
-
/**
|
|
208
|
-
* Delete the admin from the admins table
|
|
209
|
-
*/
|
|
210
|
-
await db.delete(AdminsTable).where(eq(AdminsTable.id, input.id));
|
|
211
|
-
/**
|
|
212
|
-
* Remove the admin avatar as well
|
|
213
|
-
*/
|
|
214
|
-
if (admin.coverphoto) {
|
|
215
|
-
await fs.promises.unlink(path.join(uploadsFolder, '.thumbs', 'admins', admin.coverphoto));
|
|
216
|
-
}
|
|
217
|
-
return true;
|
|
218
|
-
}),
|
|
219
|
-
});
|
|
1
|
+
import { router, privateProcedure } from '../trpc.js';
|
|
2
|
+
import * as z from 'zod';
|
|
3
|
+
import { getAdminsList, getAllPrivileges } from '../lib/serverActions.js';
|
|
4
|
+
import { db } from '../../db/client.js';
|
|
5
|
+
import { AdminPrivilegesTable, AdminsTable } from '../../db/schema.js';
|
|
6
|
+
import { eq } from 'drizzle-orm';
|
|
7
|
+
import { TRPCError } from '@trpc/server';
|
|
8
|
+
import bcrypt from 'bcrypt';
|
|
9
|
+
import { customAlphabet } from 'nanoid';
|
|
10
|
+
import getString from '../../translations/index.js';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import { getCMSConfig } from '../../core/config/index.js';
|
|
14
|
+
export const adminsRouter = router({
|
|
15
|
+
list: privateProcedure.query(async () => {
|
|
16
|
+
const data = await Promise.all([getAdminsList(), getAllPrivileges()]);
|
|
17
|
+
const adminList = data[0];
|
|
18
|
+
const privileges = data[1];
|
|
19
|
+
return {
|
|
20
|
+
admins: adminList,
|
|
21
|
+
privileges: privileges,
|
|
22
|
+
};
|
|
23
|
+
}),
|
|
24
|
+
get: privateProcedure.input(z.string()).query(async (opts) => {
|
|
25
|
+
const data = await Promise.all([
|
|
26
|
+
db
|
|
27
|
+
.select({
|
|
28
|
+
id: AdminsTable.id,
|
|
29
|
+
user: AdminsTable.user,
|
|
30
|
+
})
|
|
31
|
+
.from(AdminsTable)
|
|
32
|
+
.where(eq(AdminsTable.id, opts.input)),
|
|
33
|
+
db
|
|
34
|
+
.select({
|
|
35
|
+
sectionName: AdminPrivilegesTable.sectionName,
|
|
36
|
+
operations: AdminPrivilegesTable.operations,
|
|
37
|
+
publisher: AdminPrivilegesTable.publisher,
|
|
38
|
+
})
|
|
39
|
+
.from(AdminPrivilegesTable)
|
|
40
|
+
.where(eq(AdminPrivilegesTable.adminId, opts.input)),
|
|
41
|
+
getAllPrivileges(),
|
|
42
|
+
]);
|
|
43
|
+
const adminRows = data[0];
|
|
44
|
+
const adminRoles = data[1];
|
|
45
|
+
const allRoles = data[2];
|
|
46
|
+
const adminData = adminRows[0];
|
|
47
|
+
if (!adminData) {
|
|
48
|
+
throw new TRPCError({
|
|
49
|
+
code: 'BAD_REQUEST',
|
|
50
|
+
message: 'Admin not found',
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
admin: adminData,
|
|
55
|
+
adminRoles: adminRoles,
|
|
56
|
+
allRoles: allRoles,
|
|
57
|
+
};
|
|
58
|
+
}),
|
|
59
|
+
create: privateProcedure
|
|
60
|
+
.input(z.object({
|
|
61
|
+
username: z.string(),
|
|
62
|
+
password: z.string(),
|
|
63
|
+
privileges: z.array(z.object({
|
|
64
|
+
sectionName: z.string(),
|
|
65
|
+
publisher: z.boolean().nullable(),
|
|
66
|
+
operations: z.string(),
|
|
67
|
+
})),
|
|
68
|
+
}))
|
|
69
|
+
.mutation(async ({ ctx, input }) => {
|
|
70
|
+
/**
|
|
71
|
+
* First, let's check if the username already exists
|
|
72
|
+
*/
|
|
73
|
+
const usernameExists = await db.select().from(AdminsTable).where(eq(AdminsTable.user, input.username));
|
|
74
|
+
/**
|
|
75
|
+
* If the username already exists, throw an error
|
|
76
|
+
*/
|
|
77
|
+
if (usernameExists.length > 0) {
|
|
78
|
+
throw new TRPCError({
|
|
79
|
+
code: 'BAD_REQUEST',
|
|
80
|
+
message: getString('adminAlreadyExists'),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Let's filter the privileges to remove the ones that has operations set to 'none'
|
|
85
|
+
*/
|
|
86
|
+
const filteredPrivileges = input.privileges.filter((privilege) => privilege.operations !== 'none');
|
|
87
|
+
/**
|
|
88
|
+
* If the filtered privileges are empty, throw an error
|
|
89
|
+
*/
|
|
90
|
+
if (filteredPrivileges.length === 0) {
|
|
91
|
+
throw new TRPCError({
|
|
92
|
+
code: 'BAD_REQUEST',
|
|
93
|
+
message: getString('selectAtLeastOnePrivilege'),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Hash password with bcrypt
|
|
98
|
+
*/
|
|
99
|
+
const hashedPassword = await bcrypt.hash(input.password, 10);
|
|
100
|
+
const id = customAlphabet('1234567890', 25)();
|
|
101
|
+
const adminCreation = await db.insert(AdminsTable).values({
|
|
102
|
+
id: id,
|
|
103
|
+
pass: hashedPassword,
|
|
104
|
+
user: input.username,
|
|
105
|
+
});
|
|
106
|
+
/**
|
|
107
|
+
* Now, let's prepare the rows to be inserted into the admin_privileges table
|
|
108
|
+
*/
|
|
109
|
+
const rows = filteredPrivileges.map((privilege) => ({
|
|
110
|
+
adminId: id,
|
|
111
|
+
sectionName: privilege.sectionName,
|
|
112
|
+
operations: privilege.operations,
|
|
113
|
+
publisher: privilege.publisher,
|
|
114
|
+
}));
|
|
115
|
+
/**
|
|
116
|
+
* Insert the privileges into the admin_privileges table
|
|
117
|
+
*/
|
|
118
|
+
await db.insert(AdminPrivilegesTable).values(rows);
|
|
119
|
+
return {
|
|
120
|
+
status: 'success',
|
|
121
|
+
};
|
|
122
|
+
}),
|
|
123
|
+
update: privateProcedure
|
|
124
|
+
.input(z.object({
|
|
125
|
+
id: z.string(),
|
|
126
|
+
privileges: z.array(z.object({
|
|
127
|
+
sectionName: z.string(),
|
|
128
|
+
publisher: z.boolean().nullable(),
|
|
129
|
+
operations: z.string(),
|
|
130
|
+
})),
|
|
131
|
+
}))
|
|
132
|
+
.mutation(async ({ ctx, input }) => {
|
|
133
|
+
/**
|
|
134
|
+
* First, let's check if the admin exists
|
|
135
|
+
*/
|
|
136
|
+
const usernameExists = await db.select().from(AdminsTable).where(eq(AdminsTable.id, input.id));
|
|
137
|
+
/**
|
|
138
|
+
* If the admin doens't exist, throw an error
|
|
139
|
+
*/
|
|
140
|
+
if (usernameExists.length === 0) {
|
|
141
|
+
throw new TRPCError({
|
|
142
|
+
code: 'BAD_REQUEST',
|
|
143
|
+
message: getString('adminDoesNotExist'),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Let's filter the privileges to remove the ones that has operations set to 'none'
|
|
148
|
+
*/
|
|
149
|
+
const filteredPrivileges = input.privileges.filter((privilege) => privilege.operations !== 'none');
|
|
150
|
+
/**
|
|
151
|
+
* If the filtered privileges are empty, throw an error
|
|
152
|
+
*/
|
|
153
|
+
if (filteredPrivileges.length === 0) {
|
|
154
|
+
throw new TRPCError({
|
|
155
|
+
code: 'BAD_REQUEST',
|
|
156
|
+
message: getString('selectAtLeastOnePrivilege'),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Now, let's prepare the rows to be inserted into the admin_privileges table
|
|
161
|
+
*/
|
|
162
|
+
const rows = filteredPrivileges.map((privilege) => ({
|
|
163
|
+
adminId: input.id,
|
|
164
|
+
sectionName: privilege.sectionName,
|
|
165
|
+
operations: privilege.operations,
|
|
166
|
+
publisher: privilege.publisher,
|
|
167
|
+
}));
|
|
168
|
+
/**
|
|
169
|
+
* Delete and then insert the privileges into the admin_privileges table
|
|
170
|
+
*/
|
|
171
|
+
await db.delete(AdminPrivilegesTable).where(eq(AdminPrivilegesTable.adminId, input.id));
|
|
172
|
+
await db.insert(AdminPrivilegesTable).values(rows);
|
|
173
|
+
return {
|
|
174
|
+
status: 'success',
|
|
175
|
+
};
|
|
176
|
+
}),
|
|
177
|
+
remove: privateProcedure
|
|
178
|
+
.input(z.object({
|
|
179
|
+
id: z.string(),
|
|
180
|
+
}))
|
|
181
|
+
.mutation(async ({ input }) => {
|
|
182
|
+
const uploadsFolder = getCMSConfig().files.upload.uploadPath;
|
|
183
|
+
/**
|
|
184
|
+
* Check if the admin is not the master admin
|
|
185
|
+
*/
|
|
186
|
+
if (input.id === '1') {
|
|
187
|
+
throw new TRPCError({
|
|
188
|
+
code: 'BAD_REQUEST',
|
|
189
|
+
message: getString('masterAdminCannotBeDeleted'),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if the admin exists
|
|
194
|
+
*/
|
|
195
|
+
const adminResult = await db.select().from(AdminsTable).where(eq(AdminsTable.id, input.id));
|
|
196
|
+
const admin = adminResult[0];
|
|
197
|
+
if (!admin) {
|
|
198
|
+
throw new TRPCError({
|
|
199
|
+
code: 'BAD_REQUEST',
|
|
200
|
+
message: getString('adminNotFound'),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Delete the admin roles from the admin_privileges table
|
|
205
|
+
*/
|
|
206
|
+
await db.delete(AdminPrivilegesTable).where(eq(AdminPrivilegesTable.adminId, input.id));
|
|
207
|
+
/**
|
|
208
|
+
* Delete the admin from the admins table
|
|
209
|
+
*/
|
|
210
|
+
await db.delete(AdminsTable).where(eq(AdminsTable.id, input.id));
|
|
211
|
+
/**
|
|
212
|
+
* Remove the admin avatar as well
|
|
213
|
+
*/
|
|
214
|
+
if (admin.coverphoto) {
|
|
215
|
+
await fs.promises.unlink(path.join(uploadsFolder, '.thumbs', 'admins', admin.coverphoto));
|
|
216
|
+
}
|
|
217
|
+
return true;
|
|
218
|
+
}),
|
|
219
|
+
});
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
export declare const authRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: {
|
|
4
|
-
db: import("drizzle-orm/mysql2").MySql2Database<typeof import("../../db/schema.js")> & {
|
|
5
|
-
$client: import("mysql2/promise").Pool;
|
|
6
|
-
};
|
|
7
|
-
session: import("
|
|
8
|
-
opts: {
|
|
9
|
-
headers: Headers;
|
|
10
|
-
};
|
|
11
|
-
};
|
|
12
|
-
meta: object;
|
|
13
|
-
errorShape: {
|
|
14
|
-
data: {
|
|
15
|
-
zodError: z.core.$ZodFlattenedError<unknown, string> | null;
|
|
16
|
-
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
17
|
-
httpStatus: number;
|
|
18
|
-
path?: string;
|
|
19
|
-
stack?: string;
|
|
20
|
-
};
|
|
21
|
-
message: string;
|
|
22
|
-
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
23
|
-
};
|
|
24
|
-
transformer: true;
|
|
25
|
-
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
26
|
-
login: import("@trpc/server").TRPCMutationProcedure<{
|
|
27
|
-
input: {
|
|
28
|
-
username: string;
|
|
29
|
-
password: string;
|
|
30
|
-
};
|
|
31
|
-
output: {
|
|
32
|
-
user: {
|
|
33
|
-
id: string;
|
|
34
|
-
username: string;
|
|
35
|
-
lang: string | null;
|
|
36
|
-
avatar: string | null;
|
|
37
|
-
};
|
|
38
|
-
accessToken: string;
|
|
39
|
-
};
|
|
40
|
-
meta: object;
|
|
41
|
-
}>;
|
|
42
|
-
logout: import("@trpc/server").TRPCMutationProcedure<{
|
|
43
|
-
input: void;
|
|
44
|
-
output: boolean;
|
|
45
|
-
meta: object;
|
|
46
|
-
}>;
|
|
47
|
-
}>>;
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export declare const authRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
+
ctx: {
|
|
4
|
+
db: import("drizzle-orm/mysql2").MySql2Database<typeof import("../../db/schema.js")> & {
|
|
5
|
+
$client: import("mysql2/promise").Pool;
|
|
6
|
+
};
|
|
7
|
+
session: import("../../index.js").Session | null;
|
|
8
|
+
opts: {
|
|
9
|
+
headers: Headers;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
meta: object;
|
|
13
|
+
errorShape: {
|
|
14
|
+
data: {
|
|
15
|
+
zodError: z.core.$ZodFlattenedError<unknown, string> | null;
|
|
16
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
17
|
+
httpStatus: number;
|
|
18
|
+
path?: string;
|
|
19
|
+
stack?: string;
|
|
20
|
+
};
|
|
21
|
+
message: string;
|
|
22
|
+
code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
|
|
23
|
+
};
|
|
24
|
+
transformer: true;
|
|
25
|
+
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
26
|
+
login: import("@trpc/server").TRPCMutationProcedure<{
|
|
27
|
+
input: {
|
|
28
|
+
username: string;
|
|
29
|
+
password: string;
|
|
30
|
+
};
|
|
31
|
+
output: {
|
|
32
|
+
user: {
|
|
33
|
+
id: string;
|
|
34
|
+
username: string;
|
|
35
|
+
lang: string | null;
|
|
36
|
+
avatar: string | null;
|
|
37
|
+
};
|
|
38
|
+
accessToken: string;
|
|
39
|
+
};
|
|
40
|
+
meta: object;
|
|
41
|
+
}>;
|
|
42
|
+
logout: import("@trpc/server").TRPCMutationProcedure<{
|
|
43
|
+
input: void;
|
|
44
|
+
output: boolean;
|
|
45
|
+
meta: object;
|
|
46
|
+
}>;
|
|
47
|
+
}>>;
|
|
48
48
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/api/routers/auth.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { privateProcedure, publicProcedure, router } from
|
|
2
|
-
import * as z from 'zod';
|
|
3
|
-
import { TRPCError } from '@trpc/server';
|
|
4
|
-
import { deleteSession, login } from
|
|
5
|
-
export const authRouter = router({
|
|
6
|
-
login: publicProcedure
|
|
7
|
-
.input(z.object({
|
|
8
|
-
username: z.string(),
|
|
9
|
-
password: z.string(),
|
|
10
|
-
}))
|
|
11
|
-
.mutation(async (opts) => {
|
|
12
|
-
try {
|
|
13
|
-
return await login(opts.input);
|
|
14
|
-
}
|
|
15
|
-
catch (error) {
|
|
16
|
-
throw new TRPCError({
|
|
17
|
-
code: 'BAD_REQUEST',
|
|
18
|
-
message: error.message,
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}),
|
|
22
|
-
logout: privateProcedure.mutation(async (opts) => {
|
|
23
|
-
return await deleteSession(opts.ctx.session);
|
|
24
|
-
}),
|
|
25
|
-
});
|
|
1
|
+
import { privateProcedure, publicProcedure, router } from '../trpc.js';
|
|
2
|
+
import * as z from 'zod';
|
|
3
|
+
import { TRPCError } from '@trpc/server';
|
|
4
|
+
import { deleteSession, login } from '../../auth/lib/index.js';
|
|
5
|
+
export const authRouter = router({
|
|
6
|
+
login: publicProcedure
|
|
7
|
+
.input(z.object({
|
|
8
|
+
username: z.string(),
|
|
9
|
+
password: z.string(),
|
|
10
|
+
}))
|
|
11
|
+
.mutation(async (opts) => {
|
|
12
|
+
try {
|
|
13
|
+
return await login(opts.input);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
throw new TRPCError({
|
|
17
|
+
code: 'BAD_REQUEST',
|
|
18
|
+
message: error.message,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}),
|
|
22
|
+
logout: privateProcedure.mutation(async (opts) => {
|
|
23
|
+
return await deleteSession(opts.ctx.session);
|
|
24
|
+
}),
|
|
25
|
+
});
|