create-arkos 2.0.0-next.2 → 2.0.0-next.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -150
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/project-config-inquirer.js +93 -74
- package/dist/utils/project-config-inquirer.js.map +1 -1
- package/dist/utils/template-compiler.js +16 -11
- package/dist/utils/template-compiler.js.map +1 -1
- package/package.json +15 -14
- package/templates/basic/.env.hbs +5 -1
- package/templates/basic/.gitignore.hbs +2 -0
- package/templates/basic/README.md.hbs +2 -4
- package/templates/basic/arkos.config.ts.hbs +16 -3
- package/templates/basic/jsconfig.json.hbs +3 -13
- package/templates/basic/package.json.hbs +33 -18
- package/templates/basic/prisma/schema/__tests__/user-role.prisma.hbs.test.ts +2 -2
- package/templates/basic/prisma/schema/__tests__/user.prisma.hbs.test.ts +2 -2
- package/templates/basic/prisma/schema/auth-permission.prisma.hbs +3 -9
- package/templates/basic/prisma/schema/auth-role.prisma.hbs +2 -2
- package/templates/basic/prisma/schema/schema.prisma.hbs +2 -3
- package/templates/basic/prisma/schema/user-permission.prisma.hbs +18 -0
- package/templates/basic/prisma/schema/user.prisma.hbs +4 -2
- package/templates/basic/prisma.config.ts.hbs +11 -0
- package/templates/basic/public/favicon.ico +0 -0
- package/templates/basic/src/app.ts.hbs +9 -7
- package/templates/basic/src/modules/auth/auth.policy.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/auth.router.ts.hbs +72 -7
- package/templates/basic/src/modules/auth/dtos/login.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/dtos/signup.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/dtos/update-me.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth/dtos/update-password.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth-permission/auth-permission.router.ts.hbs +39 -7
- package/templates/basic/src/modules/auth-permission/auth-permission.service.ts.hbs +4 -6
- package/templates/basic/src/modules/auth-permission/dtos/create-auth-permission.dto.ts.hbs +7 -10
- package/templates/basic/src/modules/auth-permission/dtos/{query-auth-role.dto.ts.hbs → query-auth-permission.dto.ts.hbs} +1 -1
- package/templates/basic/src/modules/auth-permission/dtos/update-auth-permission.dto.ts.hbs +19 -4
- package/templates/basic/src/modules/auth-role/auth-role.router.ts.hbs +38 -6
- package/templates/basic/src/modules/auth-role/auth-role.service.ts.hbs +4 -6
- package/templates/basic/src/modules/auth-role/dtos/create-auth-role.dto.ts.hbs +3 -8
- package/templates/basic/src/modules/auth-role/dtos/query-auth-role.dto.ts.hbs +1 -1
- package/templates/basic/src/modules/auth-role/dtos/update-auth-role.dto.ts.hbs +3 -6
- package/templates/basic/src/modules/file-upload/file-upload.router.ts.hbs +28 -8
- package/templates/basic/src/modules/user/dtos/create-user.dto.ts.hbs +5 -5
- package/templates/basic/src/modules/user/dtos/update-user.dto.ts.hbs +5 -5
- package/templates/basic/src/modules/user/user.router.ts.hbs +91 -7
- package/templates/basic/src/modules/user/user.service.ts.hbs +4 -6
- package/templates/basic/src/router.ts.hbs +2 -2
- package/templates/basic/src/server.ts.hbs +8 -0
- package/templates/basic/src/utils/prisma/index.ts.hbs +48 -2
- package/templates/basic/src/utils/validation/api-actions.ts.hbs +2 -2
- package/templates/basic/tsconfig.json.hbs +6 -13
- package/templates/basic/src/loadables.ts.hbs +0 -29
- package/templates/basic/src/modules/auth/auth.route-hook.ts.hbs +0 -66
- package/templates/basic/src/modules/auth-permission/auth-permission.route-hook.ts.hbs +0 -35
- package/templates/basic/src/modules/auth-role/auth-role.route-hook.ts.hbs +0 -35
- package/templates/basic/src/modules/file-upload/file-upload.route-hook.ts.hbs +0 -23
- package/templates/basic/src/modules/user/user.route-hook.ts.hbs +0 -88
|
@@ -2,38 +2,53 @@
|
|
|
2
2
|
"name": "{{projectName}}",
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "This RESTful API was generated by create-arkos, read more about Arkos.js at www.arkosjs.com",
|
|
5
|
+
"description": "This RESTful API was generated by create-arkos, read more about Arkos.js at [www.arkosjs.com](https://www.arkosjs.com)",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "arkos dev",
|
|
8
8
|
"build": "arkos build",
|
|
9
9
|
"start": "arkos start",
|
|
10
10
|
"arkos": "arkos"
|
|
11
11
|
},
|
|
12
|
-
"prisma": {
|
|
13
|
-
"schema": "prisma/schema/"
|
|
14
|
-
},
|
|
15
12
|
"devDependencies": {
|
|
16
13
|
{{#if typescript}}
|
|
17
|
-
"typescript": "
|
|
18
|
-
"@types/node": "
|
|
19
|
-
"@types/express": "
|
|
14
|
+
"typescript": "7.0.2",
|
|
15
|
+
"@types/node": "26.1.1",
|
|
16
|
+
"@types/express": "5.0.6",
|
|
17
|
+
{{/if}}
|
|
18
|
+
"tsx-strict": "0.8.0",
|
|
19
|
+
"tsx": "4.23.1"{{#if (neq prisma.provider "none")}},
|
|
20
|
+
"prisma": "7.9.0"
|
|
20
21
|
{{/if}}
|
|
21
|
-
"tsx-strict": "^0.4.2",
|
|
22
|
-
"tsx": "^4.21.0",
|
|
23
|
-
"prisma": "^6.19.2"
|
|
24
22
|
},
|
|
25
23
|
"dependencies": {
|
|
26
|
-
"arkos": "
|
|
27
|
-
"express": "
|
|
28
|
-
"@scalar/express-api-reference": "
|
|
29
|
-
"@
|
|
24
|
+
"arkos": "2.0.0-next.20",
|
|
25
|
+
"express": "5.2.1",
|
|
26
|
+
"@scalar/express-api-reference": "0.10.11",
|
|
27
|
+
"@scalar/api-reference": "1.63.0"{{#if (or (neq prisma.provider "none") validation.type)}},{{/if}}
|
|
28
|
+
{{#if (neq prisma.provider "none")}}
|
|
29
|
+
"@prisma/client": "7.9.0",
|
|
30
|
+
{{#if (eq prisma.provider "postgresql")}}
|
|
31
|
+
"@prisma/adapter-pg": "7.9.0",
|
|
32
|
+
{{/if}}
|
|
33
|
+
{{#if (eq prisma.provider "cockroachdb")}}
|
|
34
|
+
"@prisma/adapter-pg": "7.9.0",
|
|
35
|
+
{{/if}}
|
|
36
|
+
{{#if (eq prisma.provider "mysql")}}
|
|
37
|
+
"@prisma/adapter-mariadb": "7.9.0",
|
|
38
|
+
{{/if}}
|
|
39
|
+
{{#if (eq prisma.provider "sqlite")}}
|
|
40
|
+
"@prisma/adapter-better-sqlite3": "7.9.0",
|
|
41
|
+
{{/if}}
|
|
42
|
+
{{#if (eq prisma.provider "sqlserver")}}
|
|
43
|
+
"@prisma/adapter-mssql": "7.9.0",
|
|
44
|
+
{{/if}}
|
|
30
45
|
{{#if (eq validation.type "class-validator")}}
|
|
31
|
-
"reflect-metadata": "
|
|
32
|
-
"class-transformer": "
|
|
33
|
-
"class-validator": "
|
|
46
|
+
"reflect-metadata": "0.2.2",
|
|
47
|
+
"class-transformer": "0.5.1",
|
|
48
|
+
"class-validator": "0.15.1"
|
|
34
49
|
{{/if}}
|
|
35
50
|
{{#if (eq validation.type "zod")}}
|
|
36
|
-
"zod": "
|
|
51
|
+
"zod": "4.4.3"
|
|
37
52
|
{{/if}}
|
|
38
53
|
}
|
|
39
54
|
}
|
|
@@ -24,10 +24,10 @@ describe("UserRole model template rendering", () => {
|
|
|
24
24
|
const result1 = renderTemplate(templatePath, context1);
|
|
25
25
|
expect(result1.trim()).toBe("");
|
|
26
26
|
|
|
27
|
-
// Test case 2:
|
|
27
|
+
// Test case 2: none authentication
|
|
28
28
|
const context2 = {
|
|
29
29
|
authentication: {
|
|
30
|
-
type: "
|
|
30
|
+
type: "none",
|
|
31
31
|
multipleRoles: false,
|
|
32
32
|
},
|
|
33
33
|
prisma: {
|
|
@@ -65,10 +65,10 @@ describe("User model template rendering", () => {
|
|
|
65
65
|
expect(result3).toContain("roles UserRole[]");
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
it('should handle "
|
|
68
|
+
it('should handle "none" authentication type', () => {
|
|
69
69
|
const context = {
|
|
70
70
|
authentication: {
|
|
71
|
-
type: "
|
|
71
|
+
type: "none",
|
|
72
72
|
usernameField: "email",
|
|
73
73
|
},
|
|
74
74
|
prisma: {
|
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
model AuthPermission {
|
|
2
2
|
id String {{{prisma.idDatabaseType}}}
|
|
3
3
|
resource String
|
|
4
|
-
{{#if (eq prisma.provider "sqlite")}}
|
|
5
4
|
action String @default("View")
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
{{/if}}
|
|
9
|
-
roleId String {{#if (eq prisma.provider "mongodb")}}@db.ObjectId{{/if}}
|
|
10
|
-
role AuthRole @relation(fields: [roleId], references: [id])
|
|
5
|
+
roles AuthRole[]
|
|
6
|
+
users UserPermission[]
|
|
11
7
|
createdAt DateTime @default(now())
|
|
12
8
|
updatedAt DateTime @updatedAt
|
|
13
9
|
|
|
14
|
-
@@unique([resource, action
|
|
10
|
+
@@unique([resource, action])
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
model UserPermission {
|
|
2
|
+
id String @id @default(uuid())
|
|
3
|
+
createdAt DateTime @default(now())
|
|
4
|
+
updatedAt DateTime @updatedAt
|
|
5
|
+
|
|
6
|
+
effect UserPermissionEffect @default(Allow)
|
|
7
|
+
userId String
|
|
8
|
+
user User @relation(fields: [userId], references: [id])
|
|
9
|
+
permissionId String
|
|
10
|
+
permission AuthPermission @relation(fields: [permissionId], references: [id])
|
|
11
|
+
|
|
12
|
+
@@unique([userId, permissionId])
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
enum UserPermissionEffect {
|
|
16
|
+
Allow
|
|
17
|
+
Deny
|
|
18
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{{#if (neq authentication.type "
|
|
1
|
+
{{#if (neq authentication.type "none")}}
|
|
2
2
|
model User {
|
|
3
3
|
id String {{{prisma.idDatabaseType}}}
|
|
4
4
|
{{authentication.usernameField}} String @unique
|
|
@@ -30,9 +30,11 @@ model User {
|
|
|
30
30
|
{{/if}}
|
|
31
31
|
{{/if}}
|
|
32
32
|
{{/if}}
|
|
33
|
+
{{#if (eq authentication.type "dynamic")}}
|
|
34
|
+
permissions UserPermission[]
|
|
35
|
+
{{/if}}
|
|
33
36
|
createdAt DateTime @default(now())
|
|
34
37
|
updatedAt DateTime @updatedAt
|
|
35
|
-
// other fields for your application
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
{{#if (eq authentication.type "static")}}
|
|
Binary file
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import arkos from "arkos";
|
|
2
|
-
import router from "@/src/router"
|
|
3
|
-
import loadables from "@/src/loadables"
|
|
2
|
+
import router from "@/src/router";
|
|
4
3
|
|
|
5
|
-
const app = arkos()
|
|
4
|
+
const app = arkos();
|
|
6
5
|
|
|
7
|
-
app.set("trust proxy", 1)
|
|
6
|
+
app.set("trust proxy", 1);
|
|
7
|
+
app.use(router);
|
|
8
8
|
|
|
9
|
-
app
|
|
10
|
-
app.
|
|
9
|
+
{{#if (eq entryPoint "src/app")}}
|
|
10
|
+
app.listen();
|
|
11
|
+
{{else}}
|
|
12
|
+
export default app;
|
|
13
|
+
{{/if}}
|
|
11
14
|
|
|
12
|
-
app.listen()
|
|
@@ -1,11 +1,76 @@
|
|
|
1
|
-
import { ArkosRouter } from
|
|
2
|
-
{{#if authentication}}
|
|
3
|
-
import authPolicy from
|
|
1
|
+
import { ArkosRouter, ArkosRouteHook } from 'arkos';
|
|
2
|
+
{{#if (neq authentication.type "none")}}
|
|
3
|
+
import authPolicy from '@/src/modules/auth/auth.policy';
|
|
4
4
|
{{/if}}
|
|
5
|
+
{{#if validation.type}}
|
|
6
|
+
import LoginDto from '@/src/modules/auth/dtos/login.dto';
|
|
7
|
+
import SignupDto from '@/src/modules/auth/dtos/signup.dto';
|
|
8
|
+
import UpdateMeDto from '@/src/modules/auth/dtos/update-me.dto';
|
|
9
|
+
import UpdatePasswordDto from '@/src/modules/auth/dtos/update-password.dto';
|
|
10
|
+
{{/if}}
|
|
11
|
+
|
|
12
|
+
const authRouteHook = ArkosRouteHook("auth");
|
|
13
|
+
|
|
14
|
+
authRouteHook.login({
|
|
15
|
+
{{#if validation.type}}validation: { body: LoginDto },{{/if}}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
authRouteHook.signup({
|
|
19
|
+
{{#if validation.type}}validation: { body: SignupDto },{{/if}}
|
|
20
|
+
prismaArgs: {
|
|
21
|
+
omit: { password: true },
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
authRouteHook.getMe({
|
|
26
|
+
prismaArgs: {
|
|
27
|
+
omit: { password: true },
|
|
28
|
+
{{#if (eq authentication.type "dynamic")}}
|
|
29
|
+
include: {
|
|
30
|
+
{{#if authentication.multipleRoles}}
|
|
31
|
+
roles: {
|
|
32
|
+
include: {
|
|
33
|
+
role: {
|
|
34
|
+
include: {
|
|
35
|
+
permissions: true,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{{else}}
|
|
41
|
+
role: {
|
|
42
|
+
include: {
|
|
43
|
+
role: {
|
|
44
|
+
include: {
|
|
45
|
+
permissions: true,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{{/if}}
|
|
51
|
+
},
|
|
52
|
+
{{/if}}
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
authRouteHook.updateMe({
|
|
57
|
+
{{#if validation.type}}validation: { body: UpdateMeDto },{{/if}}
|
|
58
|
+
prismaArgs: {
|
|
59
|
+
omit: { password: true },
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
authRouteHook.updatePassword({
|
|
64
|
+
{{#if validation.type}}validation: { body: UpdatePasswordDto },{{/if}}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
authRouteHook.logout({});
|
|
68
|
+
|
|
69
|
+
const authRouter = ArkosRouter({
|
|
70
|
+
prefix: "/auth",
|
|
71
|
+
openapi: { tags: ["Authentication"] },
|
|
72
|
+
});
|
|
5
73
|
|
|
6
|
-
|
|
7
|
-
prefix: "/auth",
|
|
8
|
-
openapi: { tags: ["Authentication"] }
|
|
9
|
-
});
|
|
74
|
+
authRouter.load(authRouteHook);
|
|
10
75
|
|
|
11
76
|
export default authRouter;
|
|
@@ -8,7 +8,7 @@ const SignupDto = z.object({
|
|
|
8
8
|
|
|
9
9
|
export default SignupDto;
|
|
10
10
|
{{#if typescript}}
|
|
11
|
-
export type
|
|
11
|
+
export type SignupDto = z.infer<typeof SignupDto>;
|
|
12
12
|
{{/if}}
|
|
13
13
|
{{/if}}
|
|
14
14
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -7,7 +7,7 @@ const UpdateMeDto = z.object({
|
|
|
7
7
|
|
|
8
8
|
export default UpdateMeDto;
|
|
9
9
|
{{#if typescript}}
|
|
10
|
-
export type
|
|
10
|
+
export type UpdateMeDto = z.infer<typeof UpdateMeDto>;
|
|
11
11
|
{{/if}}
|
|
12
12
|
{{/if}}
|
|
13
13
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -8,7 +8,7 @@ const UpdatePasswordDto = z.object({
|
|
|
8
8
|
|
|
9
9
|
export default UpdatePasswordDto;
|
|
10
10
|
{{#if typescript}}
|
|
11
|
-
export type
|
|
11
|
+
export type UpdatePasswordDto = z.infer<typeof UpdatePasswordDto>;
|
|
12
12
|
{{/if}}
|
|
13
13
|
{{/if}}
|
|
14
14
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -1,11 +1,43 @@
|
|
|
1
|
-
import { ArkosRouter } from
|
|
2
|
-
{{#if authentication}}
|
|
3
|
-
import authPermissionPolicy from
|
|
1
|
+
import { ArkosRouter, ArkosRouteHook } from 'arkos';
|
|
2
|
+
{{#if (neq authentication.type "none")}}
|
|
3
|
+
import authPermissionPolicy from '@/src/modules/auth-permission/auth-permission.policy';
|
|
4
4
|
{{/if}}
|
|
5
|
+
{{#if validation.type}}
|
|
6
|
+
import CreateAuthPermissionDto from '@/src/modules/auth-permission/dtos/create-auth-permission.dto';
|
|
7
|
+
import UpdateAuthPermissionDto from '@/src/modules/auth-permission/dtos/update-auth-permission.dto';
|
|
8
|
+
import QueryAuthPermissionDto from '@/src/modules/auth-permission/dtos/query-auth-permission.dto';
|
|
9
|
+
{{/if}}
|
|
10
|
+
|
|
11
|
+
const authPermissionRouteHook = ArkosRouteHook("auth-permission");
|
|
12
|
+
|
|
13
|
+
authPermissionRouteHook.createOne({
|
|
14
|
+
{{#if validation.type}}validation: { body: CreateAuthPermissionDto },{{/if}}
|
|
15
|
+
{{#if (neq authentication.type "none")}}authentication: authPermissionPolicy.Create,{{/if}}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
authPermissionRouteHook.findOne({
|
|
19
|
+
{{#if (neq authentication.type "none")}}authentication: authPermissionPolicy.View,{{/if}}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
authPermissionRouteHook.findMany({
|
|
23
|
+
{{#if validation.type}}validation: { query: QueryAuthPermissionDto },{{/if}}
|
|
24
|
+
{{#if (neq authentication.type "none")}}authentication: authPermissionPolicy.View,{{/if}}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
authPermissionRouteHook.updateOne({
|
|
28
|
+
{{#if validation.type}}validation: { body: UpdateAuthPermissionDto },{{/if}}
|
|
29
|
+
{{#if (neq authentication.type "none")}}authentication: authPermissionPolicy.Update,{{/if}}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
authPermissionRouteHook.deleteOne({
|
|
33
|
+
{{#if (neq authentication.type "none")}}authentication: authPermissionPolicy.Delete,{{/if}}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const authPermissionRouter = ArkosRouter({
|
|
37
|
+
prefix: "/auth-permissions",
|
|
38
|
+
openapi: { tags: ["Auth Permissions"] },
|
|
39
|
+
});
|
|
5
40
|
|
|
6
|
-
|
|
7
|
-
prefix: "/auth-permissions",
|
|
8
|
-
openapi: { tags: ["Auth Permissions"] }
|
|
9
|
-
});
|
|
41
|
+
authPermissionRouter.load(authPermissionRouteHook);
|
|
10
42
|
|
|
11
43
|
export default authPermissionRouter;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
{{#if typescript}}
|
|
3
|
-
import { Prisma } from "@prisma/client"
|
|
1
|
+
import { ArkosPrismaService } from "arkos/services";
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
{{#if typescript}}
|
|
4
|
+
class AuthPermissionService extends ArkosPrismaService<"auth-permission"> {}
|
|
6
5
|
{{else}}
|
|
7
|
-
|
|
8
|
-
class AuthPermissionService extends BaseService {}
|
|
6
|
+
class AuthPermissionService extends ArkosPrismaService {}
|
|
9
7
|
{{/if}}
|
|
10
8
|
|
|
11
9
|
const authPermissionService = new AuthPermissionService("auth-permission");
|
|
@@ -4,19 +4,19 @@ import { z } from 'zod';
|
|
|
4
4
|
const CreateAuthPermissionDto = z.object({
|
|
5
5
|
resource: z.string().min(1, 'Resource is required'),
|
|
6
6
|
action: z.string().default('View'),
|
|
7
|
-
|
|
7
|
+
roles: z.array(z.object({
|
|
8
8
|
id: z.string().min(1, 'Role ID is required'),
|
|
9
|
-
}),
|
|
9
|
+
})).optional(),
|
|
10
10
|
description: z.string().optional(),
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
export default CreateAuthPermissionDto;
|
|
14
14
|
{{#if typescript}}
|
|
15
|
-
export type
|
|
15
|
+
export type CreateAuthPermissionDto = z.infer<typeof CreateAuthPermissionDto>;
|
|
16
16
|
{{/if}}
|
|
17
17
|
{{/if}}
|
|
18
18
|
{{#if (eq validation.type "class-validator")}}
|
|
19
|
-
import { IsString, IsNotEmpty, IsOptional,
|
|
19
|
+
import { IsString, IsNotEmpty, IsOptional, IsArray, ValidateNested } from 'class-validator';
|
|
20
20
|
import { Type, Transform } from 'class-transformer';
|
|
21
21
|
import 'reflect-metadata';
|
|
22
22
|
|
|
@@ -35,13 +35,10 @@ export default class CreateAuthPermissionDto {
|
|
|
35
35
|
@Transform(({ value }) => value || 'View')
|
|
36
36
|
action?: string = 'View';
|
|
37
37
|
|
|
38
|
-
@ValidateNested()
|
|
38
|
+
@ValidateNested({ each: true })
|
|
39
|
+
@IsArray()
|
|
39
40
|
@Type(() => RoleConnectDto)
|
|
40
|
-
role!: RoleConnectDto;
|
|
41
|
-
|
|
42
41
|
@IsOptional()
|
|
43
|
-
|
|
44
|
-
@Transform(({ value }) => value)
|
|
45
|
-
description?: string;
|
|
42
|
+
roles?: RoleConnectDto[];
|
|
46
43
|
}
|
|
47
44
|
{{/if}}
|
|
@@ -18,7 +18,7 @@ const QueryAuthPermissionDto = z.object({
|
|
|
18
18
|
|
|
19
19
|
export default QueryAuthPermissionDto;
|
|
20
20
|
{{#if typescript}}
|
|
21
|
-
export type
|
|
21
|
+
export type QueryAuthPermissionDto = z.infer<typeof QueryAuthPermissionDto>;
|
|
22
22
|
{{/if}}
|
|
23
23
|
{{/if}}
|
|
24
24
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -5,18 +5,27 @@ const UpdateAuthPermissionDto = z.object({
|
|
|
5
5
|
resource: z.string().optional(),
|
|
6
6
|
action: z.string().optional(),
|
|
7
7
|
description: z.string().optional(),
|
|
8
|
+
roles: z.array(z.object({
|
|
9
|
+
id: z.string().min(1, 'Role ID is required'),
|
|
10
|
+
})).optional(),
|
|
8
11
|
});
|
|
9
12
|
|
|
10
13
|
export default UpdateAuthPermissionDto;
|
|
11
14
|
{{#if typescript}}
|
|
12
|
-
export type
|
|
15
|
+
export type UpdateAuthPermissionDto = z.infer<typeof UpdateAuthPermissionDto>;
|
|
13
16
|
{{/if}}
|
|
14
17
|
{{/if}}
|
|
15
18
|
{{#if (eq validation.type "class-validator")}}
|
|
16
|
-
import { IsString, IsOptional } from 'class-validator';
|
|
17
|
-
import { Transform } from 'class-transformer';
|
|
19
|
+
import { IsString, IsOptional, IsArray, ValidateNested } from 'class-validator';
|
|
20
|
+
import { Transform, Type } from 'class-transformer';
|
|
18
21
|
import 'reflect-metadata';
|
|
19
22
|
|
|
23
|
+
class RoleConnectDto {
|
|
24
|
+
@IsString()
|
|
25
|
+
@IsNotEmpty({ message: 'Role ID is required' })
|
|
26
|
+
id!: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
20
29
|
export default class UpdateAuthPermissionDto {
|
|
21
30
|
@IsOptional()
|
|
22
31
|
@IsString()
|
|
@@ -24,11 +33,17 @@ export default class UpdateAuthPermissionDto {
|
|
|
24
33
|
|
|
25
34
|
@IsOptional()
|
|
26
35
|
@IsString()
|
|
27
|
-
@Transform(({ value }) => value)
|
|
36
|
+
@Transform(({ value }) => String(value))
|
|
28
37
|
action?: string;
|
|
29
38
|
|
|
30
39
|
@IsOptional()
|
|
31
40
|
@IsString()
|
|
32
41
|
description?: string;
|
|
42
|
+
|
|
43
|
+
@ValidateNested({ each: true })
|
|
44
|
+
@IsArray()
|
|
45
|
+
@Type(() => RoleConnectDto)
|
|
46
|
+
@IsOptional()
|
|
47
|
+
roles?: RoleConnectDto[];
|
|
33
48
|
}
|
|
34
49
|
{{/if}}
|
|
@@ -1,11 +1,43 @@
|
|
|
1
|
-
import { ArkosRouter } from
|
|
2
|
-
{{#if authentication}}
|
|
3
|
-
import authRolePolicy from
|
|
1
|
+
import { ArkosRouter, ArkosRouteHook } from 'arkos';
|
|
2
|
+
{{#if (neq authentication.type "none")}}
|
|
3
|
+
import authRolePolicy from '@/src/modules/auth-role/auth-role.policy';
|
|
4
4
|
{{/if}}
|
|
5
|
+
{{#if validation.type}}
|
|
6
|
+
import CreateAuthRoleDto from '@/src/modules/auth-role/dtos/create-auth-role.dto';
|
|
7
|
+
import UpdateAuthRoleDto from '@/src/modules/auth-role/dtos/update-auth-role.dto';
|
|
8
|
+
import QueryAuthRoleDto from '@/src/modules/auth-role/dtos/query-auth-role.dto';
|
|
9
|
+
{{/if}}
|
|
10
|
+
|
|
11
|
+
const authRoleRouteHook = ArkosRouteHook("auth-role");
|
|
12
|
+
|
|
13
|
+
authRoleRouteHook.createOne({
|
|
14
|
+
{{#if validation.type}}validation: { body: CreateAuthRoleDto },{{/if}}
|
|
15
|
+
{{#if (neq authentication.type "none")}}authentication: authRolePolicy.Create,{{/if}}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
authRoleRouteHook.findOne({
|
|
19
|
+
{{#if (neq authentication.type "none")}}authentication: authRolePolicy.View,{{/if}}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
authRoleRouteHook.findMany({
|
|
23
|
+
{{#if validation.type}}validation: { query: QueryAuthRoleDto },{{/if}}
|
|
24
|
+
{{#if (neq authentication.type "none")}}authentication: authRolePolicy.View,{{/if}}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
authRoleRouteHook.updateOne({
|
|
28
|
+
{{#if validation.type}}validation: { body: UpdateAuthRoleDto },{{/if}}
|
|
29
|
+
{{#if (neq authentication.type "none")}}authentication: authRolePolicy.Update,{{/if}}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
authRoleRouteHook.deleteOne({
|
|
33
|
+
{{#if (neq authentication.type "none")}}authentication: authRolePolicy.Delete,{{/if}}
|
|
34
|
+
});
|
|
5
35
|
|
|
6
36
|
const authRoleRouter = ArkosRouter({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
37
|
+
prefix: "/auth-roles",
|
|
38
|
+
openapi: { tags: ["Auth Roles"] },
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
authRoleRouter.load(authRoleRouteHook);
|
|
10
42
|
|
|
11
43
|
export default authRoleRouter;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
{{#if typescript}}
|
|
3
|
-
import { Prisma } from "@prisma/client"
|
|
1
|
+
import { ArkosPrismaService } from "arkos/services";
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
{{#if typescript}}
|
|
4
|
+
class AuthRoleService extends ArkosPrismaService<"auth-role"> {}
|
|
6
5
|
{{else}}
|
|
7
|
-
|
|
8
|
-
class AuthRoleService extends BaseService {}
|
|
6
|
+
class AuthRoleService extends ArkosPrismaService {}
|
|
9
7
|
{{/if}}
|
|
10
8
|
|
|
11
9
|
const authRoleService = new AuthRoleService("auth-role");
|
|
@@ -15,7 +15,7 @@ const CreateAuthRoleDto = z.object({
|
|
|
15
15
|
|
|
16
16
|
export default CreateAuthRoleDto;
|
|
17
17
|
{{#if typescript}}
|
|
18
|
-
export type
|
|
18
|
+
export type CreateAuthRoleDto = z.infer<typeof CreateAuthRoleDto>;
|
|
19
19
|
{{/if}}
|
|
20
20
|
{{/if}}
|
|
21
21
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -29,13 +29,8 @@ class CreatePermissionForRoleDto {
|
|
|
29
29
|
resource!: string;
|
|
30
30
|
|
|
31
31
|
@IsString()
|
|
32
|
-
@Transform(({ value }) => value
|
|
33
|
-
action
|
|
34
|
-
|
|
35
|
-
@IsOptional()
|
|
36
|
-
@IsString()
|
|
37
|
-
@Transform(({ value }) => value)
|
|
38
|
-
description?: string;
|
|
32
|
+
@Transform(({ value }) => String(value))
|
|
33
|
+
action!: string;
|
|
39
34
|
}
|
|
40
35
|
|
|
41
36
|
export default class CreateAuthRoleDto {
|
|
@@ -22,7 +22,7 @@ const QueryAuthRoleDto = z.object({
|
|
|
22
22
|
|
|
23
23
|
export default QueryAuthRoleDto;
|
|
24
24
|
{{#if typescript}}
|
|
25
|
-
export type
|
|
25
|
+
export type QueryAuthRoleDto = z.infer<typeof QueryAuthRoleDto>;
|
|
26
26
|
{{/if}}
|
|
27
27
|
{{/if}}
|
|
28
28
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -17,7 +17,7 @@ const UpdateAuthRoleDto = z.object({
|
|
|
17
17
|
|
|
18
18
|
export default UpdateAuthRoleDto;
|
|
19
19
|
{{#if typescript}}
|
|
20
|
-
export type
|
|
20
|
+
export type UpdateAuthRoleDto = z.infer<typeof UpdateAuthRoleDto>;
|
|
21
21
|
{{/if}}
|
|
22
22
|
{{/if}}
|
|
23
23
|
{{#if (eq validation.type "class-validator")}}
|
|
@@ -27,6 +27,7 @@ import 'reflect-metadata';
|
|
|
27
27
|
|
|
28
28
|
export enum ApiAction {
|
|
29
29
|
connect = 'connect',
|
|
30
|
+
disconnect = 'disconnect',
|
|
30
31
|
delete = 'delete',
|
|
31
32
|
create = 'create',
|
|
32
33
|
update = 'update'
|
|
@@ -45,11 +46,7 @@ class UpdatePermissionForRoleDto {
|
|
|
45
46
|
@IsNotEmpty()
|
|
46
47
|
action!: string;
|
|
47
48
|
|
|
48
|
-
@
|
|
49
|
-
@IsString()
|
|
50
|
-
@Transform(({ value }) => value)
|
|
51
|
-
description?: string;
|
|
52
|
-
|
|
49
|
+
@IsEnum(ApiAction)
|
|
53
50
|
@IsOptional()
|
|
54
51
|
@IsString()
|
|
55
52
|
apiAction?: ApiAction;
|