@lenne.tech/nest-server 11.41.2 → 11.41.4
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/.claude/rules/architecture.md +1 -0
- package/.claude/rules/configurable-features.md +1 -0
- package/.claude/rules/role-system.md +15 -1
- package/.claude/rules/testing.md +16 -4
- package/CLAUDE.md +2 -1
- package/FRAMEWORK-API.md +4 -1
- package/dist/core/common/helpers/graceful-shutdown.helper.js.map +1 -1
- package/dist/core/common/helpers/logging.helper.js +2 -0
- package/dist/core/common/helpers/logging.helper.js.map +1 -1
- package/dist/core/common/helpers/process-diagnostics.helper.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +20 -0
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.d.ts +2 -2
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js +46 -6
- package/dist/core/modules/ai/helpers/ai-mcp-oauth.helper.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +7 -1
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.constants.d.ts +6 -0
- package/dist/core/modules/api-token/core-api-token.constants.js +11 -0
- package/dist/core/modules/api-token/core-api-token.constants.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.decorators.d.ts +1 -0
- package/dist/core/modules/api-token/core-api-token.decorators.js +8 -0
- package/dist/core/modules/api-token/core-api-token.decorators.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.helpers.d.ts +127 -0
- package/dist/core/modules/api-token/core-api-token.helpers.js +398 -0
- package/dist/core/modules/api-token/core-api-token.helpers.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.middleware.d.ts +10 -0
- package/dist/core/modules/api-token/core-api-token.middleware.js +58 -0
- package/dist/core/modules/api-token/core-api-token.middleware.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.model.d.ts +20 -0
- package/dist/core/modules/api-token/core-api-token.model.js +199 -0
- package/dist/core/modules/api-token/core-api-token.model.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.module.d.ts +11 -0
- package/dist/core/modules/api-token/core-api-token.module.js +39 -0
- package/dist/core/modules/api-token/core-api-token.module.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.registry.d.ts +9 -0
- package/dist/core/modules/api-token/core-api-token.registry.js +17 -0
- package/dist/core/modules/api-token/core-api-token.registry.js.map +1 -0
- package/dist/core/modules/api-token/core-api-token.service.d.ts +104 -0
- package/dist/core/modules/api-token/core-api-token.service.js +550 -0
- package/dist/core/modules/api-token/core-api-token.service.js.map +1 -0
- package/dist/core/modules/auth/guards/roles.guard.js +17 -1
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-roles.guard.js +12 -2
- package/dist/core/modules/better-auth/better-auth-roles.guard.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.middleware.js +4 -0
- package/dist/core/modules/better-auth/core-better-auth.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.d.ts +4 -0
- package/dist/core/modules/better-auth/core-better-auth.module.js +18 -0
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant-guard.registry.d.ts +2 -0
- package/dist/core/modules/tenant/core-tenant-guard.registry.js +19 -0
- package/dist/core/modules/tenant/core-tenant-guard.registry.js.map +1 -0
- package/dist/core/modules/tenant/core-tenant.guard.d.ts +1 -0
- package/dist/core/modules/tenant/core-tenant.guard.js +28 -12
- package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.helpers.d.ts +1 -0
- package/dist/core/modules/tenant/core-tenant.helpers.js +19 -0
- package/dist/core/modules/tenant/core-tenant.helpers.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.module.d.ts +5 -2
- package/dist/core/modules/tenant/core-tenant.module.js +8 -0
- package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
- package/dist/core/modules/user/core-user.service.js +7 -0
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core.module.js +6 -0
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/docs/REQUEST-LIFECYCLE.md +49 -1
- package/docs/security-overrides.md +16 -10
- package/migration-guides/11.41.3-to-11.41.4.md +172 -0
- package/package.json +38 -37
- package/src/core/common/helpers/graceful-shutdown.helper.ts +9 -0
- package/src/core/common/helpers/logging.helper.ts +7 -0
- package/src/core/common/helpers/process-diagnostics.helper.ts +4 -0
- package/src/core/common/interfaces/server-options.interface.ts +110 -0
- package/src/core/modules/ai/INTEGRATION-CHECKLIST.md +17 -10
- package/src/core/modules/ai/README.md +9 -1
- package/src/core/modules/ai/helpers/ai-mcp-oauth.helper.ts +74 -7
- package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +13 -1
- package/src/core/modules/api-token/INTEGRATION-CHECKLIST.md +121 -0
- package/src/core/modules/api-token/README.md +212 -0
- package/src/core/modules/api-token/core-api-token.constants.ts +27 -0
- package/src/core/modules/api-token/core-api-token.decorators.ts +29 -0
- package/src/core/modules/api-token/core-api-token.helpers.ts +711 -0
- package/src/core/modules/api-token/core-api-token.middleware.ts +57 -0
- package/src/core/modules/api-token/core-api-token.model.ts +193 -0
- package/src/core/modules/api-token/core-api-token.module.ts +48 -0
- package/src/core/modules/api-token/core-api-token.registry.ts +53 -0
- package/src/core/modules/api-token/core-api-token.service.ts +822 -0
- package/src/core/modules/auth/guards/roles.guard.ts +23 -2
- package/src/core/modules/better-auth/better-auth-roles.guard.ts +18 -4
- package/src/core/modules/better-auth/core-better-auth.middleware.ts +8 -0
- package/src/core/modules/better-auth/core-better-auth.module.ts +33 -0
- package/src/core/modules/tenant/README.md +17 -0
- package/src/core/modules/tenant/core-tenant-guard.registry.ts +36 -0
- package/src/core/modules/tenant/core-tenant.guard.ts +52 -12
- package/src/core/modules/tenant/core-tenant.helpers.ts +30 -0
- package/src/core/modules/tenant/core-tenant.module.ts +19 -2
- package/src/core/modules/user/core-user.service.ts +14 -0
- package/src/core.module.ts +12 -0
- package/src/index.ts +12 -0
|
@@ -0,0 +1,199 @@
|
|
|
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 __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CoreApiTokenModel = void 0;
|
|
13
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
14
|
+
const mongoose_1 = require("@nestjs/mongoose");
|
|
15
|
+
const restricted_decorator_1 = require("../../common/decorators/restricted.decorator");
|
|
16
|
+
const unified_field_decorator_1 = require("../../common/decorators/unified-field.decorator");
|
|
17
|
+
const role_enum_1 = require("../../common/enums/role.enum");
|
|
18
|
+
const access_denied_exception_1 = require("../../common/exceptions/access-denied.exception");
|
|
19
|
+
const core_persistence_model_1 = require("../../common/models/core-persistence.model");
|
|
20
|
+
const config_service_1 = require("../../common/services/config.service");
|
|
21
|
+
const request_context_service_1 = require("../../common/services/request-context.service");
|
|
22
|
+
const core_tenant_helpers_1 = require("../tenant/core-tenant.helpers");
|
|
23
|
+
const core_api_token_constants_1 = require("./core-api-token.constants");
|
|
24
|
+
const core_api_token_helpers_1 = require("./core-api-token.helpers");
|
|
25
|
+
let CoreApiTokenModel = class CoreApiTokenModel extends core_persistence_model_1.CorePersistenceModel {
|
|
26
|
+
createdBy = undefined;
|
|
27
|
+
description = undefined;
|
|
28
|
+
expiresAt = undefined;
|
|
29
|
+
kind = undefined;
|
|
30
|
+
lastUsedAt = undefined;
|
|
31
|
+
maxTenantRole = undefined;
|
|
32
|
+
name = undefined;
|
|
33
|
+
publicId = undefined;
|
|
34
|
+
revokedAt = undefined;
|
|
35
|
+
scopes = undefined;
|
|
36
|
+
secretHash = undefined;
|
|
37
|
+
signingKeyEncrypted = undefined;
|
|
38
|
+
tenant = undefined;
|
|
39
|
+
updatedBy = undefined;
|
|
40
|
+
user = undefined;
|
|
41
|
+
securityCheck(user, force) {
|
|
42
|
+
if (force)
|
|
43
|
+
return this;
|
|
44
|
+
if (!user)
|
|
45
|
+
throw (0, access_denied_exception_1.accessDeniedException)(user);
|
|
46
|
+
if ((0, core_api_token_helpers_1.getApiTokenContext)(user))
|
|
47
|
+
throw (0, access_denied_exception_1.accessDeniedException)(user);
|
|
48
|
+
if (this.kind === core_api_token_constants_1.ApiTokenKind.USER && user.id === this.user)
|
|
49
|
+
return this;
|
|
50
|
+
const adminBypass = config_service_1.ConfigService.configFastButReadOnly?.multiTenancy?.adminBypass !== false;
|
|
51
|
+
if (adminBypass && user.hasRole?.([role_enum_1.RoleEnum.ADMIN]))
|
|
52
|
+
return this;
|
|
53
|
+
const context = request_context_service_1.RequestContext.get();
|
|
54
|
+
if (this.kind === core_api_token_constants_1.ApiTokenKind.TENANT &&
|
|
55
|
+
context?.tenantId === this.tenant &&
|
|
56
|
+
context?.tenantRole &&
|
|
57
|
+
(0, core_tenant_helpers_1.checkRoleAccess)([(0, core_api_token_helpers_1.getApiTokenManageRole)()], undefined, context.tenantRole)) {
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
throw (0, access_denied_exception_1.accessDeniedException)(user);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
exports.CoreApiTokenModel = CoreApiTokenModel;
|
|
64
|
+
__decorate([
|
|
65
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
66
|
+
description: 'ID of the creating user',
|
|
67
|
+
isOptional: true,
|
|
68
|
+
mongoose: { type: String },
|
|
69
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
70
|
+
}),
|
|
71
|
+
__metadata("design:type", String)
|
|
72
|
+
], CoreApiTokenModel.prototype, "createdBy", void 0);
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, unified_field_decorator_1.UnifiedField)({ description: 'Description', isOptional: true, mongoose: { type: String }, roles: role_enum_1.RoleEnum.S_USER }),
|
|
75
|
+
__metadata("design:type", String)
|
|
76
|
+
], CoreApiTokenModel.prototype, "description", void 0);
|
|
77
|
+
__decorate([
|
|
78
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
79
|
+
description: 'Expiry date',
|
|
80
|
+
isOptional: true,
|
|
81
|
+
mongoose: { default: null, type: Date },
|
|
82
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
83
|
+
type: Date,
|
|
84
|
+
}),
|
|
85
|
+
__metadata("design:type", Date)
|
|
86
|
+
], CoreApiTokenModel.prototype, "expiresAt", void 0);
|
|
87
|
+
__decorate([
|
|
88
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
89
|
+
description: 'Token kind',
|
|
90
|
+
mongoose: { enum: Object.values(core_api_token_constants_1.ApiTokenKind), required: true, type: String },
|
|
91
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
92
|
+
type: () => String,
|
|
93
|
+
}),
|
|
94
|
+
__metadata("design:type", String)
|
|
95
|
+
], CoreApiTokenModel.prototype, "kind", void 0);
|
|
96
|
+
__decorate([
|
|
97
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
98
|
+
description: 'Last use',
|
|
99
|
+
isOptional: true,
|
|
100
|
+
mongoose: { default: null, type: Date },
|
|
101
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
102
|
+
type: Date,
|
|
103
|
+
}),
|
|
104
|
+
__metadata("design:type", Date)
|
|
105
|
+
], CoreApiTokenModel.prototype, "lastUsedAt", void 0);
|
|
106
|
+
__decorate([
|
|
107
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
108
|
+
description: 'Maximum tenant role',
|
|
109
|
+
isOptional: true,
|
|
110
|
+
mongoose: { type: String },
|
|
111
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
112
|
+
}),
|
|
113
|
+
__metadata("design:type", String)
|
|
114
|
+
], CoreApiTokenModel.prototype, "maxTenantRole", void 0);
|
|
115
|
+
__decorate([
|
|
116
|
+
(0, unified_field_decorator_1.UnifiedField)({ description: 'Name', mongoose: { required: true, type: String }, roles: role_enum_1.RoleEnum.S_USER }),
|
|
117
|
+
__metadata("design:type", String)
|
|
118
|
+
], CoreApiTokenModel.prototype, "name", void 0);
|
|
119
|
+
__decorate([
|
|
120
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
121
|
+
description: 'Public token id',
|
|
122
|
+
mongoose: { required: true, type: String, unique: true },
|
|
123
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
124
|
+
}),
|
|
125
|
+
__metadata("design:type", String)
|
|
126
|
+
], CoreApiTokenModel.prototype, "publicId", void 0);
|
|
127
|
+
__decorate([
|
|
128
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
129
|
+
description: 'Revocation date',
|
|
130
|
+
isOptional: true,
|
|
131
|
+
mongoose: { default: null, type: Date },
|
|
132
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
133
|
+
type: Date,
|
|
134
|
+
}),
|
|
135
|
+
__metadata("design:type", Date)
|
|
136
|
+
], CoreApiTokenModel.prototype, "revokedAt", void 0);
|
|
137
|
+
__decorate([
|
|
138
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
139
|
+
description: 'Scopes',
|
|
140
|
+
isArray: true,
|
|
141
|
+
mongoose: { default: [], type: [String] },
|
|
142
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
143
|
+
type: () => String,
|
|
144
|
+
}),
|
|
145
|
+
__metadata("design:type", Array)
|
|
146
|
+
], CoreApiTokenModel.prototype, "scopes", void 0);
|
|
147
|
+
__decorate([
|
|
148
|
+
(0, restricted_decorator_1.Restricted)(role_enum_1.RoleEnum.S_NO_ONE),
|
|
149
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
150
|
+
description: 'Secret hash',
|
|
151
|
+
isOptional: true,
|
|
152
|
+
mongoose: { select: false, type: String },
|
|
153
|
+
roles: role_enum_1.RoleEnum.S_NO_ONE,
|
|
154
|
+
}),
|
|
155
|
+
__metadata("design:type", String)
|
|
156
|
+
], CoreApiTokenModel.prototype, "secretHash", void 0);
|
|
157
|
+
__decorate([
|
|
158
|
+
(0, restricted_decorator_1.Restricted)(role_enum_1.RoleEnum.S_NO_ONE),
|
|
159
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
160
|
+
description: 'Encrypted signing key',
|
|
161
|
+
isOptional: true,
|
|
162
|
+
mongoose: { select: false, type: String },
|
|
163
|
+
roles: role_enum_1.RoleEnum.S_NO_ONE,
|
|
164
|
+
}),
|
|
165
|
+
__metadata("design:type", String)
|
|
166
|
+
], CoreApiTokenModel.prototype, "signingKeyEncrypted", void 0);
|
|
167
|
+
__decorate([
|
|
168
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
169
|
+
description: 'Tenant ID',
|
|
170
|
+
isOptional: true,
|
|
171
|
+
mongoose: { index: true, type: String },
|
|
172
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
173
|
+
}),
|
|
174
|
+
__metadata("design:type", String)
|
|
175
|
+
], CoreApiTokenModel.prototype, "tenant", void 0);
|
|
176
|
+
__decorate([
|
|
177
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
178
|
+
description: 'ID of the last updating user',
|
|
179
|
+
isOptional: true,
|
|
180
|
+
mongoose: { type: String },
|
|
181
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
182
|
+
}),
|
|
183
|
+
__metadata("design:type", String)
|
|
184
|
+
], CoreApiTokenModel.prototype, "updatedBy", void 0);
|
|
185
|
+
__decorate([
|
|
186
|
+
(0, unified_field_decorator_1.UnifiedField)({
|
|
187
|
+
description: 'Owning user ID',
|
|
188
|
+
isOptional: true,
|
|
189
|
+
mongoose: { index: true, type: String },
|
|
190
|
+
roles: role_enum_1.RoleEnum.S_USER,
|
|
191
|
+
}),
|
|
192
|
+
__metadata("design:type", String)
|
|
193
|
+
], CoreApiTokenModel.prototype, "user", void 0);
|
|
194
|
+
exports.CoreApiTokenModel = CoreApiTokenModel = __decorate([
|
|
195
|
+
(0, graphql_1.ObjectType)({ description: 'API token', isAbstract: true }),
|
|
196
|
+
(0, restricted_decorator_1.Restricted)(role_enum_1.RoleEnum.S_USER),
|
|
197
|
+
(0, mongoose_1.Schema)({ timestamps: true })
|
|
198
|
+
], CoreApiTokenModel);
|
|
199
|
+
//# sourceMappingURL=core-api-token.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-api-token.model.js","sourceRoot":"","sources":["../../../../src/core/modules/api-token/core-api-token.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA6C;AAC7C,+CAA0C;AAE1C,uFAA0E;AAC1E,6FAA+E;AAC/E,4DAAwD;AACxD,6FAAwF;AACxF,uFAAkF;AAClF,yEAAqE;AACrE,2FAA+E;AAC/E,uEAAgE;AAChE,yEAA0D;AAC1D,qEAAqF;AAmB9E,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,6CAAoB;IAQzD,SAAS,GAAW,SAAS,CAAC;IAI9B,WAAW,GAAW,SAAS,CAAC;IAUhC,SAAS,GAAS,SAAS,CAAC;IAS5B,IAAI,GAAiB,SAAS,CAAC;IAU/B,UAAU,GAAS,SAAS,CAAC;IAS7B,aAAa,GAAW,SAAS,CAAC;IAIlC,IAAI,GAAW,SAAS,CAAC;IAQzB,QAAQ,GAAW,SAAS,CAAC;IAU7B,SAAS,GAAS,SAAS,CAAC;IAU5B,MAAM,GAAa,SAAS,CAAC;IAU7B,UAAU,GAAW,SAAS,CAAC;IAU/B,mBAAmB,GAAW,SAAS,CAAC;IASxC,MAAM,GAAW,SAAS,CAAC;IAS3B,SAAS,GAAW,SAAS,CAAC;IAS9B,IAAI,GAAW,SAAS,CAAC;IAUhB,aAAa,CAAC,IAAS,EAAE,KAAe;QAC/C,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAA,+CAAqB,EAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,IAAA,2CAAkB,EAAC,IAAI,CAAC;YAAE,MAAM,IAAA,+CAAqB,EAAC,IAAI,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,IAAI,KAAK,uCAAY,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAE1E,MAAM,WAAW,GAAG,8BAAa,CAAC,qBAAqB,EAAE,YAAY,EAAE,WAAW,KAAK,KAAK,CAAC;QAC7F,IAAI,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,oBAAQ,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjE,MAAM,OAAO,GAAG,wCAAc,CAAC,GAAG,EAAE,CAAC;QACrC,IACE,IAAI,CAAC,IAAI,KAAK,uCAAY,CAAC,MAAM;YACjC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,MAAM;YACjC,OAAO,EAAE,UAAU;YACnB,IAAA,qCAAe,EAAC,CAAC,IAAA,8CAAqB,GAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,EACzE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAA,+CAAqB,EAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF,CAAA;AAjKY,8CAAiB;AAQ5B;IANC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC1B,KAAK,EAAE,oBAAQ,CAAC,MAAM;KACvB,CAAC;;oDAC4B;AAI9B;IADC,IAAA,sCAAY,EAAC,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAQ,CAAC,MAAM,EAAE,CAAC;;sDACnF;AAUhC;IAPC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,KAAK,EAAE,oBAAQ,CAAC,MAAM;QACtB,IAAI,EAAE,IAAI;KACX,CAAC;8BACS,IAAI;oDAAa;AAS5B;IANC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,YAAY;QACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,uCAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QAC7E,KAAK,EAAE,oBAAQ,CAAC,MAAM;QACtB,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM;KACnB,CAAC;;+CAC6B;AAU/B;IAPC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,UAAU;QACvB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,KAAK,EAAE,oBAAQ,CAAC,MAAM;QACtB,IAAI,EAAE,IAAI;KACX,CAAC;8BACU,IAAI;qDAAa;AAS7B;IANC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,qBAAqB;QAClC,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC1B,KAAK,EAAE,oBAAQ,CAAC,MAAM;KACvB,CAAC;;wDACgC;AAIlC;IADC,IAAA,sCAAY,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAQ,CAAC,MAAM,EAAE,CAAC;;+CACjF;AAQzB;IALC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,iBAAiB;QAC9B,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QACxD,KAAK,EAAE,oBAAQ,CAAC,MAAM;KACvB,CAAC;;mDAC2B;AAU7B;IAPC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,iBAAiB;QAC9B,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QACvC,KAAK,EAAE,oBAAQ,CAAC,MAAM;QACtB,IAAI,EAAE,IAAI;KACX,CAAC;8BACS,IAAI;oDAAa;AAU5B;IAPC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;QACzC,KAAK,EAAE,oBAAQ,CAAC,MAAM;QACtB,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM;KACnB,CAAC;;iDAC2B;AAU7B;IAPC,IAAA,iCAAU,EAAC,oBAAQ,CAAC,QAAQ,CAAC;IAC7B,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;QACzC,KAAK,EAAE,oBAAQ,CAAC,QAAQ;KACzB,CAAC;;qDAC6B;AAU/B;IAPC,IAAA,iCAAU,EAAC,oBAAQ,CAAC,QAAQ,CAAC;IAC7B,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,uBAAuB;QACpC,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;QACzC,KAAK,EAAE,oBAAQ,CAAC,QAAQ;KACzB,CAAC;;8DACsC;AASxC;IANC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QACvC,KAAK,EAAE,oBAAQ,CAAC,MAAM;KACvB,CAAC;;iDACyB;AAS3B;IANC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,8BAA8B;QAC3C,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC1B,KAAK,EAAE,oBAAQ,CAAC,MAAM;KACvB,CAAC;;oDAC4B;AAS9B;IANC,IAAA,sCAAY,EAAC;QACZ,WAAW,EAAE,gBAAgB;QAC7B,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QACvC,KAAK,EAAE,oBAAQ,CAAC,MAAM;KACvB,CAAC;;+CACuB;4BAjId,iBAAiB;IAH7B,IAAA,oBAAU,EAAC,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAA,iCAAU,EAAC,oBAAQ,CAAC,MAAM,CAAC;IAC3B,IAAA,iBAAM,EAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;GAChB,iBAAiB,CAiK7B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DynamicModule, MiddlewareConsumer, NestModule, Type } from '@nestjs/common';
|
|
2
|
+
import { CoreApiTokenModel } from './core-api-token.model';
|
|
3
|
+
import { CoreApiTokenService } from './core-api-token.service';
|
|
4
|
+
export interface CoreApiTokenModuleOptions {
|
|
5
|
+
model?: Type<CoreApiTokenModel>;
|
|
6
|
+
service?: Type<CoreApiTokenService>;
|
|
7
|
+
}
|
|
8
|
+
export declare class CoreApiTokenModule implements NestModule {
|
|
9
|
+
static forRoot(options?: CoreApiTokenModuleOptions): DynamicModule;
|
|
10
|
+
configure(consumer: MiddlewareConsumer): void;
|
|
11
|
+
}
|
|
@@ -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 CoreApiTokenModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.CoreApiTokenModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const mongoose_1 = require("@nestjs/mongoose");
|
|
13
|
+
const core_api_token_constants_1 = require("./core-api-token.constants");
|
|
14
|
+
const core_api_token_middleware_1 = require("./core-api-token.middleware");
|
|
15
|
+
const core_api_token_model_1 = require("./core-api-token.model");
|
|
16
|
+
const core_api_token_service_1 = require("./core-api-token.service");
|
|
17
|
+
let CoreApiTokenModule = CoreApiTokenModule_1 = class CoreApiTokenModule {
|
|
18
|
+
static forRoot(options = {}) {
|
|
19
|
+
const schema = mongoose_1.SchemaFactory.createForClass(options.model || core_api_token_model_1.CoreApiTokenModel);
|
|
20
|
+
schema.index({ kind: 1, tenant: 1 });
|
|
21
|
+
schema.index({ kind: 1, user: 1 });
|
|
22
|
+
return {
|
|
23
|
+
exports: [core_api_token_service_1.CoreApiTokenService],
|
|
24
|
+
global: true,
|
|
25
|
+
imports: [mongoose_1.MongooseModule.forFeature([{ name: core_api_token_constants_1.API_TOKEN_MODEL_TOKEN, schema }])],
|
|
26
|
+
module: CoreApiTokenModule_1,
|
|
27
|
+
providers: [{ provide: core_api_token_service_1.CoreApiTokenService, useClass: options.service || core_api_token_service_1.CoreApiTokenService }],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
configure(consumer) {
|
|
31
|
+
consumer.apply(core_api_token_middleware_1.CoreApiTokenMiddleware).forRoutes('*');
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.CoreApiTokenModule = CoreApiTokenModule;
|
|
35
|
+
exports.CoreApiTokenModule = CoreApiTokenModule = CoreApiTokenModule_1 = __decorate([
|
|
36
|
+
(0, common_1.Global)(),
|
|
37
|
+
(0, common_1.Module)({})
|
|
38
|
+
], CoreApiTokenModule);
|
|
39
|
+
//# sourceMappingURL=core-api-token.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-api-token.module.js","sourceRoot":"","sources":["../../../../src/core/modules/api-token/core-api-token.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAqG;AACrG,+CAAiE;AAEjE,yEAAmE;AACnE,2EAAqE;AACrE,iEAA2D;AAC3D,qEAA+D;AAsBxD,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAC7B,MAAM,CAAC,OAAO,CAAC,UAAqC,EAAE;QACpD,MAAM,MAAM,GAAG,wBAAa,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,wCAAiB,CAAC,CAAC;QAEhF,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAEnC,OAAO;YACL,OAAO,EAAE,CAAC,4CAAmB,CAAC;YAC9B,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,yBAAc,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,gDAAqB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/E,MAAM,EAAE,oBAAkB;YAC1B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,4CAAmB,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,4CAAmB,EAAE,CAAC;SAChG,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,QAAQ,CAAC,KAAK,CAAC,kDAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AAnBY,gDAAkB;6BAAlB,kBAAkB;IAF9B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,kBAAkB,CAmB9B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ApiTokenOwnerIdentity {
|
|
2
|
+
email?: string;
|
|
3
|
+
iamId?: string;
|
|
4
|
+
userId?: string;
|
|
5
|
+
}
|
|
6
|
+
type ApiTokenRevoker = (identity: ApiTokenOwnerIdentity) => Promise<number>;
|
|
7
|
+
export declare function setApiTokenRevoker(fn: ApiTokenRevoker | undefined): () => void;
|
|
8
|
+
export declare function revokeApiTokensOfUser(identity: ApiTokenOwnerIdentity): Promise<number>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setApiTokenRevoker = setApiTokenRevoker;
|
|
4
|
+
exports.revokeApiTokensOfUser = revokeApiTokensOfUser;
|
|
5
|
+
let revoker;
|
|
6
|
+
function setApiTokenRevoker(fn) {
|
|
7
|
+
revoker = fn;
|
|
8
|
+
return () => {
|
|
9
|
+
if (revoker === fn) {
|
|
10
|
+
revoker = undefined;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async function revokeApiTokensOfUser(identity) {
|
|
15
|
+
return revoker ? revoker(identity) : 0;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=core-api-token.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-api-token.registry.js","sourceRoot":"","sources":["../../../../src/core/modules/api-token/core-api-token.registry.ts"],"names":[],"mappings":";;AAmCA,gDAOC;AAQD,sDAEC;AAzBD,IAAI,OAAoC,CAAC;AAQzC,SAAgB,kBAAkB,CAAC,EAA+B;IAChE,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,GAAG,EAAE;QACV,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAQM,KAAK,UAAU,qBAAqB,CAAC,QAA+B;IACzE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { Connection, Model, Types } from 'mongoose';
|
|
3
|
+
import { CoreRedisService } from '../../common/services/core-redis.service';
|
|
4
|
+
import { RateLimitStore } from '../../common/services/rate-limit-store';
|
|
5
|
+
import { CoreTenantService } from '../tenant/core-tenant.service';
|
|
6
|
+
import { ApiTokenKind } from './core-api-token.constants';
|
|
7
|
+
import { IApiTokenContext, IApiTokenCredential, IResolvedApiTokenConfig } from './core-api-token.helpers';
|
|
8
|
+
import { CoreApiTokenModel } from './core-api-token.model';
|
|
9
|
+
import { ApiTokenOwnerIdentity } from './core-api-token.registry';
|
|
10
|
+
export interface ICreateUserApiTokenInput {
|
|
11
|
+
[projectField: string]: unknown;
|
|
12
|
+
description?: string;
|
|
13
|
+
expiresAt?: Date | null | string;
|
|
14
|
+
maxTenantRole?: null | string;
|
|
15
|
+
name: string;
|
|
16
|
+
scopes?: string[];
|
|
17
|
+
tenantId?: null | string;
|
|
18
|
+
}
|
|
19
|
+
export interface ICreateTenantApiTokenInput {
|
|
20
|
+
[projectField: string]: unknown;
|
|
21
|
+
description?: string;
|
|
22
|
+
expiresAt?: Date | null | string;
|
|
23
|
+
name: string;
|
|
24
|
+
scopes: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface IUpdateApiTokenInput {
|
|
27
|
+
[projectField: string]: unknown;
|
|
28
|
+
description?: null | string;
|
|
29
|
+
expiresAt?: Date | null | string;
|
|
30
|
+
maxTenantRole?: null | string;
|
|
31
|
+
name?: string;
|
|
32
|
+
scopes?: string[];
|
|
33
|
+
tenantId?: null | string;
|
|
34
|
+
}
|
|
35
|
+
export type ApiTokenInfo = Omit<CoreApiTokenModel, 'secretHash' | 'securityCheck' | 'signingKeyEncrypted'> & {
|
|
36
|
+
[projectField: string]: unknown;
|
|
37
|
+
};
|
|
38
|
+
export interface ICreatedApiToken {
|
|
39
|
+
apiToken: ApiTokenInfo;
|
|
40
|
+
signingKey: string;
|
|
41
|
+
token: string;
|
|
42
|
+
}
|
|
43
|
+
export declare class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
44
|
+
protected readonly apiTokenModel: Model<CoreApiTokenModel>;
|
|
45
|
+
protected readonly connection?: Connection;
|
|
46
|
+
protected readonly tenantService?: CoreTenantService;
|
|
47
|
+
protected readonly redisService?: CoreRedisService;
|
|
48
|
+
protected readonly logger: Logger;
|
|
49
|
+
protected readonly lastUsedWrites: Map<string, number>;
|
|
50
|
+
protected rateLimitStore?: RateLimitStore;
|
|
51
|
+
private warnedAboutDevelopmentKey;
|
|
52
|
+
private disposeRevoker?;
|
|
53
|
+
protected static readonly LAST_USED_INTERVAL_MS = 60000;
|
|
54
|
+
protected static readonly LAST_USED_MAX_ENTRIES = 5000;
|
|
55
|
+
constructor(apiTokenModel: Model<CoreApiTokenModel>, connection?: Connection, tenantService?: CoreTenantService, redisService?: CoreRedisService);
|
|
56
|
+
onModuleInit(): void;
|
|
57
|
+
onModuleDestroy(): void;
|
|
58
|
+
authenticate(credential: IApiTokenCredential): Promise<null | object>;
|
|
59
|
+
consumeRateLimit(tokenId: string): Promise<undefined | {
|
|
60
|
+
retryAfter: number;
|
|
61
|
+
}>;
|
|
62
|
+
touchLastUsed(tokenId: string): void;
|
|
63
|
+
protected findUsableToken(publicId: string, config: IResolvedApiTokenConfig): Promise<CoreApiTokenModel | null>;
|
|
64
|
+
protected buildRequestUser(token: CoreApiTokenModel, assertion?: IApiTokenContext['assertion']): Promise<null | object>;
|
|
65
|
+
protected loadTokenUser(userId: string): Promise<null | Record<string, any>>;
|
|
66
|
+
protected getRateLimitStore(): RateLimitStore;
|
|
67
|
+
createUserToken(input: ICreateUserApiTokenInput, currentUser: any): Promise<ICreatedApiToken>;
|
|
68
|
+
findUserTokens(currentUser: any): Promise<ApiTokenInfo[]>;
|
|
69
|
+
updateUserToken(tokenId: string, input: IUpdateApiTokenInput, currentUser: any): Promise<ApiTokenInfo>;
|
|
70
|
+
revokeUserToken(tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
|
|
71
|
+
deleteUserToken(tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
|
|
72
|
+
revokeAllForUser(userId: string): Promise<number>;
|
|
73
|
+
revokeAllForOwner(identity: ApiTokenOwnerIdentity): Promise<number>;
|
|
74
|
+
deleteAllForUser(userId: string): Promise<number>;
|
|
75
|
+
createTenantToken(tenantId: string, input: ICreateTenantApiTokenInput, currentUser: any): Promise<ICreatedApiToken>;
|
|
76
|
+
findTenantTokens(tenantId: string, currentUser: any): Promise<ApiTokenInfo[]>;
|
|
77
|
+
updateTenantToken(tenantId: string, tokenId: string, input: IUpdateApiTokenInput, currentUser: any): Promise<ApiTokenInfo>;
|
|
78
|
+
revokeTenantToken(tenantId: string, tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
|
|
79
|
+
deleteTenantToken(tenantId: string, tokenId: string, currentUser: any): Promise<ApiTokenInfo>;
|
|
80
|
+
deleteAllForTenant(tenantId: string): Promise<number>;
|
|
81
|
+
assertCanManageTenant(tenantId: string, currentUser: any, config?: IResolvedApiTokenConfig): Promise<void>;
|
|
82
|
+
protected encryptSigningKey(plain: string): string;
|
|
83
|
+
protected decryptSigningKey(stored: string): string;
|
|
84
|
+
protected getEncryptionKey(): Buffer;
|
|
85
|
+
protected requireKind(kind: ApiTokenKind): IResolvedApiTokenConfig;
|
|
86
|
+
protected assertPerson(currentUser: any): void;
|
|
87
|
+
protected issue(document: Record<string, unknown>, currentUser: any): Promise<ICreatedApiToken>;
|
|
88
|
+
protected list(filter: Record<string, unknown>): Promise<ApiTokenInfo[]>;
|
|
89
|
+
protected applyUpdate(filter: Record<string, unknown>, $set: Record<string, unknown>, currentUser: any): Promise<ApiTokenInfo>;
|
|
90
|
+
protected applyRevoke(filter: Record<string, unknown>, currentUser: any): Promise<ApiTokenInfo>;
|
|
91
|
+
protected applyDelete(filter: Record<string, unknown>): Promise<ApiTokenInfo>;
|
|
92
|
+
protected userTokenFilter(tokenId: string, currentUser: any): Record<string, unknown>;
|
|
93
|
+
protected tenantTokenFilter(tenantId: string, tokenId: string): Record<string, unknown>;
|
|
94
|
+
protected objectId(tokenId: string): Types.ObjectId;
|
|
95
|
+
protected commonUpdate(input: IUpdateApiTokenInput, config: IResolvedApiTokenConfig): Record<string, unknown>;
|
|
96
|
+
protected projectFields(input: Record<string, unknown> | undefined): Record<string, unknown>;
|
|
97
|
+
protected validateName(name: unknown): string;
|
|
98
|
+
protected validateDescription(description: unknown): null | string;
|
|
99
|
+
protected validateExpiry(expiresAt: unknown): Date | null;
|
|
100
|
+
protected validateScopes(scopes: unknown, config: IResolvedApiTokenConfig): string[];
|
|
101
|
+
protected validateUserTokenTenant(tenantId: unknown, currentUser: any, config: IResolvedApiTokenConfig): Promise<null | string>;
|
|
102
|
+
protected validateMaxTenantRole(role: unknown, config: IResolvedApiTokenConfig): null | string;
|
|
103
|
+
protected toInfo(document: Record<string, any>): ApiTokenInfo;
|
|
104
|
+
}
|