@ambushsoftworks/nestjs-auth-graphql 0.1.3
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/LICENSE +21 -0
- package/README.md +711 -0
- package/dist/auth.module.d.ts +61 -0
- package/dist/auth.module.d.ts.map +1 -0
- package/dist/auth.module.js +190 -0
- package/dist/auth.module.js.map +1 -0
- package/dist/decorators/current-user.decorator.d.ts +2 -0
- package/dist/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/decorators/current-user.decorator.js +10 -0
- package/dist/decorators/current-user.decorator.js.map +1 -0
- package/dist/dto/account-lock-status.dto.d.ts +5 -0
- package/dist/dto/account-lock-status.dto.d.ts.map +1 -0
- package/dist/dto/account-lock-status.dto.js +32 -0
- package/dist/dto/account-lock-status.dto.js.map +1 -0
- package/dist/dto/auth-response.dto.d.ts +7 -0
- package/dist/dto/auth-response.dto.d.ts.map +1 -0
- package/dist/dto/auth-response.dto.js +33 -0
- package/dist/dto/auth-response.dto.js.map +1 -0
- package/dist/dto/biometric-challenge.dto.d.ts +6 -0
- package/dist/dto/biometric-challenge.dto.d.ts.map +1 -0
- package/dist/dto/biometric-challenge.dto.js +32 -0
- package/dist/dto/biometric-challenge.dto.js.map +1 -0
- package/dist/dto/biometric-credential.dto.d.ts +10 -0
- package/dist/dto/biometric-credential.dto.d.ts.map +1 -0
- package/dist/dto/biometric-credential.dto.js +48 -0
- package/dist/dto/biometric-credential.dto.js.map +1 -0
- package/dist/dto/biometric-login.input.d.ts +5 -0
- package/dist/dto/biometric-login.input.d.ts.map +1 -0
- package/dist/dto/biometric-login.input.js +33 -0
- package/dist/dto/biometric-login.input.js.map +1 -0
- package/dist/dto/biometric-status.dto.d.ts +5 -0
- package/dist/dto/biometric-status.dto.d.ts.map +1 -0
- package/dist/dto/biometric-status.dto.js +28 -0
- package/dist/dto/biometric-status.dto.js.map +1 -0
- package/dist/dto/complete-facebook-signup.input.d.ts +6 -0
- package/dist/dto/complete-facebook-signup.input.d.ts.map +1 -0
- package/dist/dto/complete-facebook-signup.input.js +45 -0
- package/dist/dto/complete-facebook-signup.input.js.map +1 -0
- package/dist/dto/enable-biometric.input.d.ts +5 -0
- package/dist/dto/enable-biometric.input.d.ts.map +1 -0
- package/dist/dto/enable-biometric.input.js +33 -0
- package/dist/dto/enable-biometric.input.js.map +1 -0
- package/dist/dto/enroll-biometric.input.d.ts +6 -0
- package/dist/dto/enroll-biometric.input.d.ts.map +1 -0
- package/dist/dto/enroll-biometric.input.js +41 -0
- package/dist/dto/enroll-biometric.input.js.map +1 -0
- package/dist/dto/jwt-payload.interface.d.ts +5 -0
- package/dist/dto/jwt-payload.interface.d.ts.map +1 -0
- package/dist/dto/jwt-payload.interface.js +3 -0
- package/dist/dto/jwt-payload.interface.js.map +1 -0
- package/dist/dto/link-google-account.input.d.ts +5 -0
- package/dist/dto/link-google-account.input.d.ts.map +1 -0
- package/dist/dto/link-google-account.input.js +38 -0
- package/dist/dto/link-google-account.input.js.map +1 -0
- package/dist/dto/login.input.d.ts +5 -0
- package/dist/dto/login.input.d.ts.map +1 -0
- package/dist/dto/login.input.js +31 -0
- package/dist/dto/login.input.js.map +1 -0
- package/dist/dto/logout-response.dto.d.ts +9 -0
- package/dist/dto/logout-response.dto.d.ts.map +1 -0
- package/dist/dto/logout-response.dto.js +42 -0
- package/dist/dto/logout-response.dto.js.map +1 -0
- package/dist/dto/logout.input.d.ts +4 -0
- package/dist/dto/logout.input.d.ts.map +1 -0
- package/dist/dto/logout.input.js +27 -0
- package/dist/dto/logout.input.js.map +1 -0
- package/dist/dto/phone-verification-response.dto.d.ts +24 -0
- package/dist/dto/phone-verification-response.dto.d.ts.map +1 -0
- package/dist/dto/phone-verification-response.dto.js +98 -0
- package/dist/dto/phone-verification-response.dto.js.map +1 -0
- package/dist/dto/phone-verification-status.dto.d.ts +9 -0
- package/dist/dto/phone-verification-status.dto.d.ts.map +1 -0
- package/dist/dto/phone-verification-status.dto.js +44 -0
- package/dist/dto/phone-verification-status.dto.js.map +1 -0
- package/dist/dto/refresh-token.input.d.ts +4 -0
- package/dist/dto/refresh-token.input.d.ts.map +1 -0
- package/dist/dto/refresh-token.input.js +27 -0
- package/dist/dto/refresh-token.input.js.map +1 -0
- package/dist/dto/remove-biometric-device-response.dto.d.ts +5 -0
- package/dist/dto/remove-biometric-device-response.dto.d.ts.map +1 -0
- package/dist/dto/remove-biometric-device-response.dto.js +28 -0
- package/dist/dto/remove-biometric-device-response.dto.js.map +1 -0
- package/dist/dto/send-phone-verification.input.d.ts +5 -0
- package/dist/dto/send-phone-verification.input.d.ts.map +1 -0
- package/dist/dto/send-phone-verification.input.js +36 -0
- package/dist/dto/send-phone-verification.input.js.map +1 -0
- package/dist/dto/signup.input.d.ts +5 -0
- package/dist/dto/signup.input.d.ts.map +1 -0
- package/dist/dto/signup.input.js +36 -0
- package/dist/dto/signup.input.js.map +1 -0
- package/dist/dto/unlink-social-account-response.dto.d.ts +8 -0
- package/dist/dto/unlink-social-account-response.dto.d.ts.map +1 -0
- package/dist/dto/unlink-social-account-response.dto.js +37 -0
- package/dist/dto/unlink-social-account-response.dto.js.map +1 -0
- package/dist/dto/unlink-social-account.input.d.ts +4 -0
- package/dist/dto/unlink-social-account.input.d.ts.map +1 -0
- package/dist/dto/unlink-social-account.input.js +28 -0
- package/dist/dto/unlink-social-account.input.js.map +1 -0
- package/dist/dto/verify-biometric-signature.input.d.ts +6 -0
- package/dist/dto/verify-biometric-signature.input.d.ts.map +1 -0
- package/dist/dto/verify-biometric-signature.input.js +39 -0
- package/dist/dto/verify-biometric-signature.input.js.map +1 -0
- package/dist/dto/verify-email-response.dto.d.ts +5 -0
- package/dist/dto/verify-email-response.dto.d.ts.map +1 -0
- package/dist/dto/verify-email-response.dto.js +28 -0
- package/dist/dto/verify-email-response.dto.js.map +1 -0
- package/dist/dto/verify-email.input.d.ts +5 -0
- package/dist/dto/verify-email.input.d.ts.map +1 -0
- package/dist/dto/verify-email.input.js +33 -0
- package/dist/dto/verify-email.input.js.map +1 -0
- package/dist/dto/verify-phone.input.d.ts +5 -0
- package/dist/dto/verify-phone.input.d.ts.map +1 -0
- package/dist/dto/verify-phone.input.js +36 -0
- package/dist/dto/verify-phone.input.js.map +1 -0
- package/dist/entities/auth-user.entity.d.ts +23 -0
- package/dist/entities/auth-user.entity.d.ts.map +1 -0
- package/dist/entities/auth-user.entity.js +87 -0
- package/dist/entities/auth-user.entity.js.map +1 -0
- package/dist/exceptions/account-locked.exception.d.ts +5 -0
- package/dist/exceptions/account-locked.exception.d.ts.map +1 -0
- package/dist/exceptions/account-locked.exception.js +18 -0
- package/dist/exceptions/account-locked.exception.js.map +1 -0
- package/dist/exceptions/oauth.exceptions.d.ts +23 -0
- package/dist/exceptions/oauth.exceptions.d.ts.map +1 -0
- package/dist/exceptions/oauth.exceptions.js +84 -0
- package/dist/exceptions/oauth.exceptions.js.map +1 -0
- package/dist/exceptions/verification.exceptions.d.ts +14 -0
- package/dist/exceptions/verification.exceptions.d.ts.map +1 -0
- package/dist/exceptions/verification.exceptions.js +43 -0
- package/dist/exceptions/verification.exceptions.js.map +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +7 -0
- package/dist/guards/jwt-auth.guard.d.ts.map +1 -0
- package/dist/guards/jwt-auth.guard.js +23 -0
- package/dist/guards/jwt-auth.guard.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.d.ts +11 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.js +3 -0
- package/dist/interfaces/auth-lifecycle-hooks.interface.js.map +1 -0
- package/dist/interfaces/auth-logger.interface.d.ts +45 -0
- package/dist/interfaces/auth-logger.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-logger.interface.js +42 -0
- package/dist/interfaces/auth-logger.interface.js.map +1 -0
- package/dist/interfaces/auth-user.interface.d.ts +32 -0
- package/dist/interfaces/auth-user.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-user.interface.js +17 -0
- package/dist/interfaces/auth-user.interface.js.map +1 -0
- package/dist/interfaces/biometric-repository.interface.d.ts +22 -0
- package/dist/interfaces/biometric-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/biometric-repository.interface.js +3 -0
- package/dist/interfaces/biometric-repository.interface.js.map +1 -0
- package/dist/interfaces/brute-force-repository.interface.d.ts +11 -0
- package/dist/interfaces/brute-force-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/brute-force-repository.interface.js +3 -0
- package/dist/interfaces/brute-force-repository.interface.js.map +1 -0
- package/dist/interfaces/email-service.interface.d.ts +10 -0
- package/dist/interfaces/email-service.interface.d.ts.map +1 -0
- package/dist/interfaces/email-service.interface.js +3 -0
- package/dist/interfaces/email-service.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +12 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +28 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/refresh-token-repository.interface.d.ts +18 -0
- package/dist/interfaces/refresh-token-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/refresh-token-repository.interface.js +3 -0
- package/dist/interfaces/refresh-token-repository.interface.js.map +1 -0
- package/dist/interfaces/sms-service.interface.d.ts +8 -0
- package/dist/interfaces/sms-service.interface.d.ts.map +1 -0
- package/dist/interfaces/sms-service.interface.js +3 -0
- package/dist/interfaces/sms-service.interface.js.map +1 -0
- package/dist/interfaces/storage-service.interface.d.ts +5 -0
- package/dist/interfaces/storage-service.interface.d.ts.map +1 -0
- package/dist/interfaces/storage-service.interface.js +3 -0
- package/dist/interfaces/storage-service.interface.js.map +1 -0
- package/dist/interfaces/user-repository.interface.d.ts +42 -0
- package/dist/interfaces/user-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/user-repository.interface.js +3 -0
- package/dist/interfaces/user-repository.interface.js.map +1 -0
- package/dist/interfaces/verification-repository.interface.d.ts +11 -0
- package/dist/interfaces/verification-repository.interface.d.ts.map +1 -0
- package/dist/interfaces/verification-repository.interface.js +3 -0
- package/dist/interfaces/verification-repository.interface.js.map +1 -0
- package/dist/repositories/noop-biometric.repository.d.ts +23 -0
- package/dist/repositories/noop-biometric.repository.d.ts.map +1 -0
- package/dist/repositories/noop-biometric.repository.js +42 -0
- package/dist/repositories/noop-biometric.repository.js.map +1 -0
- package/dist/repositories/noop-brute-force.repository.d.ts +12 -0
- package/dist/repositories/noop-brute-force.repository.d.ts.map +1 -0
- package/dist/repositories/noop-brute-force.repository.js +34 -0
- package/dist/repositories/noop-brute-force.repository.js.map +1 -0
- package/dist/repositories/noop-verification.repository.d.ts +12 -0
- package/dist/repositories/noop-verification.repository.d.ts.map +1 -0
- package/dist/repositories/noop-verification.repository.js +30 -0
- package/dist/repositories/noop-verification.repository.js.map +1 -0
- package/dist/resolvers/auth.resolver.d.ts +66 -0
- package/dist/resolvers/auth.resolver.d.ts.map +1 -0
- package/dist/resolvers/auth.resolver.js +455 -0
- package/dist/resolvers/auth.resolver.js.map +1 -0
- package/dist/resolvers/oauth.controller.d.ts +32 -0
- package/dist/resolvers/oauth.controller.d.ts.map +1 -0
- package/dist/resolvers/oauth.controller.js +216 -0
- package/dist/resolvers/oauth.controller.js.map +1 -0
- package/dist/services/auth.service.d.ts +104 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +720 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/biometric-auth.service.d.ts +26 -0
- package/dist/services/biometric-auth.service.d.ts.map +1 -0
- package/dist/services/biometric-auth.service.js +108 -0
- package/dist/services/biometric-auth.service.js.map +1 -0
- package/dist/services/biometric-verification.service.d.ts +9 -0
- package/dist/services/biometric-verification.service.d.ts.map +1 -0
- package/dist/services/biometric-verification.service.js +78 -0
- package/dist/services/biometric-verification.service.js.map +1 -0
- package/dist/services/brute-force-protection.service.d.ts +23 -0
- package/dist/services/brute-force-protection.service.d.ts.map +1 -0
- package/dist/services/brute-force-protection.service.js +105 -0
- package/dist/services/brute-force-protection.service.js.map +1 -0
- package/dist/services/console-logger.service.d.ts +9 -0
- package/dist/services/console-logger.service.d.ts.map +1 -0
- package/dist/services/console-logger.service.js +46 -0
- package/dist/services/console-logger.service.js.map +1 -0
- package/dist/services/encryption.service.d.ts +14 -0
- package/dist/services/encryption.service.d.ts.map +1 -0
- package/dist/services/encryption.service.js +98 -0
- package/dist/services/encryption.service.js.map +1 -0
- package/dist/services/noop-email.service.d.ts +12 -0
- package/dist/services/noop-email.service.d.ts.map +1 -0
- package/dist/services/noop-email.service.js +42 -0
- package/dist/services/noop-email.service.js.map +1 -0
- package/dist/services/noop-sms.service.d.ts +8 -0
- package/dist/services/noop-sms.service.d.ts.map +1 -0
- package/dist/services/noop-sms.service.js +38 -0
- package/dist/services/noop-sms.service.js.map +1 -0
- package/dist/services/oauth-linking-token.service.d.ts +24 -0
- package/dist/services/oauth-linking-token.service.d.ts.map +1 -0
- package/dist/services/oauth-linking-token.service.js +79 -0
- package/dist/services/oauth-linking-token.service.js.map +1 -0
- package/dist/services/oauth-state.service.d.ts +19 -0
- package/dist/services/oauth-state.service.d.ts.map +1 -0
- package/dist/services/oauth-state.service.js +91 -0
- package/dist/services/oauth-state.service.js.map +1 -0
- package/dist/services/refresh-token.service.d.ts +29 -0
- package/dist/services/refresh-token.service.d.ts.map +1 -0
- package/dist/services/refresh-token.service.js +106 -0
- package/dist/services/refresh-token.service.js.map +1 -0
- package/dist/services/sendgrid-email.service.d.ts +33 -0
- package/dist/services/sendgrid-email.service.d.ts.map +1 -0
- package/dist/services/sendgrid-email.service.js +1002 -0
- package/dist/services/sendgrid-email.service.js.map +1 -0
- package/dist/services/twilio-sms.service.d.ts +13 -0
- package/dist/services/twilio-sms.service.d.ts.map +1 -0
- package/dist/services/twilio-sms.service.js +84 -0
- package/dist/services/twilio-sms.service.js.map +1 -0
- package/dist/services/verification.service.d.ts +27 -0
- package/dist/services/verification.service.d.ts.map +1 -0
- package/dist/services/verification.service.js +179 -0
- package/dist/services/verification.service.js.map +1 -0
- package/dist/strategies/facebook.strategy.d.ts +18 -0
- package/dist/strategies/facebook.strategy.d.ts.map +1 -0
- package/dist/strategies/facebook.strategy.js +96 -0
- package/dist/strategies/facebook.strategy.js.map +1 -0
- package/dist/strategies/google.strategy.d.ts +17 -0
- package/dist/strategies/google.strategy.d.ts.map +1 -0
- package/dist/strategies/google.strategy.js +73 -0
- package/dist/strategies/google.strategy.js.map +1 -0
- package/dist/strategies/jwt.strategy.d.ts +14 -0
- package/dist/strategies/jwt.strategy.d.ts.map +1 -0
- package/dist/strategies/jwt.strategy.js +45 -0
- package/dist/strategies/jwt.strategy.js.map +1 -0
- package/dist/utils/provider-helpers.d.ts +12 -0
- package/dist/utils/provider-helpers.d.ts.map +1 -0
- package/dist/utils/provider-helpers.js +33 -0
- package/dist/utils/provider-helpers.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.service.js","sourceRoot":"","sources":["../../src/services/encryption.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IEmailService } from '../interfaces/email-service.interface';
|
|
2
|
+
export declare class NoOpEmailService implements IEmailService {
|
|
3
|
+
private readonly logger;
|
|
4
|
+
sendVerificationEmail(email: string, code: string, expiresInMinutes: number): Promise<void>;
|
|
5
|
+
sendPasswordResetEmail(email: string, resetToken: string, resetUrl: string): Promise<void>;
|
|
6
|
+
sendAccountLockedEmail(email: string, lockDurationMinutes: number): Promise<void>;
|
|
7
|
+
sendWelcomeEmail(email: string, name?: string): Promise<void>;
|
|
8
|
+
sendAccountLinkedEmail(email: string, provider: 'google' | 'facebook', linkedAt: Date): Promise<void>;
|
|
9
|
+
sendAccountUnlinkedEmail(email: string, provider: 'google' | 'facebook', unlinkedAt: Date): Promise<void>;
|
|
10
|
+
sendPasswordChangedEmail(email: string, changedAt: Date, ipAddress?: string): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=noop-email.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-email.service.d.ts","sourceRoot":"","sources":["../../src/services/noop-email.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAOtE,qBACa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAEtD,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAMV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAMV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAMV,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAC/B,QAAQ,EAAE,IAAI,GACb,OAAO,CAAC,IAAI,CAAC;IAMV,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAC/B,UAAU,EAAE,IAAI,GACf,OAAO,CAAC,IAAI,CAAC;IAMV,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,IAAI,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAKjB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 NoOpEmailService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.NoOpEmailService = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
let NoOpEmailService = NoOpEmailService_1 = class NoOpEmailService {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.logger = new common_1.Logger(NoOpEmailService_1.name);
|
|
15
|
+
}
|
|
16
|
+
async sendVerificationEmail(email, code, expiresInMinutes) {
|
|
17
|
+
this.logger.log(`[NoOp] Would send verification email to ${email} with code ${code}, expires in ${expiresInMinutes} minutes`);
|
|
18
|
+
}
|
|
19
|
+
async sendPasswordResetEmail(email, resetToken, resetUrl) {
|
|
20
|
+
this.logger.log(`[NoOp] Would send password reset email to ${email} with token ${resetToken}, URL: ${resetUrl}`);
|
|
21
|
+
}
|
|
22
|
+
async sendAccountLockedEmail(email, lockDurationMinutes) {
|
|
23
|
+
this.logger.log(`[NoOp] Would send account locked email to ${email}, locked for ${lockDurationMinutes} minutes`);
|
|
24
|
+
}
|
|
25
|
+
async sendWelcomeEmail(email, name) {
|
|
26
|
+
this.logger.log(`[NoOp] Would send welcome email to ${email} for user ${name || 'unknown'}`);
|
|
27
|
+
}
|
|
28
|
+
async sendAccountLinkedEmail(email, provider, linkedAt) {
|
|
29
|
+
this.logger.log(`[NoOp] Would send account linked email to ${email}, provider: ${provider}, linked at: ${linkedAt}`);
|
|
30
|
+
}
|
|
31
|
+
async sendAccountUnlinkedEmail(email, provider, unlinkedAt) {
|
|
32
|
+
this.logger.log(`[NoOp] Would send account unlinked email to ${email}, provider: ${provider}, unlinked at: ${unlinkedAt}`);
|
|
33
|
+
}
|
|
34
|
+
async sendPasswordChangedEmail(email, changedAt, ipAddress) {
|
|
35
|
+
this.logger.log(`[NoOp] Would send password changed email to ${email}, changed at: ${changedAt}, IP: ${ipAddress || 'unknown'}`);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.NoOpEmailService = NoOpEmailService;
|
|
39
|
+
exports.NoOpEmailService = NoOpEmailService = NoOpEmailService_1 = __decorate([
|
|
40
|
+
(0, common_1.Injectable)()
|
|
41
|
+
], NoOpEmailService);
|
|
42
|
+
//# sourceMappingURL=noop-email.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-email.service.js","sourceRoot":"","sources":["../../src/services/noop-email.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoD;AAS7C,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAAtB;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAkE9D,CAAC;IAhEC,KAAK,CAAC,qBAAqB,CACzB,KAAa,EACb,IAAY,EACZ,gBAAwB;QAExB,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,2CAA2C,KAAK,cAAc,IAAI,gBAAgB,gBAAgB,UAAU,CAC7G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,KAAa,EACb,UAAkB,EAClB,QAAgB;QAEhB,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,6CAA6C,KAAK,eAAe,UAAU,UAAU,QAAQ,EAAE,CAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,KAAa,EACb,mBAA2B;QAE3B,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,6CAA6C,KAAK,gBAAgB,mBAAmB,UAAU,CAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAa,EAAE,IAAa;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,sCAAsC,KAAK,aAAa,IAAI,IAAI,SAAS,EAAE,CAC5E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,KAAa,EACb,QAA+B,EAC/B,QAAc;QAEd,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,6CAA6C,KAAK,eAAe,QAAQ,gBAAgB,QAAQ,EAAE,CACpG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,KAAa,EACb,QAA+B,EAC/B,UAAgB;QAEhB,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+CAA+C,KAAK,eAAe,QAAQ,kBAAkB,UAAU,EAAE,CAC1G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,KAAa,EACb,SAAe,EACf,SAAkB;QAElB,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+CAA+C,KAAK,iBAAiB,SAAS,SAAS,SAAS,IAAI,SAAS,EAAE,CAChH,CAAC;IACJ,CAAC;CACF,CAAA;AAnEY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;GACA,gBAAgB,CAmE5B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ISmsService } from '../interfaces/sms-service.interface';
|
|
2
|
+
export declare class NoOpSmsService implements ISmsService {
|
|
3
|
+
private readonly logger;
|
|
4
|
+
sendVerificationSms(phoneNumber: string, code: string, expiresInMinutes: number): Promise<void>;
|
|
5
|
+
normalizePhoneNumber(phoneNumber: string, countryCode?: string): string | null;
|
|
6
|
+
maskPhoneNumber(phoneNumber: string): string;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=noop-sms.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-sms.service.d.ts","sourceRoot":"","sources":["../../src/services/noop-sms.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAOlE,qBACa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAEpD,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAMhB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU9E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAS7C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 NoOpSmsService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.NoOpSmsService = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
let NoOpSmsService = NoOpSmsService_1 = class NoOpSmsService {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.logger = new common_1.Logger(NoOpSmsService_1.name);
|
|
15
|
+
}
|
|
16
|
+
async sendVerificationSms(phoneNumber, code, expiresInMinutes) {
|
|
17
|
+
this.logger.log(`[NoOp] Would send verification SMS to ${phoneNumber} with code ${code}, expires in ${expiresInMinutes} minutes`);
|
|
18
|
+
}
|
|
19
|
+
normalizePhoneNumber(phoneNumber, countryCode) {
|
|
20
|
+
const normalized = phoneNumber.replace(/\D/g, '');
|
|
21
|
+
const result = normalized.length > 0 ? (countryCode ? `+${normalized}` : normalized) : null;
|
|
22
|
+
this.logger.log(`[NoOp] Normalized phone number ${phoneNumber} (${countryCode || 'no country code'}) → ${result}`);
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
maskPhoneNumber(phoneNumber) {
|
|
26
|
+
const normalized = this.normalizePhoneNumber(phoneNumber);
|
|
27
|
+
if (!normalized)
|
|
28
|
+
return '***-***-****';
|
|
29
|
+
const masked = `***-***-${normalized.slice(-4)}`;
|
|
30
|
+
this.logger.log(`[NoOp] Masked phone number ${phoneNumber} → ${masked}`);
|
|
31
|
+
return masked;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.NoOpSmsService = NoOpSmsService;
|
|
35
|
+
exports.NoOpSmsService = NoOpSmsService = NoOpSmsService_1 = __decorate([
|
|
36
|
+
(0, common_1.Injectable)()
|
|
37
|
+
], NoOpSmsService);
|
|
38
|
+
//# sourceMappingURL=noop-sms.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-sms.service.js","sourceRoot":"","sources":["../../src/services/noop-sms.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoD;AAS7C,IAAM,cAAc,sBAApB,MAAM,cAAc;IAApB;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,gBAAc,CAAC,IAAI,CAAC,CAAC;IA+B5D,CAAC;IA7BC,KAAK,CAAC,mBAAmB,CACvB,WAAmB,EACnB,IAAY,EACZ,gBAAwB;QAExB,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,yCAAyC,WAAW,cAAc,IAAI,gBAAgB,gBAAgB,UAAU,CACjH,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,WAAmB,EAAE,WAAoB;QAE5D,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,kCAAkC,WAAW,KAAK,WAAW,IAAI,iBAAiB,OAAO,MAAM,EAAE,CAClG,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU;YAAE,OAAO,cAAc,CAAC;QACvC,MAAM,MAAM,GAAG,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,8BAA8B,WAAW,MAAM,MAAM,EAAE,CACxD,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AAhCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;GACA,cAAc,CAgC1B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { JwtService } from '@nestjs/jwt';
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
|
+
export interface OAuthLinkingTokenPayload {
|
|
4
|
+
googleId: string;
|
|
5
|
+
email: string;
|
|
6
|
+
iat: number;
|
|
7
|
+
exp: number;
|
|
8
|
+
}
|
|
9
|
+
export interface FacebookEmailFallbackTokenPayload {
|
|
10
|
+
facebookId: string;
|
|
11
|
+
purpose: 'facebook_email_fallback';
|
|
12
|
+
iat: number;
|
|
13
|
+
exp: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class OAuthLinkingTokenService {
|
|
16
|
+
private jwtService;
|
|
17
|
+
private configService;
|
|
18
|
+
constructor(jwtService: JwtService, configService: ConfigService);
|
|
19
|
+
generateLinkingToken(googleId: string, email: string): string;
|
|
20
|
+
validateLinkingToken(token: string): OAuthLinkingTokenPayload;
|
|
21
|
+
generateFacebookEmailFallbackToken(facebookId: string): string;
|
|
22
|
+
validateFacebookEmailFallbackToken(token: string): FacebookEmailFallbackTokenPayload;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=oauth-linking-token.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-linking-token.service.d.ts","sourceRoot":"","sources":["../../src/services/oauth-linking-token.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAWD,MAAM,WAAW,iCAAiC;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,yBAAyB,CAAC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAqBD,qBACa,wBAAwB;IAEjC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;gBADb,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa;IAUtC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAoB7D,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB;IA6B7D,kCAAkC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAsB9D,kCAAkC,CAChC,KAAK,EAAE,MAAM,GACZ,iCAAiC;CAuBrC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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.OAuthLinkingTokenService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const jwt_1 = require("@nestjs/jwt");
|
|
15
|
+
const config_1 = require("@nestjs/config");
|
|
16
|
+
let OAuthLinkingTokenService = class OAuthLinkingTokenService {
|
|
17
|
+
constructor(jwtService, configService) {
|
|
18
|
+
this.jwtService = jwtService;
|
|
19
|
+
this.configService = configService;
|
|
20
|
+
}
|
|
21
|
+
generateLinkingToken(googleId, email) {
|
|
22
|
+
const payload = {
|
|
23
|
+
googleId,
|
|
24
|
+
email,
|
|
25
|
+
};
|
|
26
|
+
return this.jwtService.sign(payload, {
|
|
27
|
+
secret: this.configService.get('JWT_SECRET'),
|
|
28
|
+
expiresIn: '5m',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
validateLinkingToken(token) {
|
|
32
|
+
try {
|
|
33
|
+
const payload = this.jwtService.verify(token, {
|
|
34
|
+
secret: this.configService.get('JWT_SECRET'),
|
|
35
|
+
});
|
|
36
|
+
return payload;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.name === 'TokenExpiredError') {
|
|
40
|
+
throw new Error('Linking session expired. Please sign in with Google again.');
|
|
41
|
+
}
|
|
42
|
+
throw new Error('Invalid linking token');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
generateFacebookEmailFallbackToken(facebookId) {
|
|
46
|
+
const payload = {
|
|
47
|
+
facebookId,
|
|
48
|
+
purpose: 'facebook_email_fallback',
|
|
49
|
+
};
|
|
50
|
+
return this.jwtService.sign(payload, {
|
|
51
|
+
secret: this.configService.get('JWT_SECRET'),
|
|
52
|
+
expiresIn: '10m',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
validateFacebookEmailFallbackToken(token) {
|
|
56
|
+
try {
|
|
57
|
+
const payload = this.jwtService.verify(token, {
|
|
58
|
+
secret: this.configService.get('JWT_SECRET'),
|
|
59
|
+
});
|
|
60
|
+
if (payload.purpose !== 'facebook_email_fallback') {
|
|
61
|
+
throw new Error('Invalid token purpose');
|
|
62
|
+
}
|
|
63
|
+
return payload;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error.name === 'TokenExpiredError') {
|
|
67
|
+
throw new Error('Email entry session expired. Please sign in with Facebook again.');
|
|
68
|
+
}
|
|
69
|
+
throw new Error('Invalid email fallback token');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.OAuthLinkingTokenService = OAuthLinkingTokenService;
|
|
74
|
+
exports.OAuthLinkingTokenService = OAuthLinkingTokenService = __decorate([
|
|
75
|
+
(0, common_1.Injectable)(),
|
|
76
|
+
__metadata("design:paramtypes", [jwt_1.JwtService,
|
|
77
|
+
config_1.ConfigService])
|
|
78
|
+
], OAuthLinkingTokenService);
|
|
79
|
+
//# sourceMappingURL=oauth-linking-token.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-linking-token.service.js","sourceRoot":"","sources":["../../src/services/oauth-linking-token.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,qCAAyC;AACzC,2CAA+C;AAiDxC,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,YACU,UAAsB,EACtB,aAA4B;QAD5B,eAAU,GAAV,UAAU,CAAY;QACtB,kBAAa,GAAb,aAAa,CAAe;IACnC,CAAC;IASJ,oBAAoB,CAAC,QAAgB,EAAE,KAAa;QAClD,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,KAAK;SACN,CAAC;QAGF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,CAAC;YACpD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IASD,oBAAoB,CAAC,KAAa;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAA2B,KAAK,EAAE;gBACtE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,CAAC;aACrD,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAaD,kCAAkC,CAAC,UAAkB;QACnD,MAAM,OAAO,GAAG;YACd,UAAU;YACV,OAAO,EAAE,yBAAyB;SACnC,CAAC;QAGF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,CAAC;YACpD,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAWD,kCAAkC,CAChC,KAAa;QAEb,IAAI,CAAC;YACH,MAAM,OAAO,GACX,IAAI,CAAC,UAAU,CAAC,MAAM,CAAoC,KAAK,EAAE;gBAC/D,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,YAAY,CAAC;aACrD,CAAC,CAAC;YAGL,IAAI,OAAO,CAAC,OAAO,KAAK,yBAAyB,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF,CAAA;AA7GY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;qCAGW,gBAAU;QACP,sBAAa;GAH3B,wBAAwB,CA6GpC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { JwtService } from '@nestjs/jwt';
|
|
3
|
+
export interface OAuthStatePayload {
|
|
4
|
+
provider: 'google' | 'facebook' | 'apple';
|
|
5
|
+
redirectUrl: string;
|
|
6
|
+
nonce: string;
|
|
7
|
+
iat: number;
|
|
8
|
+
exp: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class OAuthStateService {
|
|
11
|
+
private configService;
|
|
12
|
+
private jwtService;
|
|
13
|
+
private readonly expirySeconds;
|
|
14
|
+
constructor(configService: ConfigService, jwtService: JwtService);
|
|
15
|
+
generateState(provider: 'google' | 'facebook' | 'apple', redirectUrl: string): string;
|
|
16
|
+
validateState(state: string): OAuthStatePayload;
|
|
17
|
+
private validateRedirectUrl;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=oauth-state.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-state.service.d.ts","sourceRoot":"","sources":["../../src/services/oauth-state.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAyBD,qBACa,iBAAiB;IAI1B,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAJpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAO;gBAG3B,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU;IAUhC,aAAa,CACX,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,EACzC,WAAW,EAAE,MAAM,GAClB,MAAM;IA+BT,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB;IA+C/C,OAAO,CAAC,mBAAmB;CA6B5B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
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.OAuthStateService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const config_1 = require("@nestjs/config");
|
|
15
|
+
const jwt_1 = require("@nestjs/jwt");
|
|
16
|
+
const crypto_1 = require("crypto");
|
|
17
|
+
let OAuthStateService = class OAuthStateService {
|
|
18
|
+
constructor(configService, jwtService) {
|
|
19
|
+
this.configService = configService;
|
|
20
|
+
this.jwtService = jwtService;
|
|
21
|
+
this.expirySeconds = 600;
|
|
22
|
+
}
|
|
23
|
+
generateState(provider, redirectUrl) {
|
|
24
|
+
const nonce = (0, crypto_1.randomBytes)(16).toString('base64url');
|
|
25
|
+
const now = Math.floor(Date.now() / 1000);
|
|
26
|
+
const payload = {
|
|
27
|
+
provider,
|
|
28
|
+
redirectUrl,
|
|
29
|
+
nonce,
|
|
30
|
+
iat: now,
|
|
31
|
+
exp: now + this.expirySeconds,
|
|
32
|
+
};
|
|
33
|
+
const secret = this.configService.getOrThrow('OAUTH_STATE_SECRET');
|
|
34
|
+
const state = this.jwtService.sign(payload, {
|
|
35
|
+
secret,
|
|
36
|
+
expiresIn: this.expirySeconds,
|
|
37
|
+
});
|
|
38
|
+
return state;
|
|
39
|
+
}
|
|
40
|
+
validateState(state) {
|
|
41
|
+
try {
|
|
42
|
+
const secret = this.configService.getOrThrow('OAUTH_STATE_SECRET');
|
|
43
|
+
const payload = this.jwtService.verify(state, {
|
|
44
|
+
secret,
|
|
45
|
+
});
|
|
46
|
+
if (!payload.provider ||
|
|
47
|
+
!payload.redirectUrl ||
|
|
48
|
+
!payload.nonce ||
|
|
49
|
+
!payload.iat ||
|
|
50
|
+
!payload.exp) {
|
|
51
|
+
throw new common_1.UnauthorizedException('Invalid OAuth state: missing fields');
|
|
52
|
+
}
|
|
53
|
+
if (!['google', 'facebook', 'apple'].includes(payload.provider)) {
|
|
54
|
+
throw new common_1.UnauthorizedException('Invalid OAuth state: unknown provider');
|
|
55
|
+
}
|
|
56
|
+
this.validateRedirectUrl(payload.redirectUrl);
|
|
57
|
+
return payload;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error instanceof common_1.UnauthorizedException) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
throw new common_1.UnauthorizedException('Invalid OAuth state parameter');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
validateRedirectUrl(redirectUrl) {
|
|
67
|
+
const whitelistRaw = this.configService.get('OAUTH_REDIRECT_WHITELIST', '');
|
|
68
|
+
const whitelist = whitelistRaw.split(',').map((url) => url.trim());
|
|
69
|
+
const defaultWhitelist = [
|
|
70
|
+
'http://localhost:3000',
|
|
71
|
+
'http://localhost:8080',
|
|
72
|
+
'exp://localhost:8081',
|
|
73
|
+
];
|
|
74
|
+
const allowedUrls = [...whitelist, ...defaultWhitelist];
|
|
75
|
+
const isAllowed = allowedUrls.some((allowed) => {
|
|
76
|
+
if (!allowed)
|
|
77
|
+
return false;
|
|
78
|
+
return redirectUrl.startsWith(allowed);
|
|
79
|
+
});
|
|
80
|
+
if (!isAllowed) {
|
|
81
|
+
throw new common_1.UnauthorizedException('Invalid OAuth state: redirect URL not whitelisted');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.OAuthStateService = OAuthStateService;
|
|
86
|
+
exports.OAuthStateService = OAuthStateService = __decorate([
|
|
87
|
+
(0, common_1.Injectable)(),
|
|
88
|
+
__metadata("design:paramtypes", [config_1.ConfigService,
|
|
89
|
+
jwt_1.JwtService])
|
|
90
|
+
], OAuthStateService);
|
|
91
|
+
//# sourceMappingURL=oauth-state.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-state.service.js","sourceRoot":"","sources":["../../src/services/oauth-state.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmE;AACnE,2CAA+C;AAC/C,qCAAyC;AACzC,mCAAqC;AAsC9B,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAG5B,YACU,aAA4B,EAC5B,UAAsB;QADtB,kBAAa,GAAb,aAAa,CAAe;QAC5B,eAAU,GAAV,UAAU,CAAY;QAJf,kBAAa,GAAG,GAAG,CAAC;IAKlC,CAAC;IASJ,aAAa,CACX,QAAyC,EACzC,WAAmB;QAGnB,MAAM,KAAK,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAGpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAsB;YACjC,QAAQ;YACR,WAAW;YACX,KAAK;YACL,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa;SAC9B,CAAC;QAGF,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAS,oBAAoB,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;YAC1C,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,aAAa;SAC9B,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IASD,aAAa,CAAC,KAAa;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAS,oBAAoB,CAAC,CAAC;YAG3E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAoB,KAAK,EAAE;gBAC/D,MAAM;aACP,CAAC,CAAC;YAGH,IACE,CAAC,OAAO,CAAC,QAAQ;gBACjB,CAAC,OAAO,CAAC,WAAW;gBACpB,CAAC,OAAO,CAAC,KAAK;gBACd,CAAC,OAAO,CAAC,GAAG;gBACZ,CAAC,OAAO,CAAC,GAAG,EACZ,CAAC;gBACD,MAAM,IAAI,8BAAqB,CAAC,qCAAqC,CAAC,CAAC;YACzE,CAAC;YAGD,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,8BAAqB,CAC7B,uCAAuC,CACxC,CAAC;YACJ,CAAC;YAGD,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAE9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,IAAI,KAAK,YAAY,8BAAqB,EAAE,CAAC;gBAC3C,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,8BAAqB,CAAC,+BAA+B,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IASO,mBAAmB,CAAC,WAAmB;QAE7C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACzC,0BAA0B,EAC1B,EAAE,CACH,CAAC;QACF,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAGnE,MAAM,gBAAgB,GAAG;YACvB,uBAAuB;YACvB,uBAAuB;YACvB,sBAAsB;SACvB,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,gBAAgB,CAAC,CAAC;QAGxD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7C,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC3B,OAAO,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,8BAAqB,CAC7B,mDAAmD,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AA7HY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAKc,sBAAa;QAChB,gBAAU;GALrB,iBAAiB,CA6H7B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
interface RefreshCacheEntry {
|
|
3
|
+
accessToken: string;
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
refreshTokenHash: string;
|
|
6
|
+
expiresAt: Date;
|
|
7
|
+
}
|
|
8
|
+
export declare class RefreshTokenService {
|
|
9
|
+
private configService;
|
|
10
|
+
private readonly tokenLength;
|
|
11
|
+
private readonly expiryDays;
|
|
12
|
+
private readonly gracePeriodSeconds;
|
|
13
|
+
private readonly refreshCache;
|
|
14
|
+
constructor(configService: ConfigService);
|
|
15
|
+
generateToken(): {
|
|
16
|
+
token: string;
|
|
17
|
+
hash: string;
|
|
18
|
+
};
|
|
19
|
+
hashToken(token: string): string;
|
|
20
|
+
validateToken(token: string, storedHash: string): boolean;
|
|
21
|
+
isTokenExpired(createdAt: Date): boolean;
|
|
22
|
+
getExpiryDate(): Date;
|
|
23
|
+
cacheRefreshResult(oldTokenHash: string, accessToken: string, refreshToken: string, refreshTokenHash: string): void;
|
|
24
|
+
getCachedRefreshResult(tokenHash: string): RefreshCacheEntry | null;
|
|
25
|
+
invalidateCachedRefresh(tokenHash: string): void;
|
|
26
|
+
private cleanupExpiredCache;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=refresh-token.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.service.d.ts","sourceRoot":"","sources":["../../src/services/refresh-token.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;CACjB;AAyBD,qBACa,mBAAmB;IAQlB,OAAO,CAAC,aAAa;IAPjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAM;IAGzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;gBAEjD,aAAa,EAAE,aAAa;IAShD,aAAa,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAgBhD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAgBhC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAoCzD,cAAc,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO;IAWxC,aAAa,IAAI,IAAI;IAerB,kBAAkB,CAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,GACvB,IAAI;IAkBP,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAsBnE,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQhD,OAAO,CAAC,mBAAmB;CAQ5B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
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.RefreshTokenService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const config_1 = require("@nestjs/config");
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
let RefreshTokenService = class RefreshTokenService {
|
|
17
|
+
constructor(configService) {
|
|
18
|
+
this.configService = configService;
|
|
19
|
+
this.tokenLength = 32;
|
|
20
|
+
this.expiryDays = 30;
|
|
21
|
+
this.gracePeriodSeconds = 10;
|
|
22
|
+
this.refreshCache = new Map();
|
|
23
|
+
setInterval(() => this.cleanupExpiredCache(), 60 * 1000);
|
|
24
|
+
}
|
|
25
|
+
generateToken() {
|
|
26
|
+
const tokenBuffer = (0, crypto_1.randomBytes)(this.tokenLength);
|
|
27
|
+
const token = tokenBuffer.toString('base64url');
|
|
28
|
+
const hash = this.hashToken(token);
|
|
29
|
+
return { token, hash };
|
|
30
|
+
}
|
|
31
|
+
hashToken(token) {
|
|
32
|
+
const secret = this.configService.getOrThrow('REFRESH_TOKEN_SECRET');
|
|
33
|
+
const hmac = (0, crypto_1.createHmac)('sha256', secret);
|
|
34
|
+
hmac.update(token);
|
|
35
|
+
return hmac.digest('hex');
|
|
36
|
+
}
|
|
37
|
+
validateToken(token, storedHash) {
|
|
38
|
+
try {
|
|
39
|
+
const computedHash = this.hashToken(token);
|
|
40
|
+
const computedBuffer = Buffer.from(computedHash, 'hex');
|
|
41
|
+
const storedBuffer = Buffer.from(storedHash, 'hex');
|
|
42
|
+
if (computedBuffer.length !== 32 || storedBuffer.length !== 32) {
|
|
43
|
+
throw new common_1.UnauthorizedException('Invalid token format');
|
|
44
|
+
}
|
|
45
|
+
const isValid = (0, crypto_1.timingSafeEqual)(computedBuffer, storedBuffer);
|
|
46
|
+
if (!isValid) {
|
|
47
|
+
throw new common_1.UnauthorizedException('Invalid refresh token');
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof common_1.UnauthorizedException) {
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
throw new common_1.UnauthorizedException('Invalid refresh token');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
isTokenExpired(createdAt) {
|
|
59
|
+
const now = new Date();
|
|
60
|
+
const expiryMs = this.expiryDays * 24 * 60 * 60 * 1000;
|
|
61
|
+
const tokenAge = now.getTime() - createdAt.getTime();
|
|
62
|
+
return tokenAge > expiryMs;
|
|
63
|
+
}
|
|
64
|
+
getExpiryDate() {
|
|
65
|
+
const now = new Date();
|
|
66
|
+
const expiryMs = this.expiryDays * 24 * 60 * 60 * 1000;
|
|
67
|
+
return new Date(now.getTime() + expiryMs);
|
|
68
|
+
}
|
|
69
|
+
cacheRefreshResult(oldTokenHash, accessToken, refreshToken, refreshTokenHash) {
|
|
70
|
+
const expiresAt = new Date(Date.now() + this.gracePeriodSeconds * 1000);
|
|
71
|
+
this.refreshCache.set(oldTokenHash, {
|
|
72
|
+
accessToken,
|
|
73
|
+
refreshToken,
|
|
74
|
+
refreshTokenHash,
|
|
75
|
+
expiresAt,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
getCachedRefreshResult(tokenHash) {
|
|
79
|
+
const entry = this.refreshCache.get(tokenHash);
|
|
80
|
+
if (!entry) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (new Date() > entry.expiresAt) {
|
|
84
|
+
this.refreshCache.delete(tokenHash);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return entry;
|
|
88
|
+
}
|
|
89
|
+
invalidateCachedRefresh(tokenHash) {
|
|
90
|
+
this.refreshCache.delete(tokenHash);
|
|
91
|
+
}
|
|
92
|
+
cleanupExpiredCache() {
|
|
93
|
+
const now = new Date();
|
|
94
|
+
for (const [key, entry] of this.refreshCache.entries()) {
|
|
95
|
+
if (now > entry.expiresAt) {
|
|
96
|
+
this.refreshCache.delete(key);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
exports.RefreshTokenService = RefreshTokenService;
|
|
102
|
+
exports.RefreshTokenService = RefreshTokenService = __decorate([
|
|
103
|
+
(0, common_1.Injectable)(),
|
|
104
|
+
__metadata("design:paramtypes", [config_1.ConfigService])
|
|
105
|
+
], RefreshTokenService);
|
|
106
|
+
//# sourceMappingURL=refresh-token.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.service.js","sourceRoot":"","sources":["../../src/services/refresh-token.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { IEmailService } from '../interfaces/email-service.interface';
|
|
3
|
+
export declare class EmailService implements IEmailService {
|
|
4
|
+
private configService;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly fromEmail;
|
|
7
|
+
private readonly fromName;
|
|
8
|
+
constructor(configService: ConfigService);
|
|
9
|
+
sendVerificationEmail(email: string, code: string, expiresInMinutes: number): Promise<void>;
|
|
10
|
+
sendPasswordResetEmail(email: string, resetToken: string, resetUrl: string): Promise<void>;
|
|
11
|
+
sendAccountLockedEmail(email: string, lockDurationMinutes: number): Promise<void>;
|
|
12
|
+
sendWelcomeEmail(email: string, name?: string): Promise<void>;
|
|
13
|
+
sendAccountLinkedEmail(email: string, provider: 'google' | 'facebook', linkedAt: Date): Promise<void>;
|
|
14
|
+
sendAccountUnlinkedEmail(email: string, provider: 'google' | 'facebook', unlinkedAt: Date): Promise<void>;
|
|
15
|
+
sendPasswordChangedEmail(email: string, changedAt: Date, ipAddress?: string): Promise<void>;
|
|
16
|
+
private renderVerificationHtmlTemplate;
|
|
17
|
+
private renderPasswordResetHtmlTemplate;
|
|
18
|
+
private renderAccountLockedHtmlTemplate;
|
|
19
|
+
private renderWelcomeHtmlTemplate;
|
|
20
|
+
private renderAccountLinkedHtmlTemplate;
|
|
21
|
+
private renderAccountUnlinkedHtmlTemplate;
|
|
22
|
+
private renderPasswordChangedHtmlTemplate;
|
|
23
|
+
private renderVerificationTextTemplate;
|
|
24
|
+
private renderPasswordResetTextTemplate;
|
|
25
|
+
private renderAccountLockedTextTemplate;
|
|
26
|
+
private renderWelcomeTextTemplate;
|
|
27
|
+
private renderAccountLinkedTextTemplate;
|
|
28
|
+
private renderAccountUnlinkedTextTemplate;
|
|
29
|
+
private renderPasswordChangedTextTemplate;
|
|
30
|
+
private capitalize;
|
|
31
|
+
private formatDate;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sendgrid-email.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendgrid-email.service.d.ts","sourceRoot":"","sources":["../../src/services/sendgrid-email.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAMtE,qBACa,YAAa,YAAW,aAAa;IAKpC,OAAO,CAAC,aAAa;IAJjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEd,aAAa,EAAE,aAAa;IAe1C,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAwBV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAwBV,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwBV,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB7D,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAC/B,QAAQ,EAAE,IAAI,GACb,OAAO,CAAC,IAAI,CAAC;IA4BV,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GAAG,UAAU,EAC/B,UAAU,EAAE,IAAI,GACf,OAAO,CAAC,IAAI,CAAC;IA4BV,wBAAwB,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,IAAI,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA6BhB,OAAO,CAAC,8BAA8B;IA8GtC,OAAO,CAAC,+BAA+B;IAmGvC,OAAO,CAAC,+BAA+B;IAyFvC,OAAO,CAAC,yBAAyB;IAyFjC,OAAO,CAAC,+BAA+B;IAkGvC,OAAO,CAAC,iCAAiC;IAmGzC,OAAO,CAAC,iCAAiC;IA8GzC,OAAO,CAAC,8BAA8B;IAgBtC,OAAO,CAAC,+BAA+B;IAevC,OAAO,CAAC,+BAA+B;IAgBvC,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,+BAA+B;IAsBvC,OAAO,CAAC,iCAAiC;IAsBzC,OAAO,CAAC,iCAAiC;IA0BzC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;CAMnB"}
|