@simitgroup/simpleapp-generator 1.0.32 → 1.0.35
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/.vscode/settings.json +3 -0
- package/README.md +185 -16
- package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +39 -0
- package/buildinschemas copy/branch.branch.jsonschema.json +41 -0
- package/buildinschemas copy/docnoformat.docno.jsonschema.json +41 -0
- package/buildinschemas copy/organization.org.jsonschema.json +50 -0
- package/buildinschemas copy/permission.perm.jsonschema.json +23 -0
- package/buildinschemas copy/permission.perm.jsonschema.try.json +25 -0
- package/buildinschemas copy/tenant.tenant.jsonschema.json +21 -0
- package/buildinschemas copy/tenant.tenant.jsonschema.try.json +27 -0
- package/buildinschemas copy/user.user.jsonschema.json +31 -0
- package/dist/buildinschemas/autoincreament.d.ts +3 -0
- package/dist/buildinschemas/autoincreament.d.ts.map +1 -0
- package/dist/buildinschemas/autoincreament.js +36 -0
- package/dist/buildinschemas/autoincreament.js.map +1 -0
- package/dist/buildinschemas/branch.d.ts +3 -0
- package/dist/buildinschemas/branch.d.ts.map +1 -0
- package/dist/buildinschemas/branch.js +41 -0
- package/dist/buildinschemas/branch.js.map +1 -0
- package/dist/buildinschemas/docnoformat.d.ts +3 -0
- package/dist/buildinschemas/docnoformat.d.ts.map +1 -0
- package/dist/buildinschemas/docnoformat.js +60 -0
- package/dist/buildinschemas/docnoformat.js.map +1 -0
- package/dist/buildinschemas/index.d.ts +8 -0
- package/dist/buildinschemas/index.d.ts.map +1 -0
- package/dist/buildinschemas/index.js +18 -0
- package/dist/buildinschemas/index.js.map +1 -0
- package/dist/buildinschemas/organization.d.ts +3 -0
- package/dist/buildinschemas/organization.d.ts.map +1 -0
- package/dist/buildinschemas/organization.js +34 -0
- package/dist/buildinschemas/organization.js.map +1 -0
- package/dist/buildinschemas/permission.d.ts +3 -0
- package/dist/buildinschemas/permission.d.ts.map +1 -0
- package/dist/buildinschemas/permission.js +34 -0
- package/dist/buildinschemas/permission.js.map +1 -0
- package/dist/buildinschemas/tenant.d.ts +3 -0
- package/dist/buildinschemas/tenant.d.ts.map +1 -0
- package/dist/buildinschemas/tenant.js +41 -0
- package/dist/buildinschemas/tenant.js.map +1 -0
- package/dist/buildinschemas/user.d.ts +3 -0
- package/dist/buildinschemas/user.d.ts.map +1 -0
- package/dist/buildinschemas/user.js +31 -0
- package/dist/buildinschemas/user.js.map +1 -0
- package/dist/constant.d.ts +4 -0
- package/dist/constant.d.ts.map +1 -0
- package/dist/constant.js +2 -1
- package/dist/constant.js.map +1 -1
- package/dist/framework.d.ts +10 -0
- package/dist/framework.d.ts.map +1 -0
- package/dist/framework.js +120 -68
- package/dist/framework.js.map +1 -1
- package/dist/generate-allow-changebackend.js +305 -0
- package/dist/generate-allow-changebackend.js.map +1 -0
- package/dist/generate.d.ts +2 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +310 -230
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -20
- package/dist/index.js.map +1 -1
- package/dist/libs.d.ts +2 -0
- package/dist/libs.d.ts.map +1 -0
- package/dist/processors/groupsbuilder.js +2 -0
- package/dist/processors/groupsbuilder.js.map +1 -0
- package/dist/processors/jsonschemabuilder.d.ts +4 -0
- package/dist/processors/jsonschemabuilder.d.ts.map +1 -0
- package/dist/processors/jsonschemabuilder.js +146 -172
- package/dist/processors/jsonschemabuilder.js.map +1 -1
- package/dist/schematype/baseschema.js +25 -0
- package/dist/schematype/baseschema.js.map +1 -0
- package/dist/schematype/default.js +2 -0
- package/dist/schematype/default.js.map +1 -0
- package/dist/schematype/index.js +12 -0
- package/dist/schematype/index.js.map +1 -0
- package/dist/schematype/primarymasterdata.js +38 -0
- package/dist/schematype/primarymasterdata.js.map +1 -0
- package/dist/schematype/simple.js +24 -0
- package/dist/schematype/simple.js.map +1 -0
- package/dist/schematype/simplemasterdata.js +31 -0
- package/dist/schematype/simplemasterdata.js.map +1 -0
- package/dist/schematype/transaction.js +74 -0
- package/dist/schematype/transaction.js.map +1 -0
- package/dist/storage.d.ts +3 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +2 -2
- package/dist/storage.js.map +1 -1
- package/dist/type.d.ts +164 -0
- package/dist/type.d.ts.map +1 -0
- package/dist/type.js +16 -1
- package/dist/type.js.map +1 -1
- package/dist/validation.d.ts +1 -0
- package/dist/validation.d.ts.map +1 -0
- package/documentation/designconcept.bpmn +349 -0
- package/documentation/documentation.png +0 -0
- package/documentation/infra.drawio +141 -0
- package/documentation/infra.png +0 -0
- package/documentation/management.drawio +57 -0
- package/documentation/stack.drawio +106 -0
- package/package.json +3 -1
- package/src/buildinschemas/autoincreament.ts +34 -0
- package/src/buildinschemas/branch.ts +39 -0
- package/src/buildinschemas/docnoformat.ts +58 -0
- package/src/buildinschemas/index.ts +7 -0
- package/src/buildinschemas/organization.ts +31 -0
- package/src/buildinschemas/permission.ts +31 -0
- package/src/buildinschemas/tenant.ts +38 -0
- package/src/buildinschemas/user.ts +28 -0
- package/src/constant.ts +2 -1
- package/src/framework.ts +126 -67
- package/src/generate.ts +327 -266
- package/src/generate.ts.backup +339 -0
- package/src/index.ts +93 -18
- package/src/processors/jsonschemabuilder.ts +199 -226
- package/src/processors/jsonschemabuilder.ts-old +383 -0
- package/src/storage.ts +1 -1
- package/src/type.ts +94 -27
- package/templates/basic/nest/controller.ts.eta +255 -0
- package/templates/basic/nest/default.ts.eta +42 -0
- package/templates/basic/{model.eta → nest/model.ts.eta} +18 -5
- package/templates/basic/nest/processor.ts.eta +129 -0
- package/templates/basic/nest/service.ts.eta +64 -0
- package/templates/basic/{type.eta → nest/type.ts.eta} +3 -3
- package/templates/basic/nuxt/default.ts.eta +42 -0
- package/templates/basic/{pageindex.vue.eta → nuxt/pages.crud.vue.eta} +85 -22
- package/templates/basic/nuxt/simpleapp.doc.ts.eta +11 -0
- package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +212 -0
- package/templates/nest/.env.eta +31 -0
- package/templates/nest/.gitignore.eta +40 -0
- package/templates/nest/src/app.controller.ts.eta +19 -0
- package/templates/nest/src/app.module.ts.eta +77 -0
- package/templates/nest/src/app.service.ts.eta +9 -0
- package/templates/nest/src/main.ts.eta +58 -0
- package/templates/nest/src/simpleapp/generate/apischemas/index.ts.eta +16 -0
- package/templates/nest/src/simpleapp/generate/commons/decorators/appuser.decorator.ts.eta +8 -0
- package/templates/nest/src/simpleapp/generate/commons/dicts/foreignkeys.ts.eta +1 -0
- package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +101 -0
- package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +39 -0
- package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +38 -0
- package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +88 -0
- package/templates/nest/{Workflow.eta → src/simpleapp/generate/commons/providers/workflow.provider.ts.etax} +20 -14
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.decorator.ts.eta +6 -0
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.enum.ts.eta +28 -0
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +10 -0
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +34 -0
- package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +391 -0
- package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +71 -0
- package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +53 -0
- package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +45 -0
- package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +57 -0
- package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +624 -0
- package/templates/nest/src/simpleapp/generate/types/index.ts.eta +19 -0
- package/templates/nest/src/simpleapp/profile/profile.apischema.ts.eta +74 -0
- package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +110 -0
- package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +195 -0
- package/templates/nest/src/simpleapp/profile/profile.types.ts.eta +18 -0
- package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +89 -0
- package/templates/nest/src/simpleapp/services/branch.service.ts.eta +66 -0
- package/templates/nest/src/simpleapp/services/docno.service.ts.eta +93 -0
- package/templates/nest/src/simpleapp/services/org.service.ts.eta +67 -0
- package/templates/nest/src/simpleapp/services/perm.service.ts.eta +102 -0
- package/templates/nest/src/simpleapp/services/tenant.service.ts.eta +69 -0
- package/templates/nest/src/simpleapp/services/user.service.ts.eta +66 -0
- package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +43 -0
- package/templates/nuxt/.env.eta +21 -0
- package/templates/nuxt/.gitignore.eta +28 -0
- package/templates/nuxt/app.vue.eta +5 -2
- package/templates/nuxt/assets/css/tailwind.css.eta +35 -0
- package/templates/nuxt/components/CrudNestedDoc.vue.eta +164 -0
- package/templates/nuxt/components/CrudSimple.vue.eta +179 -0
- package/templates/nuxt/{components.debugdocdata.vue.eta → components/DebugDocumentData.vue.eta} +4 -1
- package/templates/nuxt/{components.eventmonitor.vue.eta → components/EventMonitor.vue.eta} +27 -27
- package/templates/nuxt/components/Invitation.vue.eta +50 -0
- package/templates/nuxt/components/Menus.vue.eta +58 -0
- package/templates/nuxt/components/PermissionInfo.vue.eta +92 -0
- package/templates/nuxt/components/SimpleAppAutocomplete.vue.eta +131 -0
- package/templates/nuxt/components/SimpleAppAutocompletemulti.vue.eta +73 -0
- package/templates/nuxt/components/SimpleAppCalendar.vue.eta +55 -0
- package/templates/nuxt/components/SimpleAppCheckbox.vue.eta +29 -0
- package/templates/nuxt/components/SimpleAppChip.vue.eta +28 -0
- package/templates/nuxt/components/SimpleAppColor.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppDatatable.vue.eta +20 -0
- package/templates/nuxt/components/SimpleAppDocumentNo.vue.eta +90 -0
- package/templates/nuxt/components/SimpleAppDynamicInput.vue.eta +29 -0
- package/templates/nuxt/components/SimpleAppEditor.vue.eta +31 -0
- package/templates/nuxt/components/SimpleAppForm.vue.eta +131 -0
- package/templates/nuxt/components/SimpleAppInputTable.vue.eta +104 -0
- package/templates/nuxt/components/SimpleAppList.vue.eta +38 -0
- package/templates/nuxt/components/SimpleAppListmulti.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppNumber.vue.eta +32 -0
- package/templates/nuxt/components/SimpleAppPassword.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppRadio.vue.eta +42 -0
- package/templates/nuxt/components/SimpleAppRating.vue.eta +41 -0
- package/templates/nuxt/components/SimpleAppSelect.vue.eta +38 -0
- package/templates/nuxt/components/SimpleAppSelectmulti.vue.eta +39 -0
- package/templates/nuxt/components/SimpleAppSlider.vue.eta +42 -0
- package/templates/nuxt/components/SimpleAppSwitch.vue.eta +30 -0
- package/templates/nuxt/components/SimpleAppText.vue.eta +50 -0
- package/templates/nuxt/components/SimpleAppTextarea.vue.eta +30 -0
- package/templates/nuxt/components/SimpleAppValue.vue.eta +86 -0
- package/templates/nuxt/components/SimpleFieldContainer.vue.eta +102 -0
- package/templates/nuxt/components/XorgPicker.vue.eta +66 -0
- package/templates/nuxt/components/helper.ts.eta +90 -0
- package/templates/nuxt/components/type.ts.eta +32 -0
- package/templates/nuxt/composables/docformat.generate.ts.eta +5 -0
- package/templates/nuxt/{composables.getautocomplete.ts.eta → composables/getAutocomplete.generate.ts.eta} +4 -5
- package/templates/nuxt/{composables.getmenus.ts.eta → composables/getMenus.generate.ts.eta} +22 -7
- package/templates/nuxt/composables/getOpenApi.generate.ts.eta +6 -0
- package/templates/nuxt/composables/getTenant.generate.ts.eta +4 -0
- package/templates/nuxt/composables/getUserStore.generate.ts.eta +22 -0
- package/templates/nuxt/composables/logout.generate.ts.eta +22 -0
- package/templates/nuxt/composables/roles.generate.ts.eta +48 -0
- package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -0
- package/templates/nuxt/{layouts.default.vue.eta → layouts/default.vue.eta} +2 -0
- package/templates/nuxt/middleware/10.acl.global.ts.eta +38 -0
- package/templates/nuxt/nuxt.config.ts.eta +12 -2
- package/templates/nuxt/pages/[xorg]/branch/index.vue.eta +102 -0
- package/templates/nuxt/pages/[xorg]/docnoformat/[id].vue.eta +17 -0
- package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +269 -0
- package/templates/nuxt/pages/[xorg]/index.vue.eta +36 -0
- package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +148 -0
- package/templates/nuxt/pages/[xorg]/permission/index.vue.eta +280 -0
- package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +93 -0
- package/templates/nuxt/pages/[xorg]/user/index.vue.eta +468 -0
- package/templates/nuxt/pages/index.vue.eta +191 -0
- package/templates/nuxt/pages/login.vue.eta +21 -0
- package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +53 -0
- package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +155 -0
- package/templates/nuxt/plugins/50.simpleapp-client.ts.eta +23 -0
- package/templates/nuxt/{server.api.ts.eta → server/api/[xorg]/[...].ts.eta} +5 -2
- package/templates/nuxt/server/api/auth/[...].ts.eta +68 -0
- package/templates/nuxt/{server.api.auth.logout.ts.eta → server/api/auth/logout.ts.eta} +1 -3
- package/templates/nuxt/server/api/profile/[...].ts.eta +150 -0
- package/templates/nuxt/server/api/profile/index.ts.eta +103 -0
- package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +187 -0
- package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -0
- package/templates/nuxt/simpleapp/generate/commons/events.ts.eta +5 -0
- package/templates/nuxt/simpleapp/generate/commons/groups.ts.eta +11 -0
- package/templates/nuxt/simpleapp/generate/commons/roles.ts.eta +21 -0
- package/templates/nuxt/types/index.ts.eta +65 -0
- package/templates/project/README.md +11 -0
- package/templates/project/build.sh.eta +17 -0
- package/templates/project/config.json.eta +2 -0
- package/templates/project/generate.ts.eta +10 -0
- package/templates/project/schemas/category.ts.eta +26 -0
- package/templates/project/schemas/index.ts.eta +5 -0
- package/templates/project/schemas/product.ts.eta +59 -0
- package/templates/project/shares/hello.ts.eta +1 -0
- package/templates/project/shares/index.ts.eta +2 -0
- package/tsconfig.json +9 -2
- package/tsconfig.tsbuildinfo +1 -0
- package/definations/category.cat.jsonschema.json +0 -55
- package/definations/level.lvl.jsonschema.json +0 -48
- package/definations/product.prd.jsonschema.json +0 -46
- package/templates/basic/controller.eta +0 -152
- package/templates/basic/module.eta +0 -22
- package/templates/basic/service.eta +0 -62
- package/templates/basic/simpleappclient.eta +0 -120
- package/templates/nest/SimpleAppController.eta +0 -69
- package/templates/nest/SimpleAppService.eta +0 -366
- package/templates/nest/TenantMiddleware.eta +0 -34
- package/templates/nest/UserProvider.eta +0 -127
- package/templates/nest/app.controller.eta +0 -12
- package/templates/nest/app.module.eta +0 -64
- package/templates/nest/app.service.eta +0 -8
- package/templates/nest/inputvalidation-exception.eta +0 -6
- package/templates/nest/nest.env.eta +0 -28
- package/templates/nest/nest.main.eta +0 -31
- package/templates/nuxt/components.crudsimple.vue.eta +0 -124
- package/templates/nuxt/components.menus.vue.eta +0 -35
- package/templates/nuxt/env.eta +0 -17
- package/templates/nuxt/pages.[xorg].index.vue.eta +0 -20
- package/templates/nuxt/pages.index.vue.eta +0 -72
- package/templates/nuxt/pages.login.vue.eta +0 -20
- package/templates/nuxt/plugins.simpleapp.ts.eta +0 -88
- package/templates/nuxt/server.api.auth[...].ts.eta +0 -233
- package/templates/nuxt/tailwind.css.eta +0 -49
- /package/templates/basic/{apischema.eta → nest/apischema.ts.eta} +0 -0
- /package/templates/basic/{jsonschema.eta → nest/jsonschema.ts.eta} +0 -0
- /package/templates/basic/{pageindexwithid.vue.eta → nuxt/pages.[id].vue.eta} +0 -0
- /package/templates/nest/{oauth2-redirect.eta → public_html/oauth2-redirect.html.eta} +0 -0
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
import { Injectable, Logger } from '@nestjs/common';
|
|
2
|
-
import { InjectModel } from '@nestjs/mongoose';
|
|
3
|
-
import { Model } from 'mongoose';
|
|
4
|
-
import Ajv from 'ajv';
|
|
5
|
-
import addFormats from 'ajv-formats';
|
|
6
|
-
import addErrors from 'ajv-errors';
|
|
7
|
-
import foreignkeys from '../dicts/foreignkeys.json';
|
|
8
|
-
import { Workflow } from './Workflow';
|
|
9
|
-
import {
|
|
10
|
-
NotFoundException,
|
|
11
|
-
InternalServerErrorException,
|
|
12
|
-
} from '@nestjs/common/exceptions';
|
|
13
|
-
import { UserProvider } from './UserProvider';
|
|
14
|
-
|
|
15
|
-
export enum IsolationType {
|
|
16
|
-
'none' = 'none',
|
|
17
|
-
'org' = 'org',
|
|
18
|
-
'tenant' = 'tenant',
|
|
19
|
-
'branch' = 'branch',
|
|
20
|
-
}
|
|
21
|
-
export enum HookType {
|
|
22
|
-
'init' = 'init',
|
|
23
|
-
'beforeSearch' = 'beforeSearch',
|
|
24
|
-
'afterSearch' = 'afterSearch',
|
|
25
|
-
'beforeValidation' = 'beforeValidation',
|
|
26
|
-
'afterValidation' = 'afterValidation',
|
|
27
|
-
'beforeCreate' = 'beforeCreate',
|
|
28
|
-
'afterCreate' = 'afterCreate',
|
|
29
|
-
'beforeUpdate' = 'beforeUpdate',
|
|
30
|
-
'afterUpdate' = 'afterUpdate',
|
|
31
|
-
'beforeDelete' = 'beforeDelete',
|
|
32
|
-
'afterDelete' = 'afterDelete',
|
|
33
|
-
'beforeFetchRecord' = 'beforeFetchRecord',
|
|
34
|
-
'afterFetchRecord' = 'afterFetchRecord',
|
|
35
|
-
}
|
|
36
|
-
export type MoreProjectionType = {
|
|
37
|
-
[key: string]: string;
|
|
38
|
-
};
|
|
39
|
-
@Injectable()
|
|
40
|
-
export class SimpleAppService<T extends { _id?: string }> {
|
|
41
|
-
protected logger = new Logger();
|
|
42
|
-
protected jsonschema = { type: 'object', properties: {}, required: [] };
|
|
43
|
-
protected documentIdentityCode = 'code';
|
|
44
|
-
protected documentIdentityName = 'label';
|
|
45
|
-
protected documentName = '-unknowndocname-';
|
|
46
|
-
protected documentType = '-unknowndoctype-';
|
|
47
|
-
protected LIMITPERPAGE = 20;
|
|
48
|
-
protected moreAutoCompleteField: MoreProjectionType = {};
|
|
49
|
-
protected isolationtype: IsolationType = IsolationType.org;
|
|
50
|
-
protected isolationFilter: any = {};
|
|
51
|
-
protected data: T = { _id: '' } as T;
|
|
52
|
-
private doc: Model<T>; //set private to prevent developer break data isolation control
|
|
53
|
-
protected errorlist = [];
|
|
54
|
-
constructor(
|
|
55
|
-
doctype: string,
|
|
56
|
-
docname: string,
|
|
57
|
-
newdoc: Model<T>,
|
|
58
|
-
isolationtype: IsolationType = IsolationType.org,
|
|
59
|
-
) {
|
|
60
|
-
this.documentType = doctype;
|
|
61
|
-
this.documentName = docname;
|
|
62
|
-
this.doc = newdoc;
|
|
63
|
-
this.isolationtype = isolationtype;
|
|
64
|
-
this.hook(HookType.init, this.documentName);
|
|
65
|
-
// this.tenantdoc = tenantdoc
|
|
66
|
-
}
|
|
67
|
-
getRecordId = (): string => this.data._id;
|
|
68
|
-
setSchema = (newschema) => (this.jsonschema = newschema);
|
|
69
|
-
getSchema = () => this.doc.schema.obj;
|
|
70
|
-
getData = () => {
|
|
71
|
-
//console.log('thisdata', this.data);
|
|
72
|
-
return this.data;
|
|
73
|
-
};
|
|
74
|
-
setData = (newdata: T) => {
|
|
75
|
-
delete newdata._id;
|
|
76
|
-
this.data = { ...newdata };
|
|
77
|
-
return this;
|
|
78
|
-
};
|
|
79
|
-
getIsolationFilter = () => {
|
|
80
|
-
let isolationFilter = {};
|
|
81
|
-
switch (this.isolationtype) {
|
|
82
|
-
case 'none':
|
|
83
|
-
isolationFilter = {};
|
|
84
|
-
break;
|
|
85
|
-
case 'branch':
|
|
86
|
-
isolationFilter = UserProvider.getInstance().getBranchFilter();
|
|
87
|
-
break;
|
|
88
|
-
case 'tenant':
|
|
89
|
-
isolationFilter = UserProvider.getInstance().getTenantFilter();
|
|
90
|
-
break;
|
|
91
|
-
case 'org':
|
|
92
|
-
default:
|
|
93
|
-
isolationFilter = UserProvider.getInstance().getOrgFilter();
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
return isolationFilter;
|
|
97
|
-
};
|
|
98
|
-
async list() {
|
|
99
|
-
try {
|
|
100
|
-
//console.log("this.isolationFilter",this.getIsolationFilter())
|
|
101
|
-
const products = await this.doc.find(this.getIsolationFilter());
|
|
102
|
-
// console.log(products)
|
|
103
|
-
const productlist = products.map((p: T) => {
|
|
104
|
-
return p;
|
|
105
|
-
});
|
|
106
|
-
// console.log(products);
|
|
107
|
-
return productlist;
|
|
108
|
-
} catch (err) {
|
|
109
|
-
throw new InternalServerErrorException(err.message);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
addAutoCompleteField = (morefield: MoreProjectionType) => {
|
|
113
|
-
const props = Object.getOwnPropertyNames(morefield);
|
|
114
|
-
console.log('addAutoCompleteField', props);
|
|
115
|
-
for (let i = 0; i < props.length; i++) {
|
|
116
|
-
const key = props[i];
|
|
117
|
-
this.moreAutoCompleteField[key] = '$' + morefield[key];
|
|
118
|
-
}
|
|
119
|
-
console.log(this.moreAutoCompleteField);
|
|
120
|
-
};
|
|
121
|
-
async getAutoComplete(keyword: string) {
|
|
122
|
-
try {
|
|
123
|
-
const filter1 = {};
|
|
124
|
-
const filter2 = {};
|
|
125
|
-
filter1[this.documentIdentityCode] = { $regex: keyword, $options: 'i' };
|
|
126
|
-
filter2[this.documentIdentityName] = { $regex: keyword, $options: 'i' };
|
|
127
|
-
const filterobj = { $or: [filter1, filter2] };
|
|
128
|
-
|
|
129
|
-
Object.assign(filterobj, this.getIsolationFilter());
|
|
130
|
-
let projections = {
|
|
131
|
-
id: `\$_id`,
|
|
132
|
-
label: `\$${this.documentIdentityCode}`,
|
|
133
|
-
name: `\$${this.documentIdentityName}`,
|
|
134
|
-
};
|
|
135
|
-
if (this.moreAutoCompleteField) {
|
|
136
|
-
Object.assign(projections, this.moreAutoCompleteField);
|
|
137
|
-
}
|
|
138
|
-
const products = await this.doc.find(filterobj, projections, {
|
|
139
|
-
limit: this.LIMITPERPAGE,
|
|
140
|
-
});
|
|
141
|
-
const productlist = products.map((p: T) => {
|
|
142
|
-
return p;
|
|
143
|
-
});
|
|
144
|
-
return productlist;
|
|
145
|
-
} catch (err) {
|
|
146
|
-
throw new InternalServerErrorException(err.message);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
async search(filters: Object) {
|
|
150
|
-
try {
|
|
151
|
-
Object.assign(filters, this.getIsolationFilter());
|
|
152
|
-
await this.hook(HookType.beforeSearch, filters);
|
|
153
|
-
const products = await this.doc.find(filters);
|
|
154
|
-
const productlist = products.map((p: T) => {
|
|
155
|
-
return p;
|
|
156
|
-
});
|
|
157
|
-
await this.hook(HookType.afterSearch, productlist);
|
|
158
|
-
// console.log(products);
|
|
159
|
-
return productlist;
|
|
160
|
-
} catch (err) {
|
|
161
|
-
throw new InternalServerErrorException(err.message);
|
|
162
|
-
}
|
|
163
|
-
// return this;
|
|
164
|
-
}
|
|
165
|
-
async findById(id: string) {
|
|
166
|
-
await this.hook(HookType.beforeFetchRecord, id);
|
|
167
|
-
const data = await this.search({ _id: id });
|
|
168
|
-
await this.hook(HookType.afterFetchRecord, data);
|
|
169
|
-
if (data.length == 1) {
|
|
170
|
-
// console.log('data0', data[0]);
|
|
171
|
-
return data[0];
|
|
172
|
-
} else {
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
async create() {
|
|
178
|
-
let result;
|
|
179
|
-
|
|
180
|
-
try {
|
|
181
|
-
await this.hook(HookType.beforeCreate, this.data);
|
|
182
|
-
Object.assign(this.data, UserProvider.getInstance().getCreateFilter());
|
|
183
|
-
delete this.data._id;
|
|
184
|
-
await this.validateData(this.data);
|
|
185
|
-
const newdoc = new this.doc(this.data);
|
|
186
|
-
result = await newdoc.save();
|
|
187
|
-
await this.hook(HookType.afterCreate, result);
|
|
188
|
-
} catch (err) {
|
|
189
|
-
throw new InternalServerErrorException(err.message);
|
|
190
|
-
}
|
|
191
|
-
return result as T;
|
|
192
|
-
}
|
|
193
|
-
async update() {
|
|
194
|
-
const id: string = this.getRecordId();
|
|
195
|
-
Object.assign(this.data, UserProvider.getInstance().getUpdateFilter());
|
|
196
|
-
await this.findIdThenUpdate(id, this.data);
|
|
197
|
-
}
|
|
198
|
-
async delete() {
|
|
199
|
-
const id: string = this.getRecordId();
|
|
200
|
-
const dependency = await this.getRelatedRecords(id);
|
|
201
|
-
if (!dependency) {
|
|
202
|
-
return await this.findIdThenDelete(id);
|
|
203
|
-
} else {
|
|
204
|
-
return dependency;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
hook = async (type: string, data?: any) => {
|
|
208
|
-
// console.log('Default hook', data);
|
|
209
|
-
return true;
|
|
210
|
-
};
|
|
211
|
-
async validateData(data: T) {
|
|
212
|
-
const ajv = new Ajv({ allErrors: true });
|
|
213
|
-
addFormats(ajv);
|
|
214
|
-
addErrors(ajv);
|
|
215
|
-
|
|
216
|
-
ajv.addFormat('x-document-no', /.*$/);
|
|
217
|
-
ajv.addFormat('x-document-label', /.*$/);
|
|
218
|
-
ajv.addFormat('tel', /^$|^\d{7,15}$/gm);
|
|
219
|
-
ajv.addFormat('x-text', /.*$/);
|
|
220
|
-
ajv.addFormat('x-html', /.*$/);
|
|
221
|
-
|
|
222
|
-
ajv.addKeyword({ keyword: 'x-document-status', type: 'array' });
|
|
223
|
-
ajv.addKeyword({ keyword: 'x-document-api', type: 'array' });
|
|
224
|
-
ajv.addKeyword({ keyword: 'x-ignore-autocomplete', type: 'boolean' });
|
|
225
|
-
ajv.addKeyword({ keyword: 'x-isolation-type', type: 'string' });
|
|
226
|
-
ajv.addKeyword({ keyword: 'x-document-type', type: 'string' });
|
|
227
|
-
ajv.addKeyword({ keyword: 'x-document-name', type: 'string' });
|
|
228
|
-
ajv.addKeyword({ keyword: 'x-collection-name', type: 'string' });
|
|
229
|
-
ajv.addKeyword({ keyword: 'x-autocomplete-field', type: 'boolean' });
|
|
230
|
-
ajv.addKeyword({ keyword: 'x-foreignkey', type: 'string' });
|
|
231
|
-
|
|
232
|
-
const issuccess = await this.hook(HookType.beforeValidation, data);
|
|
233
|
-
if (!issuccess) {
|
|
234
|
-
const erromsg: string[] = [];
|
|
235
|
-
for (let i = 0; i < this.errorlist.length; i++) {
|
|
236
|
-
erromsg.push(this.errorlist[i].message);
|
|
237
|
-
}
|
|
238
|
-
this.logger.log('run hook during validation');
|
|
239
|
-
throw new InternalServerErrorException(erromsg.join('\n'));
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
let validate;
|
|
243
|
-
try {
|
|
244
|
-
validate = ajv.compile(this.jsonschema);
|
|
245
|
-
} catch (err) {
|
|
246
|
-
this.logger.error('compile error', err);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const valid = validate(data);
|
|
250
|
-
if (!valid) {
|
|
251
|
-
this.logger.error(validate.errors);
|
|
252
|
-
const erromsg: string[] = [];
|
|
253
|
-
for (let i = 0; i < ajv.errors.length; i++) {
|
|
254
|
-
erromsg.push(ajv.errors[i].message);
|
|
255
|
-
}
|
|
256
|
-
this.logger.error('ajv erromsg: ', erromsg);
|
|
257
|
-
throw new InternalServerErrorException(erromsg.join('\n'));
|
|
258
|
-
}
|
|
259
|
-
await this.hook(HookType.afterValidation, data);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
async findIdThenDelete(id: string): Promise<any> {
|
|
263
|
-
// const data = await this.findById(id);
|
|
264
|
-
try {
|
|
265
|
-
await this.hook(HookType.beforeDelete, id);
|
|
266
|
-
//console.log('deletedeletedeletedelete');
|
|
267
|
-
const dependency = await this.getRelatedRecords(id);
|
|
268
|
-
if (!dependency) {
|
|
269
|
-
let filter = this.getIsolationFilter();
|
|
270
|
-
filter['_id'] = id;
|
|
271
|
-
const deleteresult = await this.doc.deleteOne(filter);
|
|
272
|
-
// this.doc.findByIdAndDelete(id)
|
|
273
|
-
await this.hook(HookType.afterDelete, deleteresult);
|
|
274
|
-
//this.doc.findByIdAndDelete(id);
|
|
275
|
-
return deleteresult;
|
|
276
|
-
} else {
|
|
277
|
-
return Promise.reject(dependency);
|
|
278
|
-
}
|
|
279
|
-
} catch (err) {
|
|
280
|
-
throw new InternalServerErrorException(err.message);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
updateOne = async (data: T) => {
|
|
285
|
-
this.doc.updateOne(data);
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
findIdThenUpdate = async (id: string, data: T) => {
|
|
289
|
-
const existingdata = await this.findById(id);
|
|
290
|
-
await this.hook(HookType.beforeUpdate, data);
|
|
291
|
-
try {
|
|
292
|
-
Object.assign(data, UserProvider.getInstance().getUpdateFilter());
|
|
293
|
-
Object.assign(existingdata, data);
|
|
294
|
-
await this.validateData(data);
|
|
295
|
-
let filter = this.getIsolationFilter();
|
|
296
|
-
filter['_id'] = id;
|
|
297
|
-
const result = await this.doc.findOneAndUpdate(filter, data);
|
|
298
|
-
await this.hook(HookType.afterUpdate, data);
|
|
299
|
-
return result;
|
|
300
|
-
} catch (err) {
|
|
301
|
-
throw new InternalServerErrorException(err.message);
|
|
302
|
-
}
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
//find what foreign key constraint
|
|
306
|
-
async getRelatedRecords(id: string) {
|
|
307
|
-
const foreignkeysettings = foreignkeys[this.documentName];
|
|
308
|
-
//console.log('foreignkeysettings', foreignkeysettings);
|
|
309
|
-
const propkeys = Object.getOwnPropertyNames(foreignkeysettings);
|
|
310
|
-
|
|
311
|
-
if (propkeys.length > 0) {
|
|
312
|
-
//console.log('Have properties');
|
|
313
|
-
for (let i = 0; i < propkeys.length; i++) {
|
|
314
|
-
const collectionname = propkeys[i];
|
|
315
|
-
//console.log('run ', i, collectionname);
|
|
316
|
-
const fobjs = foreignkeysettings[propkeys[i]];
|
|
317
|
-
const collection = this.doc.db.collection(collectionname);
|
|
318
|
-
//single schema may have multiple foreign key link here, loop all
|
|
319
|
-
for (let j = 0; j < fobjs.length; j++) {
|
|
320
|
-
const fkey = fobjs[j] + '._id';
|
|
321
|
-
const filter = {};
|
|
322
|
-
filter[fkey] = id;
|
|
323
|
-
//console.log('getRelatedRecords get filter', collectionname, filter);
|
|
324
|
-
const result = await collection.findOne(filter);
|
|
325
|
-
//console.log('getRelatedRecords', result);
|
|
326
|
-
if (result) {
|
|
327
|
-
return Promise.reject(result);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
return Promise.resolve(null);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* change property documentStatus for specific document, no workflow execution
|
|
337
|
-
* @param id
|
|
338
|
-
* @param docstatus
|
|
339
|
-
* @returns Promise
|
|
340
|
-
*/
|
|
341
|
-
async setDocumentStatus(id: string, docstatus: string) {
|
|
342
|
-
const partialdata: T = {} as T;
|
|
343
|
-
partialdata['documentStatus'] = docstatus;
|
|
344
|
-
return this.findIdThenUpdate(id, partialdata);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* change property documentStatus for specific document, no workflow execution
|
|
349
|
-
* @param id
|
|
350
|
-
* @param docstatus
|
|
351
|
-
* @returns Promise
|
|
352
|
-
*/
|
|
353
|
-
async executeWorkFlow(id: string, bpmnname: string, docstatus: string) {
|
|
354
|
-
const data = await this.findById(id);
|
|
355
|
-
return Workflow.getInstance().executeWorkFlow(
|
|
356
|
-
id,
|
|
357
|
-
bpmnname,
|
|
358
|
-
docstatus,
|
|
359
|
-
data,
|
|
360
|
-
);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
async getMyUserTask() {
|
|
364
|
-
return Workflow.getInstance().getMyUserTask();
|
|
365
|
-
}
|
|
366
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { Injectable, NestMiddleware, Scope } from '@nestjs/common';
|
|
2
|
-
import { Request, Response, NextFunction } from 'express';
|
|
3
|
-
// import * as jwt from 'nestjs-jwt'
|
|
4
|
-
|
|
5
|
-
import { UserProvider } from './UserProvider';
|
|
6
|
-
// import {KeycloakConfigService} from "../keycloak/keycloak.service"
|
|
7
|
-
@Injectable({
|
|
8
|
-
scope: Scope.REQUEST,
|
|
9
|
-
})
|
|
10
|
-
export class TenantMiddleware implements NestMiddleware {
|
|
11
|
-
use(req: Request, res: Response, next: NextFunction) {
|
|
12
|
-
if (req.baseUrl == '/oauth2-redirect.html') {
|
|
13
|
-
next();
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
if (!req.headers['authorization']) {
|
|
17
|
-
return res.status(401).send('Undefine bearer token');
|
|
18
|
-
}
|
|
19
|
-
if (!req.headers['x-org']) {
|
|
20
|
-
return res.status(401).send('undefine header string x-org');
|
|
21
|
-
}
|
|
22
|
-
const u = UserProvider.getInstance();
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
u.setXorg(req.headers['x-org'].toString());
|
|
26
|
-
let tokenstr: string = req.headers['authorization'];
|
|
27
|
-
tokenstr = tokenstr.replace('Bearer ', '');
|
|
28
|
-
u.setUserToken(tokenstr);
|
|
29
|
-
next();
|
|
30
|
-
} catch {
|
|
31
|
-
return res.status(401).send('Invalid x-org or user info');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { Injectable, Scope } from '@nestjs/common';
|
|
2
|
-
import Base64URL from '@darkwolf/base64url';
|
|
3
|
-
import * as jwt from 'jsonwebtoken';
|
|
4
|
-
|
|
5
|
-
@Injectable({
|
|
6
|
-
scope: Scope.REQUEST,
|
|
7
|
-
})
|
|
8
|
-
export class UserProvider {
|
|
9
|
-
private static instance: UserProvider;
|
|
10
|
-
protected uid: string = '';
|
|
11
|
-
protected uname: string = '';
|
|
12
|
-
protected email: string = '';
|
|
13
|
-
protected fullname: string = '';
|
|
14
|
-
protected xOrg: string = '';
|
|
15
|
-
protected tenantId: number = 0;
|
|
16
|
-
protected orgId: number = 0;
|
|
17
|
-
protected branchId: number = 0;
|
|
18
|
-
protected accessrights: any = {};
|
|
19
|
-
protected token: string = '';
|
|
20
|
-
protected refreshtoken: string = '';
|
|
21
|
-
protected groups: string[] = [];
|
|
22
|
-
constructor() {}
|
|
23
|
-
public static getInstance(): UserProvider {
|
|
24
|
-
if (!UserProvider.instance) {
|
|
25
|
-
UserProvider.instance = new UserProvider();
|
|
26
|
-
}
|
|
27
|
-
return UserProvider.instance;
|
|
28
|
-
}
|
|
29
|
-
getUid = () => this.uid;
|
|
30
|
-
getUname = () => this.uname;
|
|
31
|
-
getFullname = () => this.fullname;
|
|
32
|
-
getTenantId = () => this.tenantId;
|
|
33
|
-
getOrgId = () => this.orgId;
|
|
34
|
-
getBranchId = () => this.branchId;
|
|
35
|
-
getEmail = () => this.email;
|
|
36
|
-
getGroups = () => this.groups;
|
|
37
|
-
setUserToken = (tokenstr: string) => {
|
|
38
|
-
const tokeninfo = jwt.decode(tokenstr);
|
|
39
|
-
// realm_access: {
|
|
40
|
-
// roles: [
|
|
41
|
-
// 'default-roles-simitdeveloper',
|
|
42
|
-
// 'offline_access',
|
|
43
|
-
// 'uma_authorization'
|
|
44
|
-
// ]
|
|
45
|
-
// },
|
|
46
|
-
// resource_access: { account: { roles: [Array] } },
|
|
47
|
-
// scope: 'openid email profile',
|
|
48
|
-
// sid: '53192f53-d4af-413b-b8d7-1e186419fe53',
|
|
49
|
-
// email_verified: false,
|
|
50
|
-
// name: 'kstan kstan',
|
|
51
|
-
// preferred_username: 'kstan',
|
|
52
|
-
// given_name: 'kstan',
|
|
53
|
-
// family_name: 'kstan',
|
|
54
|
-
// email: 'kstan@simitgroup.com'
|
|
55
|
-
|
|
56
|
-
const u = UserProvider.getInstance();
|
|
57
|
-
u.token = tokenstr;
|
|
58
|
-
u.uid = tokeninfo.sub;
|
|
59
|
-
u.email = tokeninfo.email;
|
|
60
|
-
u.uname = tokeninfo.preferred_username;
|
|
61
|
-
u.fullname = tokeninfo.name;
|
|
62
|
-
u.groups = ['superuser', 'accountant', 'directors'];
|
|
63
|
-
u.accessrights = tokeninfo.resource_access;
|
|
64
|
-
};
|
|
65
|
-
getInfo = () => {
|
|
66
|
-
return UserProvider.getInstance();
|
|
67
|
-
};
|
|
68
|
-
getBranchFilter = () => {
|
|
69
|
-
return {
|
|
70
|
-
tenantId: UserProvider.getInstance().tenantId,
|
|
71
|
-
orgId: UserProvider.getInstance().orgId,
|
|
72
|
-
branchId: UserProvider.getInstance().branchId,
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
getTenantFilter = () => {
|
|
76
|
-
return { tenantId: UserProvider.getInstance().tenantId };
|
|
77
|
-
};
|
|
78
|
-
getOrgFilter = () => {
|
|
79
|
-
return {
|
|
80
|
-
tenantId: UserProvider.getInstance().tenantId,
|
|
81
|
-
orgId: UserProvider.getInstance().orgId,
|
|
82
|
-
};
|
|
83
|
-
};
|
|
84
|
-
getWorkflowTaskFilter() {
|
|
85
|
-
return {
|
|
86
|
-
'data.tenantId': UserProvider.getInstance().tenantId,
|
|
87
|
-
'assignments.assignee': UserProvider.getInstance().getUid(),
|
|
88
|
-
// 'assignments.assignee': User.getInstance().getUid(),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
getCreateFilter = () => {
|
|
92
|
-
const u = UserProvider.getInstance();
|
|
93
|
-
return {
|
|
94
|
-
tenantId: u.tenantId,
|
|
95
|
-
orgId: u.orgId,
|
|
96
|
-
branchId: u.branchId,
|
|
97
|
-
createdby: u.uid,
|
|
98
|
-
updatedby: u.uid,
|
|
99
|
-
created: new Date().getTime().toString(),
|
|
100
|
-
updated: new Date().getTime().toString(),
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
getUpdateFilter = () => {
|
|
104
|
-
const u = UserProvider.getInstance();
|
|
105
|
-
return {
|
|
106
|
-
updatedby: u.uid,
|
|
107
|
-
updated: new Date().getTime().toString(),
|
|
108
|
-
};
|
|
109
|
-
};
|
|
110
|
-
setXorg = (xorg) => {
|
|
111
|
-
try {
|
|
112
|
-
const decodedText: string = Base64URL.decodeText(xorg);
|
|
113
|
-
const arrXorg = decodedText.split('-');
|
|
114
|
-
|
|
115
|
-
if (arrXorg.length == 3) {
|
|
116
|
-
const u = UserProvider.getInstance();
|
|
117
|
-
u.tenantId = Number(arrXorg[0]);
|
|
118
|
-
u.orgId = Number(arrXorg[1]);
|
|
119
|
-
u.branchId = Number(arrXorg[2]);
|
|
120
|
-
} else {
|
|
121
|
-
throw 'invalid x-org';
|
|
122
|
-
}
|
|
123
|
-
} catch (err) {
|
|
124
|
-
throw err;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Controller, Get } from '@nestjs/common';
|
|
2
|
-
import { AppService } from './app.service';
|
|
3
|
-
|
|
4
|
-
@Controller()
|
|
5
|
-
export class AppController {
|
|
6
|
-
constructor(private readonly appService: AppService) {}
|
|
7
|
-
|
|
8
|
-
@Get('myworkflowtask')
|
|
9
|
-
async getHello() {
|
|
10
|
-
return await this.appService.getMyTask();
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { Module,MiddlewareConsumer,NestModule } from '@nestjs/common';
|
|
2
|
-
import { MongooseModule } from '@nestjs/mongoose';
|
|
3
|
-
import { APP_GUARD } from '@nestjs/core';
|
|
4
|
-
import {
|
|
5
|
-
AuthGuard, KeycloakConnectModule,
|
|
6
|
-
ResourceGuard,TokenValidation,
|
|
7
|
-
RoleGuard,PolicyEnforcementMode
|
|
8
|
-
} from 'nest-keycloak-connect';
|
|
9
|
-
import { ConfigModule } from '@nestjs/config';
|
|
10
|
-
import { ServeStaticModule } from '@nestjs/serve-static';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
import {TenantMiddleware} from './class/TenantMiddleware'
|
|
13
|
-
import {AppController} from './app.controller'
|
|
14
|
-
import {AppService} from './app.service'
|
|
15
|
-
<% for(let i=0;i<it.length; i++){ %>
|
|
16
|
-
import {<%= it[i].docname %>Module} from './docs/<%= it[i].doctype %>/<%= it[i].doctype %>.module'
|
|
17
|
-
<%}%>
|
|
18
|
-
|
|
19
|
-
@Module({
|
|
20
|
-
//define environment variables: MONGODB_URL='mongodb://<user>:<pass>@<host>:<port>/<db>?authMechanism=DEFAULT'
|
|
21
|
-
imports: [
|
|
22
|
-
ConfigModule.forRoot(),
|
|
23
|
-
MongooseModule.forRoot(process.env.MONGODB_URL),
|
|
24
|
-
ServeStaticModule.forRoot({
|
|
25
|
-
rootPath: join(__dirname, '..', 'public_html'),
|
|
26
|
-
exclude: ['/api/(.*)'],
|
|
27
|
-
}),
|
|
28
|
-
KeycloakConnectModule.register({
|
|
29
|
-
authServerUrl: process.env.OAUTH2_BASEURL,
|
|
30
|
-
realm: process.env.OAUTH2_REALM,
|
|
31
|
-
clientId: process.env.OAUTH2_CLIENTID,
|
|
32
|
-
secret: process.env.OAUTH2_CLIENTSECRET,
|
|
33
|
-
policyEnforcement: PolicyEnforcementMode.PERMISSIVE,
|
|
34
|
-
tokenValidation: TokenValidation.ONLINE,
|
|
35
|
-
}),
|
|
36
|
-
<% for(let i=0;i<it.length; i++){ %><%= it[i].docname %>Module,<%}%>],
|
|
37
|
-
controllers: [AppController],
|
|
38
|
-
providers: [
|
|
39
|
-
AppService,
|
|
40
|
-
{
|
|
41
|
-
provide: APP_GUARD,
|
|
42
|
-
useClass: AuthGuard,
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
provide: APP_GUARD,
|
|
46
|
-
useClass: ResourceGuard,
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
provide: APP_GUARD,
|
|
50
|
-
useClass: RoleGuard,
|
|
51
|
-
},],
|
|
52
|
-
})
|
|
53
|
-
export class AppModule implements NestModule{
|
|
54
|
-
configure(consumer: MiddlewareConsumer) {
|
|
55
|
-
consumer
|
|
56
|
-
.apply(TenantMiddleware)
|
|
57
|
-
// .exclude('/api-yaml')
|
|
58
|
-
// .exclude('/api-json')
|
|
59
|
-
// .exclude('/api')
|
|
60
|
-
.forRoutes('*')
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
MONGODB_URL=<%=it.mongoConnectStr%>
|
|
2
|
-
|
|
3
|
-
HTTP_PORT=<%=it.backendPort%>
|
|
4
|
-
|
|
5
|
-
PROJECT_NAME=SimpleApp Demo1
|
|
6
|
-
PROJECT_DESCRIPTION=Try CRUD
|
|
7
|
-
PROJECT_Version=1.0.0
|
|
8
|
-
|
|
9
|
-
BPMN_HOST=<%=it.bpmnsetting.BPMN_HOST%>
|
|
10
|
-
|
|
11
|
-
BPMN_PORT=<%=it.bpmnsetting.BPMN_PORT%>
|
|
12
|
-
|
|
13
|
-
BPMN_API_KEY=<%=it.bpmnsetting.BPMN_API_KEY%>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
OAUTH2_BASEURL=<%=it.keycloaksetting.OAUTH2_BASEURL%>
|
|
17
|
-
|
|
18
|
-
OAUTH2_REALM=<%=it.keycloaksetting.OAUTH2_REALM%>
|
|
19
|
-
|
|
20
|
-
OAUTH2_CONFIGURL=<%=it.keycloaksetting.OAUTH2_CONFIGURL%>
|
|
21
|
-
|
|
22
|
-
OAUTH2_CLIENTID=<%=it.keycloaksetting.OAUTH2_CLIENTID%>
|
|
23
|
-
|
|
24
|
-
OAUTH2_CLIENTSECRET=<%=it.keycloaksetting.OAUTH2_CLIENTSECRET%>
|
|
25
|
-
|
|
26
|
-
AUTH_SECRET_KEY=<%=it.keycloaksetting.AUTH_SECRET_KEY%>
|
|
27
|
-
|
|
28
|
-
AUTH_ORIGIN=http://localhost:8080
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { NestFactory } from '@nestjs/core';
|
|
2
|
-
import { AppModule } from './app.module';
|
|
3
|
-
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
|
|
4
|
-
|
|
5
|
-
async function bootstrap() {
|
|
6
|
-
const app = await NestFactory.create(AppModule);
|
|
7
|
-
app.enableCors();
|
|
8
|
-
const config = new DocumentBuilder()
|
|
9
|
-
.setTitle(process.env.PROJECT_NAME)
|
|
10
|
-
.setDescription(process.env.PROJECT_DESCRIPTION)
|
|
11
|
-
.setVersion(process.env.PROJECT_VERSION)
|
|
12
|
-
.addApiKey({
|
|
13
|
-
in: 'header',name: 'x-org',type: 'apiKey',description: 'base 64 url encode. example: MS0xLTE',
|
|
14
|
-
},'x-org',)
|
|
15
|
-
.addOAuth2({
|
|
16
|
-
type:'oauth2',flows:{
|
|
17
|
-
implicit:{
|
|
18
|
-
authorizationUrl: `${process.env.OAUTH2_CONFIGURL}/protocol/openid-connect/auth`,
|
|
19
|
-
scopes:{},
|
|
20
|
-
}}},'oauth2')
|
|
21
|
-
.addSecurityRequirements('x-org')
|
|
22
|
-
.addSecurityRequirements('oauth2')
|
|
23
|
-
.build();
|
|
24
|
-
const document = SwaggerModule.createDocument(app, config);
|
|
25
|
-
SwaggerModule.setup('api', app, document, {
|
|
26
|
-
swaggerOptions: { showExtensions: true, persistAuthorization: true },
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
await app.listen(process.env.HTTP_PORT ?? 8000); //listen which port
|
|
30
|
-
}
|
|
31
|
-
bootstrap();
|