@ofeklabs/horizon-auth 1.0.6 → 1.0.7
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 +67 -0
- package/dist/auth/auth.module.js +2 -0
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +3 -1
- package/dist/auth/auth.service.js +15 -3
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/services/email.service.d.ts +15 -0
- package/dist/auth/services/email.service.js +168 -0
- package/dist/auth/services/email.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -306,6 +306,12 @@ interface HorizonAuthConfig {
|
|
|
306
306
|
};
|
|
307
307
|
|
|
308
308
|
// Optional
|
|
309
|
+
email?: {
|
|
310
|
+
from: string; // Sender email address
|
|
311
|
+
customSender?: (to: string, subject: string, html: string) => Promise<void>;
|
|
312
|
+
provider?: 'resend' | 'sendgrid';
|
|
313
|
+
apiKey?: string; // Required if using provider
|
|
314
|
+
};
|
|
309
315
|
multiTenant?: {
|
|
310
316
|
enabled: boolean;
|
|
311
317
|
tenantIdExtractor?: 'header' | 'subdomain' | 'custom';
|
|
@@ -322,6 +328,67 @@ interface HorizonAuthConfig {
|
|
|
322
328
|
}
|
|
323
329
|
```
|
|
324
330
|
|
|
331
|
+
## Email Configuration
|
|
332
|
+
|
|
333
|
+
The package supports email sending for password resets and email verification. You can use a custom sender function or one of the supported providers.
|
|
334
|
+
|
|
335
|
+
### Provider Setup
|
|
336
|
+
|
|
337
|
+
**Important**: You must install the SDK for your chosen email provider:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# For Resend
|
|
341
|
+
npm install resend
|
|
342
|
+
|
|
343
|
+
# For SendGrid
|
|
344
|
+
npm install @sendgrid/mail
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Using Resend
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
HorizonAuthModule.forRoot({
|
|
351
|
+
// ... other config
|
|
352
|
+
email: {
|
|
353
|
+
from: 'noreply@yourdomain.com',
|
|
354
|
+
provider: 'resend',
|
|
355
|
+
apiKey: process.env.RESEND_API_KEY,
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Using SendGrid
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
HorizonAuthModule.forRoot({
|
|
364
|
+
// ... other config
|
|
365
|
+
email: {
|
|
366
|
+
from: 'noreply@yourdomain.com',
|
|
367
|
+
provider: 'sendgrid',
|
|
368
|
+
apiKey: process.env.SENDGRID_API_KEY,
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Using Custom Sender
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
HorizonAuthModule.forRoot({
|
|
377
|
+
// ... other config
|
|
378
|
+
email: {
|
|
379
|
+
from: 'noreply@yourdomain.com',
|
|
380
|
+
customSender: async (to: string, subject: string, html: string) => {
|
|
381
|
+
// Your custom email sending logic
|
|
382
|
+
await yourEmailService.send({ to, subject, html });
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Development Mode
|
|
389
|
+
|
|
390
|
+
If no email configuration is provided, tokens will be logged to the console for development purposes.
|
|
391
|
+
|
|
325
392
|
## Decorators
|
|
326
393
|
|
|
327
394
|
### @Public()
|
package/dist/auth/auth.module.js
CHANGED
|
@@ -18,6 +18,7 @@ const auth_controller_1 = require("./auth.controller");
|
|
|
18
18
|
const jwks_controller_1 = require("./jwks.controller");
|
|
19
19
|
const password_service_1 = require("./services/password.service");
|
|
20
20
|
const token_service_1 = require("./services/token.service");
|
|
21
|
+
const email_service_1 = require("./services/email.service");
|
|
21
22
|
const jwt_strategy_1 = require("./strategies/jwt.strategy");
|
|
22
23
|
const jwt_sso_strategy_1 = require("./strategies/jwt-sso.strategy");
|
|
23
24
|
const jwt_auth_guard_1 = require("./guards/jwt-auth.guard");
|
|
@@ -82,6 +83,7 @@ let AuthModule = AuthModule_1 = class AuthModule {
|
|
|
82
83
|
auth_service_1.AuthService,
|
|
83
84
|
password_service_1.PasswordService,
|
|
84
85
|
token_service_1.TokenService,
|
|
86
|
+
email_service_1.EmailService,
|
|
85
87
|
jwt_strategy_1.JwtStrategy,
|
|
86
88
|
jwt_auth_guard_1.JwtAuthGuard,
|
|
87
89
|
roles_guard_1.RolesGuard,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,qCAAwC;AACxC,+CAAkD;AAClD,iDAAoD;AACpD,uCAAoD;AACpD,iDAA6C;AAC7C,uDAAmD;AACnD,uDAAmD;AACnD,kEAA8D;AAC9D,4DAAwD;AACxD,4DAAwD;AACxD,oEAA+D;AAC/D,4DAAuD;AACvD,sDAAkD;AAClD,wDAAoD;AACpD,wDAAoD;AAEpD,uEAAkE;AAClE,4DAAwD;AACxD,wEAAmE;AACnE,8DAA0D;AAC1D,0EAAqE;AAI9D,IAAM,UAAU,kBAAhB,MAAM,UAAU;IAIrB,MAAM,CAAC,UAAU;QACf,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE;gBACP,yBAAc;gBACd,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;aACvB;YACD,SAAS,EAAE;gBACT,gBAAS;gBACT,iCAAc;gBACd,6BAAY;gBACZ,wBAAU;aACX;YACD,OAAO,EAAE,CAAC,6BAAY,EAAE,wBAAU,EAAE,gBAAS,CAAC;SAC/C,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,WAAW,CAAC,MAA0B;QAC3C,MAAM,OAAO,GAAU;YACrB,yBAAc;YACd,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtB,2BAAe,CAAC,OAAO,CAAC;gBACtB;oBACE,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,EAAE;iBACV;aACF,CAAC;YACF,0BAAW;YACX,0BAAW;YACX,mCAAe;SAChB,CAAC;QAGF,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;QAElC,IAAI,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,4BAAY,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,mCAAe,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,8BAAa,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,QAAQ,EAAE,WAAW,EAAE,MAAM,IAAI,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,qCAAgB,CAAC,CAAC;QACjC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO;YACP,WAAW,EAAE,CAAC,gCAAc,EAAE,gCAAc,CAAC;YAC7C,SAAS,EAAE;gBACT,gBAAS;gBACT,0BAAW;gBACX,kCAAe;gBACf,4BAAY;gBACZ,0BAAW;gBACX,6BAAY;gBACZ,wBAAU;aACX;YACD,OAAO,EAAE,CAAC,0BAAW,EAAE,6BAAY,EAAE,wBAAU,EAAE,gBAAS,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,qCAAwC;AACxC,+CAAkD;AAClD,iDAAoD;AACpD,uCAAoD;AACpD,iDAA6C;AAC7C,uDAAmD;AACnD,uDAAmD;AACnD,kEAA8D;AAC9D,4DAAwD;AACxD,4DAAwD;AACxD,4DAAwD;AACxD,oEAA+D;AAC/D,4DAAuD;AACvD,sDAAkD;AAClD,wDAAoD;AACpD,wDAAoD;AAEpD,uEAAkE;AAClE,4DAAwD;AACxD,wEAAmE;AACnE,8DAA0D;AAC1D,0EAAqE;AAI9D,IAAM,UAAU,kBAAhB,MAAM,UAAU;IAIrB,MAAM,CAAC,UAAU;QACf,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE;gBACP,yBAAc;gBACd,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;aACvB;YACD,SAAS,EAAE;gBACT,gBAAS;gBACT,iCAAc;gBACd,6BAAY;gBACZ,wBAAU;aACX;YACD,OAAO,EAAE,CAAC,6BAAY,EAAE,wBAAU,EAAE,gBAAS,CAAC;SAC/C,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,WAAW,CAAC,MAA0B;QAC3C,MAAM,OAAO,GAAU;YACrB,yBAAc;YACd,eAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtB,2BAAe,CAAC,OAAO,CAAC;gBACtB;oBACE,GAAG,EAAE,KAAK;oBACV,KAAK,EAAE,EAAE;iBACV;aACF,CAAC;YACF,0BAAW;YACX,0BAAW;YACX,mCAAe;SAChB,CAAC;QAGF,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;QAElC,IAAI,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,4BAAY,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,mCAAe,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,8BAAa,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,QAAQ,EAAE,WAAW,EAAE,MAAM,IAAI,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,qCAAgB,CAAC,CAAC;QACjC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO;YACP,WAAW,EAAE,CAAC,gCAAc,EAAE,gCAAc,CAAC;YAC7C,SAAS,EAAE;gBACT,gBAAS;gBACT,0BAAW;gBACX,kCAAe;gBACf,4BAAY;gBACZ,4BAAY;gBACZ,0BAAW;gBACX,6BAAY;gBACZ,wBAAU;aACX;YACD,OAAO,EAAE,CAAC,0BAAW,EAAE,6BAAY,EAAE,wBAAU,EAAE,gBAAS,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF,CAAA;AA3EY,gCAAU;qBAAV,UAAU;IADtB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,UAAU,CA2EtB"}
|
|
@@ -5,6 +5,7 @@ import { RedisService } from '../redis/redis.service';
|
|
|
5
5
|
import { PrismaClient } from '@prisma/client';
|
|
6
6
|
import { TwoFactorService } from '../two-factor/two-factor.service';
|
|
7
7
|
import { DeviceService } from '../devices/device.service';
|
|
8
|
+
import { EmailService } from './services/email.service';
|
|
8
9
|
export interface AuthResult {
|
|
9
10
|
user: SafeUser;
|
|
10
11
|
accessToken: string;
|
|
@@ -21,8 +22,9 @@ export declare class AuthService {
|
|
|
21
22
|
private readonly redisService;
|
|
22
23
|
private readonly twoFactorService?;
|
|
23
24
|
private readonly deviceService?;
|
|
25
|
+
private readonly emailService?;
|
|
24
26
|
private readonly prisma;
|
|
25
|
-
constructor(usersService: UsersService, passwordService: PasswordService, tokenService: TokenService, redisService: RedisService, prisma: PrismaClient, twoFactorService?: TwoFactorService | undefined, deviceService?: DeviceService | undefined);
|
|
27
|
+
constructor(usersService: UsersService, passwordService: PasswordService, tokenService: TokenService, redisService: RedisService, prisma: PrismaClient, twoFactorService?: TwoFactorService | undefined, deviceService?: DeviceService | undefined, emailService?: EmailService | undefined);
|
|
26
28
|
register(email: string, password: string, fullName?: string, tenantId?: string): Promise<AuthResult>;
|
|
27
29
|
login(email: string, password: string, deviceInfo?: {
|
|
28
30
|
userAgent?: string;
|
|
@@ -21,16 +21,18 @@ const redis_service_1 = require("../redis/redis.service");
|
|
|
21
21
|
const client_1 = require("@prisma/client");
|
|
22
22
|
const two_factor_service_1 = require("../two-factor/two-factor.service");
|
|
23
23
|
const device_service_1 = require("../devices/device.service");
|
|
24
|
+
const email_service_1 = require("./services/email.service");
|
|
24
25
|
const exceptions_1 = require("../common/exceptions");
|
|
25
26
|
const constants_1 = require("../common/constants");
|
|
26
27
|
let AuthService = class AuthService {
|
|
27
|
-
constructor(usersService, passwordService, tokenService, redisService, prisma, twoFactorService, deviceService) {
|
|
28
|
+
constructor(usersService, passwordService, tokenService, redisService, prisma, twoFactorService, deviceService, emailService) {
|
|
28
29
|
this.usersService = usersService;
|
|
29
30
|
this.passwordService = passwordService;
|
|
30
31
|
this.tokenService = tokenService;
|
|
31
32
|
this.redisService = redisService;
|
|
32
33
|
this.twoFactorService = twoFactorService;
|
|
33
34
|
this.deviceService = deviceService;
|
|
35
|
+
this.emailService = emailService;
|
|
34
36
|
this.prisma = prisma;
|
|
35
37
|
console.log('🔍 AuthService constructor - prisma type:', prisma?.constructor?.name);
|
|
36
38
|
console.log('🔍 AuthService constructor - prisma defined:', !!prisma);
|
|
@@ -47,6 +49,9 @@ let AuthService = class AuthService {
|
|
|
47
49
|
if (fullName) {
|
|
48
50
|
await this.usersService.update(user.id, { fullName });
|
|
49
51
|
}
|
|
52
|
+
if (this.emailService && user.emailVerifyToken) {
|
|
53
|
+
await this.emailService.sendEmailVerificationEmail(email, user.emailVerifyToken);
|
|
54
|
+
}
|
|
50
55
|
const accessToken = this.tokenService.generateAccessToken({
|
|
51
56
|
sub: user.id,
|
|
52
57
|
email: user.email,
|
|
@@ -247,7 +252,12 @@ let AuthService = class AuthService {
|
|
|
247
252
|
}
|
|
248
253
|
async requestPasswordReset(email) {
|
|
249
254
|
const resetToken = await this.usersService.generateResetToken(email);
|
|
250
|
-
|
|
255
|
+
if (this.emailService) {
|
|
256
|
+
await this.emailService.sendPasswordResetEmail(email, resetToken);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
console.log(`Password reset token for ${email}: ${resetToken}`);
|
|
260
|
+
}
|
|
251
261
|
}
|
|
252
262
|
async resetPassword(token, newPassword) {
|
|
253
263
|
if (newPassword.length < 8) {
|
|
@@ -267,12 +277,14 @@ exports.AuthService = AuthService = __decorate([
|
|
|
267
277
|
__param(4, (0, common_1.Inject)(constants_1.PRISMA_CLIENT_TOKEN)),
|
|
268
278
|
__param(5, (0, common_1.Optional)()),
|
|
269
279
|
__param(6, (0, common_1.Optional)()),
|
|
280
|
+
__param(7, (0, common_1.Optional)()),
|
|
270
281
|
__metadata("design:paramtypes", [users_service_1.UsersService,
|
|
271
282
|
password_service_1.PasswordService,
|
|
272
283
|
token_service_1.TokenService,
|
|
273
284
|
redis_service_1.RedisService,
|
|
274
285
|
client_1.PrismaClient,
|
|
275
286
|
two_factor_service_1.TwoFactorService,
|
|
276
|
-
device_service_1.DeviceService
|
|
287
|
+
device_service_1.DeviceService,
|
|
288
|
+
email_service_1.EmailService])
|
|
277
289
|
], AuthService);
|
|
278
290
|
//# sourceMappingURL=auth.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA0G;AAC1G,0DAAgE;AAChE,kEAA8D;AAC9D,4DAAwD;AACxD,0DAAsD;AACtD,2CAA8C;AAC9C,yEAAoE;AACpE,8DAA0D;AAC1D,qDAAmE;AACnE,mDAA0D;AAcnD,IAAM,WAAW,GAAjB,MAAM,WAAW;IAGtB,YACmB,YAA0B,EAC1B,eAAgC,EAChC,YAA0B,EAC1B,YAA0B,EACd,MAAoB,EACpB,gBAAmC,EACnC,aAA6B;
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { HorizonAuthConfig } from '../../lib/horizon-auth-config.interface';
|
|
2
|
+
export declare class EmailService {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly emailConfig?;
|
|
6
|
+
constructor(config: HorizonAuthConfig);
|
|
7
|
+
sendPasswordResetEmail(email: string, resetToken: string): Promise<void>;
|
|
8
|
+
sendEmailVerificationEmail(email: string, verificationToken: string): Promise<void>;
|
|
9
|
+
private sendEmail;
|
|
10
|
+
private sendWithResend;
|
|
11
|
+
private sendWithSendGrid;
|
|
12
|
+
private getBaseUrl;
|
|
13
|
+
private generatePasswordResetEmailHtml;
|
|
14
|
+
private generateEmailVerificationHtml;
|
|
15
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
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 EmailService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.EmailService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
let EmailService = EmailService_1 = class EmailService {
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.logger = new common_1.Logger(EmailService_1.name);
|
|
22
|
+
this.emailConfig = config.email;
|
|
23
|
+
}
|
|
24
|
+
async sendPasswordResetEmail(email, resetToken) {
|
|
25
|
+
if (!this.emailConfig) {
|
|
26
|
+
console.log(`Password reset token for ${email}: ${resetToken}`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const resetLink = `${this.getBaseUrl()}/reset-password?token=${resetToken}`;
|
|
30
|
+
const subject = 'Password Reset Request';
|
|
31
|
+
const html = this.generatePasswordResetEmailHtml(resetLink);
|
|
32
|
+
await this.sendEmail(email, subject, html);
|
|
33
|
+
}
|
|
34
|
+
async sendEmailVerificationEmail(email, verificationToken) {
|
|
35
|
+
if (!this.emailConfig) {
|
|
36
|
+
console.log(`Email verification token for ${email}: ${verificationToken}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const verificationLink = `${this.getBaseUrl()}/verify-email?token=${verificationToken}`;
|
|
40
|
+
const subject = 'Verify Your Email Address';
|
|
41
|
+
const html = this.generateEmailVerificationHtml(verificationLink);
|
|
42
|
+
await this.sendEmail(email, subject, html);
|
|
43
|
+
}
|
|
44
|
+
async sendEmail(to, subject, html) {
|
|
45
|
+
if (!this.emailConfig) {
|
|
46
|
+
throw new Error('Email configuration is not provided');
|
|
47
|
+
}
|
|
48
|
+
if (this.emailConfig.customSender) {
|
|
49
|
+
await this.emailConfig.customSender(to, subject, html);
|
|
50
|
+
this.logger.log(`Email sent to ${to} using custom sender`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (this.emailConfig.provider === 'resend') {
|
|
54
|
+
await this.sendWithResend(to, subject, html);
|
|
55
|
+
}
|
|
56
|
+
else if (this.emailConfig.provider === 'sendgrid') {
|
|
57
|
+
await this.sendWithSendGrid(to, subject, html);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error(`Unsupported email provider: ${this.emailConfig.provider}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async sendWithResend(to, subject, html) {
|
|
64
|
+
if (!this.emailConfig?.apiKey) {
|
|
65
|
+
throw new Error('Resend API key is not configured');
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const resendModule = await Function('return import("resend")')().catch(() => {
|
|
69
|
+
throw new Error('Resend package is not installed. Install it with: npm install resend');
|
|
70
|
+
});
|
|
71
|
+
const Resend = resendModule.Resend;
|
|
72
|
+
const resend = new Resend(this.emailConfig.apiKey);
|
|
73
|
+
await resend.emails.send({
|
|
74
|
+
from: this.emailConfig.from,
|
|
75
|
+
to,
|
|
76
|
+
subject,
|
|
77
|
+
html,
|
|
78
|
+
});
|
|
79
|
+
this.logger.log(`Email sent to ${to} using Resend`);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
this.logger.error(`Failed to send email via Resend: ${error.message}`);
|
|
83
|
+
throw new Error(`Failed to send email: ${error.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async sendWithSendGrid(to, subject, html) {
|
|
87
|
+
if (!this.emailConfig?.apiKey) {
|
|
88
|
+
throw new Error('SendGrid API key is not configured');
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const sgMailModule = await Function('return import("@sendgrid/mail")')().catch(() => {
|
|
92
|
+
throw new Error('SendGrid package is not installed. Install it with: npm install @sendgrid/mail');
|
|
93
|
+
});
|
|
94
|
+
const sgMail = sgMailModule.default;
|
|
95
|
+
sgMail.setApiKey(this.emailConfig.apiKey);
|
|
96
|
+
await sgMail.send({
|
|
97
|
+
from: this.emailConfig.from,
|
|
98
|
+
to,
|
|
99
|
+
subject,
|
|
100
|
+
html,
|
|
101
|
+
});
|
|
102
|
+
this.logger.log(`Email sent to ${to} using SendGrid`);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.logger.error(`Failed to send email via SendGrid: ${error.message}`);
|
|
106
|
+
throw new Error(`Failed to send email: ${error.message}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
getBaseUrl() {
|
|
110
|
+
return process.env.APP_URL || 'http://localhost:3000';
|
|
111
|
+
}
|
|
112
|
+
generatePasswordResetEmailHtml(resetLink) {
|
|
113
|
+
return `
|
|
114
|
+
<!DOCTYPE html>
|
|
115
|
+
<html>
|
|
116
|
+
<head>
|
|
117
|
+
<meta charset="utf-8">
|
|
118
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
119
|
+
<title>Password Reset Request</title>
|
|
120
|
+
</head>
|
|
121
|
+
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
|
|
122
|
+
<div style="background-color: #f4f4f4; padding: 20px; border-radius: 5px;">
|
|
123
|
+
<h2 style="color: #333; margin-top: 0;">Password Reset Request</h2>
|
|
124
|
+
<p>You requested to reset your password. Click the button below to reset it:</p>
|
|
125
|
+
<div style="text-align: center; margin: 30px 0;">
|
|
126
|
+
<a href="${resetLink}" style="background-color: #007bff; color: white; padding: 12px 30px; text-decoration: none; border-radius: 5px; display: inline-block;">Reset Password</a>
|
|
127
|
+
</div>
|
|
128
|
+
<p>Or copy and paste this link into your browser:</p>
|
|
129
|
+
<p style="word-break: break-all; color: #007bff;">${resetLink}</p>
|
|
130
|
+
<p style="color: #666; font-size: 14px; margin-top: 30px;">This link will expire in 1 hour.</p>
|
|
131
|
+
<p style="color: #666; font-size: 14px;">If you didn't request this password reset, please ignore this email.</p>
|
|
132
|
+
</div>
|
|
133
|
+
</body>
|
|
134
|
+
</html>
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
generateEmailVerificationHtml(verificationLink) {
|
|
138
|
+
return `
|
|
139
|
+
<!DOCTYPE html>
|
|
140
|
+
<html>
|
|
141
|
+
<head>
|
|
142
|
+
<meta charset="utf-8">
|
|
143
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
144
|
+
<title>Verify Your Email Address</title>
|
|
145
|
+
</head>
|
|
146
|
+
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
|
|
147
|
+
<div style="background-color: #f4f4f4; padding: 20px; border-radius: 5px;">
|
|
148
|
+
<h2 style="color: #333; margin-top: 0;">Verify Your Email Address</h2>
|
|
149
|
+
<p>Thank you for registering! Please verify your email address by clicking the button below:</p>
|
|
150
|
+
<div style="text-align: center; margin: 30px 0;">
|
|
151
|
+
<a href="${verificationLink}" style="background-color: #28a745; color: white; padding: 12px 30px; text-decoration: none; border-radius: 5px; display: inline-block;">Verify Email</a>
|
|
152
|
+
</div>
|
|
153
|
+
<p>Or copy and paste this link into your browser:</p>
|
|
154
|
+
<p style="word-break: break-all; color: #28a745;">${verificationLink}</p>
|
|
155
|
+
<p style="color: #666; font-size: 14px; margin-top: 30px;">If you didn't create an account, please ignore this email.</p>
|
|
156
|
+
</div>
|
|
157
|
+
</body>
|
|
158
|
+
</html>
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
exports.EmailService = EmailService;
|
|
163
|
+
exports.EmailService = EmailService = EmailService_1 = __decorate([
|
|
164
|
+
(0, common_1.Injectable)(),
|
|
165
|
+
__param(0, (0, common_1.Inject)('HORIZON_AUTH_CONFIG')),
|
|
166
|
+
__metadata("design:paramtypes", [Object])
|
|
167
|
+
], EmailService);
|
|
168
|
+
//# sourceMappingURL=email.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../src/auth/services/email.service.ts"],"names":[],"mappings":"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"}
|