@appxdigital/appx-core 0.1.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/appx-core.module.d.ts +7 -0
  2. package/dist/appx-core.module.d.ts.map +1 -0
  3. package/dist/appx-core.module.js +46 -0
  4. package/dist/common/config/default-permissions.config.d.ts +3 -0
  5. package/dist/common/config/default-permissions.config.d.ts.map +1 -0
  6. package/dist/common/config/default-permissions.config.js +6 -0
  7. package/dist/common/config/permissions.config.provider.d.ts +8 -0
  8. package/dist/common/config/permissions.config.provider.d.ts.map +1 -0
  9. package/dist/common/config/permissions.config.provider.js +12 -0
  10. package/dist/common/config/permissions.service.d.ts +7 -0
  11. package/dist/common/config/permissions.service.d.ts.map +1 -0
  12. package/dist/common/config/permissions.service.js +31 -0
  13. package/dist/common/config/permissionsConfigTypes.d.ts +18 -0
  14. package/dist/common/config/permissionsConfigTypes.d.ts.map +1 -0
  15. package/dist/common/config/permissionsConfigTypes.js +2 -0
  16. package/dist/common/contants.d.ts +3 -0
  17. package/dist/common/contants.d.ts.map +1 -0
  18. package/dist/common/contants.js +5 -0
  19. package/dist/common/decorators/guard.decorator.d.ts +5 -0
  20. package/dist/common/decorators/guard.decorator.d.ts.map +1 -0
  21. package/dist/common/decorators/guard.decorator.js +22 -0
  22. package/dist/common/decorators/permission.decorator.d.ts +3 -0
  23. package/dist/common/decorators/permission.decorator.d.ts.map +1 -0
  24. package/dist/common/decorators/permission.decorator.js +7 -0
  25. package/dist/common/decorators/transaction.decorator.d.ts +8 -0
  26. package/dist/common/decorators/transaction.decorator.d.ts.map +1 -0
  27. package/dist/common/decorators/transaction.decorator.js +12 -0
  28. package/dist/common/enums/role.enum.d.ts +6 -0
  29. package/dist/common/enums/role.enum.d.ts.map +1 -0
  30. package/dist/common/enums/role.enum.js +9 -0
  31. package/dist/common/guards/rbac.guard.d.ts +10 -0
  32. package/dist/common/guards/rbac.guard.d.ts.map +1 -0
  33. package/dist/common/guards/rbac.guard.js +56 -0
  34. package/dist/common/guards/role.guard.d.ts +12 -0
  35. package/dist/common/guards/role.guard.d.ts.map +1 -0
  36. package/dist/common/guards/role.guard.js +44 -0
  37. package/dist/common/interceptors/file.interceptor.d.ts +9 -0
  38. package/dist/common/interceptors/file.interceptor.d.ts.map +1 -0
  39. package/dist/common/interceptors/file.interceptor.js +74 -0
  40. package/dist/common/interceptors/prisma.interceptor.d.ts +14 -0
  41. package/dist/common/interceptors/prisma.interceptor.d.ts.map +1 -0
  42. package/dist/common/interceptors/prisma.interceptor.js +82 -0
  43. package/dist/common/interfaces/file-upload.interface.d.ts +13 -0
  44. package/dist/common/interfaces/file-upload.interface.d.ts.map +1 -0
  45. package/dist/common/interfaces/file-upload.interface.js +2 -0
  46. package/dist/common/interfaces/storage-service.interface.d.ts +4 -0
  47. package/dist/common/interfaces/storage-service.interface.d.ts.map +1 -0
  48. package/dist/common/interfaces/storage-service.interface.js +2 -0
  49. package/dist/common/interfaces/user.interface.d.ts +12 -0
  50. package/dist/common/interfaces/user.interface.d.ts.map +1 -0
  51. package/dist/common/interfaces/user.interface.js +2 -0
  52. package/dist/common/providers/aws-storage.service.d.ts +10 -0
  53. package/dist/common/providers/aws-storage.service.d.ts.map +1 -0
  54. package/dist/common/providers/aws-storage.service.js +60 -0
  55. package/dist/common/providers/gcp-storage.service.d.ts +10 -0
  56. package/dist/common/providers/gcp-storage.service.d.ts.map +1 -0
  57. package/dist/common/providers/gcp-storage.service.js +87 -0
  58. package/dist/common/providers/local-storage.service.d.ts +7 -0
  59. package/dist/common/providers/local-storage.service.d.ts.map +1 -0
  60. package/dist/common/providers/local-storage.service.js +80 -0
  61. package/dist/common/types.d.ts +21 -0
  62. package/dist/common/types.d.ts.map +1 -0
  63. package/dist/common/types.js +3 -0
  64. package/dist/common/utils/context-transformer.util.d.ts +6 -0
  65. package/dist/common/utils/context-transformer.util.d.ts.map +1 -0
  66. package/dist/common/utils/context-transformer.util.js +28 -0
  67. package/dist/common/utils/error-handler.d.ts +2 -0
  68. package/dist/common/utils/error-handler.d.ts.map +1 -0
  69. package/dist/common/utils/error-handler.js +38 -0
  70. package/dist/config/admin/create.d.ts +2 -0
  71. package/dist/config/admin/create.d.ts.map +1 -0
  72. package/dist/config/admin/create.js +25 -0
  73. package/dist/config/admin/generate-admin.d.ts +2 -0
  74. package/dist/config/admin/generate-admin.d.ts.map +1 -0
  75. package/dist/config/admin/generate-admin.js +75 -0
  76. package/dist/config/admin/templates/admin.template.d.ts +2 -0
  77. package/dist/config/admin/templates/admin.template.d.ts.map +1 -0
  78. package/dist/config/admin/templates/admin.template.js +131 -0
  79. package/dist/config/admin/templates/component-loader.template.d.ts +2 -0
  80. package/dist/config/admin/templates/component-loader.template.d.ts.map +1 -0
  81. package/dist/config/admin/templates/component-loader.template.js +17 -0
  82. package/dist/config/admin/templates/dashboard.template.d.ts +2 -0
  83. package/dist/config/admin/templates/dashboard.template.d.ts.map +1 -0
  84. package/dist/config/admin/templates/dashboard.template.js +40 -0
  85. package/dist/config/admin/templates/utils.template.d.ts +2 -0
  86. package/dist/config/admin/templates/utils.template.d.ts.map +1 -0
  87. package/dist/config/admin/templates/utils.template.js +135 -0
  88. package/dist/config/generate-all.d.ts +3 -0
  89. package/dist/config/generate-all.d.ts.map +1 -0
  90. package/dist/config/generate-all.js +64 -0
  91. package/dist/config/generate-controllers.d.ts +2 -0
  92. package/dist/config/generate-controllers.d.ts.map +1 -0
  93. package/dist/config/generate-controllers.js +83 -0
  94. package/dist/config/generate-modules.d.ts +2 -0
  95. package/dist/config/generate-modules.d.ts.map +1 -0
  96. package/dist/config/generate-modules.js +158 -0
  97. package/dist/config/generate-resolvers.d.ts +2 -0
  98. package/dist/config/generate-resolvers.d.ts.map +1 -0
  99. package/dist/config/generate-resolvers.js +97 -0
  100. package/dist/config/generate-services.d.ts +2 -0
  101. package/dist/config/generate-services.d.ts.map +1 -0
  102. package/dist/config/generate-services.js +72 -0
  103. package/dist/config/generate-session-schema.d.ts +2 -0
  104. package/dist/config/generate-session-schema.d.ts.map +1 -0
  105. package/dist/config/generate-session-schema.js +78 -0
  106. package/dist/config/setup-fileupload.d.ts +3 -0
  107. package/dist/config/setup-fileupload.d.ts.map +1 -0
  108. package/dist/config/setup-fileupload.js +265 -0
  109. package/dist/config/utils.d.ts +3 -0
  110. package/dist/config/utils.d.ts.map +1 -0
  111. package/dist/config/utils.js +55 -0
  112. package/dist/graphql/batch.payload.d.ts +4 -0
  113. package/dist/graphql/batch.payload.d.ts.map +1 -0
  114. package/dist/graphql/batch.payload.js +23 -0
  115. package/dist/graphql/generic.resolver.d.ts +15 -0
  116. package/dist/graphql/generic.resolver.d.ts.map +1 -0
  117. package/dist/graphql/generic.resolver.js +107 -0
  118. package/dist/graphql/graphql.module.d.ts +3 -0
  119. package/dist/graphql/graphql.module.d.ts.map +1 -0
  120. package/dist/graphql/graphql.module.js +28 -0
  121. package/dist/index.d.ts +24 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +39 -0
  124. package/dist/modules/auth/auth-field.decorator.d.ts +10 -0
  125. package/dist/modules/auth/auth-field.decorator.d.ts.map +1 -0
  126. package/dist/modules/auth/auth-field.decorator.js +18 -0
  127. package/dist/modules/auth/auth.controller.d.ts +25 -0
  128. package/dist/modules/auth/auth.controller.d.ts.map +1 -0
  129. package/dist/modules/auth/auth.controller.js +158 -0
  130. package/dist/modules/auth/auth.module.d.ts +3 -0
  131. package/dist/modules/auth/auth.module.d.ts.map +1 -0
  132. package/dist/modules/auth/auth.module.js +28 -0
  133. package/dist/modules/auth/auth.resolver.d.ts +6 -0
  134. package/dist/modules/auth/auth.resolver.d.ts.map +1 -0
  135. package/dist/modules/auth/auth.resolver.js +24 -0
  136. package/dist/modules/auth/auth.service.d.ts +28 -0
  137. package/dist/modules/auth/auth.service.d.ts.map +1 -0
  138. package/dist/modules/auth/auth.service.js +197 -0
  139. package/dist/modules/auth/authenticated.guard.d.ts +5 -0
  140. package/dist/modules/auth/authenticated.guard.d.ts.map +1 -0
  141. package/dist/modules/auth/authenticated.guard.js +20 -0
  142. package/dist/modules/auth/dto/register.dto.d.ts +6 -0
  143. package/dist/modules/auth/dto/register.dto.d.ts.map +1 -0
  144. package/dist/modules/auth/dto/register.dto.js +21 -0
  145. package/dist/modules/auth/dto/user.dto.d.ts +5 -0
  146. package/dist/modules/auth/dto/user.dto.d.ts.map +1 -0
  147. package/dist/modules/auth/dto/user.dto.js +36 -0
  148. package/dist/modules/auth/local-auth.guard.d.ts +7 -0
  149. package/dist/modules/auth/local-auth.guard.d.ts.map +1 -0
  150. package/dist/modules/auth/local-auth.guard.js +31 -0
  151. package/dist/modules/auth/local.strategy.d.ts +15 -0
  152. package/dist/modules/auth/local.strategy.d.ts.map +1 -0
  153. package/dist/modules/auth/local.strategy.js +48 -0
  154. package/dist/modules/auth/session/session-auth.guard.d.ts +5 -0
  155. package/dist/modules/auth/session/session-auth.guard.d.ts.map +1 -0
  156. package/dist/modules/auth/session/session-auth.guard.js +30 -0
  157. package/dist/modules/auth/session/session-serializer.d.ts +9 -0
  158. package/dist/modules/auth/session/session-serializer.d.ts.map +1 -0
  159. package/dist/modules/auth/session/session-serializer.js +44 -0
  160. package/dist/modules/auth/session/session-store.d.ts +11 -0
  161. package/dist/modules/auth/session/session-store.d.ts.map +1 -0
  162. package/dist/modules/auth/session/session-store.js +97 -0
  163. package/dist/modules/common.module.d.ts +3 -0
  164. package/dist/modules/common.module.d.ts.map +1 -0
  165. package/dist/modules/common.module.js +20 -0
  166. package/dist/modules/core/core.controller.d.ts +14 -0
  167. package/dist/modules/core/core.controller.d.ts.map +1 -0
  168. package/dist/modules/core/core.controller.js +114 -0
  169. package/dist/modules/core/core.module.d.ts +3 -0
  170. package/dist/modules/core/core.module.d.ts.map +1 -0
  171. package/dist/modules/core/core.module.js +22 -0
  172. package/dist/modules/core/core.service.d.ts +44 -0
  173. package/dist/modules/core/core.service.d.ts.map +1 -0
  174. package/dist/modules/core/core.service.js +121 -0
  175. package/dist/modules/file/file-upload.controller.d.ts +11 -0
  176. package/dist/modules/file/file-upload.controller.d.ts.map +1 -0
  177. package/dist/modules/file/file-upload.controller.js +52 -0
  178. package/dist/modules/file/file-upload.module.d.ts +6 -0
  179. package/dist/modules/file/file-upload.module.d.ts.map +1 -0
  180. package/dist/modules/file/file-upload.module.js +62 -0
  181. package/dist/modules/file/file-upload.service.d.ts +27 -0
  182. package/dist/modules/file/file-upload.service.d.ts.map +1 -0
  183. package/dist/modules/file/file-upload.service.js +69 -0
  184. package/dist/modules/user/user.module.d.ts +3 -0
  185. package/dist/modules/user/user.module.d.ts.map +1 -0
  186. package/dist/modules/user/user.module.js +20 -0
  187. package/dist/modules/user/user.service.d.ts +10 -0
  188. package/dist/modules/user/user.service.d.ts.map +1 -0
  189. package/dist/modules/user/user.service.js +49 -0
  190. package/dist/prisma/prisma.service.d.ts +128 -0
  191. package/dist/prisma/prisma.service.d.ts.map +1 -0
  192. package/dist/prisma/prisma.service.js +512 -0
  193. package/dist/tasks/session-cleanup.service.d.ts +7 -0
  194. package/dist/tasks/session-cleanup.service.d.ts.map +1 -0
  195. package/dist/tasks/session-cleanup.service.js +38 -0
  196. package/package.json +66 -0
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adminJsModuleCode = void 0;
4
+ exports.adminJsModuleCode = `
5
+ import {DynamicModule} from '@nestjs/common';
6
+ import {addBasicFilters, createActions, createPermissionHandler, dynamicImport, getAdminJSResources} from './utils';
7
+ import {initializeComponents} from './component-loader';
8
+ import {readFileSync} from 'fs';
9
+ import {getDMMF} from '@prisma/sdk';
10
+ import {PrismaService} from 'appx-core';
11
+ import {PrismaModule} from "../prisma/prisma.module";
12
+
13
+ const DEFAULT_ADMIN = {
14
+ email: 'joao.duvido@appx.pt',
15
+ password: 'password',
16
+ };
17
+
18
+ const authenticate = async (email: string, password: string) => {
19
+ if (email === DEFAULT_ADMIN.email && password === DEFAULT_ADMIN.password) {
20
+ return Promise.resolve(DEFAULT_ADMIN);
21
+ }
22
+ return null;
23
+ };
24
+
25
+ export async function createAdminJsModule(): Promise<DynamicModule> {
26
+ const {default: AdminJS} = await dynamicImport('adminjs');
27
+ const {Database, Resource} = await dynamicImport('@adminjs/prisma');
28
+ const {AdminModule} = await dynamicImport('@adminjs/nestjs');
29
+ const {default: importExportFeature} = await dynamicImport('@adminjs/import-export');
30
+ const {default: passwordFeature} = await dynamicImport('@adminjs/passwords');
31
+ const argon2 = await dynamicImport('argon2');
32
+
33
+ const resources = getAdminJSResources();
34
+ const {componentLoader, Components} = await initializeComponents();
35
+ const schemaPath = './prisma/schema.prisma';
36
+ const schema = readFileSync(schemaPath, 'utf-8');
37
+ const dmmf = await getDMMF({datamodel: schema});
38
+
39
+ const models = [];
40
+
41
+ for (const resource of resources) {
42
+ const model = dmmf.datamodel.models.find(
43
+ (model) => model.name === resource.name,
44
+ );
45
+
46
+ models.push({
47
+ model,
48
+ options: resource.options,
49
+ features: model.name === 'User' ? [
50
+ passwordFeature({
51
+ properties: {
52
+ encryptedPassword: 'password',
53
+ password: 'plainPassword',
54
+ },
55
+ hash: argon2.hash,
56
+ componentLoader,
57
+ }),
58
+ ] : [],
59
+ });
60
+ }
61
+
62
+ AdminJS.registerAdapter({Database, Resource});
63
+
64
+ return AdminModule.createAdminAsync({
65
+ imports: [PrismaModule],
66
+ inject: [PrismaService],
67
+ useFactory: async (prisma: PrismaService) => {
68
+ const authenticate = async (email: string, password: string) => {
69
+ const user = await prisma.user.findUnique({
70
+ where: {
71
+ email
72
+ }
73
+ });
74
+
75
+ if (!user || user.role !== 'ADMIN') {
76
+ return null;
77
+ }
78
+
79
+ const isPasswordValid = await argon2.verify(user.password, password);
80
+
81
+ return isPasswordValid ? Promise.resolve({email: user.email, role: user.role, id: user.id}) : null;
82
+ }
83
+
84
+ return {
85
+ adminJsOptions: {
86
+ rootPath: '/admin',
87
+ dashboard: {
88
+ component: Components.Dashboard,
89
+ handler: async () => {
90
+ return {some: 'output'};
91
+ },
92
+ },
93
+ branding: {
94
+ companyName: 'AppX Core Wizard',
95
+ withMadeWithLove: false,
96
+ logo: 'https://i.ibb.co/XZNRS5m/appxdigitalcom-logo.jpg',
97
+ },
98
+ resources: models.map((m) => {
99
+ return {
100
+ resource: {model: m.model, client: prisma},
101
+ options: {
102
+ ...m.options,
103
+ actions: createActions(),
104
+ },
105
+ features: [...(m.features || []), importExportFeature({
106
+ componentLoader
107
+ })],
108
+ };
109
+ }),
110
+ componentLoader,
111
+ },
112
+ auth: {
113
+ authenticate,
114
+ cookieName: process.env.SESSION_COOKIE_NAME,
115
+ cookiePassword: process.env.SESSION_SECRET,
116
+ },
117
+ sessionOptions: {
118
+ resave: false,
119
+ saveUninitialized: true,
120
+ secret: process.env.SESSION_SECRET,
121
+ cookie: {
122
+ httpOnly: process.env.NODE_ENV === 'production',
123
+ secure: false,
124
+ },
125
+ name: process.env.SESSION_COOKIE_NAME,
126
+ },
127
+ };
128
+ },
129
+ });
130
+ }
131
+ `;
@@ -0,0 +1,2 @@
1
+ export declare const componentLoaderTemplate = "import { dynamicImport } from \"./utils\";\n\nasync function loadComponents() {\n const { ComponentLoader } = await dynamicImport('adminjs');\n const componentLoader = new ComponentLoader();\n\n const Components = {\n Dashboard: componentLoader.add('dashboard', './components/dashboard'),\n };\n\n return { componentLoader, Components };\n}\nexport const initializeComponents = loadComponents;\n";
2
+ //# sourceMappingURL=component-loader.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-loader.template.d.ts","sourceRoot":"","sources":["../../../../src/config/admin/templates/component-loader.template.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,saAanC,CAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.componentLoaderTemplate = void 0;
4
+ exports.componentLoaderTemplate = `import { dynamicImport } from "./utils";
5
+
6
+ async function loadComponents() {
7
+ const { ComponentLoader } = await dynamicImport('adminjs');
8
+ const componentLoader = new ComponentLoader();
9
+
10
+ const Components = {
11
+ Dashboard: componentLoader.add('dashboard', './components/dashboard'),
12
+ };
13
+
14
+ return { componentLoader, Components };
15
+ }
16
+ export const initializeComponents = loadComponents;
17
+ `;
@@ -0,0 +1,2 @@
1
+ export declare const dashboardTemplate = "import React from 'react';\n\nexport const Dashboard = () => {\n\n return (\n <div style={{\n backgroundColor: 'white',\n borderRadius: '15px',\n height: '100%',\n padding: '1rem',\n margin: '1rem',\n }}>\n <h1 style={{fontSize: \"1.5rem\", textAlign: \"center\"}}>Dashboard</h1>\n <div style={{\n display: 'flex',\n gap: '1rem',\n flexDirection: 'column',\n textAlign: 'center',\n marginTop: '3rem',\n borderRadius: '15px',\n border: '2px solid gainsboro',\n maxWidth: '300px',\n margin: '3rem auto',\n padding: '1rem',\n }}>\n <h2>Customize it!</h2>\n <p>You can customize your dashboard however you want.</p>\n <p>Display any data you might find useful.</p>\n <p>See the number of users or check statistics on graphics</p>\n <p>Whatever you want to do! Edit it on components/dashboard.</p>\n </div>\n </div>\n\n );\n};\n\nexport default Dashboard;";
2
+ //# sourceMappingURL=dashboard.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.template.d.ts","sourceRoot":"","sources":["../../../../src/config/admin/templates/dashboard.template.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,srCAoCJ,CAAA"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dashboardTemplate = void 0;
4
+ exports.dashboardTemplate = `import React from 'react';
5
+
6
+ export const Dashboard = () => {
7
+
8
+ return (
9
+ <div style={{
10
+ backgroundColor: 'white',
11
+ borderRadius: '15px',
12
+ height: '100%',
13
+ padding: '1rem',
14
+ margin: '1rem',
15
+ }}>
16
+ <h1 style={{fontSize: "1.5rem", textAlign: "center"}}>Dashboard</h1>
17
+ <div style={{
18
+ display: 'flex',
19
+ gap: '1rem',
20
+ flexDirection: 'column',
21
+ textAlign: 'center',
22
+ marginTop: '3rem',
23
+ borderRadius: '15px',
24
+ border: '2px solid gainsboro',
25
+ maxWidth: '300px',
26
+ margin: '3rem auto',
27
+ padding: '1rem',
28
+ }}>
29
+ <h2>Customize it!</h2>
30
+ <p>You can customize your dashboard however you want.</p>
31
+ <p>Display any data you might find useful.</p>
32
+ <p>See the number of users or check statistics on graphics</p>
33
+ <p>Whatever you want to do! Edit it on components/dashboard.</p>
34
+ </div>
35
+ </div>
36
+
37
+ );
38
+ };
39
+
40
+ export default Dashboard;`;
@@ -0,0 +1,2 @@
1
+ export declare const permissionsUtilsContent = "\nimport {PermissionsConfig} from \"../config/permissions.config\";\n\nexport const dynamicImport = async (packageName: string) =>\n new Function(`return import('${packageName}')`)();\n\nexport const getAdminJSResources = (specific = null) => {\n const resources = [\n {\n name: 'User',\n options: {},\n },\n ];\n\n return specific ? resources.filter((r) => r.name === specific) : resources;\n};\n\nexport function createPermissionHandler(role: string, resource: string, action: string) {\n const rolePermissions = PermissionsConfig[resource]?.[role];\n\n if (!rolePermissions) {\n return () => false;\n }\n\n const actionMapping = {\n list : 'findMany',\n show : 'findUnique',\n edit : 'update',\n delete : 'delete',\n new : 'create',\n };\n\n const mappedAction = actionMapping[action];\n\n if (!mappedAction || !rolePermissions[mappedAction]) {\n return () => false;\n }\n\n if (rolePermissions[mappedAction] === 'ALL') {\n return () => true;\n }\n\n if (typeof rolePermissions[mappedAction] === 'object') {\n\n return (requestContext) => {\n // @ts-ignore\n const clauses = rolePermissions[mappedAction]?.clauses;\n if (!clauses) return () => false;\n return parseClauses(clauses)(requestContext);\n };\n }\n\n return () => false;\n}\n\nconst clauseMapping = {\n '$USER_ID': \"id\",\n '$USER_EMAIL': \"email\",\n};\n\nconst parseClauses = (clauses) => {\n return (requestContext) => {\n if (!clauses || !Array.isArray(clauses)) return true;\n\n for (const clause of clauses) {\n if (clause.type === 'field') {\n for (const [field, value] of Object.entries(clause.conditions)) {\n let actualValue = value;\n\n if (typeof value === 'string' && value.startsWith('$')) {\n actualValue = requestContext?.currentAdmin[clauseMapping[value]] ?? null;\n }\n\n if (requestContext.record?.param(field) !== actualValue) {\n return false;\n }\n }\n }\n }\n return true;\n };\n};\n\nexport const addBasicFilters = (filters) => {\n return async (request, context) => {\n for (const [field, value] of Object.entries(filters)) {\n request.query[`filters.${field}`] = value;\n }\n return request;\n };\n};\n\nexport const createActions = () => {\n return {\n list: {\n isAccessible: createIsAccessible('list'),\n },\n show: {\n isAccessible: createIsAccessible('show'),\n },\n edit: {\n isAccessible: createIsAccessible('edit'),\n },\n delete: {\n isAccessible: createIsAccessible('delete'),\n },\n new: {\n isAccessible: createIsAccessible('new'),\n },\n };\n};\n\nconst createIsAccessible = (action) => {\n return (context) => {\n if (!context.currentAdmin) return false;\n const { role } = context.currentAdmin;\n return createPermissionHandler(role, context.resource.model.name, action)(context);\n };\n};\n\nconst createBeforeHook = (filters) => {\n return (request, context) => {\n if (context.currentAdmin) {\n request.query.filters = {\n ...request.query.filters,\n ...filters,\n };\n }\n return request;\n };\n};\n";
2
+ //# sourceMappingURL=utils.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.template.d.ts","sourceRoot":"","sources":["../../../../src/config/admin/templates/utils.template.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,uiHAmInC,CAAC"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.permissionsUtilsContent = void 0;
4
+ exports.permissionsUtilsContent = `
5
+ import {PermissionsConfig} from "../config/permissions.config";
6
+
7
+ export const dynamicImport = async (packageName: string) =>
8
+ new Function(\`return import('\${packageName}')\`)();
9
+
10
+ export const getAdminJSResources = (specific = null) => {
11
+ const resources = [
12
+ {
13
+ name: 'User',
14
+ options: {},
15
+ },
16
+ ];
17
+
18
+ return specific ? resources.filter((r) => r.name === specific) : resources;
19
+ };
20
+
21
+ export function createPermissionHandler(role: string, resource: string, action: string) {
22
+ const rolePermissions = PermissionsConfig[resource]?.[role];
23
+
24
+ if (!rolePermissions) {
25
+ return () => false;
26
+ }
27
+
28
+ const actionMapping = {
29
+ list : 'findMany',
30
+ show : 'findUnique',
31
+ edit : 'update',
32
+ delete : 'delete',
33
+ new : 'create',
34
+ };
35
+
36
+ const mappedAction = actionMapping[action];
37
+
38
+ if (!mappedAction || !rolePermissions[mappedAction]) {
39
+ return () => false;
40
+ }
41
+
42
+ if (rolePermissions[mappedAction] === 'ALL') {
43
+ return () => true;
44
+ }
45
+
46
+ if (typeof rolePermissions[mappedAction] === 'object') {
47
+
48
+ return (requestContext) => {
49
+ // @ts-ignore
50
+ const clauses = rolePermissions[mappedAction]?.clauses;
51
+ if (!clauses) return () => false;
52
+ return parseClauses(clauses)(requestContext);
53
+ };
54
+ }
55
+
56
+ return () => false;
57
+ }
58
+
59
+ const clauseMapping = {
60
+ '$USER_ID': "id",
61
+ '$USER_EMAIL': "email",
62
+ };
63
+
64
+ const parseClauses = (clauses) => {
65
+ return (requestContext) => {
66
+ if (!clauses || !Array.isArray(clauses)) return true;
67
+
68
+ for (const clause of clauses) {
69
+ if (clause.type === 'field') {
70
+ for (const [field, value] of Object.entries(clause.conditions)) {
71
+ let actualValue = value;
72
+
73
+ if (typeof value === 'string' && value.startsWith('$')) {
74
+ actualValue = requestContext?.currentAdmin[clauseMapping[value]] ?? null;
75
+ }
76
+
77
+ if (requestContext.record?.param(field) !== actualValue) {
78
+ return false;
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return true;
84
+ };
85
+ };
86
+
87
+ export const addBasicFilters = (filters) => {
88
+ return async (request, context) => {
89
+ for (const [field, value] of Object.entries(filters)) {
90
+ request.query[\`filters.\${field}\`] = value;
91
+ }
92
+ return request;
93
+ };
94
+ };
95
+
96
+ export const createActions = () => {
97
+ return {
98
+ list: {
99
+ isAccessible: createIsAccessible('list'),
100
+ },
101
+ show: {
102
+ isAccessible: createIsAccessible('show'),
103
+ },
104
+ edit: {
105
+ isAccessible: createIsAccessible('edit'),
106
+ },
107
+ delete: {
108
+ isAccessible: createIsAccessible('delete'),
109
+ },
110
+ new: {
111
+ isAccessible: createIsAccessible('new'),
112
+ },
113
+ };
114
+ };
115
+
116
+ const createIsAccessible = (action) => {
117
+ return (context) => {
118
+ if (!context.currentAdmin) return false;
119
+ const { role } = context.currentAdmin;
120
+ return createPermissionHandler(role, context.resource.model.name, action)(context);
121
+ };
122
+ };
123
+
124
+ const createBeforeHook = (filters) => {
125
+ return (request, context) => {
126
+ if (context.currentAdmin) {
127
+ request.query.filters = {
128
+ ...request.query.filters,
129
+ ...filters,
130
+ };
131
+ }
132
+ return request;
133
+ };
134
+ };
135
+ `;
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=generate-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-all.d.ts","sourceRoot":"","sources":["../../src/config/generate-all.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const child_process_1 = require("child_process");
38
+ const path = __importStar(require("path"));
39
+ const scriptsDir = path.join(__dirname);
40
+ console.log('Running Prisma Generate...');
41
+ (0, child_process_1.execSync)(`npx prisma generate`, {
42
+ stdio: 'inherit',
43
+ });
44
+ console.log('Generating Modules...');
45
+ (0, child_process_1.execSync)(`node ${path.join(scriptsDir, 'generate-modules.js')}`, {
46
+ stdio: 'inherit',
47
+ });
48
+ console.log('Generating Resolvers...');
49
+ (0, child_process_1.execSync)(`node ${path.join(scriptsDir, 'generate-resolvers.js')}`, {
50
+ stdio: 'inherit',
51
+ });
52
+ console.log('Generating Services...');
53
+ (0, child_process_1.execSync)(`node ${path.join(scriptsDir, 'generate-services.js')}`, {
54
+ stdio: 'inherit',
55
+ });
56
+ console.log('Generating Controllers...');
57
+ (0, child_process_1.execSync)(`node ${path.join(scriptsDir, 'generate-controllers.js')}`, {
58
+ stdio: 'inherit',
59
+ });
60
+ // console.log('Generating Session Schema...');
61
+ // execSync(`node ${path.join(scriptsDir, 'generate-session-schema.js')}`, {
62
+ // stdio: 'inherit',
63
+ // });
64
+ console.log('All generators ran successfully.');
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-controllers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-controllers.d.ts","sourceRoot":"","sources":["../../src/config/generate-controllers.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const path = __importStar(require("path"));
38
+ const utils_1 = require("./utils");
39
+ const modelsPath = path.join(process.cwd(), 'src/generated');
40
+ const modulesOutputPath = path.join(process.cwd(), 'src/modules');
41
+ /**
42
+ * Generic controller template for a given model
43
+ * @param model
44
+ * @param folder
45
+ */
46
+ const genericControllerTemplate = (model, folder) => `
47
+ import { Controller } from '@nestjs/common';
48
+ import { ${model}Service } from './${folder}.service';
49
+ import { ${model} } from '@prisma/client';
50
+ import { CoreController } from 'appx-core';
51
+
52
+ @Controller('${model.toLowerCase()}s')
53
+ export class ${model}Controller extends CoreController<${model}> {
54
+ constructor(protected readonly service: ${model}Service) {
55
+ super(service);
56
+ }
57
+
58
+ static get entityName(): string {
59
+ return '${model}';
60
+ }
61
+ }
62
+ `;
63
+ /**
64
+ * Generate controllers for each model
65
+ */
66
+ fs.readdirSync(modelsPath).forEach((folder) => {
67
+ if (folder === 'prisma' || folder === 'schema.gql' || folder === 'session')
68
+ return;
69
+ const modelName = (0, utils_1.kebabToPascalCase)(folder); // Capitalize model name e.g., 'Comment', 'Post'
70
+ const modelOutputPath = path.join(modulesOutputPath, folder);
71
+ if (!fs.existsSync(modelOutputPath)) {
72
+ fs.mkdirSync(modelOutputPath, { recursive: true });
73
+ console.log(`Folder for model ${modelName} created.`);
74
+ }
75
+ else {
76
+ console.log(`Folder for model ${modelName} already exists, skipping creation.`);
77
+ }
78
+ /**
79
+ * Create the controller file
80
+ */
81
+ const controllerPath = path.join(modelOutputPath, `${folder}.controller.ts`);
82
+ (0, utils_1.createFileIfNotExists)(controllerPath, genericControllerTemplate(modelName, folder));
83
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-modules.d.ts","sourceRoot":"","sources":["../../src/config/generate-modules.ts"],"names":[],"mappings":""}