@ciscode/authentication-kit 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -73
- package/dist/auth-kit.module.d.ts +7 -0
- package/dist/auth-kit.module.js +50 -0
- package/dist/config/db.config.d.ts +1 -0
- package/dist/config/db.config.js +22 -0
- package/dist/config/passport.config.d.ts +3 -0
- package/dist/config/passport.config.js +272 -0
- package/dist/controllers/admin.controller.d.ts +4 -0
- package/dist/controllers/admin.controller.js +59 -0
- package/dist/controllers/auth.controller.d.ts +23 -0
- package/dist/controllers/auth.controller.js +645 -0
- package/dist/controllers/password-reset.controller.d.ts +8 -0
- package/dist/controllers/password-reset.controller.js +146 -0
- package/dist/controllers/permissions.controller.d.ts +7 -0
- package/dist/controllers/permissions.controller.js +115 -0
- package/dist/controllers/roles.controller.d.ts +7 -0
- package/dist/controllers/roles.controller.js +113 -0
- package/dist/controllers/users.controller.d.ts +8 -0
- package/dist/controllers/users.controller.js +259 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +14 -0
- package/dist/middleware/auth.guard.d.ts +4 -0
- package/dist/middleware/auth.guard.js +39 -0
- package/dist/middleware/authenticate.guard.d.ts +4 -0
- package/dist/middleware/authenticate.guard.js +44 -0
- package/dist/middleware/permission.guard.d.ts +4 -0
- package/dist/middleware/permission.guard.js +52 -0
- package/dist/middleware/tenant.guard.d.ts +4 -0
- package/dist/middleware/tenant.guard.js +39 -0
- package/dist/models/client.model.d.ts +54 -0
- package/dist/models/client.model.js +34 -0
- package/dist/models/permission.model.d.ts +19 -0
- package/dist/models/permission.model.js +17 -0
- package/dist/models/role.model.d.ts +33 -0
- package/dist/models/role.model.js +19 -0
- package/dist/models/tenant.model.d.ts +19 -0
- package/dist/models/tenant.model.js +15 -0
- package/dist/models/user.model.d.ts +63 -0
- package/dist/models/user.model.js +41 -0
- package/dist/standalone.d.ts +1 -0
- package/dist/standalone.js +12 -0
- package/dist/utils/helper.d.ts +1 -0
- package/dist/utils/helper.js +22 -0
- package/package.json +69 -43
- package/.github/workflows/ci .yml +0 -36
- package/.github/workflows/publish.yml +0 -30
- package/CODE_OF_CONDUCT +0 -38
- package/CONTRIBUTING.md +0 -40
- package/SECURITY +0 -31
- package/azure-pipelines.yml +0 -100
- package/src/config/db.config.js +0 -21
- package/src/config/passport.config.js +0 -280
- package/src/controllers/auth.controller.js +0 -566
- package/src/controllers/passwordReset.controller.js +0 -127
- package/src/controllers/permission.controller.js +0 -81
- package/src/controllers/roles.controller.js +0 -108
- package/src/controllers/user.controller.js +0 -283
- package/src/index.js +0 -32
- package/src/middleware/auth.middleware.js +0 -16
- package/src/middleware/authenticate.js +0 -25
- package/src/middleware/rbac.middleware.js +0 -24
- package/src/middleware/tenant.middleware.js +0 -16
- package/src/models/client.model.js +0 -39
- package/src/models/permission.model.js +0 -9
- package/src/models/role.model.js +0 -14
- package/src/models/tenant.model.js +0 -9
- package/src/models/user.model.js +0 -51
- package/src/routes/admin.routes.js +0 -8
- package/src/routes/auth.routes.js +0 -77
- package/src/routes/passwordReset.routes.js +0 -8
- package/src/routes/permission.routes.js +0 -17
- package/src/routes/roles.routes.js +0 -11
- package/src/routes/user.routes.js +0 -22
- package/src/utils/helper.js +0 -26
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasPermission = exports.TenantGuard = exports.AuthGuard = exports.AuthenticateGuard = exports.AuthKitModule = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
var auth_kit_module_1 = require("./auth-kit.module");
|
|
6
|
+
Object.defineProperty(exports, "AuthKitModule", { enumerable: true, get: function () { return auth_kit_module_1.AuthKitModule; } });
|
|
7
|
+
var authenticate_guard_1 = require("./middleware/authenticate.guard");
|
|
8
|
+
Object.defineProperty(exports, "AuthenticateGuard", { enumerable: true, get: function () { return authenticate_guard_1.AuthenticateGuard; } });
|
|
9
|
+
var auth_guard_1 = require("./middleware/auth.guard");
|
|
10
|
+
Object.defineProperty(exports, "AuthGuard", { enumerable: true, get: function () { return auth_guard_1.AuthGuard; } });
|
|
11
|
+
var tenant_guard_1 = require("./middleware/tenant.guard");
|
|
12
|
+
Object.defineProperty(exports, "TenantGuard", { enumerable: true, get: function () { return tenant_guard_1.TenantGuard; } });
|
|
13
|
+
var permission_guard_1 = require("./middleware/permission.guard");
|
|
14
|
+
Object.defineProperty(exports, "hasPermission", { enumerable: true, get: function () { return permission_guard_1.hasPermission; } });
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AuthGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
15
|
+
let AuthGuard = class AuthGuard {
|
|
16
|
+
canActivate(context) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
const req = context.switchToHttp().getRequest();
|
|
19
|
+
const res = context.switchToHttp().getResponse();
|
|
20
|
+
const token = (_b = (_a = req.headers) === null || _a === void 0 ? void 0 : _a.authorization) === null || _b === void 0 ? void 0 : _b.split(' ')[1];
|
|
21
|
+
if (!token) {
|
|
22
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const decoded = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET);
|
|
27
|
+
req.user = decoded;
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
res.status(403).json({ error: 'Invalid token' });
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.AuthGuard = AuthGuard;
|
|
37
|
+
exports.AuthGuard = AuthGuard = __decorate([
|
|
38
|
+
(0, common_1.Injectable)()
|
|
39
|
+
], AuthGuard);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AuthenticateGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
15
|
+
let AuthenticateGuard = class AuthenticateGuard {
|
|
16
|
+
canActivate(context) {
|
|
17
|
+
var _a;
|
|
18
|
+
const req = context.switchToHttp().getRequest();
|
|
19
|
+
const res = context.switchToHttp().getResponse();
|
|
20
|
+
const authHeader = (_a = req.headers) === null || _a === void 0 ? void 0 : _a.authorization;
|
|
21
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
22
|
+
res.status(401).json({ message: 'Missing or invalid Authorization header.' });
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const token = authHeader.split(' ')[1];
|
|
26
|
+
try {
|
|
27
|
+
const decoded = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET);
|
|
28
|
+
req.user = decoded;
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if ((err === null || err === void 0 ? void 0 : err.name) === 'TokenExpiredError') {
|
|
33
|
+
res.status(401).json({ message: 'Access token expired.' });
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
res.status(401).json({ message: 'Invalid access token.' });
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.AuthenticateGuard = AuthenticateGuard;
|
|
42
|
+
exports.AuthenticateGuard = AuthenticateGuard = __decorate([
|
|
43
|
+
(0, common_1.Injectable)()
|
|
44
|
+
], AuthenticateGuard);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.hasPermission = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const role_model_1 = __importDefault(require("../models/role.model"));
|
|
15
|
+
const hasPermission = (requiredPermission) => {
|
|
16
|
+
let PermissionGuard = class PermissionGuard {
|
|
17
|
+
async canActivate(context) {
|
|
18
|
+
const req = context.switchToHttp().getRequest();
|
|
19
|
+
const res = context.switchToHttp().getResponse();
|
|
20
|
+
try {
|
|
21
|
+
const { tenantId, roleIds, roles, permissions } = req.user || {};
|
|
22
|
+
const tokenPermissions = Array.isArray(permissions) ? permissions : [];
|
|
23
|
+
if (tokenPermissions.includes(requiredPermission)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
let resolvedPermissions = [];
|
|
27
|
+
if (Array.isArray(roleIds) && roleIds.length > 0) {
|
|
28
|
+
const roleDocs = await role_model_1.default.find({ _id: { $in: roleIds }, tenantId });
|
|
29
|
+
resolvedPermissions = roleDocs.flatMap((role) => role.permissions);
|
|
30
|
+
}
|
|
31
|
+
else if (Array.isArray(roles) && roles.length > 0 && tenantId) {
|
|
32
|
+
const roleDocs = await role_model_1.default.find({ name: { $in: roles }, tenantId });
|
|
33
|
+
resolvedPermissions = roleDocs.flatMap((role) => role.permissions);
|
|
34
|
+
}
|
|
35
|
+
if (resolvedPermissions.includes(requiredPermission)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
res.status(403).json({ error: 'Forbidden: Insufficient permissions' });
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
res.status(500).json({ error: 'Authorization error' });
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
PermissionGuard = __decorate([
|
|
48
|
+
(0, common_1.Injectable)()
|
|
49
|
+
], PermissionGuard);
|
|
50
|
+
return (0, common_1.mixin)(PermissionGuard);
|
|
51
|
+
};
|
|
52
|
+
exports.hasPermission = hasPermission;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TenantGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
15
|
+
let TenantGuard = class TenantGuard {
|
|
16
|
+
canActivate(context) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
const req = context.switchToHttp().getRequest();
|
|
19
|
+
const res = context.switchToHttp().getResponse();
|
|
20
|
+
const token = (_b = (_a = req.headers) === null || _a === void 0 ? void 0 : _a.authorization) === null || _b === void 0 ? void 0 : _b.split(' ')[1];
|
|
21
|
+
if (!token) {
|
|
22
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const decoded = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET);
|
|
27
|
+
req.tenantId = decoded.tenantId;
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
res.status(403).json({ error: 'Invalid token' });
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.TenantGuard = TenantGuard;
|
|
37
|
+
exports.TenantGuard = TenantGuard = __decorate([
|
|
38
|
+
(0, common_1.Injectable)()
|
|
39
|
+
], TenantGuard);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
declare const ClientSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
3
|
+
timestamps: true;
|
|
4
|
+
}, {
|
|
5
|
+
createdAt: NativeDate;
|
|
6
|
+
updatedAt: NativeDate;
|
|
7
|
+
} & {
|
|
8
|
+
email: string;
|
|
9
|
+
roles: mongoose.Types.ObjectId[];
|
|
10
|
+
createdAt: Date;
|
|
11
|
+
name?: string;
|
|
12
|
+
password?: string;
|
|
13
|
+
microsoftId?: string;
|
|
14
|
+
googleId?: string;
|
|
15
|
+
facebookId?: string;
|
|
16
|
+
resetPasswordToken?: string;
|
|
17
|
+
resetPasswordExpires?: Date;
|
|
18
|
+
refreshToken?: string;
|
|
19
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
20
|
+
createdAt: NativeDate;
|
|
21
|
+
updatedAt: NativeDate;
|
|
22
|
+
} & {
|
|
23
|
+
email: string;
|
|
24
|
+
roles: mongoose.Types.ObjectId[];
|
|
25
|
+
createdAt: Date;
|
|
26
|
+
name?: string;
|
|
27
|
+
password?: string;
|
|
28
|
+
microsoftId?: string;
|
|
29
|
+
googleId?: string;
|
|
30
|
+
facebookId?: string;
|
|
31
|
+
resetPasswordToken?: string;
|
|
32
|
+
resetPasswordExpires?: Date;
|
|
33
|
+
refreshToken?: string;
|
|
34
|
+
}>> & mongoose.FlatRecord<{
|
|
35
|
+
createdAt: NativeDate;
|
|
36
|
+
updatedAt: NativeDate;
|
|
37
|
+
} & {
|
|
38
|
+
email: string;
|
|
39
|
+
roles: mongoose.Types.ObjectId[];
|
|
40
|
+
createdAt: Date;
|
|
41
|
+
name?: string;
|
|
42
|
+
password?: string;
|
|
43
|
+
microsoftId?: string;
|
|
44
|
+
googleId?: string;
|
|
45
|
+
facebookId?: string;
|
|
46
|
+
resetPasswordToken?: string;
|
|
47
|
+
resetPasswordExpires?: Date;
|
|
48
|
+
refreshToken?: string;
|
|
49
|
+
}> & {
|
|
50
|
+
_id: mongoose.Types.ObjectId;
|
|
51
|
+
}>;
|
|
52
|
+
declare const Client: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
53
|
+
export { ClientSchema };
|
|
54
|
+
export default Client;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ClientSchema = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const mongoose_paginate_v2_1 = __importDefault(require("mongoose-paginate-v2"));
|
|
9
|
+
const ClientSchema = new mongoose_1.default.Schema({
|
|
10
|
+
email: {
|
|
11
|
+
type: String,
|
|
12
|
+
required: true,
|
|
13
|
+
unique: true
|
|
14
|
+
},
|
|
15
|
+
password: {
|
|
16
|
+
type: String,
|
|
17
|
+
required: function () {
|
|
18
|
+
return !this.microsoftId && !this.googleId && !this.facebookId;
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
name: { type: String },
|
|
22
|
+
microsoftId: { type: String, index: true },
|
|
23
|
+
googleId: { type: String, index: true },
|
|
24
|
+
facebookId: { type: String, index: true },
|
|
25
|
+
roles: [{ type: mongoose_1.default.Schema.Types.ObjectId, ref: 'Role' }],
|
|
26
|
+
resetPasswordToken: { type: String },
|
|
27
|
+
resetPasswordExpires: { type: Date },
|
|
28
|
+
refreshToken: { type: String },
|
|
29
|
+
createdAt: { type: Date, default: Date.now }
|
|
30
|
+
}, { timestamps: true });
|
|
31
|
+
exports.ClientSchema = ClientSchema;
|
|
32
|
+
ClientSchema.plugin(mongoose_paginate_v2_1.default);
|
|
33
|
+
const Client = mongoose_1.default.models.Client || mongoose_1.default.model('Client', ClientSchema);
|
|
34
|
+
exports.default = Client;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
declare const PermissionSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, {
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
category?: string;
|
|
6
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
category?: string;
|
|
10
|
+
}>> & mongoose.FlatRecord<{
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
category?: string;
|
|
14
|
+
}> & {
|
|
15
|
+
_id: mongoose.Types.ObjectId;
|
|
16
|
+
}>;
|
|
17
|
+
declare const Permission: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
18
|
+
export { PermissionSchema };
|
|
19
|
+
export default Permission;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PermissionSchema = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const mongoose_paginate_v2_1 = __importDefault(require("mongoose-paginate-v2"));
|
|
9
|
+
const PermissionSchema = new mongoose_1.default.Schema({
|
|
10
|
+
name: { type: String, required: true, unique: true },
|
|
11
|
+
category: { type: String },
|
|
12
|
+
description: { type: String }
|
|
13
|
+
});
|
|
14
|
+
exports.PermissionSchema = PermissionSchema;
|
|
15
|
+
PermissionSchema.plugin(mongoose_paginate_v2_1.default);
|
|
16
|
+
const Permission = mongoose_1.default.models.Permission || mongoose_1.default.model('Permission', PermissionSchema);
|
|
17
|
+
exports.default = Permission;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
declare const RoleSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
3
|
+
timestamps: true;
|
|
4
|
+
}, {
|
|
5
|
+
createdAt: NativeDate;
|
|
6
|
+
updatedAt: NativeDate;
|
|
7
|
+
} & {
|
|
8
|
+
name: string;
|
|
9
|
+
tenantId: string;
|
|
10
|
+
permissions: string[];
|
|
11
|
+
description?: string;
|
|
12
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
13
|
+
createdAt: NativeDate;
|
|
14
|
+
updatedAt: NativeDate;
|
|
15
|
+
} & {
|
|
16
|
+
name: string;
|
|
17
|
+
tenantId: string;
|
|
18
|
+
permissions: string[];
|
|
19
|
+
description?: string;
|
|
20
|
+
}>> & mongoose.FlatRecord<{
|
|
21
|
+
createdAt: NativeDate;
|
|
22
|
+
updatedAt: NativeDate;
|
|
23
|
+
} & {
|
|
24
|
+
name: string;
|
|
25
|
+
tenantId: string;
|
|
26
|
+
permissions: string[];
|
|
27
|
+
description?: string;
|
|
28
|
+
}> & {
|
|
29
|
+
_id: mongoose.Types.ObjectId;
|
|
30
|
+
}>;
|
|
31
|
+
declare const Role: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
32
|
+
export { RoleSchema };
|
|
33
|
+
export default Role;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RoleSchema = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const mongoose_paginate_v2_1 = __importDefault(require("mongoose-paginate-v2"));
|
|
9
|
+
const RoleSchema = new mongoose_1.default.Schema({
|
|
10
|
+
tenantId: { type: String, required: true },
|
|
11
|
+
name: { type: String, required: true },
|
|
12
|
+
description: { type: String },
|
|
13
|
+
permissions: [{ type: String }]
|
|
14
|
+
}, { timestamps: true });
|
|
15
|
+
exports.RoleSchema = RoleSchema;
|
|
16
|
+
RoleSchema.plugin(mongoose_paginate_v2_1.default);
|
|
17
|
+
RoleSchema.index({ tenantId: 1, name: 1 }, { unique: true });
|
|
18
|
+
const Role = mongoose_1.default.models.Role || mongoose_1.default.model('Role', RoleSchema);
|
|
19
|
+
exports.default = Role;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
declare const TenantSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, {
|
|
3
|
+
_id?: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
plan?: string;
|
|
6
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
7
|
+
_id?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
plan?: string;
|
|
10
|
+
}>> & mongoose.FlatRecord<{
|
|
11
|
+
_id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
plan?: string;
|
|
14
|
+
}> & Required<{
|
|
15
|
+
_id: string;
|
|
16
|
+
}>>;
|
|
17
|
+
declare const Tenant: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
18
|
+
export { TenantSchema };
|
|
19
|
+
export default Tenant;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TenantSchema = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const TenantSchema = new mongoose_1.default.Schema({
|
|
9
|
+
_id: String,
|
|
10
|
+
name: String,
|
|
11
|
+
plan: String
|
|
12
|
+
});
|
|
13
|
+
exports.TenantSchema = TenantSchema;
|
|
14
|
+
const Tenant = mongoose_1.default.models.Tenant || mongoose_1.default.model('Tenant', TenantSchema);
|
|
15
|
+
exports.default = Tenant;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
declare const UserSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
3
|
+
timestamps: true;
|
|
4
|
+
}, {
|
|
5
|
+
createdAt: NativeDate;
|
|
6
|
+
updatedAt: NativeDate;
|
|
7
|
+
} & {
|
|
8
|
+
email: string;
|
|
9
|
+
tenantId: string;
|
|
10
|
+
roles: mongoose.Types.ObjectId[];
|
|
11
|
+
status: "pending" | "active" | "suspended" | "deactivated";
|
|
12
|
+
failedLoginAttempts: number;
|
|
13
|
+
name?: string;
|
|
14
|
+
password?: string;
|
|
15
|
+
microsoftId?: string;
|
|
16
|
+
googleId?: string;
|
|
17
|
+
facebookId?: string;
|
|
18
|
+
resetPasswordToken?: string;
|
|
19
|
+
resetPasswordExpires?: Date;
|
|
20
|
+
refreshToken?: string;
|
|
21
|
+
lockUntil?: Date;
|
|
22
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
23
|
+
createdAt: NativeDate;
|
|
24
|
+
updatedAt: NativeDate;
|
|
25
|
+
} & {
|
|
26
|
+
email: string;
|
|
27
|
+
tenantId: string;
|
|
28
|
+
roles: mongoose.Types.ObjectId[];
|
|
29
|
+
status: "pending" | "active" | "suspended" | "deactivated";
|
|
30
|
+
failedLoginAttempts: number;
|
|
31
|
+
name?: string;
|
|
32
|
+
password?: string;
|
|
33
|
+
microsoftId?: string;
|
|
34
|
+
googleId?: string;
|
|
35
|
+
facebookId?: string;
|
|
36
|
+
resetPasswordToken?: string;
|
|
37
|
+
resetPasswordExpires?: Date;
|
|
38
|
+
refreshToken?: string;
|
|
39
|
+
lockUntil?: Date;
|
|
40
|
+
}>> & mongoose.FlatRecord<{
|
|
41
|
+
createdAt: NativeDate;
|
|
42
|
+
updatedAt: NativeDate;
|
|
43
|
+
} & {
|
|
44
|
+
email: string;
|
|
45
|
+
tenantId: string;
|
|
46
|
+
roles: mongoose.Types.ObjectId[];
|
|
47
|
+
status: "pending" | "active" | "suspended" | "deactivated";
|
|
48
|
+
failedLoginAttempts: number;
|
|
49
|
+
name?: string;
|
|
50
|
+
password?: string;
|
|
51
|
+
microsoftId?: string;
|
|
52
|
+
googleId?: string;
|
|
53
|
+
facebookId?: string;
|
|
54
|
+
resetPasswordToken?: string;
|
|
55
|
+
resetPasswordExpires?: Date;
|
|
56
|
+
refreshToken?: string;
|
|
57
|
+
lockUntil?: Date;
|
|
58
|
+
}> & {
|
|
59
|
+
_id: mongoose.Types.ObjectId;
|
|
60
|
+
}>;
|
|
61
|
+
declare const User: mongoose.Model<any, {}, {}, {}, any, any>;
|
|
62
|
+
export { UserSchema };
|
|
63
|
+
export default User;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.UserSchema = void 0;
|
|
7
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
8
|
+
const mongoose_paginate_v2_1 = __importDefault(require("mongoose-paginate-v2"));
|
|
9
|
+
const UserSchema = new mongoose_1.default.Schema({
|
|
10
|
+
email: {
|
|
11
|
+
type: String,
|
|
12
|
+
required: true
|
|
13
|
+
},
|
|
14
|
+
password: {
|
|
15
|
+
type: String,
|
|
16
|
+
required: function () {
|
|
17
|
+
return !this.microsoftId && !this.googleId && !this.facebookId;
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
name: { type: String },
|
|
21
|
+
tenantId: { type: String, required: true },
|
|
22
|
+
microsoftId: { type: String, index: true },
|
|
23
|
+
googleId: { type: String, index: true },
|
|
24
|
+
facebookId: { type: String, index: true },
|
|
25
|
+
roles: [{ type: mongoose_1.default.Schema.Types.ObjectId, ref: 'Role' }],
|
|
26
|
+
resetPasswordToken: { type: String },
|
|
27
|
+
resetPasswordExpires: { type: Date },
|
|
28
|
+
status: {
|
|
29
|
+
type: String,
|
|
30
|
+
enum: ['pending', 'active', 'suspended', 'deactivated'],
|
|
31
|
+
default: 'pending'
|
|
32
|
+
},
|
|
33
|
+
refreshToken: { type: String },
|
|
34
|
+
failedLoginAttempts: { type: Number, default: 0 },
|
|
35
|
+
lockUntil: { type: Date }
|
|
36
|
+
}, { timestamps: true });
|
|
37
|
+
exports.UserSchema = UserSchema;
|
|
38
|
+
UserSchema.plugin(mongoose_paginate_v2_1.default);
|
|
39
|
+
UserSchema.index({ tenantId: 1, email: 1 }, { unique: true });
|
|
40
|
+
const User = mongoose_1.default.models.User || mongoose_1.default.model('User', UserSchema);
|
|
41
|
+
exports.default = User;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const core_1 = require("@nestjs/core");
|
|
5
|
+
const auth_kit_module_1 = require("./auth-kit.module");
|
|
6
|
+
async function bootstrap() {
|
|
7
|
+
const app = await core_1.NestFactory.create(auth_kit_module_1.AuthKitModule);
|
|
8
|
+
const port = process.env.PORT || 3000;
|
|
9
|
+
await app.listen(port);
|
|
10
|
+
console.log('AuthKit listening on', port);
|
|
11
|
+
}
|
|
12
|
+
bootstrap();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getMillisecondsFromExpiry(expiry: string | number): number;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMillisecondsFromExpiry = getMillisecondsFromExpiry;
|
|
4
|
+
function getMillisecondsFromExpiry(expiry) {
|
|
5
|
+
if (typeof expiry === 'number') {
|
|
6
|
+
return expiry * 1000;
|
|
7
|
+
}
|
|
8
|
+
const unit = expiry.slice(-1).toLowerCase();
|
|
9
|
+
const value = parseInt(expiry.slice(0, -1), 10);
|
|
10
|
+
switch (unit) {
|
|
11
|
+
case 's':
|
|
12
|
+
return value * 1000;
|
|
13
|
+
case 'm':
|
|
14
|
+
return value * 60 * 1000;
|
|
15
|
+
case 'h':
|
|
16
|
+
return value * 60 * 60 * 1000;
|
|
17
|
+
case 'd':
|
|
18
|
+
return value * 24 * 60 * 60 * 1000;
|
|
19
|
+
default:
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
}
|