@neohm/nestend 3.1.4 → 3.2.0
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 +68 -10
- package/dist/admin/controllers/admin.api.key.controller.d.ts +24 -0
- package/dist/admin/controllers/admin.api.key.controller.d.ts.map +1 -0
- package/dist/admin/controllers/admin.api.key.controller.js +117 -0
- package/dist/admin/controllers/admin.api.key.controller.js.map +1 -0
- package/dist/admin/controllers/admin.scheduled.task.controller.d.ts +1 -1
- package/dist/admin/controllers/admin.scope.controller.d.ts +24 -0
- package/dist/admin/controllers/admin.scope.controller.d.ts.map +1 -0
- package/dist/admin/controllers/admin.scope.controller.js +106 -0
- package/dist/admin/controllers/admin.scope.controller.js.map +1 -0
- package/dist/admin/controllers/admin.tenant.controller.d.ts +5 -6
- package/dist/admin/controllers/admin.tenant.controller.d.ts.map +1 -1
- package/dist/admin/controllers/admin.tenant.controller.js +17 -11
- package/dist/admin/controllers/admin.tenant.controller.js.map +1 -1
- package/dist/admin/controllers/admin.tenant.user.controller.d.ts +4 -6
- package/dist/admin/controllers/admin.tenant.user.controller.d.ts.map +1 -1
- package/dist/admin/controllers/admin.tenant.user.controller.js +5 -8
- package/dist/admin/controllers/admin.tenant.user.controller.js.map +1 -1
- package/dist/admin/controllers/admin.user.controller.d.ts +1 -1
- package/dist/admin/dtos/add.api.key.dto.d.ts +7 -0
- package/dist/admin/dtos/add.api.key.dto.d.ts.map +1 -0
- package/dist/admin/dtos/add.api.key.dto.js +55 -0
- package/dist/admin/dtos/add.api.key.dto.js.map +1 -0
- package/dist/admin/dtos/add.client.user.dto.d.ts +1 -2
- package/dist/admin/dtos/add.client.user.dto.d.ts.map +1 -1
- package/dist/admin/dtos/add.client.user.dto.js +2 -1
- package/dist/admin/dtos/add.client.user.dto.js.map +1 -1
- package/dist/admin/dtos/add.scope.dto.d.ts +7 -0
- package/dist/admin/dtos/add.scope.dto.d.ts.map +1 -0
- package/dist/admin/dtos/add.scope.dto.js +47 -0
- package/dist/admin/dtos/add.scope.dto.js.map +1 -0
- package/dist/admin/dtos/add.tenant.dto.d.ts +1 -0
- package/dist/admin/dtos/add.tenant.dto.d.ts.map +1 -1
- package/dist/admin/dtos/add.tenant.dto.js +12 -0
- package/dist/admin/dtos/add.tenant.dto.js.map +1 -1
- package/dist/admin/dtos/api.key.list.dto.d.ts +4 -0
- package/dist/admin/dtos/api.key.list.dto.d.ts.map +1 -0
- package/dist/admin/dtos/api.key.list.dto.js +8 -0
- package/dist/admin/dtos/api.key.list.dto.js.map +1 -0
- package/dist/admin/dtos/scope.list.dto.d.ts +4 -0
- package/dist/admin/dtos/scope.list.dto.d.ts.map +1 -0
- package/dist/admin/dtos/scope.list.dto.js +8 -0
- package/dist/admin/dtos/scope.list.dto.js.map +1 -0
- package/dist/admin/es6.classes.d.ts +12 -4
- package/dist/admin/es6.classes.d.ts.map +1 -1
- package/dist/admin/es6.classes.js +21 -1
- package/dist/admin/es6.classes.js.map +1 -1
- package/dist/admin/libraries/api.key.data.processor.d.ts +16 -0
- package/dist/admin/libraries/api.key.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/api.key.data.processor.js +59 -0
- package/dist/admin/libraries/api.key.data.processor.js.map +1 -0
- package/dist/admin/libraries/api.key.list.processor.d.ts +15 -0
- package/dist/admin/libraries/api.key.list.processor.d.ts.map +1 -0
- package/dist/admin/libraries/api.key.list.processor.js +48 -0
- package/dist/admin/libraries/api.key.list.processor.js.map +1 -0
- package/dist/admin/libraries/client.user.data.processor.d.ts +3 -6
- package/dist/admin/libraries/client.user.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/client.user.data.processor.js +14 -33
- package/dist/admin/libraries/client.user.data.processor.js.map +1 -1
- package/dist/admin/libraries/scope.data.processor.d.ts +13 -0
- package/dist/admin/libraries/scope.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/scope.data.processor.js +43 -0
- package/dist/admin/libraries/scope.data.processor.js.map +1 -0
- package/dist/admin/libraries/scope.list.processor.d.ts +15 -0
- package/dist/admin/libraries/scope.list.processor.d.ts.map +1 -0
- package/dist/admin/libraries/scope.list.processor.js +29 -0
- package/dist/admin/libraries/scope.list.processor.js.map +1 -0
- package/dist/admin/libraries/tenant.data.processor.d.ts +5 -6
- package/dist/admin/libraries/tenant.data.processor.d.ts.map +1 -1
- package/dist/admin/libraries/tenant.data.processor.js +41 -28
- package/dist/admin/libraries/tenant.data.processor.js.map +1 -1
- package/dist/admin/libraries/tenant.delete.processor.d.ts.map +1 -1
- package/dist/admin/libraries/tenant.delete.processor.js +14 -0
- package/dist/admin/libraries/tenant.delete.processor.js.map +1 -1
- package/dist/admin/types/admin.types.d.ts +10 -4
- package/dist/admin/types/admin.types.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +9 -2
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/entities/api.key.entity.d.ts +3 -1
- package/dist/auth/entities/api.key.entity.d.ts.map +1 -1
- package/dist/auth/entities/api.key.entity.js +9 -3
- package/dist/auth/entities/api.key.entity.js.map +1 -1
- package/dist/auth/entities/tenant.scope.entity.d.ts +10 -0
- package/dist/auth/entities/tenant.scope.entity.d.ts.map +1 -0
- package/dist/auth/entities/tenant.scope.entity.js +41 -0
- package/dist/auth/entities/tenant.scope.entity.js.map +1 -0
- package/dist/auth/enums/api.key.default.enum.d.ts +2 -1
- package/dist/auth/enums/api.key.default.enum.d.ts.map +1 -1
- package/dist/auth/enums/api.key.default.enum.js +1 -0
- package/dist/auth/enums/api.key.default.enum.js.map +1 -1
- package/dist/auth/es6.classes.d.ts +2 -1
- package/dist/auth/es6.classes.d.ts.map +1 -1
- package/dist/auth/es6.classes.js +2 -0
- package/dist/auth/es6.classes.js.map +1 -1
- package/dist/auth/guards/api.key.guard.js +1 -1
- package/dist/auth/guards/api.key.guard.js.map +1 -1
- package/dist/auth/helpers/api.key.context.d.ts +6 -1
- package/dist/auth/helpers/api.key.context.d.ts.map +1 -1
- package/dist/auth/helpers/api.key.context.js +11 -2
- package/dist/auth/helpers/api.key.context.js.map +1 -1
- package/dist/auth/middlewares/api.key.middleware.d.ts +1 -0
- package/dist/auth/middlewares/api.key.middleware.d.ts.map +1 -1
- package/dist/auth/middlewares/api.key.middleware.js +17 -5
- package/dist/auth/middlewares/api.key.middleware.js.map +1 -1
- package/dist/auth/services/api.key.service.d.ts +13 -2
- package/dist/auth/services/api.key.service.d.ts.map +1 -1
- package/dist/auth/services/api.key.service.js +77 -5
- package/dist/auth/services/api.key.service.js.map +1 -1
- package/dist/auth/services/auth.service.d.ts +4 -1
- package/dist/auth/services/auth.service.d.ts.map +1 -1
- package/dist/auth/services/auth.service.js +19 -15
- package/dist/auth/services/auth.service.js.map +1 -1
- package/dist/auth/services/scope.service.d.ts +10 -0
- package/dist/auth/services/scope.service.d.ts.map +1 -0
- package/dist/auth/services/scope.service.js +50 -0
- package/dist/auth/services/scope.service.js.map +1 -0
- package/dist/auth/types/api.key.types.d.ts +15 -1
- package/dist/auth/types/api.key.types.d.ts.map +1 -1
- package/dist/common/types/common.response.types.d.ts +10 -0
- package/dist/common/types/common.response.types.d.ts.map +1 -1
- package/dist/constants/entity.constants.d.ts +1 -0
- package/dist/constants/entity.constants.d.ts.map +1 -1
- package/dist/constants/entity.constants.js +1 -0
- package/dist/constants/entity.constants.js.map +1 -1
- package/dist/constants/entity.maps.d.ts +2 -0
- package/dist/constants/entity.maps.d.ts.map +1 -1
- package/dist/constants/entity.maps.js +2 -0
- package/dist/constants/entity.maps.js.map +1 -1
- package/dist/constants/job.constants.d.ts +2 -0
- package/dist/constants/job.constants.d.ts.map +1 -1
- package/dist/constants/job.constants.js +2 -0
- package/dist/constants/job.constants.js.map +1 -1
- package/dist/constants/job.maps.d.ts.map +1 -1
- package/dist/constants/job.maps.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations/1749600000017.CreateSysApiKeysTable.d.ts.map +1 -1
- package/dist/migrations/1749600000017.CreateSysApiKeysTable.js +7 -1
- package/dist/migrations/1749600000017.CreateSysApiKeysTable.js.map +1 -1
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.d.ts +6 -0
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.d.ts.map +1 -0
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.js +36 -0
- package/dist/migrations/1749600000027.CreateSysTenantScopesTable.js.map +1 -0
- package/dist/notification/es6.classes.d.ts +3 -1
- package/dist/notification/es6.classes.d.ts.map +1 -1
- package/dist/notification/es6.classes.js +3 -1
- package/dist/notification/es6.classes.js.map +1 -1
- package/dist/notification/jobs/tenant.onboarded.mail.job.d.ts +15 -0
- package/dist/notification/jobs/tenant.onboarded.mail.job.d.ts.map +1 -0
- package/dist/notification/jobs/tenant.onboarded.mail.job.js +56 -0
- package/dist/notification/jobs/tenant.onboarded.mail.job.js.map +1 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.d.ts +15 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.d.ts.map +1 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.js +56 -0
- package/dist/notification/jobs/tenant.user.onboarded.mail.job.js.map +1 -0
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +7 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/types/email.notification.types.d.ts +12 -0
- package/dist/notification/types/email.notification.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/admin/dtos/add.user.role.dto.d.ts +0 -4
- package/dist/admin/dtos/add.user.role.dto.d.ts.map +0 -1
- package/dist/admin/dtos/add.user.role.dto.js +0 -22
- package/dist/admin/dtos/add.user.role.dto.js.map +0 -1
package/dist/auth/auth.module.js
CHANGED
|
@@ -23,7 +23,7 @@ const jwt_middleware_1 = require("./middlewares/jwt.middleware");
|
|
|
23
23
|
const admin_jwt_middleware_1 = require("./middlewares/admin.jwt.middleware");
|
|
24
24
|
const api_key_middleware_1 = require("./middlewares/api.key.middleware");
|
|
25
25
|
const es6_classes_1 = require("./es6.classes");
|
|
26
|
-
const [ApiKeyService, AuthService, AdminAuthService, GoogleAuthService] = es6_classes_1.es6Classes.services;
|
|
26
|
+
const [ApiKeyService, ScopeService, AuthService, AdminAuthService, GoogleAuthService,] = es6_classes_1.es6Classes.services;
|
|
27
27
|
function createAuthImports() {
|
|
28
28
|
return [
|
|
29
29
|
common_module_1.CommonModule,
|
|
@@ -43,11 +43,12 @@ function createAuthProviders(options = {}) {
|
|
|
43
43
|
return [
|
|
44
44
|
{
|
|
45
45
|
provide: AuthService,
|
|
46
|
-
useFactory: (jwtService, cacheService, dataSource) => new AuthService(jwtService, cacheService, dataSource),
|
|
46
|
+
useFactory: (jwtService, cacheService, dataSource, scopeService) => new AuthService(jwtService, cacheService, dataSource, scopeService),
|
|
47
47
|
inject: [
|
|
48
48
|
jwt_1.JwtService,
|
|
49
49
|
cache_service_1.CacheService,
|
|
50
50
|
(0, typeorm_1.getDataSourceToken)(options.dataSourceName),
|
|
51
|
+
ScopeService,
|
|
51
52
|
],
|
|
52
53
|
},
|
|
53
54
|
{
|
|
@@ -60,6 +61,11 @@ function createAuthProviders(options = {}) {
|
|
|
60
61
|
useFactory: (dataSource) => new ApiKeyService(dataSource),
|
|
61
62
|
inject: [(0, typeorm_1.getDataSourceToken)(options.dataSourceName)],
|
|
62
63
|
},
|
|
64
|
+
{
|
|
65
|
+
provide: ScopeService,
|
|
66
|
+
useFactory: (dataSource) => new ScopeService(dataSource),
|
|
67
|
+
inject: [(0, typeorm_1.getDataSourceToken)(options.dataSourceName)],
|
|
68
|
+
},
|
|
63
69
|
GoogleAuthService,
|
|
64
70
|
jwt_strategy_1.JwtStrategy,
|
|
65
71
|
jwt_refresh_strategy_1.JwtRefreshStrategy,
|
|
@@ -75,6 +81,7 @@ const authExports = [
|
|
|
75
81
|
AuthService,
|
|
76
82
|
AdminAuthService,
|
|
77
83
|
ApiKeyService,
|
|
84
|
+
ScopeService,
|
|
78
85
|
GoogleAuthService,
|
|
79
86
|
jwt_auth_guard_1.JwtAuthGuard,
|
|
80
87
|
jwt_refresh_guard_1.JwtRefreshGuard,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAKwB;AACxB,qCAAoE;AACpE,+CAAkD;AAClD,6CAAqD;AAErD,2DAAuD;AACvD,oEAAgE;AAChE,0DAAqD;AACrD,4DAAuD;AACvD,kEAA6D;AAC7D,0EAAqE;AACrE,0DAAsD;AACtD,iEAA6D;AAC7D,6EAAwE;AACxE,yEAAoE;AACpE,+CAA2C;AAI3C,MAAM,
|
|
1
|
+
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { CommonAdminEntity } from '../../common/entities/common.admin.entity';
|
|
2
|
+
import { TenantEntity } from '../../tenant/entities/tenant.entity';
|
|
2
3
|
export declare class ApiKeyEntity extends CommonAdminEntity {
|
|
3
4
|
is_active: boolean;
|
|
4
5
|
name: string;
|
|
5
6
|
key_prefix: string;
|
|
6
7
|
key_hash: string;
|
|
7
|
-
|
|
8
|
+
tenant_id: string;
|
|
8
9
|
expires_at: Date;
|
|
9
10
|
revoked_at: Date;
|
|
10
11
|
last_used_at: Date;
|
|
12
|
+
tenant: TenantEntity;
|
|
11
13
|
}
|
|
12
14
|
//# sourceMappingURL=api.key.entity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.entity.d.ts","sourceRoot":"","sources":["../../../src/auth/entities/api.key.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"api.key.entity.d.ts","sourceRoot":"","sources":["../../../src/auth/entities/api.key.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAGnE,qBACa,YAAa,SAAQ,iBAAiB;IAEjD,SAAS,EAAE,OAAO,CAAC;IAGnB,IAAI,EAAE,MAAM,CAAC;IAIb,UAAU,EAAE,MAAM,CAAC;IAInB,QAAQ,EAAE,MAAM,CAAC;IAGjB,SAAS,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,IAAI,CAAC;IAGjB,UAAU,EAAE,IAAI,CAAC;IAGjB,YAAY,EAAE,IAAI,CAAC;IAInB,MAAM,EAAE,YAAY,CAAC;CACtB"}
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.ApiKeyEntity = void 0;
|
|
13
13
|
const typeorm_1 = require("typeorm");
|
|
14
14
|
const common_admin_entity_1 = require("../../common/entities/common.admin.entity");
|
|
15
|
+
const tenant_entity_1 = require("../../tenant/entities/tenant.entity");
|
|
15
16
|
let ApiKeyEntity = class ApiKeyEntity extends common_admin_entity_1.CommonAdminEntity {
|
|
16
17
|
};
|
|
17
18
|
exports.ApiKeyEntity = ApiKeyEntity;
|
|
@@ -32,9 +33,9 @@ __decorate([
|
|
|
32
33
|
__metadata("design:type", String)
|
|
33
34
|
], ApiKeyEntity.prototype, "key_hash", void 0);
|
|
34
35
|
__decorate([
|
|
35
|
-
(0, typeorm_1.Column)({ type: '
|
|
36
|
-
__metadata("design:type",
|
|
37
|
-
], ApiKeyEntity.prototype, "
|
|
36
|
+
(0, typeorm_1.Column)({ type: 'uuid', nullable: true }),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], ApiKeyEntity.prototype, "tenant_id", void 0);
|
|
38
39
|
__decorate([
|
|
39
40
|
(0, typeorm_1.Column)({ type: 'timestamptz' }),
|
|
40
41
|
__metadata("design:type", Date)
|
|
@@ -47,6 +48,11 @@ __decorate([
|
|
|
47
48
|
(0, typeorm_1.Column)({ type: 'timestamptz' }),
|
|
48
49
|
__metadata("design:type", Date)
|
|
49
50
|
], ApiKeyEntity.prototype, "last_used_at", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
(0, typeorm_1.ManyToOne)(() => tenant_entity_1.TenantEntity),
|
|
53
|
+
(0, typeorm_1.JoinColumn)({ name: 'tenant_id' }),
|
|
54
|
+
__metadata("design:type", tenant_entity_1.TenantEntity)
|
|
55
|
+
], ApiKeyEntity.prototype, "tenant", void 0);
|
|
50
56
|
exports.ApiKeyEntity = ApiKeyEntity = __decorate([
|
|
51
57
|
(0, typeorm_1.Entity)({ name: 'sys_api_keys' })
|
|
52
58
|
], ApiKeyEntity);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.entity.js","sourceRoot":"","sources":["../../../src/auth/entities/api.key.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"api.key.entity.js","sourceRoot":"","sources":["../../../src/auth/entities/api.key.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAgE;AAChE,mFAA8E;AAC9E,uEAAmE;AAI5D,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,uCAAiB;CA8BlD,CAAA;AA9BY,oCAAY;AAEvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CACf;AAIb;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;gDACT;AAInB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACX;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACvB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;8BACpB,IAAI;gDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;8BACpB,IAAI;gDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;8BAClB,IAAI;kDAAC;AAInB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4BAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BAC1B,4BAAY;4CAAC;uBA7BV,YAAY;IADxB,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;GACpB,YAAY,CA8BxB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CommonAdminEntity } from '../../common/entities/common.admin.entity';
|
|
2
|
+
import { TenantEntity } from '../../tenant/entities/tenant.entity';
|
|
3
|
+
import { ScopeEntity } from './scope.entity';
|
|
4
|
+
export declare class TenantScopeEntity extends CommonAdminEntity {
|
|
5
|
+
tenant_id: string;
|
|
6
|
+
scope_id: string;
|
|
7
|
+
tenant: TenantEntity;
|
|
8
|
+
scope: ScopeEntity;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=tenant.scope.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.scope.entity.d.ts","sourceRoot":"","sources":["../../../src/auth/entities/tenant.scope.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,qBACa,iBAAkB,SAAQ,iBAAiB;IAEtD,SAAS,EAAE,MAAM,CAAC;IAGlB,QAAQ,EAAE,MAAM,CAAC;IAIjB,MAAM,EAAE,YAAY,CAAC;IAIrB,KAAK,EAAE,WAAW,CAAC;CACpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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.TenantScopeEntity = void 0;
|
|
13
|
+
const typeorm_1 = require("typeorm");
|
|
14
|
+
const common_admin_entity_1 = require("../../common/entities/common.admin.entity");
|
|
15
|
+
const tenant_entity_1 = require("../../tenant/entities/tenant.entity");
|
|
16
|
+
const scope_entity_1 = require("./scope.entity");
|
|
17
|
+
let TenantScopeEntity = class TenantScopeEntity extends common_admin_entity_1.CommonAdminEntity {
|
|
18
|
+
};
|
|
19
|
+
exports.TenantScopeEntity = TenantScopeEntity;
|
|
20
|
+
__decorate([
|
|
21
|
+
(0, typeorm_1.Column)({ type: 'uuid' }),
|
|
22
|
+
__metadata("design:type", String)
|
|
23
|
+
], TenantScopeEntity.prototype, "tenant_id", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, typeorm_1.Column)({ type: 'uuid' }),
|
|
26
|
+
__metadata("design:type", String)
|
|
27
|
+
], TenantScopeEntity.prototype, "scope_id", void 0);
|
|
28
|
+
__decorate([
|
|
29
|
+
(0, typeorm_1.ManyToOne)(() => tenant_entity_1.TenantEntity),
|
|
30
|
+
(0, typeorm_1.JoinColumn)({ name: 'tenant_id' }),
|
|
31
|
+
__metadata("design:type", tenant_entity_1.TenantEntity)
|
|
32
|
+
], TenantScopeEntity.prototype, "tenant", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
(0, typeorm_1.ManyToOne)(() => scope_entity_1.ScopeEntity),
|
|
35
|
+
(0, typeorm_1.JoinColumn)({ name: 'scope_id' }),
|
|
36
|
+
__metadata("design:type", scope_entity_1.ScopeEntity)
|
|
37
|
+
], TenantScopeEntity.prototype, "scope", void 0);
|
|
38
|
+
exports.TenantScopeEntity = TenantScopeEntity = __decorate([
|
|
39
|
+
(0, typeorm_1.Entity)({ name: 'sys_tenant_scopes' })
|
|
40
|
+
], TenantScopeEntity);
|
|
41
|
+
//# sourceMappingURL=tenant.scope.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.scope.entity.js","sourceRoot":"","sources":["../../../src/auth/entities/tenant.scope.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAgE;AAChE,mFAA8E;AAC9E,uEAAmE;AACnE,iDAA6C;AAItC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,uCAAiB;CAcvD,CAAA;AAdY,8CAAiB;AAE5B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oDACP;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDACR;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,4BAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BAC1B,4BAAY;iDAAC;AAIrB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAW,CAAC;IAC5B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;8BAC1B,0BAAW;gDAAC;4BAbR,iBAAiB;IAD7B,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;GACzB,iBAAiB,CAc7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.default.enum.d.ts","sourceRoot":"","sources":["../../../src/auth/enums/api.key.default.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,MAAM,OAAO;IACb,WAAW,cAAc;IACzB,YAAY,KAAK;IAEjB,qBAAqB,KAAK;
|
|
1
|
+
{"version":3,"file":"api.key.default.enum.d.ts","sourceRoot":"","sources":["../../../src/auth/enums/api.key.default.enum.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,MAAM,OAAO;IACb,WAAW,cAAc;IACzB,YAAY,KAAK;IAEjB,qBAAqB,KAAK;IAE1B,cAAc,MAAM;CACrB"}
|
|
@@ -7,5 +7,6 @@ var ApiKeyDefault;
|
|
|
7
7
|
ApiKeyDefault["HEADER_NAME"] = "x-api-key";
|
|
8
8
|
ApiKeyDefault[ApiKeyDefault["RANDOM_BYTES"] = 24] = "RANDOM_BYTES";
|
|
9
9
|
ApiKeyDefault[ApiKeyDefault["PREFIX_VISIBLE_LENGTH"] = 11] = "PREFIX_VISIBLE_LENGTH";
|
|
10
|
+
ApiKeyDefault["WILDCARD_SCOPE"] = "*";
|
|
10
11
|
})(ApiKeyDefault || (exports.ApiKeyDefault = ApiKeyDefault = {}));
|
|
11
12
|
//# sourceMappingURL=api.key.default.enum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.default.enum.js","sourceRoot":"","sources":["../../../src/auth/enums/api.key.default.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"api.key.default.enum.js","sourceRoot":"","sources":["../../../src/auth/enums/api.key.default.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,aAQX;AARD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,0CAAyB,CAAA;IACzB,kEAAiB,CAAA;IAEjB,oFAA0B,CAAA;IAE1B,qCAAoB,CAAA;AACtB,CAAC,EARW,aAAa,6BAAb,aAAa,QAQxB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AuthController } from './controllers/auth.controller';
|
|
2
2
|
import { AdminAuthController } from './controllers/admin.auth.controller';
|
|
3
3
|
import { ApiKeyService } from './services/api.key.service';
|
|
4
|
+
import { ScopeService } from './services/scope.service';
|
|
4
5
|
import { AuthService } from './services/auth.service';
|
|
5
6
|
import { AdminAuthService } from './services/admin.auth.service';
|
|
6
7
|
import { GoogleAuthService } from './services/google.auth.service';
|
|
@@ -11,7 +12,7 @@ import { LoginDto } from './dtos/login.dto';
|
|
|
11
12
|
import { RefreshTokenDto } from './dtos/refresh.token.dto';
|
|
12
13
|
export declare const es6Classes: {
|
|
13
14
|
controllers: (typeof AuthController | typeof AdminAuthController)[];
|
|
14
|
-
services: readonly [typeof ApiKeyService, typeof AuthService, typeof AdminAuthService, typeof GoogleAuthService];
|
|
15
|
+
services: readonly [typeof ApiKeyService, typeof ScopeService, typeof AuthService, typeof AdminAuthService, typeof GoogleAuthService];
|
|
15
16
|
libraries: any[];
|
|
16
17
|
dtos: (typeof LoginDto | typeof GoogleLoginDto | typeof RefreshTokenDto | typeof ChangePasswordDto | typeof AdminLoginDto)[];
|
|
17
18
|
jobs: any[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es6.classes.d.ts","sourceRoot":"","sources":["../../src/auth/es6.classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,eAAO,MAAM,UAAU;;;;;;;
|
|
1
|
+
{"version":3,"file":"es6.classes.d.ts","sourceRoot":"","sources":["../../src/auth/es6.classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,eAAO,MAAM,UAAU;;;;;;;CAoBtB,CAAC"}
|
package/dist/auth/es6.classes.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.es6Classes = void 0;
|
|
|
4
4
|
const auth_controller_1 = require("./controllers/auth.controller");
|
|
5
5
|
const admin_auth_controller_1 = require("./controllers/admin.auth.controller");
|
|
6
6
|
const api_key_service_1 = require("./services/api.key.service");
|
|
7
|
+
const scope_service_1 = require("./services/scope.service");
|
|
7
8
|
const auth_service_1 = require("./services/auth.service");
|
|
8
9
|
const admin_auth_service_1 = require("./services/admin.auth.service");
|
|
9
10
|
const google_auth_service_1 = require("./services/google.auth.service");
|
|
@@ -17,6 +18,7 @@ exports.es6Classes = {
|
|
|
17
18
|
controllers: [auth_controller_1.AuthController, admin_auth_controller_1.AdminAuthController],
|
|
18
19
|
services: [
|
|
19
20
|
api_key_service_1.ApiKeyService,
|
|
21
|
+
scope_service_1.ScopeService,
|
|
20
22
|
auth_service_1.AuthService,
|
|
21
23
|
admin_auth_service_1.AdminAuthService,
|
|
22
24
|
google_auth_service_1.GoogleAuthService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es6.classes.js","sourceRoot":"","sources":["../../src/auth/es6.classes.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAC/D,+EAA0E;AAC1E,gEAA2D;AAC3D,0DAAsD;AACtD,sEAAiE;AACjE,wEAAmE;AACnE,4DAAuD;AACvD,oEAA+D;AAC/D,8DAAyD;AACzD,gDAA4C;AAC5C,gEAA2D;AAC3D,sDAAkD;AAErC,QAAA,UAAU,GAAG;IACxB,WAAW,EAAE,CAAC,gCAAc,EAAE,2CAAmB,CAAC;IAClD,QAAQ,EAAE;QACR,+BAAa;QACb,0BAAW;QACX,qCAAgB;QAChB,uCAAiB;KACT;IACV,SAAS,EAAE,EAAE;IACb,IAAI,EAAE;QACJ,+BAAa;QACb,uCAAiB;QACjB,iCAAc;QACd,oBAAQ;QACR,mCAAe;QACf,0BAAW;KACZ;IACD,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,EAAE;CAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"es6.classes.js","sourceRoot":"","sources":["../../src/auth/es6.classes.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAC/D,+EAA0E;AAC1E,gEAA2D;AAC3D,4DAAwD;AACxD,0DAAsD;AACtD,sEAAiE;AACjE,wEAAmE;AACnE,4DAAuD;AACvD,oEAA+D;AAC/D,8DAAyD;AACzD,gDAA4C;AAC5C,gEAA2D;AAC3D,sDAAkD;AAErC,QAAA,UAAU,GAAG;IACxB,WAAW,EAAE,CAAC,gCAAc,EAAE,2CAAmB,CAAC;IAClD,QAAQ,EAAE;QACR,+BAAa;QACb,4BAAY;QACZ,0BAAW;QACX,qCAAgB;QAChB,uCAAiB;KACT;IACV,SAAS,EAAE,EAAE;IACb,IAAI,EAAE;QACJ,+BAAa;QACb,uCAAiB;QACjB,iCAAc;QACd,oBAAQ;QACR,mCAAe;QACf,0BAAW;KACZ;IACD,IAAI,EAAE,EAAE;IACR,WAAW,EAAE,EAAE;CAChB,CAAC"}
|
|
@@ -41,7 +41,7 @@ let ApiKeyGuard = class ApiKeyGuard {
|
|
|
41
41
|
context.getClass(),
|
|
42
42
|
]) ?? [];
|
|
43
43
|
for (const scope of requiredScopes) {
|
|
44
|
-
if (!this.apiKeyService.hasScope(apiKey, scope)) {
|
|
44
|
+
if (!(await this.apiKeyService.hasScope(apiKey, scope))) {
|
|
45
45
|
throw new access_exception_1.AccessException(`API key is missing the "${scope}" scope.`);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.guard.js","sourceRoot":"","sources":["../../../src/auth/guards/api.key.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AAEzC,+EAA2E;AAC3E,qFAA4E;AAC5E,wEAA8D;AAC9D,qEAA+D;AAC/D,iEAA4D;AAUrD,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,YACmB,aAA4B,EAC5B,SAAoB;QADpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,gCAAa,EAAE;YACxE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,8BAAqB,CAAC,qBAAqB,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,8BAAqB,CAC7B,yCAAyC,CAC1C,CAAC;QAEJ,MAAM,cAAc,GAClB,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAW,6CAAkB,EAAE;YAC7D,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,IAAI,EAAE,CAAC;QACX,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"api.key.guard.js","sourceRoot":"","sources":["../../../src/auth/guards/api.key.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AAEzC,+EAA2E;AAC3E,qFAA4E;AAC5E,wEAA8D;AAC9D,qEAA+D;AAC/D,iEAA4D;AAUrD,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,YACmB,aAA4B,EAC5B,SAAoB;QADpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,gCAAa,EAAE;YACxE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,8BAAqB,CAAC,qBAAqB,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,8BAAqB,CAC7B,yCAAyC,CAC1C,CAAC;QAEJ,MAAM,cAAc,GAClB,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAW,6CAAkB,EAAE;YAC7D,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,IAAI,EAAE,CAAC;QACX,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,kCAAe,CAAC,2BAA2B,KAAK,UAAU,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAEA,OAAgC,CAAC,MAAM,GAAG,MAAM,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,OAAgB;QACjC,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,oCAAa,CAAC,WAAW,CAAC;QAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACpD,IAAI,aAAa,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAlDY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAGuB,+BAAa;QACjB,gBAAS;GAH5B,WAAW,CAkDvB"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { ApiKeyEntity } from '../entities/api.key.entity';
|
|
2
|
+
import { TenantEntity } from '../../tenant/entities/tenant.entity';
|
|
3
|
+
import type { ApiKeyContextValue } from '../types/api.key.types';
|
|
2
4
|
export declare class ApiKeyContext {
|
|
3
|
-
static
|
|
5
|
+
static runWithContext<T>(context: ApiKeyContextValue, callback: () => T): T;
|
|
6
|
+
static set(context: ApiKeyContextValue): void;
|
|
4
7
|
static apiKey(): ApiKeyEntity | undefined;
|
|
8
|
+
static tenant(): TenantEntity | undefined;
|
|
9
|
+
static scopes(): ApiKeyContextValue | undefined;
|
|
5
10
|
}
|
|
6
11
|
//# sourceMappingURL=api.key.context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.context.d.ts","sourceRoot":"","sources":["../../../src/auth/helpers/api.key.context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.key.context.d.ts","sourceRoot":"","sources":["../../../src/auth/helpers/api.key.context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAYjE,qBAAa,aAAa;IAMxB,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;IAS3E,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAI7C,MAAM,CAAC,MAAM,IAAI,YAAY,GAAG,SAAS;IAIzC,MAAM,CAAC,MAAM,IAAI,YAAY,GAAG,SAAS;IAUzC,MAAM,CAAC,MAAM,IAAI,kBAAkB,GAAG,SAAS;CAGhD"}
|
|
@@ -4,10 +4,19 @@ exports.ApiKeyContext = void 0;
|
|
|
4
4
|
const async_hooks_1 = require("async_hooks");
|
|
5
5
|
const storage = new async_hooks_1.AsyncLocalStorage();
|
|
6
6
|
class ApiKeyContext {
|
|
7
|
-
static
|
|
8
|
-
storage.
|
|
7
|
+
static runWithContext(context, callback) {
|
|
8
|
+
return storage.run(context, callback);
|
|
9
|
+
}
|
|
10
|
+
static set(context) {
|
|
11
|
+
storage.enterWith(context);
|
|
9
12
|
}
|
|
10
13
|
static apiKey() {
|
|
14
|
+
return storage.getStore()?.apiKey;
|
|
15
|
+
}
|
|
16
|
+
static tenant() {
|
|
17
|
+
return storage.getStore()?.tenant;
|
|
18
|
+
}
|
|
19
|
+
static scopes() {
|
|
11
20
|
return storage.getStore();
|
|
12
21
|
}
|
|
13
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.context.js","sourceRoot":"","sources":["../../../src/auth/helpers/api.key.context.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;
|
|
1
|
+
{"version":3,"file":"api.key.context.js","sourceRoot":"","sources":["../../../src/auth/helpers/api.key.context.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAKhD,MAAM,OAAO,GAAG,IAAI,+BAAiB,EAAsB,CAAC;AAU5D,MAAa,aAAa;IAMxB,MAAM,CAAC,cAAc,CAAI,OAA2B,EAAE,QAAiB;QACrE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAOD,MAAM,CAAC,GAAG,CAAC,OAA2B;QACpC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;IACpC,CAAC;IAQD,MAAM,CAAC,MAAM;QACX,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;CACF;AApCD,sCAoCC"}
|
|
@@ -5,6 +5,7 @@ export declare class ApiKeyMiddleware implements NestMiddleware {
|
|
|
5
5
|
private readonly apiKeyService;
|
|
6
6
|
constructor(apiKeyService: ApiKeyService);
|
|
7
7
|
use(request: Request, _response: Response, next: NextFunction): Promise<void>;
|
|
8
|
+
private resolveContext;
|
|
8
9
|
private extractKey;
|
|
9
10
|
}
|
|
10
11
|
//# sourceMappingURL=api.key.middleware.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.middleware.d.ts","sourceRoot":"","sources":["../../../src/auth/middlewares/api.key.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.key.middleware.d.ts","sourceRoot":"","sources":["../../../src/auth/middlewares/api.key.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAiB5D,qBACa,gBAAiB,YAAW,cAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEnD,GAAG,CACP,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,QAAQ,EACnB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC;YAcF,cAAc;IAgB5B,OAAO,CAAC,UAAU;CAYnB"}
|
|
@@ -19,14 +19,26 @@ let ApiKeyMiddleware = class ApiKeyMiddleware {
|
|
|
19
19
|
this.apiKeyService = apiKeyService;
|
|
20
20
|
}
|
|
21
21
|
async use(request, _response, next) {
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
api_key_context_1.ApiKeyContext.set(apiKey);
|
|
22
|
+
const context = await this.resolveContext(request);
|
|
23
|
+
if (context) {
|
|
24
|
+
api_key_context_1.ApiKeyContext.runWithContext(context, next);
|
|
25
|
+
return;
|
|
27
26
|
}
|
|
28
27
|
next();
|
|
29
28
|
}
|
|
29
|
+
async resolveContext(request) {
|
|
30
|
+
const rawKey = this.extractKey(request);
|
|
31
|
+
if (!rawKey)
|
|
32
|
+
return null;
|
|
33
|
+
const apiKey = await this.apiKeyService.validateApiKey(rawKey);
|
|
34
|
+
if (!apiKey)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
apiKey,
|
|
38
|
+
tenant: apiKey.tenant ?? undefined,
|
|
39
|
+
scopes: await this.apiKeyService.grantedScopes(apiKey.id),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
30
42
|
extractKey(request) {
|
|
31
43
|
const headerName = process.env.API_KEY_HEADER_NAME || api_key_default_enum_1.ApiKeyDefault.HEADER_NAME;
|
|
32
44
|
const headerKey = request.headers[headerName];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.middleware.js","sourceRoot":"","sources":["../../../src/auth/middlewares/api.key.middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAE5D,wEAA8D;AAC9D,iEAA4D;AAC5D,gEAA2D;
|
|
1
|
+
{"version":3,"file":"api.key.middleware.js","sourceRoot":"","sources":["../../../src/auth/middlewares/api.key.middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAE5D,wEAA8D;AAC9D,iEAA4D;AAC5D,gEAA2D;AAiBpD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,KAAK,CAAC,GAAG,CACP,OAAgB,EAChB,SAAmB,EACnB,IAAkB;QAElB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAKnD,IAAI,OAAO,EAAE,CAAC;YACZ,+BAAa,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;IAGO,KAAK,CAAC,cAAc,CAC1B,OAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO;YACL,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;YAClC,MAAM,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;SAC1D,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,OAAgB;QACjC,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,oCAAa,CAAC,WAAW,CAAC;QAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACpD,IAAI,aAAa,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvD,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAjDY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAEiC,+BAAa;GAD9C,gBAAgB,CAiD5B"}
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import { Logger } from '@nestjs/common';
|
|
2
2
|
import { DataSource } from 'typeorm';
|
|
3
|
+
import { DeleteResult, DisableResult } from '../../common/types/common.response.types';
|
|
3
4
|
import { ApiKeyEntity } from '../entities/api.key.entity';
|
|
4
|
-
import {
|
|
5
|
+
import { ApiScopeEntity } from '../entities/api.scope.entity';
|
|
6
|
+
import { ApiKeyAccess, ApiKeyDetail, GenerateApiKeyOptions, GeneratedApiKey } from '../types/api.key.types';
|
|
5
7
|
export declare class ApiKeyService {
|
|
6
8
|
private readonly dataSource;
|
|
7
9
|
protected readonly logger: Logger;
|
|
8
10
|
constructor(dataSource: DataSource);
|
|
9
11
|
generateApiKey(name: string, options?: GenerateApiKeyOptions): Promise<GeneratedApiKey>;
|
|
12
|
+
grantScopes(apiKeyUuid: string, scopeIds?: string[], grantedBy?: string): Promise<ApiScopeEntity[]>;
|
|
10
13
|
validateApiKey(rawKey: string): Promise<ApiKeyEntity | null>;
|
|
11
|
-
|
|
14
|
+
grantedScopes(apiKeyUuid: string): Promise<string[]>;
|
|
15
|
+
apiKeyDetail(apiKeyUuid: string): Promise<ApiKeyDetail>;
|
|
16
|
+
hasScope(apiKey: ApiKeyEntity, scope: string): Promise<boolean>;
|
|
17
|
+
validateAccess(scopeIdentifier: string): ApiKeyAccess;
|
|
12
18
|
revokeApiKey(apiKeyUuid: string): Promise<void>;
|
|
19
|
+
disableApiKey(apiKeyUuid: string, actorUuid: string): Promise<DisableResult>;
|
|
20
|
+
deleteApiKey(apiKeyUuid: string, actorUuid: string): Promise<DeleteResult>;
|
|
13
21
|
listApiKeys(): Promise<ApiKeyEntity[]>;
|
|
22
|
+
private grantedScopeRecords;
|
|
23
|
+
private grants;
|
|
14
24
|
private touchLastUsed;
|
|
15
25
|
private get apiKeyRepository();
|
|
26
|
+
private get apiScopeRepository();
|
|
16
27
|
}
|
|
17
28
|
//# sourceMappingURL=api.key.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.service.d.ts","sourceRoot":"","sources":["../../../src/auth/services/api.key.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.key.service.d.ts","sourceRoot":"","sources":["../../../src/auth/services/api.key.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AAGjD,OAAO,EACL,YAAY,EACZ,aAAa,EACd,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAWhC,qBACa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAkC;gBAE9B,UAAU,EAAE,UAAU;IAE7C,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,eAAe,CAAC;IAoBrB,WAAW,CACf,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,EAAE,CAAC;IAetB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiB5D,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASpD,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAavD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrE,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY;IAkB/C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC;IAkBnB,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IAiBlB,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAK9B,mBAAmB;IAajC,OAAO,CAAC,MAAM;YAMA,aAAa;IAO3B,OAAO,KAAK,gBAAgB,GAE3B;IAED,OAAO,KAAK,kBAAkB,GAE7B;CACF"}
|
|
@@ -14,10 +14,13 @@ exports.ApiKeyService = void 0;
|
|
|
14
14
|
const common_1 = require("@nestjs/common");
|
|
15
15
|
const crypto_1 = require("crypto");
|
|
16
16
|
const typeorm_1 = require("typeorm");
|
|
17
|
+
const access_exception_1 = require("../../global/exceptions/access.exception");
|
|
17
18
|
const not_found_exception_1 = require("../../global/exceptions/not.found.exception");
|
|
18
19
|
const hash_util_1 = require("../../global/utilities/hash.util");
|
|
19
20
|
const api_key_entity_1 = require("../entities/api.key.entity");
|
|
21
|
+
const api_scope_entity_1 = require("../entities/api.scope.entity");
|
|
20
22
|
const api_key_default_enum_1 = require("../enums/api.key.default.enum");
|
|
23
|
+
const api_key_context_1 = require("../helpers/api.key.context");
|
|
21
24
|
let ApiKeyService = ApiKeyService_1 = class ApiKeyService {
|
|
22
25
|
constructor(dataSource) {
|
|
23
26
|
this.dataSource = dataSource;
|
|
@@ -30,17 +33,28 @@ let ApiKeyService = ApiKeyService_1 = class ApiKeyService {
|
|
|
30
33
|
key_prefix: rawKey.slice(0, api_key_default_enum_1.ApiKeyDefault.PREFIX_VISIBLE_LENGTH),
|
|
31
34
|
key_hash: hash_util_1.Hash.sha256(rawKey),
|
|
32
35
|
is_active: true,
|
|
33
|
-
...(options?.
|
|
36
|
+
...(options?.tenantId ? { tenant_id: options.tenantId } : {}),
|
|
34
37
|
...(options?.expiresAt ? { expires_at: options.expiresAt } : {}),
|
|
35
38
|
...(options?.createdBy ? { created_by: options.createdBy } : {}),
|
|
36
39
|
}));
|
|
40
|
+
await this.grantScopes(apiKey.id, options?.scopeIds, options?.createdBy);
|
|
37
41
|
return { rawKey, apiKey };
|
|
38
42
|
}
|
|
43
|
+
async grantScopes(apiKeyUuid, scopeIds, grantedBy) {
|
|
44
|
+
if (!scopeIds?.length)
|
|
45
|
+
return [];
|
|
46
|
+
return this.apiScopeRepository.save([...new Set(scopeIds)].map((scope_id) => this.apiScopeRepository.create({
|
|
47
|
+
api_key_id: apiKeyUuid,
|
|
48
|
+
scope_id,
|
|
49
|
+
...(grantedBy ? { created_by: grantedBy } : {}),
|
|
50
|
+
})));
|
|
51
|
+
}
|
|
39
52
|
async validateApiKey(rawKey) {
|
|
40
53
|
if (!rawKey)
|
|
41
54
|
return null;
|
|
42
55
|
const apiKey = await this.apiKeyRepository.findOne({
|
|
43
56
|
where: { key_hash: hash_util_1.Hash.sha256(rawKey) },
|
|
57
|
+
relations: { tenant: true },
|
|
44
58
|
});
|
|
45
59
|
if (!apiKey || !apiKey.is_active || apiKey.revoked_at)
|
|
46
60
|
return null;
|
|
@@ -49,10 +63,33 @@ let ApiKeyService = ApiKeyService_1 = class ApiKeyService {
|
|
|
49
63
|
this.touchLastUsed(apiKey).catch((error) => this.logger.warn(`Failed to update last_used_at: ${error.message}`));
|
|
50
64
|
return apiKey;
|
|
51
65
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
66
|
+
async grantedScopes(apiKeyUuid) {
|
|
67
|
+
const scopes = await this.grantedScopeRecords(apiKeyUuid);
|
|
68
|
+
return scopes.map((scope) => scope.identifier);
|
|
69
|
+
}
|
|
70
|
+
async apiKeyDetail(apiKeyUuid) {
|
|
71
|
+
const apiKey = await this.apiKeyRepository.findOne({
|
|
72
|
+
where: { id: apiKeyUuid },
|
|
73
|
+
relations: { tenant: true },
|
|
74
|
+
});
|
|
75
|
+
if (!apiKey)
|
|
76
|
+
throw new not_found_exception_1.NotFoundException('No API key exists for this id');
|
|
77
|
+
return Object.assign(apiKey, {
|
|
78
|
+
scopes: await this.grantedScopeRecords(apiKeyUuid),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async hasScope(apiKey, scope) {
|
|
82
|
+
return this.grants(await this.grantedScopes(apiKey.id), scope);
|
|
83
|
+
}
|
|
84
|
+
validateAccess(scopeIdentifier) {
|
|
85
|
+
const granted = api_key_context_1.ApiKeyContext.scopes();
|
|
86
|
+
if (!granted)
|
|
87
|
+
throw new access_exception_1.AccessException('Authentication required: no valid API key on this request.');
|
|
88
|
+
if (!this.grants(granted.scopes, scopeIdentifier))
|
|
89
|
+
throw new access_exception_1.AccessException('This feature is not enabled for this Api key');
|
|
90
|
+
if (!granted.tenant)
|
|
91
|
+
throw new access_exception_1.AccessException('This Api key is not bound to an organization.');
|
|
92
|
+
return { tenant: granted.tenant };
|
|
56
93
|
}
|
|
57
94
|
async revokeApiKey(apiKeyUuid) {
|
|
58
95
|
const apiKey = await this.apiKeyRepository.findOne({
|
|
@@ -64,15 +101,50 @@ let ApiKeyService = ApiKeyService_1 = class ApiKeyService {
|
|
|
64
101
|
apiKey.is_active = false;
|
|
65
102
|
await this.apiKeyRepository.save(apiKey);
|
|
66
103
|
}
|
|
104
|
+
async disableApiKey(apiKeyUuid, actorUuid) {
|
|
105
|
+
const apiKey = await this.apiKeyRepository.findOne({
|
|
106
|
+
where: { id: apiKeyUuid },
|
|
107
|
+
});
|
|
108
|
+
if (!apiKey)
|
|
109
|
+
throw new not_found_exception_1.NotFoundException('No API key exists for this id');
|
|
110
|
+
apiKey.is_active = false;
|
|
111
|
+
await this.apiKeyRepository.save(apiKey);
|
|
112
|
+
return { id: apiKeyUuid, disabled: true, disabled_by: actorUuid };
|
|
113
|
+
}
|
|
114
|
+
async deleteApiKey(apiKeyUuid, actorUuid) {
|
|
115
|
+
if (!(await this.apiKeyRepository.existsBy({ id: apiKeyUuid })))
|
|
116
|
+
throw new not_found_exception_1.NotFoundException('No API key exists for this id');
|
|
117
|
+
await this.dataSource.transaction(async (trx) => {
|
|
118
|
+
await trx.update(api_key_entity_1.ApiKeyEntity, { id: apiKeyUuid }, { is_active: false, revoked_at: new Date() });
|
|
119
|
+
await trx.softDelete(api_scope_entity_1.ApiScopeEntity, { api_key_id: apiKeyUuid });
|
|
120
|
+
await trx.softDelete(api_key_entity_1.ApiKeyEntity, { id: apiKeyUuid });
|
|
121
|
+
});
|
|
122
|
+
return { id: apiKeyUuid, deleted: true, deleted_by: actorUuid };
|
|
123
|
+
}
|
|
67
124
|
async listApiKeys() {
|
|
68
125
|
return this.apiKeyRepository.find({ order: { created_at: 'DESC' } });
|
|
69
126
|
}
|
|
127
|
+
async grantedScopeRecords(apiKeyUuid) {
|
|
128
|
+
const apiScopes = await this.apiScopeRepository.find({
|
|
129
|
+
where: { api_key_id: apiKeyUuid },
|
|
130
|
+
relations: { scope: true },
|
|
131
|
+
});
|
|
132
|
+
return apiScopes
|
|
133
|
+
.map((apiScope) => apiScope.scope)
|
|
134
|
+
.filter((scope) => !!scope);
|
|
135
|
+
}
|
|
136
|
+
grants(granted, scope) {
|
|
137
|
+
return (granted.includes(api_key_default_enum_1.ApiKeyDefault.WILDCARD_SCOPE) || granted.includes(scope));
|
|
138
|
+
}
|
|
70
139
|
async touchLastUsed(apiKey) {
|
|
71
140
|
await this.apiKeyRepository.update({ id: apiKey.id }, { last_used_at: new Date() });
|
|
72
141
|
}
|
|
73
142
|
get apiKeyRepository() {
|
|
74
143
|
return this.dataSource.getRepository(api_key_entity_1.ApiKeyEntity);
|
|
75
144
|
}
|
|
145
|
+
get apiScopeRepository() {
|
|
146
|
+
return this.dataSource.getRepository(api_scope_entity_1.ApiScopeEntity);
|
|
147
|
+
}
|
|
76
148
|
};
|
|
77
149
|
exports.ApiKeyService = ApiKeyService;
|
|
78
150
|
exports.ApiKeyService = ApiKeyService = ApiKeyService_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.key.service.js","sourceRoot":"","sources":["../../../src/auth/services/api.key.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,mCAAqC;AACrC,qCAAiD;AACjD,qFAAgF;
|
|
1
|
+
{"version":3,"file":"api.key.service.js","sourceRoot":"","sources":["../../../src/auth/services/api.key.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,16 @@ import { JwtService } from '@nestjs/jwt';
|
|
|
2
2
|
import { DataSource } from 'typeorm';
|
|
3
3
|
import { UserEntity } from '../entities/user.entity';
|
|
4
4
|
import { CacheService } from '../../common/services/cache.service';
|
|
5
|
+
import { ScopeService } from './scope.service';
|
|
5
6
|
import { AuthenticatedAccess, AuthTokenPair, IssueTokensUser, TokenIssueContext } from '../types/auth.types';
|
|
6
7
|
export declare class AuthService {
|
|
7
8
|
private readonly jwtService;
|
|
8
9
|
private readonly cacheService;
|
|
9
10
|
private readonly dataSource;
|
|
10
|
-
|
|
11
|
+
private readonly scopeService;
|
|
12
|
+
constructor(jwtService: JwtService, cacheService: CacheService, dataSource: DataSource, scopeService: ScopeService);
|
|
11
13
|
validateRole(roleIdentifier?: string): Promise<AuthenticatedAccess>;
|
|
14
|
+
validateAccess(scopeIdentifier: string, roleIdentifier?: string): Promise<AuthenticatedAccess>;
|
|
12
15
|
validateCredentials(email: string, password: string): Promise<UserEntity>;
|
|
13
16
|
issueTokens(user: IssueTokensUser, context?: TokenIssueContext): Promise<AuthTokenPair>;
|
|
14
17
|
refresh(rawRefreshToken: string, context?: TokenIssueContext): Promise<AuthTokenPair>;
|