@groundbrick/service-base 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/package.json +56 -58
- package/dist/email/EmailConfigurationService.d.ts +0 -14
- package/dist/email/EmailConfigurationService.d.ts.map +0 -1
- package/dist/email/EmailConfigurationService.js +0 -60
- package/dist/email/EmailConfigurationService.js.map +0 -1
- package/dist/email/EmailService.d.ts +0 -15
- package/dist/email/EmailService.d.ts.map +0 -1
- package/dist/email/EmailService.js +0 -96
- package/dist/email/EmailService.js.map +0 -1
- package/dist/email/interfaces/EmailInterfaces.d.ts +0 -45
- package/dist/email/interfaces/EmailInterfaces.d.ts.map +0 -1
- package/dist/email/interfaces/EmailInterfaces.js +0 -2
- package/dist/email/interfaces/EmailInterfaces.js.map +0 -1
- package/dist/email/providers/SmtpEmailProvider.d.ts +0 -14
- package/dist/email/providers/SmtpEmailProvider.d.ts.map +0 -1
- package/dist/email/providers/SmtpEmailProvider.js +0 -88
- package/dist/email/providers/SmtpEmailProvider.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,9 +6,5 @@ export { Validator } from './validation/Validator.js';
|
|
|
6
6
|
export { ValidationHelper } from './validation/ValidationHelper.js';
|
|
7
7
|
export type { ValidationRule, ValidationRules } from './validation/Validator.js';
|
|
8
8
|
export type { ValidationResult } from './validation/ValidationResult.js';
|
|
9
|
-
export { EmailService, EmailUtils } from './email/EmailService.js';
|
|
10
|
-
export { EmailConfigurationService } from './email/EmailConfigurationService.js';
|
|
11
|
-
export { SmtpEmailProvider } from './email/providers/SmtpEmailProvider.js';
|
|
12
|
-
export type { EmailAddress, EmailContent, EmailAttachment, EmailMessage, EmailConfig, EmailProvider, EmailResult } from './email/interfaces/EmailInterfaces.js';
|
|
13
9
|
export type { ServiceOptions } from './types/ServiceOptions.js';
|
|
14
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMlF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAMzE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMlF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAMzE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,10 +13,4 @@ export { createSuccessResult, createErrorResult } from './types/ServiceResult.js
|
|
|
13
13
|
// ============================================================================
|
|
14
14
|
export { Validator } from './validation/Validator.js';
|
|
15
15
|
export { ValidationHelper } from './validation/ValidationHelper.js';
|
|
16
|
-
// ============================================================================
|
|
17
|
-
// EMAIL SERVICES
|
|
18
|
-
// ============================================================================
|
|
19
|
-
export { EmailService, EmailUtils } from './email/EmailService.js';
|
|
20
|
-
export { EmailConfigurationService } from './email/EmailConfigurationService.js';
|
|
21
|
-
export { SmtpEmailProvider } from './email/providers/SmtpEmailProvider.js';
|
|
22
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElF,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElF,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,60 +1,58 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist/**/*",
|
|
17
|
-
"README.md",
|
|
18
|
-
"LICENSE"
|
|
19
|
-
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"build": "tsc --build",
|
|
22
|
-
"clean": "rm -rf dist *.tsbuildinfo",
|
|
23
|
-
"lint": "eslint src/**/*.ts",
|
|
24
|
-
"lint:fix": "eslint src/**/*.ts --fix"
|
|
25
|
-
},
|
|
26
|
-
"keywords": [
|
|
27
|
-
"typescript",
|
|
28
|
-
"service-layer",
|
|
29
|
-
"business-logic",
|
|
30
|
-
"validation",
|
|
31
|
-
"microframework",
|
|
32
|
-
"error-handling",
|
|
33
|
-
"transactions",
|
|
34
|
-
"email",
|
|
35
|
-
"notifications"
|
|
36
|
-
],
|
|
37
|
-
"author": "Cleiton Marques <cleiton.marques@200.systems>",
|
|
38
|
-
"license": "MIT",
|
|
39
|
-
"repository": {
|
|
40
|
-
"type": "git",
|
|
41
|
-
"url": "git+https://github.com/200Systems/bitbrick-microframework.git",
|
|
42
|
-
"directory": "packages/service-base"
|
|
43
|
-
},
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"@groundbrick/db-core": "workspace:*",
|
|
46
|
-
"@groundbrick/logger": "workspace:*",
|
|
47
|
-
"nodemailer": "^6.10.1"
|
|
48
|
-
},
|
|
49
|
-
"devDependencies": {
|
|
50
|
-
"@types/node": "^20.10.0",
|
|
51
|
-
"@types/nodemailer": "^6.4.14",
|
|
52
|
-
"typescript": "^5.8.3"
|
|
53
|
-
},
|
|
54
|
-
"engines": {
|
|
55
|
-
"node": ">=18.0.0"
|
|
56
|
-
},
|
|
57
|
-
"publishConfig": {
|
|
58
|
-
"access": "public"
|
|
2
|
+
"name": "@groundbrick/service-base",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Service layer base classes with validation, error handling, business logic patterns, and generic email infrastructure",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
59
13
|
}
|
|
60
|
-
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc --build",
|
|
22
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
23
|
+
"lint": "eslint src/**/*.ts",
|
|
24
|
+
"lint:fix": "eslint src/**/*.ts --fix"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"typescript",
|
|
28
|
+
"service-layer",
|
|
29
|
+
"business-logic",
|
|
30
|
+
"validation",
|
|
31
|
+
"microframework",
|
|
32
|
+
"error-handling",
|
|
33
|
+
"transactions",
|
|
34
|
+
"email",
|
|
35
|
+
"notifications"
|
|
36
|
+
],
|
|
37
|
+
"author": "Cleiton Marques <cleiton.marques@200.systems>",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/200Systems/bitbrick-microframework.git",
|
|
42
|
+
"directory": "packages/service-base"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@groundbrick/db-core": "workspace:*",
|
|
46
|
+
"@groundbrick/logger": "workspace:*"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^20.10.0",
|
|
50
|
+
"typescript": "^5.8.3"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18.0.0"
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { EmailService } from './EmailService.js';
|
|
2
|
-
export interface EmailConfigRepository {
|
|
3
|
-
findByKey(key: string): Promise<{
|
|
4
|
-
value: string;
|
|
5
|
-
} | null>;
|
|
6
|
-
}
|
|
7
|
-
export declare class EmailConfigurationService {
|
|
8
|
-
private configRepository;
|
|
9
|
-
private logger;
|
|
10
|
-
constructor(configRepository: EmailConfigRepository);
|
|
11
|
-
createEmailService(): Promise<EmailService>;
|
|
12
|
-
private loadEmailConfig;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=EmailConfigurationService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailConfigurationService.d.ts","sourceRoot":"","sources":["../../src/email/EmailConfigurationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKjD,MAAM,WAAW,qBAAqB;IAClC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC7D;AAED,qBAAa,yBAAyB;IAGtB,OAAO,CAAC,gBAAgB;IAFpC,OAAO,CAAC,MAAM,CAAS;gBAEH,gBAAgB,EAAE,qBAAqB;IAIrD,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;YAmBnC,eAAe;CAqChC"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { EmailService } from './EmailService.js';
|
|
2
|
-
import { SmtpEmailProvider } from './providers/SmtpEmailProvider.js';
|
|
3
|
-
import { createLogger } from '@groundbrick/logger';
|
|
4
|
-
export class EmailConfigurationService {
|
|
5
|
-
configRepository;
|
|
6
|
-
logger;
|
|
7
|
-
constructor(configRepository) {
|
|
8
|
-
this.configRepository = configRepository;
|
|
9
|
-
this.logger = createLogger().child('email-config');
|
|
10
|
-
}
|
|
11
|
-
async createEmailService() {
|
|
12
|
-
try {
|
|
13
|
-
const config = await this.loadEmailConfig();
|
|
14
|
-
const provider = new SmtpEmailProvider();
|
|
15
|
-
const emailService = new EmailService(provider);
|
|
16
|
-
await emailService.initialize(config);
|
|
17
|
-
return emailService;
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
this.logger.warn('Failed to create email service with SMTP provider, using fallback', {
|
|
21
|
-
error: error instanceof Error ? error.message : String(error)
|
|
22
|
-
});
|
|
23
|
-
// Return service without provider (will log emails instead of sending)
|
|
24
|
-
return new EmailService();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async loadEmailConfig() {
|
|
28
|
-
const configs = await Promise.all([
|
|
29
|
-
this.configRepository.findByKey('smtp_host'),
|
|
30
|
-
this.configRepository.findByKey('smtp_port'),
|
|
31
|
-
this.configRepository.findByKey('smtp_secure'),
|
|
32
|
-
this.configRepository.findByKey('smtp_user'),
|
|
33
|
-
this.configRepository.findByKey('smtp_password'),
|
|
34
|
-
this.configRepository.findByKey('email_from_address'),
|
|
35
|
-
this.configRepository.findByKey('email_from_name')
|
|
36
|
-
]);
|
|
37
|
-
const [host, port, secure, user, password, fromAddress, fromName] = configs;
|
|
38
|
-
if (!host?.value || !port?.value || !fromAddress?.value) {
|
|
39
|
-
throw new Error('Missing required email configuration: host, port, or from_address');
|
|
40
|
-
}
|
|
41
|
-
const config = {
|
|
42
|
-
host: host.value,
|
|
43
|
-
port: parseInt(port.value),
|
|
44
|
-
secure: secure?.value === 'true',
|
|
45
|
-
from: {
|
|
46
|
-
address: fromAddress.value,
|
|
47
|
-
name: fromName?.value
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
// Only add auth if both user and password are provided
|
|
51
|
-
if (user?.value && password?.value) {
|
|
52
|
-
config.auth = {
|
|
53
|
-
user: user.value,
|
|
54
|
-
pass: password.value
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
return config;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=EmailConfigurationService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailConfigurationService.js","sourceRoot":"","sources":["../../src/email/EmailConfigurationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAU,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAM3D,MAAM,OAAO,yBAAyB;IAGd;IAFZ,MAAM,CAAS;IAEvB,YAAoB,gBAAuC;QAAvC,qBAAgB,GAAhB,gBAAgB,CAAuB;QACvD,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,kBAAkB;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEhD,MAAM,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,YAAY,CAAC;QAExB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE;gBAClF,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;YAEH,uEAAuE;YACvE,OAAO,IAAI,YAAY,EAAE,CAAC;QAC9B,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,eAAe;QACzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,aAAa,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC;YAChD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,oBAAoB,CAAC;YACrD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,CAAC;SACrD,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC;QAE5E,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,MAAM,GAAgB;YACxB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,MAAM;YAChC,IAAI,EAAE;gBACF,OAAO,EAAE,WAAW,CAAC,KAAK;gBAC1B,IAAI,EAAE,QAAQ,EAAE,KAAK;aACxB;SACJ,CAAC;QAEF,uDAAuD;QACvD,IAAI,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,GAAG;gBACV,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,IAAI,EAAE,QAAQ,CAAC,KAAK;aACvB,CAAC;QACN,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { EmailProvider, EmailMessage, EmailResult, EmailConfig, EmailAddress } from './interfaces/EmailInterfaces.js';
|
|
2
|
-
export declare class EmailService {
|
|
3
|
-
private logger;
|
|
4
|
-
private provider?;
|
|
5
|
-
private isEnabled;
|
|
6
|
-
constructor(provider?: EmailProvider);
|
|
7
|
-
initialize(config: EmailConfig): Promise<void>;
|
|
8
|
-
sendEmail(message: EmailMessage): Promise<EmailResult>;
|
|
9
|
-
isServiceEnabled(): boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare class EmailUtils {
|
|
12
|
-
static createAddress(address: string, name?: string): EmailAddress;
|
|
13
|
-
static createSimpleMessage(to: string | EmailAddress, subject: string, content: string, isHtml?: boolean): EmailMessage;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=EmailService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailService.d.ts","sourceRoot":"","sources":["../../src/email/EmailService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAGtH,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,QAAQ,CAAC,EAAE,aAAa;IAK9B,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9C,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IA4C5D,gBAAgB,IAAI,OAAO;CAG9B;AAGD,qBAAa,UAAU;IACnB,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY;IAIlE,MAAM,CAAC,mBAAmB,CACtB,EAAE,EAAE,MAAM,GAAG,YAAY,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,OAAe,GACxB,YAAY;CAgBlB"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { createLogger } from '@groundbrick/logger';
|
|
2
|
-
import { env } from 'process';
|
|
3
|
-
export class EmailService {
|
|
4
|
-
logger;
|
|
5
|
-
provider;
|
|
6
|
-
isEnabled = false;
|
|
7
|
-
constructor(provider) {
|
|
8
|
-
this.logger = createLogger().child('email-service');
|
|
9
|
-
this.provider = provider;
|
|
10
|
-
}
|
|
11
|
-
async initialize(config) {
|
|
12
|
-
if (!this.provider) {
|
|
13
|
-
this.logger.warn('No email provider configured, emails will be logged only');
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
try {
|
|
17
|
-
await this.provider.initialize(config);
|
|
18
|
-
this.isEnabled = this.provider.isConfigured();
|
|
19
|
-
if (this.isEnabled) {
|
|
20
|
-
this.logger.info('Email service initialized successfully');
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
this.logger.warn('Email service initialized but not properly configured');
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
this.logger.error('Failed to initialize email service', error instanceof Error ? error : new Error(String(error)));
|
|
28
|
-
this.isEnabled = false;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
async sendEmail(message) {
|
|
32
|
-
const endTimer = this.logger.startTimer('send-email');
|
|
33
|
-
try {
|
|
34
|
-
if (!this.isEnabled || !this.provider) {
|
|
35
|
-
this.logger.info('Email sending disabled, logging email instead', {
|
|
36
|
-
to: message.to,
|
|
37
|
-
subject: message.content.subject
|
|
38
|
-
});
|
|
39
|
-
return {
|
|
40
|
-
success: true,
|
|
41
|
-
messageId: 'mock-' + Date.now()
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
const result = await this.provider.sendEmail(message);
|
|
45
|
-
if (result.success) {
|
|
46
|
-
this.logger.info('Email sent successfully', {
|
|
47
|
-
to: message.to,
|
|
48
|
-
subject: message.content.subject,
|
|
49
|
-
messageId: result.messageId
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
this.logger.error('Failed to send email', undefined, {
|
|
54
|
-
to: message.to,
|
|
55
|
-
subject: message.content.subject,
|
|
56
|
-
error: result.error
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
return result;
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
this.logger.error('Email sending error', error instanceof Error ? error : new Error(String(error)));
|
|
63
|
-
return {
|
|
64
|
-
success: false,
|
|
65
|
-
error: error instanceof Error ? error.message : String(error)
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
endTimer();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
isServiceEnabled() {
|
|
73
|
-
return this.isEnabled;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Utility functions for common email operations
|
|
77
|
-
export class EmailUtils {
|
|
78
|
-
static createAddress(address, name) {
|
|
79
|
-
return { address, name };
|
|
80
|
-
}
|
|
81
|
-
static createSimpleMessage(to, subject, content, isHtml = false) {
|
|
82
|
-
if (env.NODE_ENV === 'development') {
|
|
83
|
-
to = 'cleiton.marques@200.systems';
|
|
84
|
-
subject = `[DEV] ${subject}`;
|
|
85
|
-
}
|
|
86
|
-
const toAddress = typeof to === 'string' ? { address: to } : to;
|
|
87
|
-
return {
|
|
88
|
-
to: toAddress,
|
|
89
|
-
content: {
|
|
90
|
-
subject,
|
|
91
|
-
...(isHtml ? { html: content } : { text: content })
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=EmailService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailService.js","sourceRoot":"","sources":["../../src/email/EmailService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export interface EmailAddress {
|
|
2
|
-
address: string;
|
|
3
|
-
name?: string;
|
|
4
|
-
}
|
|
5
|
-
export interface EmailContent {
|
|
6
|
-
subject: string;
|
|
7
|
-
text?: string;
|
|
8
|
-
html?: string;
|
|
9
|
-
attachments?: EmailAttachment[];
|
|
10
|
-
}
|
|
11
|
-
export interface EmailAttachment {
|
|
12
|
-
filename: string;
|
|
13
|
-
content: Buffer | string;
|
|
14
|
-
contentType: string;
|
|
15
|
-
}
|
|
16
|
-
export interface EmailMessage {
|
|
17
|
-
to: EmailAddress | EmailAddress[];
|
|
18
|
-
from?: EmailAddress;
|
|
19
|
-
cc?: EmailAddress[];
|
|
20
|
-
bcc?: EmailAddress[];
|
|
21
|
-
replyTo?: EmailAddress;
|
|
22
|
-
content: EmailContent;
|
|
23
|
-
}
|
|
24
|
-
export type EmailProviderType = 'smtp';
|
|
25
|
-
export interface EmailConfig {
|
|
26
|
-
host: string;
|
|
27
|
-
port: number;
|
|
28
|
-
secure: boolean;
|
|
29
|
-
auth?: {
|
|
30
|
-
user: string;
|
|
31
|
-
pass: string;
|
|
32
|
-
};
|
|
33
|
-
from: EmailAddress;
|
|
34
|
-
}
|
|
35
|
-
export interface EmailProvider {
|
|
36
|
-
initialize(config: EmailConfig): Promise<void>;
|
|
37
|
-
sendEmail(message: EmailMessage): Promise<EmailResult>;
|
|
38
|
-
isConfigured(): boolean;
|
|
39
|
-
}
|
|
40
|
-
export interface EmailResult {
|
|
41
|
-
success: boolean;
|
|
42
|
-
messageId?: string;
|
|
43
|
-
error?: string;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=EmailInterfaces.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailInterfaces.d.ts","sourceRoot":"","sources":["../../../src/email/interfaces/EmailInterfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACvC,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE;QACH,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACvD,YAAY,IAAI,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailInterfaces.js","sourceRoot":"","sources":["../../../src/email/interfaces/EmailInterfaces.ts"],"names":[],"mappings":""}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { EmailProvider, EmailMessage, EmailResult, EmailConfig } from '../interfaces/EmailInterfaces.js';
|
|
2
|
-
export declare class SmtpEmailProvider implements EmailProvider {
|
|
3
|
-
private logger;
|
|
4
|
-
private transporter?;
|
|
5
|
-
private config?;
|
|
6
|
-
private configured;
|
|
7
|
-
constructor();
|
|
8
|
-
initialize(config: EmailConfig): Promise<void>;
|
|
9
|
-
sendEmail(message: EmailMessage): Promise<EmailResult>;
|
|
10
|
-
isConfigured(): boolean;
|
|
11
|
-
private formatAddress;
|
|
12
|
-
private formatAddresses;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=SmtpEmailProvider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SmtpEmailProvider.d.ts","sourceRoot":"","sources":["../../../src/email/providers/SmtpEmailProvider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,kCAAkC,CAAC;AAGvH,qBAAa,iBAAkB,YAAW,aAAa;IACnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,UAAU,CAAkB;;IAM9B,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC9C,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAuC5D,YAAY,IAAI,OAAO;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,eAAe;CAM1B"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
// packages/service-base/src/email/providers/SmtpEmailProvider.ts
|
|
2
|
-
import { createTransport } from 'nodemailer';
|
|
3
|
-
import { createLogger } from '@groundbrick/logger';
|
|
4
|
-
export class SmtpEmailProvider {
|
|
5
|
-
logger;
|
|
6
|
-
transporter;
|
|
7
|
-
config;
|
|
8
|
-
configured = false;
|
|
9
|
-
constructor() {
|
|
10
|
-
this.logger = createLogger().child('smtp-provider');
|
|
11
|
-
}
|
|
12
|
-
async initialize(config) {
|
|
13
|
-
try {
|
|
14
|
-
this.config = config;
|
|
15
|
-
this.transporter = createTransport({
|
|
16
|
-
pool: true,
|
|
17
|
-
host: config.host,
|
|
18
|
-
port: config.port,
|
|
19
|
-
secure: config.secure,
|
|
20
|
-
auth: config.auth ? {
|
|
21
|
-
user: config.auth.user,
|
|
22
|
-
pass: config.auth.pass
|
|
23
|
-
} : undefined
|
|
24
|
-
});
|
|
25
|
-
// Test connection
|
|
26
|
-
await this.transporter.verify();
|
|
27
|
-
this.configured = true;
|
|
28
|
-
this.logger.info('SMTP provider initialized successfully', {
|
|
29
|
-
host: config.host,
|
|
30
|
-
port: config.port,
|
|
31
|
-
secure: config.secure,
|
|
32
|
-
hasAuth: !!config.auth
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
this.logger.error('Failed to initialize SMTP provider', error instanceof Error ? error : new Error(String(error)));
|
|
37
|
-
this.configured = false;
|
|
38
|
-
throw error;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async sendEmail(message) {
|
|
42
|
-
if (!this.transporter || !this.config) {
|
|
43
|
-
return {
|
|
44
|
-
success: false,
|
|
45
|
-
error: 'SMTP provider not initialized'
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
const mailOptions = {
|
|
50
|
-
from: this.formatAddress(message.from || this.config.from),
|
|
51
|
-
to: this.formatAddresses(message.to),
|
|
52
|
-
cc: message.cc ? this.formatAddresses(message.cc) : undefined,
|
|
53
|
-
bcc: message.bcc ? this.formatAddresses(message.bcc) : undefined,
|
|
54
|
-
replyTo: message.replyTo ? this.formatAddress(message.replyTo) : undefined,
|
|
55
|
-
subject: message.content.subject,
|
|
56
|
-
text: message.content.text,
|
|
57
|
-
html: message.content.html,
|
|
58
|
-
attachments: message.content.attachments
|
|
59
|
-
};
|
|
60
|
-
const result = await this.transporter.sendMail(mailOptions);
|
|
61
|
-
return {
|
|
62
|
-
success: true,
|
|
63
|
-
messageId: result.messageId
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
68
|
-
this.logger.error('Failed to send email via SMTP', error instanceof Error ? error : new Error(String(error)));
|
|
69
|
-
return {
|
|
70
|
-
success: false,
|
|
71
|
-
error: errorMessage
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
isConfigured() {
|
|
76
|
-
return this.configured;
|
|
77
|
-
}
|
|
78
|
-
formatAddress(address) {
|
|
79
|
-
return address.name ? `"${address.name}" <${address.address}>` : address.address;
|
|
80
|
-
}
|
|
81
|
-
formatAddresses(addresses) {
|
|
82
|
-
if (Array.isArray(addresses)) {
|
|
83
|
-
return addresses.map(addr => this.formatAddress(addr));
|
|
84
|
-
}
|
|
85
|
-
return this.formatAddress(addresses);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=SmtpEmailProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SmtpEmailProvider.js","sourceRoot":"","sources":["../../../src/email/providers/SmtpEmailProvider.ts"],"names":[],"mappings":"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"}
|