@nathapp/nestjs-oauth-prisma 1.0.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.
Files changed (61) hide show
  1. package/README.md +249 -0
  2. package/dist/abstract-prisma-public-client.repository.d.ts +20 -0
  3. package/dist/abstract-prisma-public-client.repository.js +54 -0
  4. package/dist/abstract-prisma-public-client.repository.js.map +1 -0
  5. package/dist/index.d.ts +12 -0
  6. package/dist/index.js +29 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/oauth-prisma.module.d.ts +7 -0
  9. package/dist/oauth-prisma.module.js +75 -0
  10. package/dist/oauth-prisma.module.js.map +1 -0
  11. package/dist/oauth-prisma.types.d.ts +189 -0
  12. package/dist/oauth-prisma.types.js +43 -0
  13. package/dist/oauth-prisma.types.js.map +1 -0
  14. package/dist/prisma-consent-logout-target.resolver.d.ts +12 -0
  15. package/dist/prisma-consent-logout-target.resolver.js +43 -0
  16. package/dist/prisma-consent-logout-target.resolver.js.map +1 -0
  17. package/dist/prisma-oauth-access-token.repository.d.ts +41 -0
  18. package/dist/prisma-oauth-access-token.repository.js +124 -0
  19. package/dist/prisma-oauth-access-token.repository.js.map +1 -0
  20. package/dist/prisma-oauth-authorization-code.repository.d.ts +41 -0
  21. package/dist/prisma-oauth-authorization-code.repository.js +118 -0
  22. package/dist/prisma-oauth-authorization-code.repository.js.map +1 -0
  23. package/dist/prisma-oauth-client.repository.d.ts +50 -0
  24. package/dist/prisma-oauth-client.repository.js +193 -0
  25. package/dist/prisma-oauth-client.repository.js.map +1 -0
  26. package/dist/prisma-oauth-consent.repository.d.ts +36 -0
  27. package/dist/prisma-oauth-consent.repository.js +95 -0
  28. package/dist/prisma-oauth-consent.repository.js.map +1 -0
  29. package/dist/prisma-oauth-device-code.repository.d.ts +36 -0
  30. package/dist/prisma-oauth-device-code.repository.js +124 -0
  31. package/dist/prisma-oauth-device-code.repository.js.map +1 -0
  32. package/dist/prisma-oauth-pushed-request.repository.d.ts +16 -0
  33. package/dist/prisma-oauth-pushed-request.repository.js +104 -0
  34. package/dist/prisma-oauth-pushed-request.repository.js.map +1 -0
  35. package/dist/prisma-oauth-refresh-token.repository.d.ts +28 -0
  36. package/dist/prisma-oauth-refresh-token.repository.js +100 -0
  37. package/dist/prisma-oauth-refresh-token.repository.js.map +1 -0
  38. package/dist/prisma-oauth-scope.repository.d.ts +25 -0
  39. package/dist/prisma-oauth-scope.repository.js +87 -0
  40. package/dist/prisma-oauth-scope.repository.js.map +1 -0
  41. package/dist/prisma-oauth-signing-key.repository.d.ts +24 -0
  42. package/dist/prisma-oauth-signing-key.repository.js +110 -0
  43. package/dist/prisma-oauth-signing-key.repository.js.map +1 -0
  44. package/dist/prisma-signing-key.provider.d.ts +22 -0
  45. package/dist/prisma-signing-key.provider.js +133 -0
  46. package/dist/prisma-signing-key.provider.js.map +1 -0
  47. package/package.json +45 -0
  48. package/prisma/migrations/20260608_oauth_signing_keys_one_active/migration.mysql.sql +8 -0
  49. package/prisma/migrations/20260608_oauth_signing_keys_one_active/migration.sql +3 -0
  50. package/prisma/migrations/20260724_oauth_client_advanced_auth_fields/migration.mysql.sql +10 -0
  51. package/prisma/migrations/20260724_oauth_client_advanced_auth_fields/migration.sql +9 -0
  52. package/prisma/migrations/20260725_oauth_resource_indicator/migration.mysql.sql +10 -0
  53. package/prisma/migrations/20260725_oauth_resource_indicator/migration.sql +15 -0
  54. package/prisma/migrations/20260725_oauth_token_exchange_actor/migration.mysql.sql +2 -0
  55. package/prisma/migrations/20260725_oauth_token_exchange_actor/migration.sql +2 -0
  56. package/prisma/migrations/20261003_oauth_access_token_mtls_binding/migration.mysql.sql +2 -0
  57. package/prisma/migrations/20261003_oauth_access_token_mtls_binding/migration.sql +2 -0
  58. package/prisma/migrations/20261004_oauth_signing_keys_one_active_per_tenant/migration.mysql.sql +13 -0
  59. package/prisma/migrations/20261004_oauth_signing_keys_one_active_per_tenant/migration.sql +14 -0
  60. package/prisma/oauth.prisma +287 -0
  61. package/prisma/sql/long-text-columns.mysql.sql +29 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-oauth-pushed-request.repository.js","sourceRoot":"","sources":["../lib/prisma-oauth-pushed-request.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { AbstractPrismaRepository, type PrismaClientLike } from '@nathapp/nestjs-prisma';
2
+ import { ITransactionManager } from '@nathapp/nestjs-data';
3
+ import { type IOAuthRefreshTokenRepository, type IOAuthRefreshToken } from '@nathapp/nestjs-oauth';
4
+ import { type OAuthPrismaDelegate, type OAuthRefreshTokenRow } from './oauth-prisma.types';
5
+ export declare class PrismaOAuthRefreshTokenRepository extends AbstractPrismaRepository<IOAuthRefreshToken, OAuthRefreshTokenRow, string> implements IOAuthRefreshTokenRepository {
6
+ constructor(tx: ITransactionManager);
7
+ protected modelDelegate(client: PrismaClientLike): OAuthPrismaDelegate<OAuthRefreshTokenRow>;
8
+ private get oauthModel();
9
+ protected toDomain(e: OAuthRefreshTokenRow): IOAuthRefreshToken;
10
+ protected toPersistenceCreate(d: IOAuthRefreshToken): {
11
+ id: string;
12
+ tenantId: string | null;
13
+ tokenHash: string;
14
+ clientId: string;
15
+ userId: string;
16
+ scope: string | null;
17
+ previousTokenHash: string | null;
18
+ expiresAt: Date;
19
+ cnfJkt: string | null;
20
+ resource: string | null;
21
+ };
22
+ protected toPersistenceUpdate(p: Partial<IOAuthRefreshToken>): Record<string, unknown>;
23
+ findByTokenHash(tokenHash: string): Promise<IOAuthRefreshToken | null>;
24
+ revoke(id: string, revokedAt: Date): Promise<void>;
25
+ revokeByUserAndClient(userId: string, clientId: string, revokedAt: Date): Promise<void>;
26
+ revokeIfActive(id: string, revokedAt: Date): Promise<boolean>;
27
+ deleteExpired(now: Date): Promise<number>;
28
+ }
@@ -0,0 +1,100 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PrismaOAuthRefreshTokenRepository = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const nestjs_prisma_1 = require("@nathapp/nestjs-prisma");
18
+ const nestjs_data_1 = require("@nathapp/nestjs-data");
19
+ const oauth_prisma_types_1 = require("./oauth-prisma.types");
20
+ let PrismaOAuthRefreshTokenRepository = class PrismaOAuthRefreshTokenRepository extends nestjs_prisma_1.AbstractPrismaRepository {
21
+ constructor(tx) { super(tx); }
22
+ modelDelegate(client) {
23
+ return (0, oauth_prisma_types_1.getOAuthPrismaDelegate)(client, 'oAuthRefreshToken');
24
+ }
25
+ get oauthModel() {
26
+ return this.modelDelegate(this.tx.getClient());
27
+ }
28
+ toDomain(e) {
29
+ var _a, _b, _c, _d, _e, _f;
30
+ return {
31
+ id: e.id,
32
+ tenantId: (_a = e.tenantId) !== null && _a !== void 0 ? _a : undefined,
33
+ tokenHash: e.tokenHash,
34
+ clientId: e.clientId,
35
+ userId: e.userId,
36
+ scope: (_b = e.scope) !== null && _b !== void 0 ? _b : undefined,
37
+ previousTokenHash: (_c = e.previousTokenHash) !== null && _c !== void 0 ? _c : undefined,
38
+ expiresAt: e.expiresAt,
39
+ revokedAt: (_d = e.revokedAt) !== null && _d !== void 0 ? _d : undefined,
40
+ cnf: e.cnfJkt ? { jkt: e.cnfJkt } : undefined,
41
+ lastUsedAt: (_e = e.lastUsedAt) !== null && _e !== void 0 ? _e : undefined,
42
+ resource: (_f = e.resource) !== null && _f !== void 0 ? _f : undefined,
43
+ createdAt: e.createdAt,
44
+ };
45
+ }
46
+ toPersistenceCreate(d) {
47
+ var _a, _b, _c, _d, _e, _f;
48
+ return {
49
+ id: d.id,
50
+ tenantId: (_a = d.tenantId) !== null && _a !== void 0 ? _a : null,
51
+ tokenHash: d.tokenHash,
52
+ clientId: d.clientId,
53
+ userId: d.userId,
54
+ scope: (_b = d.scope) !== null && _b !== void 0 ? _b : null,
55
+ previousTokenHash: (_c = d.previousTokenHash) !== null && _c !== void 0 ? _c : null,
56
+ expiresAt: d.expiresAt,
57
+ cnfJkt: (_e = (_d = d.cnf) === null || _d === void 0 ? void 0 : _d.jkt) !== null && _e !== void 0 ? _e : null,
58
+ resource: (_f = d.resource) !== null && _f !== void 0 ? _f : null,
59
+ };
60
+ }
61
+ toPersistenceUpdate(p) {
62
+ const out = {};
63
+ if (p.revokedAt !== undefined)
64
+ out.revokedAt = p.revokedAt;
65
+ if (p.lastUsedAt !== undefined)
66
+ out.lastUsedAt = p.lastUsedAt;
67
+ return out;
68
+ }
69
+ async findByTokenHash(tokenHash) {
70
+ const e = await this.oauthModel.findUnique({ where: { tokenHash } });
71
+ return e ? this.toDomain(e) : null;
72
+ }
73
+ async revoke(id, revokedAt) {
74
+ await this.model.update({ where: { id }, data: { revokedAt } });
75
+ }
76
+ async revokeByUserAndClient(userId, clientId, revokedAt) {
77
+ await this.oauthModel.updateMany({
78
+ where: { userId, clientId, revokedAt: null },
79
+ data: { revokedAt },
80
+ });
81
+ }
82
+ async revokeIfActive(id, revokedAt) {
83
+ const res = await this.oauthModel.updateMany({
84
+ where: { id, revokedAt: null },
85
+ data: { revokedAt },
86
+ });
87
+ return res.count === 1;
88
+ }
89
+ async deleteExpired(now) {
90
+ const res = await this.oauthModel.deleteMany({ where: { expiresAt: { lt: now } } });
91
+ return res.count;
92
+ }
93
+ };
94
+ exports.PrismaOAuthRefreshTokenRepository = PrismaOAuthRefreshTokenRepository;
95
+ exports.PrismaOAuthRefreshTokenRepository = PrismaOAuthRefreshTokenRepository = __decorate([
96
+ (0, common_1.Injectable)(),
97
+ __param(0, (0, common_1.Inject)(nestjs_data_1.TRANSACTION_MANAGER)),
98
+ __metadata("design:paramtypes", [Object])
99
+ ], PrismaOAuthRefreshTokenRepository);
100
+ //# sourceMappingURL=prisma-oauth-refresh-token.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-oauth-refresh-token.repository.js","sourceRoot":"","sources":["../lib/prisma-oauth-refresh-token.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { AbstractPrismaRepository, type PrismaClientLike } from '@nathapp/nestjs-prisma';
2
+ import { ITransactionManager } from '@nathapp/nestjs-data';
3
+ import { type IOAuthScopeRepository, type IOAuthScope, OAuthScopeStatus } from '@nathapp/nestjs-oauth';
4
+ import { type OAuthPrismaDelegate, type OAuthScopeRow } from './oauth-prisma.types';
5
+ export declare class PrismaOAuthScopeRepository extends AbstractPrismaRepository<IOAuthScope, OAuthScopeRow, string> implements IOAuthScopeRepository {
6
+ constructor(tx: ITransactionManager);
7
+ protected modelDelegate(client: PrismaClientLike): OAuthPrismaDelegate<OAuthScopeRow>;
8
+ private get oauthModel();
9
+ private get clientScopeModel();
10
+ protected toDomain(e: OAuthScopeRow): IOAuthScope;
11
+ protected toPersistenceCreate(d: IOAuthScope): {
12
+ id: string;
13
+ code: string;
14
+ name: string;
15
+ description: string | null;
16
+ claims: string[];
17
+ isSystem: boolean;
18
+ status: OAuthScopeStatus;
19
+ };
20
+ protected toPersistenceUpdate(p: Partial<IOAuthScope>): Record<string, unknown>;
21
+ findByCode(code: string): Promise<IOAuthScope | null>;
22
+ findByCodes(codes: string[]): Promise<IOAuthScope[]>;
23
+ findClientScopeCodes(clientId: string): Promise<string[]>;
24
+ setClientScopes(clientId: string, scopeIds: string[]): Promise<void>;
25
+ }
@@ -0,0 +1,87 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PrismaOAuthScopeRepository = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const nestjs_prisma_1 = require("@nathapp/nestjs-prisma");
18
+ const nestjs_data_1 = require("@nathapp/nestjs-data");
19
+ const oauth_prisma_types_1 = require("./oauth-prisma.types");
20
+ let PrismaOAuthScopeRepository = class PrismaOAuthScopeRepository extends nestjs_prisma_1.AbstractPrismaRepository {
21
+ constructor(tx) { super(tx); }
22
+ modelDelegate(client) {
23
+ return (0, oauth_prisma_types_1.getOAuthPrismaDelegate)(client, 'oAuthScope');
24
+ }
25
+ get oauthModel() {
26
+ return this.modelDelegate(this.tx.getClient());
27
+ }
28
+ get clientScopeModel() {
29
+ return (0, oauth_prisma_types_1.getOAuthPrismaDelegate)(this.tx.getClient(), 'oAuthClientScope');
30
+ }
31
+ toDomain(e) {
32
+ var _a;
33
+ return {
34
+ id: e.id, code: e.code, name: e.name, description: (_a = e.description) !== null && _a !== void 0 ? _a : undefined,
35
+ claims: Array.isArray(e.claims) && e.claims.every((claim) => typeof claim === 'string')
36
+ ? e.claims : [],
37
+ isSystem: e.isSystem, status: e.status,
38
+ createdAt: e.createdAt, updatedAt: e.updatedAt,
39
+ };
40
+ }
41
+ toPersistenceCreate(d) {
42
+ var _a;
43
+ return {
44
+ id: d.id, code: d.code, name: d.name, description: (_a = d.description) !== null && _a !== void 0 ? _a : null,
45
+ claims: d.claims, isSystem: d.isSystem, status: d.status,
46
+ };
47
+ }
48
+ toPersistenceUpdate(p) {
49
+ const out = {};
50
+ if (p.name !== undefined)
51
+ out.name = p.name;
52
+ if (p.description !== undefined)
53
+ out.description = p.description;
54
+ if (p.claims !== undefined)
55
+ out.claims = p.claims;
56
+ if (p.status !== undefined)
57
+ out.status = p.status;
58
+ return out;
59
+ }
60
+ async findByCode(code) {
61
+ const e = await this.oauthModel.findUnique({ where: { code } });
62
+ return e ? this.toDomain(e) : null;
63
+ }
64
+ async findByCodes(codes) {
65
+ const rows = await this.oauthModel.findMany({ where: { code: { in: codes } } });
66
+ return rows.map((r) => this.toDomain(r));
67
+ }
68
+ async findClientScopeCodes(clientId) {
69
+ const rows = await this.clientScopeModel.findMany({ where: { clientId }, include: { scope: true } });
70
+ return rows.map((row) => row.scope.code);
71
+ }
72
+ async setClientScopes(clientId, scopeIds) {
73
+ await this.clientScopeModel.deleteMany({ where: { clientId } });
74
+ if (scopeIds.length) {
75
+ await this.clientScopeModel.createMany({
76
+ data: scopeIds.map((scopeId) => ({ clientId, scopeId })),
77
+ });
78
+ }
79
+ }
80
+ };
81
+ exports.PrismaOAuthScopeRepository = PrismaOAuthScopeRepository;
82
+ exports.PrismaOAuthScopeRepository = PrismaOAuthScopeRepository = __decorate([
83
+ (0, common_1.Injectable)(),
84
+ __param(0, (0, common_1.Inject)(nestjs_data_1.TRANSACTION_MANAGER)),
85
+ __metadata("design:paramtypes", [Object])
86
+ ], PrismaOAuthScopeRepository);
87
+ //# sourceMappingURL=prisma-oauth-scope.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-oauth-scope.repository.js","sourceRoot":"","sources":["../lib/prisma-oauth-scope.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { AbstractPrismaRepository, type PrismaClientLike } from '@nathapp/nestjs-prisma';
2
+ import { ITransactionManager } from '@nathapp/nestjs-data';
3
+ import { type IOAuthSigningKeyRepository, type IOAuthSigningKey, type IOAuthSigningKeyPublic, type SigningKeyStatus } from '@nathapp/nestjs-oauth';
4
+ import { type OAuthPrismaDelegate, type OAuthSigningKeyRow } from './oauth-prisma.types';
5
+ export declare class PrismaOAuthSigningKeyRepository extends AbstractPrismaRepository<IOAuthSigningKey, OAuthSigningKeyRow, string> implements IOAuthSigningKeyRepository {
6
+ constructor(tx: ITransactionManager);
7
+ protected modelDelegate(client: PrismaClientLike): OAuthPrismaDelegate<OAuthSigningKeyRow>;
8
+ private get oauthModel();
9
+ protected toDomain(e: OAuthSigningKeyRow): IOAuthSigningKey;
10
+ protected toPersistenceCreate(d: IOAuthSigningKey): {
11
+ id: string;
12
+ kid: string;
13
+ alg: string;
14
+ privateKeyPem: string;
15
+ publicKeyPem: string;
16
+ status: SigningKeyStatus;
17
+ expiresAt: Date | null;
18
+ tenantId: string | null;
19
+ };
20
+ protected toPersistenceUpdate(p: Partial<IOAuthSigningKey>): Record<string, unknown>;
21
+ findActive(tenantId?: string | null): Promise<IOAuthSigningKey | null>;
22
+ findByStatusIn(statuses: SigningKeyStatus[], tenantId?: string | null): Promise<IOAuthSigningKeyPublic[]>;
23
+ setStatus(id: string, status: SigningKeyStatus, expiresAt?: Date): Promise<void>;
24
+ }
@@ -0,0 +1,110 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PrismaOAuthSigningKeyRepository = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const nestjs_prisma_1 = require("@nathapp/nestjs-prisma");
18
+ const nestjs_data_1 = require("@nathapp/nestjs-data");
19
+ const oauth_prisma_types_1 = require("./oauth-prisma.types");
20
+ let PrismaOAuthSigningKeyRepository = class PrismaOAuthSigningKeyRepository extends nestjs_prisma_1.AbstractPrismaRepository {
21
+ constructor(tx) { super(tx); }
22
+ modelDelegate(client) {
23
+ return (0, oauth_prisma_types_1.getOAuthPrismaDelegate)(client, 'oAuthSigningKey');
24
+ }
25
+ get oauthModel() {
26
+ return this.modelDelegate(this.tx.getClient());
27
+ }
28
+ toDomain(e) {
29
+ var _a, _b;
30
+ return {
31
+ id: e.id,
32
+ kid: e.kid,
33
+ alg: e.alg,
34
+ privateKeyPem: e.privateKeyPem,
35
+ publicKeyPem: e.publicKeyPem,
36
+ status: e.status,
37
+ createdAt: e.createdAt,
38
+ expiresAt: (_a = e.expiresAt) !== null && _a !== void 0 ? _a : undefined,
39
+ tenantId: (_b = e.tenantId) !== null && _b !== void 0 ? _b : undefined,
40
+ };
41
+ }
42
+ toPersistenceCreate(d) {
43
+ var _a, _b;
44
+ return {
45
+ id: d.id,
46
+ kid: d.kid,
47
+ alg: d.alg,
48
+ privateKeyPem: d.privateKeyPem,
49
+ publicKeyPem: d.publicKeyPem,
50
+ status: d.status,
51
+ expiresAt: (_a = d.expiresAt) !== null && _a !== void 0 ? _a : null,
52
+ tenantId: (_b = d.tenantId) !== null && _b !== void 0 ? _b : null,
53
+ };
54
+ }
55
+ toPersistenceUpdate(p) {
56
+ const out = {};
57
+ if (p.status !== undefined)
58
+ out.status = p.status;
59
+ if (p.expiresAt !== undefined)
60
+ out.expiresAt = p.expiresAt;
61
+ return out;
62
+ }
63
+ async findActive(tenantId) {
64
+ const where = { status: 'active' };
65
+ if (tenantId !== undefined) {
66
+ where.tenantId = tenantId;
67
+ }
68
+ const e = await this.model.findFirst({ where });
69
+ return e ? this.toDomain(e) : null;
70
+ }
71
+ async findByStatusIn(statuses, tenantId) {
72
+ const now = new Date();
73
+ const where = {
74
+ status: { in: statuses },
75
+ OR: [{ expiresAt: null }, { expiresAt: { gt: now } }],
76
+ };
77
+ if (tenantId !== undefined) {
78
+ where.tenantId = tenantId;
79
+ }
80
+ const rows = await this.oauthModel.findMany({
81
+ where,
82
+ select: { id: true, kid: true, alg: true, publicKeyPem: true, status: true, createdAt: true, expiresAt: true },
83
+ });
84
+ return rows.map((r) => {
85
+ var _a;
86
+ return ({
87
+ id: r.id,
88
+ kid: r.kid,
89
+ alg: r.alg,
90
+ publicKeyPem: r.publicKeyPem,
91
+ status: r.status,
92
+ createdAt: r.createdAt,
93
+ expiresAt: (_a = r.expiresAt) !== null && _a !== void 0 ? _a : undefined,
94
+ });
95
+ });
96
+ }
97
+ async setStatus(id, status, expiresAt) {
98
+ await this.model.update({
99
+ where: { id },
100
+ data: { status, ...(expiresAt !== undefined ? { expiresAt } : {}) },
101
+ });
102
+ }
103
+ };
104
+ exports.PrismaOAuthSigningKeyRepository = PrismaOAuthSigningKeyRepository;
105
+ exports.PrismaOAuthSigningKeyRepository = PrismaOAuthSigningKeyRepository = __decorate([
106
+ (0, common_1.Injectable)(),
107
+ __param(0, (0, common_1.Inject)(nestjs_data_1.TRANSACTION_MANAGER)),
108
+ __metadata("design:paramtypes", [Object])
109
+ ], PrismaOAuthSigningKeyRepository);
110
+ //# sourceMappingURL=prisma-oauth-signing-key.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-oauth-signing-key.repository.js","sourceRoot":"","sources":["../lib/prisma-oauth-signing-key.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Logger } from "@nestjs/common";
2
+ import { IClock, IIdGenerator } from "@nathapp/nestjs-common";
3
+ import { ITransactionManager } from "@nathapp/nestjs-data";
4
+ import { type IOAuthSigningKeyRepository, type IOAuthSigningKey, type ISigningKeyProvider, type ActiveSigningKey, type Jwk } from "@nathapp/nestjs-oauth";
5
+ export declare class PrismaSigningKeyProvider implements ISigningKeyProvider {
6
+ protected readonly repo: IOAuthSigningKeyRepository;
7
+ protected readonly txManager: ITransactionManager;
8
+ protected readonly idGenerator: IIdGenerator;
9
+ protected readonly clock: IClock;
10
+ protected readonly logger: Logger;
11
+ constructor(repo: IOAuthSigningKeyRepository, txManager: ITransactionManager, idGenerator: IIdGenerator, clock: IClock);
12
+ getActiveSigningKey(tenantId?: string | null): Promise<ActiveSigningKey>;
13
+ getVerificationKeys(tenantId?: string | null): Promise<Jwk[]>;
14
+ rotate(tenantId?: string | null): Promise<void>;
15
+ protected generateAndPersist(status: "active", tenantId: string | null): Promise<IOAuthSigningKey>;
16
+ protected encryptPrivateKey(pem: string): Promise<string>;
17
+ protected decryptPrivateKey(encrypted: string): Promise<string>;
18
+ protected generateKid(): string;
19
+ private generateInitialActiveKey;
20
+ private rotateOrReuseConcurrentWinner;
21
+ protected toJwk(publicKeyPem: string, kid: string, alg: string): Jwk;
22
+ }
@@ -0,0 +1,133 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var PrismaSigningKeyProvider_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.PrismaSigningKeyProvider = void 0;
17
+ const node_crypto_1 = require("node:crypto");
18
+ const node_util_1 = require("node:util");
19
+ const common_1 = require("@nestjs/common");
20
+ const nestjs_common_1 = require("@nathapp/nestjs-common");
21
+ const nestjs_data_1 = require("@nathapp/nestjs-data");
22
+ const generateKeyPairAsync = (0, node_util_1.promisify)(node_crypto_1.generateKeyPair);
23
+ const nestjs_oauth_1 = require("@nathapp/nestjs-oauth");
24
+ const ALG = "RS256";
25
+ const MODULUS_LENGTH = 2048;
26
+ const RETIRING_GRACE_MS = 1000 * 60 * 60 * 24 * 7;
27
+ let PrismaSigningKeyProvider = PrismaSigningKeyProvider_1 = class PrismaSigningKeyProvider {
28
+ constructor(repo, txManager, idGenerator, clock) {
29
+ this.repo = repo;
30
+ this.txManager = txManager;
31
+ this.idGenerator = idGenerator;
32
+ this.clock = clock;
33
+ this.logger = new common_1.Logger(PrismaSigningKeyProvider_1.name);
34
+ }
35
+ async getActiveSigningKey(tenantId) {
36
+ const actualTenantId = tenantId !== null && tenantId !== void 0 ? tenantId : null;
37
+ const existing = await this.repo.findActive(actualTenantId);
38
+ const key = existing !== null && existing !== void 0 ? existing : (await this.generateInitialActiveKey(actualTenantId));
39
+ const privateKeyPem = await this.decryptPrivateKey(key.privateKeyPem);
40
+ return { kid: key.kid, alg: key.alg, privateKeyPem };
41
+ }
42
+ async getVerificationKeys(tenantId) {
43
+ const actualTenantId = tenantId !== null && tenantId !== void 0 ? tenantId : null;
44
+ const keys = await this.repo.findByStatusIn(["active", "retiring"], actualTenantId);
45
+ return keys.map((k) => this.toJwk(k.publicKeyPem, k.kid, k.alg));
46
+ }
47
+ async rotate(tenantId) {
48
+ const actualTenantId = tenantId !== null && tenantId !== void 0 ? tenantId : null;
49
+ const next = await this.rotateOrReuseConcurrentWinner(actualTenantId);
50
+ this.logger.log(`Signing key rotated. New active kid=${next.kid}`);
51
+ }
52
+ async generateAndPersist(status, tenantId) {
53
+ const { privateKey, publicKey } = await generateKeyPairAsync("rsa", {
54
+ modulusLength: MODULUS_LENGTH,
55
+ publicKeyEncoding: { type: "spki", format: "pem" },
56
+ privateKeyEncoding: { type: "pkcs8", format: "pem" },
57
+ });
58
+ const keyToStore = await this.encryptPrivateKey(privateKey);
59
+ const entity = {
60
+ id: this.idGenerator.generate(),
61
+ kid: this.generateKid(),
62
+ alg: ALG,
63
+ privateKeyPem: keyToStore,
64
+ publicKeyPem: publicKey,
65
+ status,
66
+ createdAt: this.clock.now(),
67
+ tenantId,
68
+ };
69
+ return this.repo.create(entity);
70
+ }
71
+ async encryptPrivateKey(pem) {
72
+ if (process.env.NODE_ENV === 'production' && !process.env.OAUTH_ALLOW_PLAINTEXT_SIGNING_KEYS) {
73
+ throw new Error('Plaintext RSA private key storage is not allowed in production. ' +
74
+ 'Override encryptPrivateKey()/decryptPrivateKey() or set OAUTH_ALLOW_PLAINTEXT_SIGNING_KEYS=true to opt out.');
75
+ }
76
+ return pem;
77
+ }
78
+ async decryptPrivateKey(encrypted) {
79
+ if (encrypted.startsWith('-----BEGIN') &&
80
+ process.env.NODE_ENV === 'production' &&
81
+ !process.env.OAUTH_ALLOW_PLAINTEXT_SIGNING_KEYS) {
82
+ throw new Error('Detected plaintext PEM private key in production database. ' +
83
+ 'Override decryptPrivateKey() with KMS-backed decryption, or set OAUTH_ALLOW_PLAINTEXT_SIGNING_KEYS=true to opt out (insecure).');
84
+ }
85
+ return encrypted;
86
+ }
87
+ generateKid() {
88
+ return (0, node_crypto_1.randomBytes)(16).toString("hex");
89
+ }
90
+ async generateInitialActiveKey(tenantId) {
91
+ try {
92
+ return await this.generateAndPersist("active", tenantId);
93
+ }
94
+ catch (error) {
95
+ const winner = await this.repo.findActive(tenantId);
96
+ if (winner)
97
+ return winner;
98
+ throw error;
99
+ }
100
+ }
101
+ async rotateOrReuseConcurrentWinner(tenantId) {
102
+ return this.txManager.run(async () => {
103
+ const previous = await this.repo.findActive(tenantId);
104
+ if (previous) {
105
+ const expiresAt = new Date(this.clock.now().getTime() + RETIRING_GRACE_MS);
106
+ await this.repo.setStatus(previous.id, "retiring", expiresAt);
107
+ }
108
+ try {
109
+ return await this.generateAndPersist("active", tenantId);
110
+ }
111
+ catch (error) {
112
+ const winner = await this.repo.findActive(tenantId);
113
+ if (winner)
114
+ return winner;
115
+ throw error;
116
+ }
117
+ });
118
+ }
119
+ toJwk(publicKeyPem, kid, alg) {
120
+ const jwk = (0, node_crypto_1.createPublicKey)(publicKeyPem).export({ format: "jwk" });
121
+ return { kty: jwk.kty, use: "sig", alg, kid, n: jwk.n, e: jwk.e };
122
+ }
123
+ };
124
+ exports.PrismaSigningKeyProvider = PrismaSigningKeyProvider;
125
+ exports.PrismaSigningKeyProvider = PrismaSigningKeyProvider = PrismaSigningKeyProvider_1 = __decorate([
126
+ (0, common_1.Injectable)(),
127
+ __param(0, (0, common_1.Inject)(nestjs_oauth_1.OAUTH_SIGNING_KEY_REPOSITORY)),
128
+ __param(1, (0, common_1.Inject)(nestjs_data_1.TRANSACTION_MANAGER)),
129
+ __param(2, (0, common_1.Inject)(nestjs_common_1.ID_GENERATOR)),
130
+ __param(3, (0, common_1.Inject)(nestjs_common_1.CLOCK)),
131
+ __metadata("design:paramtypes", [Function, Object, Object, Object])
132
+ ], PrismaSigningKeyProvider);
133
+ //# sourceMappingURL=prisma-signing-key.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-signing-key.provider.js","sourceRoot":"","sources":["../lib/prisma-signing-key.provider.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@nathapp/nestjs-oauth-prisma",
3
+ "version": "1.0.0",
4
+ "description": "Prisma adapter for @nathapp/nestjs-oauth",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "rimraf dist && tsc -p tsconfig.json",
9
+ "clean": "rimraf dist/ .turbo/",
10
+ "lint": "eslint -c .eslintrc.js --ext .ts .",
11
+ "lint:fix": "eslint -c .eslintrc.js --ext .ts . --fix",
12
+ "test": "jest --config ./test/jest-test.json --forceExit --no-colors --silent",
13
+ "test:json": "jest --config ./test/jest-test.json --json --no-colors --silent",
14
+ "test:verbose": "jest --config ./test/jest-test.json",
15
+ "test:cov": "jest --config ./test/jest-test.json --coverage",
16
+ "type-check": "tsc --noEmit -p tsconfig.json"
17
+ },
18
+ "author": "",
19
+ "license": "ISC",
20
+ "engines": {
21
+ "node": "^20.19.0 || >=22.12.0"
22
+ },
23
+ "directories": {
24
+ "lib": "lib"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "prisma"
29
+ ],
30
+ "peerDependencies": {
31
+ "@nestjs/common": "^11.0.0 || ^12.1.0",
32
+ "@nestjs/core": "^11.0.0 || ^12.1.0",
33
+ "@nathapp/nestjs-prisma": "^3.3.0 || ^4.0.2"
34
+ },
35
+ "dependencies": {
36
+ "@nathapp/nestjs-oauth": "1.0.0",
37
+ "@nathapp/nestjs-data": "^3.3.0 || ^4.0.2",
38
+ "@nathapp/nestjs-common": "^3.3.0 || ^4.0.2"
39
+ },
40
+ "devDependencies": {
41
+ "@nathapp/nestjs-prisma": "^4.0.2",
42
+ "eslint": "^8.57.0",
43
+ "typescript": "^5"
44
+ }
45
+ }
@@ -0,0 +1,8 @@
1
+ -- MySQL equivalent of migration.sql. MySQL has no partial indexes; a functional
2
+ -- unique index (MySQL 8.0.13+) that is NULL for every non-active row allows at most
3
+ -- one active signing key (NULLs never collide).
4
+ -- Preflight: MySQL never enforced this invariant, so existing data may violate it.
5
+ -- If this returns more than 1, retire all but one active key before creating the index:
6
+ -- SELECT COUNT(*) FROM oauth_signing_keys WHERE status = 'active';
7
+ CREATE UNIQUE INDEX oauth_signing_keys_one_active
8
+ ON oauth_signing_keys ((CASE WHEN status = 'active' THEN 1 ELSE NULL END));
@@ -0,0 +1,3 @@
1
+ CREATE UNIQUE INDEX IF NOT EXISTS oauth_signing_keys_one_active
2
+ ON oauth_signing_keys (status)
3
+ WHERE status = 'active';