@illustrisinteractive/sentinel-nest 0.0.1
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/.prettierrc +4 -0
- package/README.md +98 -0
- package/config/config.json +24 -0
- package/dist/bin/commit.d.ts +1 -0
- package/dist/bin/commit.js +136 -0
- package/dist/bin/commit.js.map +1 -0
- package/dist/bin/init.d.ts +2 -0
- package/dist/bin/init.js +179 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/migrations/1-create-permission.d.ts +6 -0
- package/dist/bin/migrations/1-create-permission.js +30 -0
- package/dist/bin/migrations/1-create-permission.js.map +1 -0
- package/dist/bin/migrations/2-create-role.d.ts +2 -0
- package/dist/bin/migrations/2-create-role.js +29 -0
- package/dist/bin/migrations/2-create-role.js.map +1 -0
- package/dist/bin/migrations/3-create-rolepermissions.d.ts +2 -0
- package/dist/bin/migrations/3-create-rolepermissions.js +46 -0
- package/dist/bin/migrations/3-create-rolepermissions.js.map +1 -0
- package/dist/bin/migrations/4-create-model-roles.d.ts +2 -0
- package/dist/bin/migrations/4-create-model-roles.js +46 -0
- package/dist/bin/migrations/4-create-model-roles.js.map +1 -0
- package/dist/bin/resource.d.ts +1 -0
- package/dist/bin/resource.js +91 -0
- package/dist/bin/resource.js.map +1 -0
- package/dist/bin/sentinel.d.ts +2 -0
- package/dist/bin/sentinel.js +52 -0
- package/dist/bin/sentinel.js.map +1 -0
- package/dist/models/SecuredResource.d.ts +8 -0
- package/dist/models/SecuredResource.js +9 -0
- package/dist/models/SecuredResource.js.map +1 -0
- package/dist/models/SentinelConfig.d.ts +7 -0
- package/dist/models/SentinelConfig.js +3 -0
- package/dist/models/SentinelConfig.js.map +1 -0
- package/dist/models/sequelize/PermissionKey.d.ts +7 -0
- package/dist/models/sequelize/PermissionKey.js +39 -0
- package/dist/models/sequelize/PermissionKey.js.map +1 -0
- package/dist/prisma.config.d.ts +3 -0
- package/dist/prisma.config.js +14 -0
- package/dist/prisma.config.js.map +1 -0
- package/dist/src/can.decorator.d.ts +2 -0
- package/dist/src/can.decorator.js +6 -0
- package/dist/src/can.decorator.js.map +1 -0
- package/dist/src/generated/prisma/browser.d.ts +10 -0
- package/dist/src/generated/prisma/browser.js +44 -0
- package/dist/src/generated/prisma/browser.js.map +1 -0
- package/dist/src/generated/prisma/client.d.ts +14 -0
- package/dist/src/generated/prisma/client.js +46 -0
- package/dist/src/generated/prisma/client.js.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts +263 -0
- package/dist/src/generated/prisma/commonInputTypes.js +3 -0
- package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
- package/dist/src/generated/prisma/enums.d.ts +1 -0
- package/dist/src/generated/prisma/enums.js +3 -0
- package/dist/src/generated/prisma/enums.js.map +1 -0
- package/dist/src/generated/prisma/internal/class.d.ts +50 -0
- package/dist/src/generated/prisma/internal/class.js +75 -0
- package/dist/src/generated/prisma/internal/class.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +778 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js +128 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +88 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +112 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/src/generated/prisma/models/ModelHasRoles.d.ts +691 -0
- package/dist/src/generated/prisma/models/ModelHasRoles.js +3 -0
- package/dist/src/generated/prisma/models/ModelHasRoles.js.map +1 -0
- package/dist/src/generated/prisma/models/PermissionKeys.d.ts +547 -0
- package/dist/src/generated/prisma/models/PermissionKeys.js +3 -0
- package/dist/src/generated/prisma/models/PermissionKeys.js.map +1 -0
- package/dist/src/generated/prisma/models/RoleHasPermissions.d.ts +675 -0
- package/dist/src/generated/prisma/models/RoleHasPermissions.js +3 -0
- package/dist/src/generated/prisma/models/RoleHasPermissions.js.map +1 -0
- package/dist/src/generated/prisma/models/Roles.d.ts +582 -0
- package/dist/src/generated/prisma/models/Roles.js +3 -0
- package/dist/src/generated/prisma/models/Roles.js.map +1 -0
- package/dist/src/generated/prisma/models/SequelizeMeta.d.ts +289 -0
- package/dist/src/generated/prisma/models/SequelizeMeta.js +3 -0
- package/dist/src/generated/prisma/models/SequelizeMeta.js.map +1 -0
- package/dist/src/generated/prisma/models/Users.d.ts +572 -0
- package/dist/src/generated/prisma/models/Users.js +3 -0
- package/dist/src/generated/prisma/models/Users.js.map +1 -0
- package/dist/src/generated/prisma/models.d.ts +7 -0
- package/dist/src/generated/prisma/models.js +3 -0
- package/dist/src/generated/prisma/models.js.map +1 -0
- package/dist/src/main.d.ts +6 -0
- package/dist/src/main.js +23 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/models/SecuredResource.d.ts +8 -0
- package/dist/src/models/SecuredResource.js +9 -0
- package/dist/src/models/SecuredResource.js.map +1 -0
- package/dist/src/models/SentinelConfig.d.ts +7 -0
- package/dist/src/models/SentinelConfig.js +3 -0
- package/dist/src/models/SentinelConfig.js.map +1 -0
- package/dist/src/models/SentinelModel.d.ts +35 -0
- package/dist/src/models/SentinelModel.js +3 -0
- package/dist/src/models/SentinelModel.js.map +1 -0
- package/dist/src/models/SentinelModuleOptions.d.ts +7 -0
- package/dist/src/models/SentinelModuleOptions.js +3 -0
- package/dist/src/models/SentinelModuleOptions.js.map +1 -0
- package/dist/src/prisma.service.d.ts +4 -0
- package/dist/src/prisma.service.js +29 -0
- package/dist/src/prisma.service.js.map +1 -0
- package/dist/src/sentinel.guard.d.ts +9 -0
- package/dist/src/sentinel.guard.js +73 -0
- package/dist/src/sentinel.guard.js.map +1 -0
- package/dist/src/sentinel.module-definition.d.ts +2 -0
- package/dist/src/sentinel.module-definition.js +7 -0
- package/dist/src/sentinel.module-definition.js.map +1 -0
- package/dist/src/sentinel.module.d.ts +3 -0
- package/dist/src/sentinel.module.js +40 -0
- package/dist/src/sentinel.module.js.map +1 -0
- package/dist/src/sentinel.service.d.ts +39 -0
- package/dist/src/sentinel.service.js +146 -0
- package/dist/src/sentinel.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.mjs +34 -0
- package/models/index.js +43 -0
- package/models/permissionkey.js +31 -0
- package/models/role.js +23 -0
- package/models/rolehaspermission.js +43 -0
- package/nest-cli.json +8 -0
- package/package.json +103 -0
- package/prisma/migrations/20260227023704_init/migration.sql +74 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +62 -0
- package/prisma.config.ts +14 -0
- package/src/bin/commit.ts +186 -0
- package/src/bin/init.ts +251 -0
- package/src/bin/migrations/1-create-permission.js +32 -0
- package/src/bin/migrations/2-create-role.js +29 -0
- package/src/bin/migrations/3-create-rolepermissions.js +46 -0
- package/src/bin/migrations/4-create-model-roles.js +46 -0
- package/src/bin/resource.ts +107 -0
- package/src/bin/sentinel.ts +115 -0
- package/src/bin/tsconfig.json +30 -0
- package/src/can.decorator.ts +4 -0
- package/src/generated/prisma/browser.ts +49 -0
- package/src/generated/prisma/client.ts +69 -0
- package/src/generated/prisma/commonInputTypes.ts +302 -0
- package/src/generated/prisma/enums.ts +15 -0
- package/src/generated/prisma/internal/class.ts +250 -0
- package/src/generated/prisma/internal/prismaNamespace.ts +1213 -0
- package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +163 -0
- package/src/generated/prisma/models/ModelHasRoles.ts +1521 -0
- package/src/generated/prisma/models/PermissionKeys.ts +1362 -0
- package/src/generated/prisma/models/RoleHasPermissions.ts +1503 -0
- package/src/generated/prisma/models/Roles.ts +1437 -0
- package/src/generated/prisma/models/SequelizeMeta.ts +1032 -0
- package/src/generated/prisma/models/Users.ts +1402 -0
- package/src/generated/prisma/models.ts +17 -0
- package/src/main.ts +24 -0
- package/src/models/SecuredResource.d.ts +8 -0
- package/src/models/SecuredResource.ts +9 -0
- package/src/models/SentinelConfig.d.ts +7 -0
- package/src/models/SentinelConfig.ts +8 -0
- package/src/models/SentinelModel.ts +39 -0
- package/src/models/SentinelModuleOptions.ts +11 -0
- package/src/models/sequelize/PermissionKey.ts +22 -0
- package/src/models/tsconfig.json +25 -0
- package/src/prisma.service.ts +13 -0
- package/src/sentinel.guard.ts +63 -0
- package/src/sentinel.module-definition.ts +5 -0
- package/src/sentinel.module.ts +27 -0
- package/src/sentinel.service.ts +188 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +25 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { Model } = require('sequelize');
|
|
3
|
+
module.exports = (sequelize, DataTypes) => {
|
|
4
|
+
class PermissionKey extends Model {
|
|
5
|
+
/**
|
|
6
|
+
* Helper method for defining associations.
|
|
7
|
+
* This method is not a part of Sequelize lifecycle.
|
|
8
|
+
* The `models/index` file will call this method automatically.
|
|
9
|
+
*/
|
|
10
|
+
static associate(models) {
|
|
11
|
+
// define association here
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
PermissionKey.init(
|
|
15
|
+
{
|
|
16
|
+
id: {
|
|
17
|
+
type: DataTypes.STRING,
|
|
18
|
+
allowNull: false,
|
|
19
|
+
primaryKey: true,
|
|
20
|
+
},
|
|
21
|
+
resource: DataTypes.STRING,
|
|
22
|
+
action: DataTypes.STRING,
|
|
23
|
+
description: DataTypes.STRING,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
sequelize,
|
|
27
|
+
modelName: 'PermissionKey',
|
|
28
|
+
},
|
|
29
|
+
);
|
|
30
|
+
return PermissionKey;
|
|
31
|
+
};
|
package/models/role.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {
|
|
3
|
+
Model
|
|
4
|
+
} = require('sequelize');
|
|
5
|
+
module.exports = (sequelize, DataTypes) => {
|
|
6
|
+
class Role extends Model {
|
|
7
|
+
/**
|
|
8
|
+
* Helper method for defining associations.
|
|
9
|
+
* This method is not a part of Sequelize lifecycle.
|
|
10
|
+
* The `models/index` file will call this method automatically.
|
|
11
|
+
*/
|
|
12
|
+
static associate(models) {
|
|
13
|
+
// define association here
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
Role.init({
|
|
17
|
+
name: DataTypes.STRING
|
|
18
|
+
}, {
|
|
19
|
+
sequelize,
|
|
20
|
+
modelName: 'Role',
|
|
21
|
+
});
|
|
22
|
+
return Role;
|
|
23
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { Model } = require('sequelize');
|
|
3
|
+
module.exports = (sequelize, DataTypes) => {
|
|
4
|
+
class RoleHasPermission extends Model {
|
|
5
|
+
/**
|
|
6
|
+
* Helper method for defining associations.
|
|
7
|
+
* This method is not a part of Sequelize lifecycle.
|
|
8
|
+
* The `models/index` file will call this method automatically.
|
|
9
|
+
*/
|
|
10
|
+
static associate(models) {
|
|
11
|
+
// define association here
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
RoleHasPermission.init(
|
|
15
|
+
{
|
|
16
|
+
role: {
|
|
17
|
+
type: DataTypes.INTEGER,
|
|
18
|
+
references: {
|
|
19
|
+
model: {
|
|
20
|
+
tableName: 'Roles',
|
|
21
|
+
},
|
|
22
|
+
key: 'id',
|
|
23
|
+
},
|
|
24
|
+
allowNull: false,
|
|
25
|
+
},
|
|
26
|
+
permission: {
|
|
27
|
+
type: DataTypes.INTEGER,
|
|
28
|
+
references: {
|
|
29
|
+
model: {
|
|
30
|
+
tableName: 'PermissionKeys',
|
|
31
|
+
},
|
|
32
|
+
key: 'id',
|
|
33
|
+
},
|
|
34
|
+
allowNull: false,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
sequelize,
|
|
39
|
+
modelName: 'RoleHasPermission',
|
|
40
|
+
},
|
|
41
|
+
);
|
|
42
|
+
return RoleHasPermission;
|
|
43
|
+
};
|
package/nest-cli.json
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@illustrisinteractive/sentinel-nest",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"author": "John Dela Vega <john@luminotion.com>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build-models": "tsc -p src/models/tsconfig.json && tsc-alias -p src/models/tsconfig.json",
|
|
9
|
+
"build-bin": "tsc -p src/bin/tsconfig.json && tsc-alias -p src/bin/tsconfig.json",
|
|
10
|
+
"build-module": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json ",
|
|
11
|
+
"clean": "rimraf dist/",
|
|
12
|
+
"build": "npm run clean && npm run build-bin && npm run build-module"
|
|
13
|
+
},
|
|
14
|
+
"main": "dist/src/main",
|
|
15
|
+
"rimraf": "./node_modules/rimraf/bin.js",
|
|
16
|
+
"bin": {
|
|
17
|
+
"sentinel": "dist/bin/sentinel.js"
|
|
18
|
+
},
|
|
19
|
+
"old_scripts": {
|
|
20
|
+
"build": "nest build",
|
|
21
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
22
|
+
"start": "nest start",
|
|
23
|
+
"start:dev": "nest start --watch",
|
|
24
|
+
"start:debug": "nest start --debug --watch",
|
|
25
|
+
"start:prod": "node dist/main",
|
|
26
|
+
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
27
|
+
"test": "jest",
|
|
28
|
+
"test:watch": "jest --watch",
|
|
29
|
+
"test:cov": "jest --coverage",
|
|
30
|
+
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
31
|
+
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@nestjs/core": "^11.0.1"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@casl/ability": "^6.8.0",
|
|
38
|
+
"@clack/prompts": "^1.0.1",
|
|
39
|
+
"@grpc/grpc-js": "^1.14.3",
|
|
40
|
+
"@nestjs/common": "^11.0.1",
|
|
41
|
+
"@nestjs/config": "^4.0.3",
|
|
42
|
+
"@nestjs/jwt": "^11.0.2",
|
|
43
|
+
"@nestjs/platform-express": "^11.0.1",
|
|
44
|
+
"@nestjs/sequelize": "^11.0.1",
|
|
45
|
+
"@prisma/adapter-pg": "^7.4.1",
|
|
46
|
+
"@prisma/client": "^7.4.1",
|
|
47
|
+
"commander": "^14.0.3",
|
|
48
|
+
"mysql2": "^3.18.0",
|
|
49
|
+
"pg": "^8.18.0",
|
|
50
|
+
"reflect-metadata": "^0.2.2",
|
|
51
|
+
"rxjs": "^7.8.1",
|
|
52
|
+
"sequelize": "^6.37.7",
|
|
53
|
+
"sequelize-typescript": "^2.1.6",
|
|
54
|
+
"ts-morph": "^27.0.2",
|
|
55
|
+
"umzug": "^3.8.2"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@eslint/eslintrc": "^3.2.0",
|
|
59
|
+
"@eslint/js": "^9.18.0",
|
|
60
|
+
"@nestjs/cli": "^11.0.0",
|
|
61
|
+
"@nestjs/schematics": "^11.0.0",
|
|
62
|
+
"@nestjs/testing": "^11.0.1",
|
|
63
|
+
"@types/express": "^5.0.0",
|
|
64
|
+
"@types/jest": "^30.0.0",
|
|
65
|
+
"@types/node": "^22.10.7",
|
|
66
|
+
"@types/sequelize": "^4.28.20",
|
|
67
|
+
"@types/supertest": "^6.0.2",
|
|
68
|
+
"eslint": "^9.18.0",
|
|
69
|
+
"eslint-config-prettier": "^10.0.1",
|
|
70
|
+
"eslint-plugin-prettier": "^5.2.2",
|
|
71
|
+
"globals": "^16.0.0",
|
|
72
|
+
"jest": "^30.0.0",
|
|
73
|
+
"prettier": "^3.4.2",
|
|
74
|
+
"prisma": "^7.4.1",
|
|
75
|
+
"rimraf": "^6.1.3",
|
|
76
|
+
"source-map-support": "^0.5.21",
|
|
77
|
+
"supertest": "^7.0.0",
|
|
78
|
+
"ts-jest": "^29.2.5",
|
|
79
|
+
"ts-loader": "^9.5.2",
|
|
80
|
+
"ts-node": "^10.9.2",
|
|
81
|
+
"tsc-alias": "^1.8.16",
|
|
82
|
+
"tsconfig-paths": "^4.2.0",
|
|
83
|
+
"typescript": "^5.7.3",
|
|
84
|
+
"typescript-eslint": "^8.20.0"
|
|
85
|
+
},
|
|
86
|
+
"jest": {
|
|
87
|
+
"moduleFileExtensions": [
|
|
88
|
+
"js",
|
|
89
|
+
"json",
|
|
90
|
+
"ts"
|
|
91
|
+
],
|
|
92
|
+
"rootDir": "src",
|
|
93
|
+
"testRegex": ".*\\.spec\\.ts$",
|
|
94
|
+
"transform": {
|
|
95
|
+
"^.+\\.(t|j)s$": "ts-jest"
|
|
96
|
+
},
|
|
97
|
+
"collectCoverageFrom": [
|
|
98
|
+
"**/*.(t|j)s"
|
|
99
|
+
],
|
|
100
|
+
"coverageDirectory": "../coverage",
|
|
101
|
+
"testEnvironment": "node"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "ModelHasRoles" (
|
|
3
|
+
"id" SERIAL NOT NULL,
|
|
4
|
+
"role" INTEGER NOT NULL,
|
|
5
|
+
"model" INTEGER NOT NULL,
|
|
6
|
+
"createdAt" TIMESTAMPTZ(6) NOT NULL,
|
|
7
|
+
"updatedAt" TIMESTAMPTZ(6) NOT NULL,
|
|
8
|
+
|
|
9
|
+
CONSTRAINT "ModelHasRoles_pkey" PRIMARY KEY ("id")
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
-- CreateTable
|
|
13
|
+
CREATE TABLE "PermissionKeys" (
|
|
14
|
+
"id" VARCHAR(255) NOT NULL,
|
|
15
|
+
"resource" VARCHAR(255),
|
|
16
|
+
"action" VARCHAR(255),
|
|
17
|
+
"createdAt" TIMESTAMPTZ(6) NOT NULL,
|
|
18
|
+
"updatedAt" TIMESTAMPTZ(6) NOT NULL,
|
|
19
|
+
"description" VARCHAR(255),
|
|
20
|
+
|
|
21
|
+
CONSTRAINT "PermissionKeys_pkey" PRIMARY KEY ("id")
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
-- CreateTable
|
|
25
|
+
CREATE TABLE "RoleHasPermissions" (
|
|
26
|
+
"id" SERIAL NOT NULL,
|
|
27
|
+
"role" INTEGER NOT NULL,
|
|
28
|
+
"permission" VARCHAR(255) NOT NULL,
|
|
29
|
+
"createdAt" TIMESTAMPTZ(6) NOT NULL,
|
|
30
|
+
"updatedAt" TIMESTAMPTZ(6) NOT NULL,
|
|
31
|
+
|
|
32
|
+
CONSTRAINT "RoleHasPermissions_pkey" PRIMARY KEY ("id")
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
-- CreateTable
|
|
36
|
+
CREATE TABLE "Roles" (
|
|
37
|
+
"id" SERIAL NOT NULL,
|
|
38
|
+
"name" VARCHAR(255),
|
|
39
|
+
"createdAt" TIMESTAMPTZ(6) NOT NULL,
|
|
40
|
+
"updatedAt" TIMESTAMPTZ(6) NOT NULL,
|
|
41
|
+
|
|
42
|
+
CONSTRAINT "Roles_pkey" PRIMARY KEY ("id")
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
-- CreateTable
|
|
46
|
+
CREATE TABLE "SequelizeMeta" (
|
|
47
|
+
"name" VARCHAR(255) NOT NULL,
|
|
48
|
+
|
|
49
|
+
CONSTRAINT "SequelizeMeta_pkey" PRIMARY KEY ("name")
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
-- CreateTable
|
|
53
|
+
CREATE TABLE "Users" (
|
|
54
|
+
"id" INTEGER NOT NULL,
|
|
55
|
+
"firstName" VARCHAR(255),
|
|
56
|
+
"lastName" VARCHAR(255),
|
|
57
|
+
"isActive" BOOLEAN DEFAULT true,
|
|
58
|
+
"createdAt" TIMESTAMPTZ(6) NOT NULL,
|
|
59
|
+
"updatedAt" TIMESTAMPTZ(6) NOT NULL,
|
|
60
|
+
|
|
61
|
+
CONSTRAINT "Users_pkey" PRIMARY KEY ("id")
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- AddForeignKey
|
|
65
|
+
ALTER TABLE "ModelHasRoles" ADD CONSTRAINT "ModelHasRoles_model_fkey" FOREIGN KEY ("model") REFERENCES "Users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
|
|
66
|
+
|
|
67
|
+
-- AddForeignKey
|
|
68
|
+
ALTER TABLE "ModelHasRoles" ADD CONSTRAINT "ModelHasRoles_role_fkey" FOREIGN KEY ("role") REFERENCES "Roles"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
|
|
69
|
+
|
|
70
|
+
-- AddForeignKey
|
|
71
|
+
ALTER TABLE "RoleHasPermissions" ADD CONSTRAINT "RoleHasPermissions_permission_fkey" FOREIGN KEY ("permission") REFERENCES "PermissionKeys"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
|
|
72
|
+
|
|
73
|
+
-- AddForeignKey
|
|
74
|
+
ALTER TABLE "RoleHasPermissions" ADD CONSTRAINT "RoleHasPermissions_role_fkey" FOREIGN KEY ("role") REFERENCES "Roles"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
generator client {
|
|
2
|
+
provider = "prisma-client"
|
|
3
|
+
output = "../src/generated/prisma"
|
|
4
|
+
moduleFormat = "cjs"
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
datasource db {
|
|
8
|
+
provider = "postgresql"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
model ModelHasRoles {
|
|
12
|
+
id Int @id @default(autoincrement())
|
|
13
|
+
role Int
|
|
14
|
+
model Int
|
|
15
|
+
createdAt DateTime @db.Timestamptz(6)
|
|
16
|
+
updatedAt DateTime @db.Timestamptz(6)
|
|
17
|
+
Users Users @relation(fields: [model], references: [id], onDelete: NoAction, onUpdate: NoAction)
|
|
18
|
+
Roles Roles @relation(fields: [role], references: [id], onDelete: NoAction, onUpdate: NoAction)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
model PermissionKeys {
|
|
22
|
+
id String @id @db.VarChar(255)
|
|
23
|
+
resource String? @db.VarChar(255)
|
|
24
|
+
action String? @db.VarChar(255)
|
|
25
|
+
createdAt DateTime @db.Timestamptz(6)
|
|
26
|
+
updatedAt DateTime @db.Timestamptz(6)
|
|
27
|
+
description String? @db.VarChar(255)
|
|
28
|
+
RoleHasPermissions RoleHasPermissions[]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
model RoleHasPermissions {
|
|
32
|
+
id Int @id @default(autoincrement())
|
|
33
|
+
role Int
|
|
34
|
+
permission String @db.VarChar(255)
|
|
35
|
+
createdAt DateTime @db.Timestamptz(6)
|
|
36
|
+
updatedAt DateTime @db.Timestamptz(6)
|
|
37
|
+
PermissionKeys PermissionKeys @relation(fields: [permission], references: [id], onDelete: NoAction, onUpdate: NoAction)
|
|
38
|
+
Roles Roles @relation(fields: [role], references: [id], onDelete: NoAction, onUpdate: NoAction)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
model Roles {
|
|
42
|
+
id Int @id @default(autoincrement())
|
|
43
|
+
name String? @db.VarChar(255)
|
|
44
|
+
createdAt DateTime @db.Timestamptz(6)
|
|
45
|
+
updatedAt DateTime @db.Timestamptz(6)
|
|
46
|
+
ModelHasRoles ModelHasRoles[]
|
|
47
|
+
RoleHasPermissions RoleHasPermissions[]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
model SequelizeMeta {
|
|
51
|
+
name String @id @db.VarChar(255)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
model Users {
|
|
55
|
+
id Int @id
|
|
56
|
+
firstName String? @db.VarChar(255)
|
|
57
|
+
lastName String? @db.VarChar(255)
|
|
58
|
+
isActive Boolean? @default(true)
|
|
59
|
+
createdAt DateTime @db.Timestamptz(6)
|
|
60
|
+
updatedAt DateTime @db.Timestamptz(6)
|
|
61
|
+
ModelHasRoles ModelHasRoles[]
|
|
62
|
+
}
|
package/prisma.config.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// This file was generated by Prisma, and assumes you have installed the following:
|
|
2
|
+
// npm install --save-dev prisma dotenv
|
|
3
|
+
import 'dotenv/config';
|
|
4
|
+
import { defineConfig } from 'prisma/config';
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
schema: 'prisma/schema.prisma',
|
|
8
|
+
migrations: {
|
|
9
|
+
path: 'prisma/migrations',
|
|
10
|
+
},
|
|
11
|
+
datasource: {
|
|
12
|
+
url: `postgres://${process.env.SENTINEL_DB_USER}:${process.env.SENTINEL_DB_PASS}@${process.env.SENTINEL_DB_HOST}:${process.env.SENTINEL_DB_PORT}/${process.env.SENTINEL_DB_DATABASE}`,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { confirm, intro, log } from '@clack/prompts';
|
|
2
|
+
import { SecuredResource } from '@models/SecuredResource';
|
|
3
|
+
import { exec } from 'child_process';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { exit } from 'process';
|
|
7
|
+
import { Sequelize } from 'sequelize-typescript';
|
|
8
|
+
import { PermissionKey } from '@models/sequelize/PermissionKey';
|
|
9
|
+
|
|
10
|
+
export const commit = async (envFrom: string, skipPrompts = false) => {
|
|
11
|
+
intro('Sentinel CLI');
|
|
12
|
+
log.info('Commit - Prepare your Secured Resources for persistence.');
|
|
13
|
+
|
|
14
|
+
if (envFrom) {
|
|
15
|
+
try {
|
|
16
|
+
process.loadEnvFile(envFrom);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
log.error(
|
|
19
|
+
`Sentinel CLI failed to commit your Secured Resources during ENV file loading. ${error}`,
|
|
20
|
+
);
|
|
21
|
+
exit(-1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!fs.existsSync(process.cwd() + '\\src\\sentinel\\sentinel.config.json')) {
|
|
26
|
+
log.error(
|
|
27
|
+
`"sentinel.config.json" was not found in (${process.cwd() + '\\src\\sentinel'}). Have you initialized Sentinel using "npx sentinel init"?`,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
await import(
|
|
32
|
+
'file://' + process.cwd() + '\\src\\sentinel\\sentinel.config.json',
|
|
33
|
+
{
|
|
34
|
+
with: { type: 'json' },
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.log(error);
|
|
39
|
+
exit(-1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!fs.existsSync('src\\sentinel\\resources')) {
|
|
43
|
+
log.error(
|
|
44
|
+
`Resources folder not found in ${process.cwd() + '\\src\\sentinel\\resources'}. Have you created any Secured Resources with "npx sentinel resource <name>"?`,
|
|
45
|
+
);
|
|
46
|
+
// exit(-1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
await new Promise((resolve) => {
|
|
50
|
+
exec(`tsc -p ${'src\\sentinel\\resources'}\\tsconfig.json`, () => {
|
|
51
|
+
resolve(undefined);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const compilePath =
|
|
56
|
+
process.cwd() + `${'\\src\\sentinel\\resources'}\\.sentinel`;
|
|
57
|
+
const resourcesToImport = fs
|
|
58
|
+
.readdirSync(compilePath)
|
|
59
|
+
.filter((file) => path.extname(file) == '.js');
|
|
60
|
+
|
|
61
|
+
log.info(
|
|
62
|
+
`Found ${resourcesToImport.length} files in Secured Resources directory.`,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const resources: SecuredResource[] = [];
|
|
66
|
+
const promises: Promise<any>[] = [];
|
|
67
|
+
resourcesToImport.forEach((_res) => {
|
|
68
|
+
promises.push(
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises, no-async-promise-executor
|
|
70
|
+
new Promise(async (resolve) => {
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
72
|
+
const res = (await import(`file://${compilePath}/${_res}`)).default[
|
|
73
|
+
_res.split('.')[0]
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
77
|
+
resources.push(res);
|
|
78
|
+
resolve(undefined);
|
|
79
|
+
}),
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
await Promise.all(promises);
|
|
84
|
+
|
|
85
|
+
log.info('Secured Resources Graph');
|
|
86
|
+
resources.forEach((res) => {
|
|
87
|
+
log.step(res.name);
|
|
88
|
+
let message = '';
|
|
89
|
+
if (res.actions) {
|
|
90
|
+
Object.keys(res.actions).forEach((_key) => {
|
|
91
|
+
const action = res.actions[_key];
|
|
92
|
+
message += `-> ${_key} - ${action.description || 'No description.'}\n`;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
log.message(message);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (!skipPrompts) {
|
|
99
|
+
const ok = await confirm({
|
|
100
|
+
message: `Are you sure you want to commit ${resources.length} Secured Resources to your database? Please review the graph above if all Actions were successfully read.`,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
if (!ok) {
|
|
104
|
+
log.error('Commit was cancelled.');
|
|
105
|
+
exit(-1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const opts = {
|
|
111
|
+
SENTINEL_DB_HOST: process.env.SENTINEL_DB_HOST,
|
|
112
|
+
SENTINEL_DB_USER: process.env.SENTINEL_DB_USER,
|
|
113
|
+
SENTINEL_DB_PASS: process.env.SENTINEL_DB_PASS,
|
|
114
|
+
SENTINEL_DB_PORT: process.env.SENTINEL_DB_PORT as unknown as number,
|
|
115
|
+
SENTINEL_DB_DATABASE: process.env.SENTINEL_DB_DATABASE,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const missingOpts = Object.keys(opts).filter((key) => {
|
|
119
|
+
return opts[key] === undefined;
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
if (missingOpts.length != 0) {
|
|
123
|
+
log.error(
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
125
|
+
`Sentinel CLI failed to commit your Secured Resources due to missing environment variables: ${missingOpts}.`,
|
|
126
|
+
);
|
|
127
|
+
log.message(
|
|
128
|
+
'If these variables are defined in a file, run `npx sentinel init --env-from="<path>"` instead.',
|
|
129
|
+
);
|
|
130
|
+
exit(-1);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const sequelize = new Sequelize({
|
|
134
|
+
dialect: 'postgres',
|
|
135
|
+
host: opts.SENTINEL_DB_HOST,
|
|
136
|
+
username: opts.SENTINEL_DB_USER,
|
|
137
|
+
password: opts.SENTINEL_DB_PASS,
|
|
138
|
+
port: opts.SENTINEL_DB_PORT,
|
|
139
|
+
database: opts.SENTINEL_DB_DATABASE,
|
|
140
|
+
models: [PermissionKey],
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
await sequelize.authenticate();
|
|
145
|
+
} catch (error) {
|
|
146
|
+
console.log(error);
|
|
147
|
+
log.error(
|
|
148
|
+
'Sentinel CLI cannot connect to your database. Initialization failed.',
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
exit(-1);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
log.success('Successfully connected to your database.');
|
|
155
|
+
|
|
156
|
+
const keysToSeed: Promise<PermissionKey>[] = [];
|
|
157
|
+
|
|
158
|
+
for (const res of resources) {
|
|
159
|
+
Object.keys(res.actions).forEach((_key) => {
|
|
160
|
+
const action = res.actions[_key];
|
|
161
|
+
keysToSeed.push(
|
|
162
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
163
|
+
PermissionKey.upsert({
|
|
164
|
+
id: `${res.name.toLowerCase()}.${_key.toLowerCase()}`,
|
|
165
|
+
resource: res.name,
|
|
166
|
+
action: _key,
|
|
167
|
+
description: action.description || '',
|
|
168
|
+
})[0],
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
await Promise.all(keysToSeed);
|
|
174
|
+
|
|
175
|
+
log.success(
|
|
176
|
+
'Successfully commited all Secured Resources and their actions',
|
|
177
|
+
);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.log(error);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// const res = (
|
|
183
|
+
// await import(`file://${process.cwd()}/.sentinel/TestResource.js`)
|
|
184
|
+
// ).default['TestResource'];
|
|
185
|
+
// console.log(new res());
|
|
186
|
+
};
|