bmd-extension 1.6.3
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/launch.json +14 -0
- package/.vscode/settings.json +1 -0
- package/CHANGELOG.md +9 -0
- package/DEPLOY.md +4 -0
- package/README.md +17 -0
- package/README_PRIVATE.md +1 -0
- package/build.sh +5 -0
- package/logo.png +0 -0
- package/media/dark/add.svg +40 -0
- package/media/dark/block.svg +1 -0
- package/media/dark/checklist-1.svg +1 -0
- package/media/dark/checklist.svg +1 -0
- package/media/dark/control.svg +1 -0
- package/media/dark/create.svg +1 -0
- package/media/dark/delete-1.svg +1 -0
- package/media/dark/delete.svg +1 -0
- package/media/dark/deploy-1.svg +2 -0
- package/media/dark/deploy.svg +2 -0
- package/media/dark/documents.svg +66 -0
- package/media/dark/earth.svg +68 -0
- package/media/dark/exe.svg +15 -0
- package/media/dark/export.svg +1 -0
- package/media/dark/function.svg +1 -0
- package/media/dark/game-controller.svg +77 -0
- package/media/dark/get.svg +1 -0
- package/media/dark/id-card.svg +59 -0
- package/media/dark/identity.svg +81 -0
- package/media/dark/import.svg +1 -0
- package/media/dark/information.svg +1 -0
- package/media/dark/interface.svg +1 -0
- package/media/dark/layout.svg +41 -0
- package/media/dark/leaf.svg +54 -0
- package/media/dark/list.svg +13 -0
- package/media/dark/logo.svg +249 -0
- package/media/dark/mockup.svg +1 -0
- package/media/dark/needle.svg +1 -0
- package/media/dark/pass.svg +46 -0
- package/media/dark/plus.svg +1 -0
- package/media/dark/post.svg +1 -0
- package/media/dark/quit.svg +1 -0
- package/media/dark/rocket.svg +28 -0
- package/media/dark/service.svg +1 -0
- package/media/dark/settings.svg +98 -0
- package/media/dark/social.svg +1 -0
- package/media/dark/spaceship-1.svg +1 -0
- package/media/dark/spaceship-2.svg +1 -0
- package/media/dark/spaceship.svg +1 -0
- package/media/dark/support.svg +88 -0
- package/media/dark/transfer.svg +1 -0
- package/media/dark/transform.svg +92 -0
- package/media/dark/update.svg +45 -0
- package/media/dark/upload-1.svg +1 -0
- package/media/dark/upload.svg +41 -0
- package/media/dark/vaccine.svg +1 -0
- package/media/dark/vr-gaming.svg +1 -0
- package/media/light/add.svg +40 -0
- package/media/light/block.svg +1 -0
- package/media/light/checklist-1.svg +1 -0
- package/media/light/checklist.svg +1 -0
- package/media/light/control.svg +1 -0
- package/media/light/create.svg +1 -0
- package/media/light/delete-1.svg +1 -0
- package/media/light/delete.svg +1 -0
- package/media/light/deploy-1.svg +2 -0
- package/media/light/deploy.svg +2 -0
- package/media/light/documents.svg +66 -0
- package/media/light/earth.svg +68 -0
- package/media/light/exe.svg +15 -0
- package/media/light/export.svg +1 -0
- package/media/light/function.svg +1 -0
- package/media/light/game-controller.svg +77 -0
- package/media/light/get.svg +1 -0
- package/media/light/id-card.svg +59 -0
- package/media/light/identity.svg +81 -0
- package/media/light/import.svg +1 -0
- package/media/light/information.svg +1 -0
- package/media/light/interface.svg +1 -0
- package/media/light/layout.svg +41 -0
- package/media/light/leaf.svg +54 -0
- package/media/light/list.svg +13 -0
- package/media/light/logo.svg +249 -0
- package/media/light/mockup.svg +1 -0
- package/media/light/needle.svg +1 -0
- package/media/light/pass.svg +46 -0
- package/media/light/plus.svg +1 -0
- package/media/light/post.svg +1 -0
- package/media/light/quit.svg +1 -0
- package/media/light/rocket.svg +28 -0
- package/media/light/service.svg +1 -0
- package/media/light/settings.svg +98 -0
- package/media/light/social.svg +1 -0
- package/media/light/spaceship-1.svg +1 -0
- package/media/light/spaceship-2.svg +1 -0
- package/media/light/spaceship.svg +1 -0
- package/media/light/support.svg +88 -0
- package/media/light/transfer.svg +1 -0
- package/media/light/transform.svg +92 -0
- package/media/light/update.svg +45 -0
- package/media/light/upload-1.svg +1 -0
- package/media/light/upload.svg +41 -0
- package/media/light/vaccine.svg +1 -0
- package/media/light/vr-gaming.svg +1 -0
- package/package-lock.json +6430 -0
- package/package.json +540 -0
- package/snippets-tsr.json +512 -0
- package/snippets.json +761 -0
- package/src/API.ts +14 -0
- package/src/FsProvider.ts +105 -0
- package/src/Request.ts +24 -0
- package/src/assets/api/api.txt +27 -0
- package/src/assets/configuration/AdminConfigurationController.ts.txt +72 -0
- package/src/assets/configuration/Configuration.ts.txt +37 -0
- package/src/assets/configuration/ConfigurationService.ts.txt +26 -0
- package/src/assets/contentDefine/AdminContentDefineController.ts.txt +91 -0
- package/src/assets/contentDefine/ContentDefine.ts.txt +45 -0
- package/src/assets/contentDefine/ContentDefineService.ts.txt +19 -0
- package/src/assets/contentDefine/CustomerContentDefineController.ts.txt +34 -0
- package/src/assets/controller/controller.txt +46 -0
- package/src/assets/controller/controllerResource.txt +103 -0
- package/src/assets/entity/entity.txt +22 -0
- package/src/assets/entity-request/entity-request.txt +18 -0
- package/src/assets/init/.env.example.txt +37 -0
- package/src/assets/init/.env.production.txt +37 -0
- package/src/assets/init/.gitignore.txt +8 -0
- package/src/assets/init/config.ts.txt +55 -0
- package/src/assets/init/deploy.sh.txt +46 -0
- package/src/assets/init/package-lock.json.txt +4184 -0
- package/src/assets/init/package.json.txt +79 -0
- package/src/assets/init/src/Server.ts.txt +167 -0
- package/src/assets/init/src/controllers/admin/AuthController.ts.txt +96 -0
- package/src/assets/init/src/controllers/admin/CustomerController.ts.txt +107 -0
- package/src/assets/init/src/controllers/admin/RoleController.ts.txt +143 -0
- package/src/assets/init/src/controllers/admin/StaffController.ts.txt +192 -0
- package/src/assets/init/src/controllers/customer/AuthController.ts.txt +170 -0
- package/src/assets/init/src/controllers/customer/CustomerController.ts.txt +32 -0
- package/src/assets/init/src/core/entity/CoreEntity.ts.txt +70 -0
- package/src/assets/init/src/core/services/CoreService.ts.txt +21 -0
- package/src/assets/init/src/entity/Customer.ts.txt +68 -0
- package/src/assets/init/src/entity/Permission.ts.txt +29 -0
- package/src/assets/init/src/entity/Role.ts.txt +36 -0
- package/src/assets/init/src/entity/Staff.ts.txt +54 -0
- package/src/assets/init/src/entity-request/CustomerInsert.ts.txt +42 -0
- package/src/assets/init/src/entity-request/CustomerUpdate.ts.txt +40 -0
- package/src/assets/init/src/entity-request/PermissionImport.ts.txt +12 -0
- package/src/assets/init/src/entity-request/StaffUpdate.ts.txt +33 -0
- package/src/assets/init/src/index.ts.txt +13 -0
- package/src/assets/init/src/middleware/auth/Verification.ts.txt +16 -0
- package/src/assets/init/src/middleware/auth/VerificationJWT.ts.txt +16 -0
- package/src/assets/init/src/middleware/auth/strategy/AuthStrategy.ts.txt +5 -0
- package/src/assets/init/src/middleware/auth/strategy/JWT.ts.txt +147 -0
- package/src/assets/init/src/middleware/error/handleError.ts.txt +22 -0
- package/src/assets/init/src/middleware/error/handleNotFound.ts.txt +7 -0
- package/src/assets/init/src/middleware/response/CustomSendResponse.ts.txt +35 -0
- package/src/assets/init/src/middleware/response/responseAPI.ts.txt +76 -0
- package/src/assets/init/src/middleware/validator/Validator.ts.txt +103 -0
- package/src/assets/init/src/services/CustomerService.ts.txt +79 -0
- package/src/assets/init/src/services/InitService.ts.txt +11 -0
- package/src/assets/init/src/services/MailService.ts.txt +271 -0
- package/src/assets/init/src/services/RoleService.ts.txt +66 -0
- package/src/assets/init/src/services/StaffService.ts.txt +104 -0
- package/src/assets/init/src/ssl/certificate-ca.crt +0 -0
- package/src/assets/init/src/ssl/certificate.crt +0 -0
- package/src/assets/init/src/ssl/private.key +0 -0
- package/src/assets/init/src/types/express.d.ts.txt +97 -0
- package/src/assets/init/src/util/expo.ts.txt +53 -0
- package/src/assets/init/src/util/helper.ts.txt +321 -0
- package/src/assets/init/src/util/language.ts.txt +8 -0
- package/src/assets/init/src/util/logger.ts.txt +47 -0
- package/src/assets/init/src/util/mailer.ts.txt +32 -0
- package/src/assets/init/src/util/password.ts.txt +13 -0
- package/src/assets/init/tsconfig.json.txt +26 -0
- package/src/assets/service/service.txt +34 -0
- package/src/constant.ts +83 -0
- package/src/extension.ts +459 -0
- package/src/provider/codeAction/controller/addPathParams.ts +65 -0
- package/src/provider/codeAction/controller/addTokenParam.ts +43 -0
- package/src/provider/codeAction/controller/addValidation.ts +47 -0
- package/src/provider/codeAction/controller/codeAction.ts +34 -0
- package/src/provider/codeAction/controller/util.ts +48 -0
- package/src/provider/codeAction/entity/codeAction.ts +48 -0
- package/src/provider/codeAction/entity/handleBuilder.ts +87 -0
- package/src/provider/codeAction/entity/handleFunction.ts +487 -0
- package/src/provider/codeAction/entity/handleProperty.ts +32 -0
- package/src/provider/codeAction/entity/handleRelation.ts +72 -0
- package/src/provider/codeAction/entity/helper.ts +132 -0
- package/src/provider/codeAction/entity-request/codeAction.ts +178 -0
- package/src/provider/codeAction/enum/codeAction.ts +95 -0
- package/src/provider/codeAction/service/codeAction.ts +232 -0
- package/src/provider/completion/CompletionProvider.ts +108 -0
- package/src/provider/errorChecking/checkHeaderToken.ts +60 -0
- package/src/provider/errorChecking/checkPathParam.ts +64 -0
- package/src/provider/errorChecking/checkRequired.ts +56 -0
- package/src/provider/errorChecking/errorChecking.ts +35 -0
- package/src/provider/errorChecking/util.ts +56 -0
- package/src/provider/treeDataProvider/Dependency.ts +26 -0
- package/src/provider/treeDataProvider/TreeProviderCommand.ts +60 -0
- package/src/provider/treeDataProvider/TreeProviderProject.ts +65 -0
- package/src/provider/treeDataProvider/api/createApi.ts +106 -0
- package/src/provider/treeDataProvider/controller/command/createController.ts +99 -0
- package/src/provider/treeDataProvider/controller/command/handleMethod.ts +363 -0
- package/src/provider/treeDataProvider/controller/treeData.ts +81 -0
- package/src/provider/treeDataProvider/deploy/command/handleDeploy.ts +70 -0
- package/src/provider/treeDataProvider/deploy/treeData.ts +21 -0
- package/src/provider/treeDataProvider/entity/command/addProperty.ts +144 -0
- package/src/provider/treeDataProvider/entity/command/addRelation.ts +125 -0
- package/src/provider/treeDataProvider/entity/command/createEntity.ts +53 -0
- package/src/provider/treeDataProvider/entity/command/createEntityRequest.ts +65 -0
- package/src/provider/treeDataProvider/entity/command/exportInterface.ts +130 -0
- package/src/provider/treeDataProvider/entity/treeData.ts +49 -0
- package/src/provider/treeDataProvider/module/command/configuration.ts +34 -0
- package/src/provider/treeDataProvider/module/command/contentDefine.ts +36 -0
- package/src/provider/treeDataProvider/module/command/initProject.ts +155 -0
- package/src/provider/treeDataProvider/module/treeData.ts +28 -0
- package/src/provider/treeDataProvider/project/command/addEnum.ts +0 -0
- package/src/provider/treeDataProvider/project/command/addProjectName.ts +23 -0
- package/src/provider/treeDataProvider/project/command/getProjectDetails.ts +284 -0
- package/src/provider/treeDataProvider/project/treeData.ts +28 -0
- package/src/provider/treeDataProvider/service/command/createService.ts +70 -0
- package/src/provider/treeDataProvider/service/command/handleConstructor.ts +134 -0
- package/src/provider/treeDataProvider/service/treeData.ts +25 -0
- package/src/types/project.d.ts +7 -0
- package/src/util.ts +145 -0
- package/src/utils/Password.ts +19 -0
- package/tsconfig.json +18 -0
- package/tslint.json +15 -0
- package/vsc-extension-quickstart.md +42 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
{
|
2
|
+
"name": "agtx",
|
3
|
+
"version": "0.0.1",
|
4
|
+
"description": "Awesome project developed by BMD.",
|
5
|
+
"devDependencies": {
|
6
|
+
"@types/bcrypt": "3.0.0",
|
7
|
+
"@types/body-parser": "1.17.0",
|
8
|
+
"@types/compression": "1.0.1",
|
9
|
+
"@types/cors": "2.8.5",
|
10
|
+
"@types/errorhandler": "0.0.32",
|
11
|
+
"@types/express": "4.17.2",
|
12
|
+
"@types/faker": "4.1.9",
|
13
|
+
"@types/hapi__joi": "17.1.0",
|
14
|
+
"@types/jsonwebtoken": "8.3.2",
|
15
|
+
"@types/method-override": "0.0.31",
|
16
|
+
"@types/moment-timezone": "0.5.12",
|
17
|
+
"@types/multer": "1.4.2",
|
18
|
+
"@types/node": "13.5.0",
|
19
|
+
"@types/node-rsa": "1.0.0",
|
20
|
+
"@types/sha256": "0.2.0",
|
21
|
+
"@types/swagger-schema-official": "2.0.21",
|
22
|
+
"@types/winston": "2.4.4",
|
23
|
+
"dotenv": "8.2.0",
|
24
|
+
"ts-node": "3.3.0",
|
25
|
+
"ts-node-dev": "1.0.0-pre.40",
|
26
|
+
"typescript": "3.7.5"
|
27
|
+
},
|
28
|
+
"dependencies": {
|
29
|
+
"@hapi/joi": "17.1.0",
|
30
|
+
"@parse/node-apn": "3.1.0",
|
31
|
+
"@tsed/common": "5.44.14",
|
32
|
+
"@tsed/core": "5.44.14",
|
33
|
+
"@tsed/multipartfiles": "5.44.14",
|
34
|
+
"@tsed/swagger": "5.44.14",
|
35
|
+
"@tsed/typeorm": "5.44.14",
|
36
|
+
"@types/md5": "2.1.33",
|
37
|
+
"@types/slug": "0.9.1",
|
38
|
+
"bcrypt": "3.0.6",
|
39
|
+
"body-parser": "1.19.0",
|
40
|
+
"compression": "1.7.4",
|
41
|
+
"cors": "2.8.5",
|
42
|
+
"cron": "1.7.2",
|
43
|
+
"crypto": "1.0.1",
|
44
|
+
"expo-server-sdk": "3.4.0",
|
45
|
+
"express": "4.17.1",
|
46
|
+
"faker": "4.1.0",
|
47
|
+
"jimp": "^0.16.1",
|
48
|
+
"jsonwebtoken": "8.5.1",
|
49
|
+
"md5": "2.2.1",
|
50
|
+
"method-override": "3.0.0",
|
51
|
+
"mime": "2.4.4",
|
52
|
+
"moment": "2.24.0",
|
53
|
+
"moment-timezone": "0.5.26",
|
54
|
+
"multer": "1.4.2",
|
55
|
+
"mysql": "2.14.1",
|
56
|
+
"node-rsa": "1.0.8",
|
57
|
+
"nodemailer": "6.4.2",
|
58
|
+
"otp-generator": "1.1.0",
|
59
|
+
"reflect-metadata": "0.1.10",
|
60
|
+
"request": "2.88.0",
|
61
|
+
"request-promise": "4.2.5",
|
62
|
+
"sha256": "0.2.0",
|
63
|
+
"ts-express-decorators": "5.44.14",
|
64
|
+
"ts-httpexceptions": "4.1.0",
|
65
|
+
"ts-log-debug": "5.1.1",
|
66
|
+
"typeorm": "0.2.20",
|
67
|
+
"winston": "3.2.1"
|
68
|
+
},
|
69
|
+
"scripts": {
|
70
|
+
"start": "pm2 start dist/src/index.js --name agtx --watch",
|
71
|
+
"build": "tsc",
|
72
|
+
"dev": "set debug=* && ts-node-dev --debug --respawn --transpile-only --ignore-watch node_modules ./src/index.ts",
|
73
|
+
"prod": "node ./dist/src/server.js",
|
74
|
+
"migration:run": "ts-node ./node_modules/typeorm/cli.js migration:run",
|
75
|
+
"migration:create": "ts-node ./node_modules/typeorm/cli.js migration:create -n Init",
|
76
|
+
"migration:generate": "ts-node ./node_modules/typeorm/cli.js migration:generate -n Init",
|
77
|
+
"start:debug": "ts-node --inspect=5858 --debug-brk --ignore false ./src/server.ts"
|
78
|
+
}
|
79
|
+
}
|
@@ -0,0 +1,167 @@
|
|
1
|
+
// IMPORT LIBRARY
|
2
|
+
import { ServerLoader, ServerSettings, GlobalAcceptMimesMiddleware } from "@tsed/common";
|
3
|
+
import "@tsed/typeorm";
|
4
|
+
import Path from "path";
|
5
|
+
import compression from "compression";
|
6
|
+
import bodyParser from "body-parser";
|
7
|
+
import cors from 'cors';
|
8
|
+
import methodOverride from 'method-override';
|
9
|
+
import timezone from 'moment-timezone';
|
10
|
+
import multer from "multer";
|
11
|
+
import moment from "moment";
|
12
|
+
import fs from 'fs';
|
13
|
+
import md5 from 'md5';
|
14
|
+
import "@tsed/swagger";
|
15
|
+
import "@tsed/multipartfiles";
|
16
|
+
import { ServerOptions } from "https";
|
17
|
+
|
18
|
+
// IMPORT CUSTOM
|
19
|
+
import responseAPI from './middleware/response/responseAPI';
|
20
|
+
import handleError from "./middleware/error/handleError";
|
21
|
+
import handleNotFound from "./middleware/error/handleNotFound";
|
22
|
+
import logger from './util/logger';
|
23
|
+
import './middleware/response/CustomSendResponse';
|
24
|
+
import CONFIG from "../config";
|
25
|
+
import { logSection } from "./util/helper";
|
26
|
+
|
27
|
+
interface ProtocolPorts {
|
28
|
+
httpsPort: string | boolean
|
29
|
+
httpPort: string | boolean
|
30
|
+
}
|
31
|
+
|
32
|
+
// TIMEZONE
|
33
|
+
timezone.tz.setDefault("Asia/Ho_Chi_Minh");
|
34
|
+
|
35
|
+
|
36
|
+
// HANDLE HTTP/HTTPS
|
37
|
+
function handleProtocolPort(): ProtocolPorts {
|
38
|
+
if (process.env.PRODUCTION_MODE == "1")
|
39
|
+
return {
|
40
|
+
httpsPort: `${CONFIG.HOST}:${CONFIG.PORT}`,
|
41
|
+
httpPort: false
|
42
|
+
}
|
43
|
+
|
44
|
+
return {
|
45
|
+
httpPort: `${CONFIG.HOST}:${CONFIG.PORT}`,
|
46
|
+
httpsPort: false
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
function handleHttpsOptions(): ServerOptions {
|
51
|
+
if (process.env.PRODUCTION_MODE == "1") {
|
52
|
+
logSection('production mode')
|
53
|
+
return {
|
54
|
+
cert: fs.readFileSync(CONFIG.SSL),
|
55
|
+
key: fs.readFileSync(CONFIG.SSL),
|
56
|
+
ca: fs.readFileSync(__dirname + "/ssl/certificate-ca.crt")
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
logSection('development mode')
|
61
|
+
return {}
|
62
|
+
}
|
63
|
+
|
64
|
+
|
65
|
+
// HANDLE MULTER UPLOAD
|
66
|
+
function handleStorage(): multer.StorageEngine {
|
67
|
+
return multer.diskStorage({
|
68
|
+
destination: (
|
69
|
+
req: Express.Request, file: Express.Multer.File,
|
70
|
+
callback: (error: Error | null, destination: string) => void
|
71
|
+
) => {
|
72
|
+
const controller = req.ctx.endpoint.targetName
|
73
|
+
const des = controller.replace("Controller", "").toLowerCase()
|
74
|
+
if (!des) {
|
75
|
+
callback(new Error("Wrong controller"), null)
|
76
|
+
} else {
|
77
|
+
const uploadPath = `${CONFIG.UPLOAD_DIR}/${des}`
|
78
|
+
if (!fs.existsSync(uploadPath)) {
|
79
|
+
fs.mkdirSync(uploadPath);
|
80
|
+
}
|
81
|
+
callback(null, uploadPath)
|
82
|
+
}
|
83
|
+
},
|
84
|
+
filename: (
|
85
|
+
req: Express.Request,
|
86
|
+
file: Express.Multer.File,
|
87
|
+
callback: (error: Error | null, filename: string) => void
|
88
|
+
) => {
|
89
|
+
if (!file.mimetype.includes("image")) {
|
90
|
+
return callback(new Error("Invalidate file's extend name "), null)
|
91
|
+
} else {
|
92
|
+
callback(null, md5(file.filename + moment().valueOf().toString()) + Path.extname(file.originalname))
|
93
|
+
}
|
94
|
+
}
|
95
|
+
});
|
96
|
+
}
|
97
|
+
|
98
|
+
|
99
|
+
// SERVER
|
100
|
+
const OPTION: any = {
|
101
|
+
httpsOptions: handleHttpsOptions(),
|
102
|
+
rootDir: __dirname,
|
103
|
+
socketIO: {},
|
104
|
+
statics: {
|
105
|
+
"/": `${CONFIG.STATIC_DIR}`
|
106
|
+
},
|
107
|
+
acceptMimes: ["application/json"],
|
108
|
+
mount: {
|
109
|
+
[CONFIG.PREFIX_URL]: `${__dirname}/controllers/**/**Controller.{ts,js}`
|
110
|
+
},
|
111
|
+
swagger: [
|
112
|
+
{
|
113
|
+
path: "/docs_admin",
|
114
|
+
doc: "docs_admin"
|
115
|
+
},
|
116
|
+
{
|
117
|
+
path: "/docs_customer",
|
118
|
+
doc: "docs_customer"
|
119
|
+
}
|
120
|
+
],
|
121
|
+
typeorm: [
|
122
|
+
CONFIG.TYPE_ORM
|
123
|
+
],
|
124
|
+
multer: {
|
125
|
+
storage: handleStorage(),
|
126
|
+
},
|
127
|
+
logger: {
|
128
|
+
// logStart: false,
|
129
|
+
format: `%[%d{[hh:mm:ss dd/MM/yyyy}] %p%] %m`,
|
130
|
+
requestFields: ["method", "url", "body", "query", "params"]
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
|
135
|
+
const PORT = handleProtocolPort()
|
136
|
+
@ServerSettings({ ...OPTION, ...PORT })
|
137
|
+
export class Server extends ServerLoader {
|
138
|
+
|
139
|
+
public $beforeRoutesInit(): void | Promise<any> {
|
140
|
+
this.use(GlobalAcceptMimesMiddleware)
|
141
|
+
.use(cors())
|
142
|
+
.use(compression())
|
143
|
+
.use(methodOverride())
|
144
|
+
.use(bodyParser.json())
|
145
|
+
.use(bodyParser.urlencoded({
|
146
|
+
extended: true
|
147
|
+
}))
|
148
|
+
.use(responseAPI)
|
149
|
+
|
150
|
+
return null;
|
151
|
+
}
|
152
|
+
|
153
|
+
public $onReady() {
|
154
|
+
logSection('server started')
|
155
|
+
logger('info').info(`SERVER RESTART AT ${moment().format("YYYY-MM-DD HH:mm:ss")}`)
|
156
|
+
}
|
157
|
+
|
158
|
+
public $afterRoutesInit() {
|
159
|
+
this.use(handleNotFound)
|
160
|
+
.use(handleError)
|
161
|
+
}
|
162
|
+
|
163
|
+
public $onServerInitError(err: any) {
|
164
|
+
console.error(err);
|
165
|
+
logger('error').error("Error On Server Init: ", JSON.stringify(err))
|
166
|
+
}
|
167
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
// IMPORT LIBRARY
|
2
|
+
import { Controller, UseAuth, Req, Get, Res, Response, HeaderParams, PathParams, Post, BodyParams } from '@tsed/common';
|
3
|
+
import Joi from '@hapi/joi';
|
4
|
+
import { Docs } from '@tsed/swagger';
|
5
|
+
import { Request } from 'express';
|
6
|
+
|
7
|
+
|
8
|
+
// IMPORT CUSTOM
|
9
|
+
import { Validator } from '../../middleware/validator/Validator';
|
10
|
+
import { VerificationJWT } from '../../middleware/auth/VerificationJWT';
|
11
|
+
import { StaffService } from '../../services/StaffService';
|
12
|
+
import JWT, { AuthType } from '../../middleware/auth/strategy/JWT';
|
13
|
+
import { Staff } from '../../entity/Staff';
|
14
|
+
|
15
|
+
|
16
|
+
@Controller("/admin/auth")
|
17
|
+
@Docs("docs_admin")
|
18
|
+
export class AuthController {
|
19
|
+
constructor(
|
20
|
+
private staffService: StaffService,
|
21
|
+
) { }
|
22
|
+
|
23
|
+
|
24
|
+
// =====================LOGIN=====================
|
25
|
+
@Post('/login')
|
26
|
+
@Validator({
|
27
|
+
username: Joi.string().required(),
|
28
|
+
password: Joi.string().required()
|
29
|
+
})
|
30
|
+
async login(
|
31
|
+
@BodyParams('username') username: string,
|
32
|
+
@BodyParams('password') password: string,
|
33
|
+
@Res() res: Response,
|
34
|
+
@Req() req: Request,
|
35
|
+
) {
|
36
|
+
const staff = await this.staffService.login(username, password);
|
37
|
+
const token = JWT.sign({ id: staff.id, type: AuthType.Staff });
|
38
|
+
|
39
|
+
return res.sendOK({ token })
|
40
|
+
}
|
41
|
+
|
42
|
+
|
43
|
+
// =====================PROFILE=====================
|
44
|
+
@Get('/profile')
|
45
|
+
@UseAuth(VerificationJWT)
|
46
|
+
async getInfo(
|
47
|
+
@Req() req: Request,
|
48
|
+
@Res() res: Response,
|
49
|
+
@HeaderParams("token") token: string,
|
50
|
+
) {
|
51
|
+
const staff = await Staff.findOneOrThrowId(req.staff.id, {
|
52
|
+
relations: ['role.permissions', 'role']
|
53
|
+
});
|
54
|
+
|
55
|
+
return res.sendOK(staff)
|
56
|
+
}
|
57
|
+
|
58
|
+
|
59
|
+
// =====================UPDATE PASSWORD=====================
|
60
|
+
@Post('/password/update')
|
61
|
+
@UseAuth(VerificationJWT)
|
62
|
+
@Validator({
|
63
|
+
oldPassword: Joi.string().required(),
|
64
|
+
newPassword: Joi.string().required()
|
65
|
+
})
|
66
|
+
async changePassword(
|
67
|
+
@Req() req: Request,
|
68
|
+
@Res() res: Response,
|
69
|
+
@BodyParams('oldPassword') oldPassword: string,
|
70
|
+
@BodyParams('newPassword') newPassword: string,
|
71
|
+
@HeaderParams("token") token: string,
|
72
|
+
) {
|
73
|
+
const { staff } = req;
|
74
|
+
|
75
|
+
await this.staffService.changePassword({ staff, oldPassword, newPassword })
|
76
|
+
|
77
|
+
return res.sendOK(staff, 'Cập nhật mật khẩu thành công');
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
// =====================GET PERMISSION=====================
|
82
|
+
@Get('/profile/permission')
|
83
|
+
@UseAuth(VerificationJWT)
|
84
|
+
async getPermission(
|
85
|
+
@Req() req: Request,
|
86
|
+
@Res() res: Response,
|
87
|
+
@HeaderParams("token") token: string,
|
88
|
+
) {
|
89
|
+
const { id } = req.staff;
|
90
|
+
const permissions = await this.staffService.getPermission(id);
|
91
|
+
|
92
|
+
return res.sendOK(permissions);
|
93
|
+
}
|
94
|
+
|
95
|
+
|
96
|
+
} // END FILE
|
@@ -0,0 +1,107 @@
|
|
1
|
+
import { Controller, Post, UseAuth, Req, Request, Res, Response, HeaderParams, BodyParams, Get, PathParams, QueryParams } from '@tsed/common';
|
2
|
+
import { Docs } from '@tsed/swagger';
|
3
|
+
import Joi from '@hapi/joi';
|
4
|
+
import { Like, Raw } from 'typeorm';
|
5
|
+
|
6
|
+
import { VerificationJWT } from '../../middleware/auth/VerificationJWT';
|
7
|
+
import { Validator } from '../../middleware/validator/Validator';
|
8
|
+
import { Customer } from '../../entity/Customer';
|
9
|
+
import { Password } from '../../util/password';
|
10
|
+
|
11
|
+
@Controller("/admin/customer")
|
12
|
+
@Docs("docs_admin")
|
13
|
+
export class CustomerController {
|
14
|
+
constructor() { }
|
15
|
+
|
16
|
+
|
17
|
+
// =====================GET LIST=====================
|
18
|
+
@Get('')
|
19
|
+
@UseAuth(VerificationJWT)
|
20
|
+
@Validator({
|
21
|
+
page: Joi.number().min(0),
|
22
|
+
limit: Joi.number().min(0)
|
23
|
+
})
|
24
|
+
async findAll(
|
25
|
+
@HeaderParams("token") token: string,
|
26
|
+
@QueryParams("page") page: number,
|
27
|
+
@QueryParams("limit") limit: number,
|
28
|
+
@QueryParams("search") search: string = "",
|
29
|
+
@Req() req: Request,
|
30
|
+
@Res() res: Response
|
31
|
+
) {
|
32
|
+
let where = `customer.name LIKE :search AND customer.isDeleted = false`
|
33
|
+
|
34
|
+
const [customers, total] = await Customer.createQueryBuilder('customer')
|
35
|
+
.leftJoinAndSelect('customer.addressCity', 'addressCity')
|
36
|
+
.where(where, {search: `%${search}%`})
|
37
|
+
.skip((page - 1) * limit)
|
38
|
+
.take(limit)
|
39
|
+
.orderBy('customer.id', 'DESC')
|
40
|
+
.getManyAndCount()
|
41
|
+
|
42
|
+
return res.sendOK({ customers, total })
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
// =====================UPDATE ITEM=====================
|
47
|
+
@Post('/:customerId/update')
|
48
|
+
@UseAuth(VerificationJWT)
|
49
|
+
@Validator({
|
50
|
+
customer: Joi.required(),
|
51
|
+
customerId: Joi.number().required()
|
52
|
+
})
|
53
|
+
async update(
|
54
|
+
@Req() req: Request,
|
55
|
+
@Res() res: Response,
|
56
|
+
@HeaderParams("token") token: string,
|
57
|
+
@BodyParams("customer") customer: Customer,
|
58
|
+
@PathParams("customerId") customerId: number,
|
59
|
+
) {
|
60
|
+
await Customer.findOneOrThrowId(+customerId)
|
61
|
+
customer.id = customerId
|
62
|
+
await customer.save()
|
63
|
+
|
64
|
+
return res.sendOK(customer, 'Cập nhật thành công!')
|
65
|
+
}
|
66
|
+
|
67
|
+
// =====================GET ITEM=====================
|
68
|
+
@Get('/:customerId')
|
69
|
+
@UseAuth(VerificationJWT)
|
70
|
+
@Validator({
|
71
|
+
customerId: Joi.number().required(),
|
72
|
+
})
|
73
|
+
async findOne(
|
74
|
+
@Req() req: Request,
|
75
|
+
@Res() res: Response,
|
76
|
+
@HeaderParams("token") token: string,
|
77
|
+
@PathParams("customerId") customerId: number,
|
78
|
+
|
79
|
+
) {
|
80
|
+
const customer = await Customer.findOneOrThrowId(+customerId)
|
81
|
+
|
82
|
+
return res.sendOK(customer)
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
// =====================RESET PASSWORD=====================
|
87
|
+
@Post('/:customerId/update/password')
|
88
|
+
@UseAuth(VerificationJWT)
|
89
|
+
@Validator({
|
90
|
+
customerId: Joi.number().required(),
|
91
|
+
password: Joi.string().required()
|
92
|
+
})
|
93
|
+
async updatePassword(
|
94
|
+
@Req() req: Request,
|
95
|
+
@Res() res: Response,
|
96
|
+
@HeaderParams('token') token: string,
|
97
|
+
@PathParams('customerId') customerId: number,
|
98
|
+
@BodyParams('password') password: string
|
99
|
+
) {
|
100
|
+
const customer = await Customer.findOneOrThrowId(+customerId);
|
101
|
+
customer.password = await Password.hash(password)
|
102
|
+
await customer.save()
|
103
|
+
|
104
|
+
return res.sendOK(customer, 'Cập nhật thành công.')
|
105
|
+
}
|
106
|
+
|
107
|
+
} // END FILE
|
@@ -0,0 +1,143 @@
|
|
1
|
+
import { Controller, UseAuth, Req, Get, Res, Response, HeaderParams, PathParams, Post, BodyParams } from '@tsed/common';
|
2
|
+
import Joi from '@hapi/joi';
|
3
|
+
import { Docs } from '@tsed/swagger';
|
4
|
+
import { Request } from 'express';
|
5
|
+
|
6
|
+
import { Validator } from '../../middleware/validator/Validator';
|
7
|
+
import { VerificationJWT } from '../../middleware/auth/VerificationJWT';
|
8
|
+
import { Role } from '../../entity/Role';
|
9
|
+
import { RoleService } from '../../services/RoleService';
|
10
|
+
import { Permission } from '../../entity/Permission';
|
11
|
+
import { PermissionImport } from '../../entity-request/PermissionImport';
|
12
|
+
|
13
|
+
@Controller("/admin/role")
|
14
|
+
@Docs("docs_admin")
|
15
|
+
export class RoleController {
|
16
|
+
constructor(
|
17
|
+
private roleService: RoleService
|
18
|
+
) { }
|
19
|
+
|
20
|
+
|
21
|
+
// =====================CREATE ITEM=====================
|
22
|
+
@Post('')
|
23
|
+
@UseAuth(VerificationJWT)
|
24
|
+
@Validator({
|
25
|
+
role: Joi.required(),
|
26
|
+
token: Joi.required()
|
27
|
+
})
|
28
|
+
async create(
|
29
|
+
@BodyParams("role") role: Role,
|
30
|
+
@HeaderParams("token") token: string,
|
31
|
+
@Req() req: Request,
|
32
|
+
@Res() res: Response
|
33
|
+
) {
|
34
|
+
await role.save()
|
35
|
+
|
36
|
+
return res.sendOK({ id: role.id })
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
// =====================GET LIST=====================
|
41
|
+
@Get('')
|
42
|
+
@UseAuth(VerificationJWT)
|
43
|
+
@Validator({
|
44
|
+
})
|
45
|
+
async findAll(
|
46
|
+
@Res() res: Response,
|
47
|
+
@Req() req: Request,
|
48
|
+
@HeaderParams("token") token: string,
|
49
|
+
) {
|
50
|
+
const roles = await Role.find()
|
51
|
+
|
52
|
+
return res.sendOK(roles)
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
// =====================IMPORT PERMISSIONS=====================
|
57
|
+
@Post('/permissions/import')
|
58
|
+
@UseAuth(VerificationJWT)
|
59
|
+
@Validator({
|
60
|
+
permissions: Joi.required(),
|
61
|
+
token: Joi.required()
|
62
|
+
})
|
63
|
+
async importPermission(
|
64
|
+
@BodyParams("permissions", PermissionImport) permissionImports: PermissionImport[],
|
65
|
+
@HeaderParams("token") token: string,
|
66
|
+
@Req() req: Request,
|
67
|
+
@Res() res: Response
|
68
|
+
) {
|
69
|
+
const permissions = await this.roleService.import(permissionImports)
|
70
|
+
await this.roleService.resetRoleForAdmin(permissions)
|
71
|
+
|
72
|
+
return res.sendOK(permissions)
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
// =====================GET PERMISSION=====================
|
77
|
+
@Get('/permissions')
|
78
|
+
@UseAuth(VerificationJWT)
|
79
|
+
@Validator({
|
80
|
+
token: Joi.required()
|
81
|
+
})
|
82
|
+
async getAllPermission(
|
83
|
+
@Res() res: Response,
|
84
|
+
@Req() req: Request,
|
85
|
+
@HeaderParams("token") token: string,
|
86
|
+
) {
|
87
|
+
const permissions = await Permission.find()
|
88
|
+
|
89
|
+
return res.sendOK(permissions)
|
90
|
+
}
|
91
|
+
|
92
|
+
|
93
|
+
// =====================GET ITEM=====================
|
94
|
+
@Get('/:roleId')
|
95
|
+
@UseAuth(VerificationJWT)
|
96
|
+
@Validator({
|
97
|
+
roleId: Joi.number().required(),
|
98
|
+
token: Joi.required()
|
99
|
+
})
|
100
|
+
async getRole(
|
101
|
+
@PathParams("roleId") roleId: number,
|
102
|
+
@HeaderParams("token") token: string,
|
103
|
+
@Req() req: Request,
|
104
|
+
@Res() res: Response
|
105
|
+
) {
|
106
|
+
const role = await Role.findOne(roleId, {
|
107
|
+
relations: ["permissions"]
|
108
|
+
})
|
109
|
+
|
110
|
+
return res.sendOK(role)
|
111
|
+
}
|
112
|
+
|
113
|
+
|
114
|
+
// =====================UPDATE ROLE=====================
|
115
|
+
@Post('/:roleId/update')
|
116
|
+
@UseAuth(VerificationJWT)
|
117
|
+
@Validator({
|
118
|
+
roleId: Joi.number().required(),
|
119
|
+
permissionIds: Joi.required(),
|
120
|
+
token: Joi.required()
|
121
|
+
})
|
122
|
+
async turnOnPermissionInRole(
|
123
|
+
@HeaderParams("token") token: string,
|
124
|
+
@Res() res: Response,
|
125
|
+
@Req() req: Request,
|
126
|
+
@PathParams("roleId") roleId: number,
|
127
|
+
@BodyParams("permissionIds", Number) permissionIds: number[],
|
128
|
+
@BodyParams("info") role: Role,
|
129
|
+
) {
|
130
|
+
await Role.findOneOrThrowId(+roleId)
|
131
|
+
|
132
|
+
const permissions = await Permission.createQueryBuilder('permission')
|
133
|
+
.where(`id IN (:...permissionIds)`, { permissionIds })
|
134
|
+
.getMany()
|
135
|
+
|
136
|
+
role.id = +roleId
|
137
|
+
role.permissions = permissions
|
138
|
+
await role.save()
|
139
|
+
|
140
|
+
return res.sendOK(role)
|
141
|
+
}
|
142
|
+
|
143
|
+
} // END FILE
|