@betterinternship/core 2.3.1 → 2.3.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/dist/lib/broker/tasks/base.task.d.ts +22 -0
- package/dist/lib/broker/tasks/base.task.js +34 -0
- package/dist/lib/broker/tasks/base.task.js.map +1 -0
- package/dist/lib/broker/tasks/email..task.d.ts +15 -0
- package/dist/lib/broker/tasks/email..task.js +4 -0
- package/dist/lib/broker/tasks/email..task.js.map +1 -0
- package/dist/lib/broker/tasks/index.d.ts +1 -0
- package/dist/lib/broker/tasks/index.js +2 -0
- package/dist/lib/broker/tasks/index.js.map +1 -0
- package/dist/lib/broker/tasks/sign.task.d.ts +35 -0
- package/dist/lib/broker/tasks/sign.task.js +4 -0
- package/dist/lib/broker/tasks/sign.task.js.map +1 -0
- package/dist/lib/chat/pb.js +15 -15
- package/dist/lib/email/email.js +90 -66
- package/dist/lib/email/email.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class BaseTaskInitiator<Request, Response> {
|
|
2
|
+
private requestQueueId;
|
|
3
|
+
private responseQueueId;
|
|
4
|
+
constructor(queueId: string);
|
|
5
|
+
sendRequest(content: Request): Promise<boolean>;
|
|
6
|
+
readResponse(): Promise<{
|
|
7
|
+
content: Response | null;
|
|
8
|
+
resolve: () => void;
|
|
9
|
+
reject: () => void;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export declare class BaseTaskHandler<Request, Response> {
|
|
13
|
+
private requestQueueId;
|
|
14
|
+
private responseQueueId;
|
|
15
|
+
constructor(queueId: string);
|
|
16
|
+
readRequest(): Promise<{
|
|
17
|
+
content: Request | null;
|
|
18
|
+
resolve: () => void;
|
|
19
|
+
reject: () => void;
|
|
20
|
+
}>;
|
|
21
|
+
sendResponse(content: Response): Promise<boolean>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BrokerAPI } from '../broker.js';
|
|
2
|
+
export class BaseTaskInitiator {
|
|
3
|
+
requestQueueId;
|
|
4
|
+
responseQueueId;
|
|
5
|
+
constructor(queueId) {
|
|
6
|
+
this.requestQueueId = `request.${queueId}`;
|
|
7
|
+
this.responseQueueId = `response.${queueId}`;
|
|
8
|
+
}
|
|
9
|
+
async sendRequest(content) {
|
|
10
|
+
const brokerAPI = await BrokerAPI.instance();
|
|
11
|
+
return brokerAPI.sendToQueue(this.requestQueueId, content);
|
|
12
|
+
}
|
|
13
|
+
async readResponse() {
|
|
14
|
+
const brokerAPI = await BrokerAPI.instance();
|
|
15
|
+
return await brokerAPI.readFromQueue(this.responseQueueId);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class BaseTaskHandler {
|
|
19
|
+
requestQueueId;
|
|
20
|
+
responseQueueId;
|
|
21
|
+
constructor(queueId) {
|
|
22
|
+
this.requestQueueId = `request.${queueId}`;
|
|
23
|
+
this.responseQueueId = `response.${queueId}`;
|
|
24
|
+
}
|
|
25
|
+
async readRequest() {
|
|
26
|
+
const brokerAPI = await BrokerAPI.instance();
|
|
27
|
+
return brokerAPI.readFromQueue(this.requestQueueId);
|
|
28
|
+
}
|
|
29
|
+
async sendResponse(content) {
|
|
30
|
+
const brokerAPI = await BrokerAPI.instance();
|
|
31
|
+
return brokerAPI.sendToQueue(this.responseQueueId, content);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=base.task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.task.js","sourceRoot":"","sources":["../../../../lib/broker/tasks/base.task.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,MAAM,OAAO,iBAAiB;IACpB,cAAc,CAAS;IACvB,eAAe,CAAS;IAEhC,YAAY,OAAe;QACzB,IAAI,CAAC,cAAc,GAAG,WAAW,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,YAAY,OAAO,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAgB;QAChC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY;QAKhB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,MAAM,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7D,CAAC;CACF;AAMD,MAAM,OAAO,eAAe;IAClB,cAAc,CAAS;IACvB,eAAe,CAAS;IAEhC,YAAY,OAAe;QACzB,IAAI,CAAC,cAAc,GAAG,WAAW,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,YAAY,OAAO,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW;QAKf,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAiB;QAClC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseTaskInitiator, BaseTaskHandler } from './base.task.js';
|
|
2
|
+
export interface EmailTaskRequest {
|
|
3
|
+
sender?: string;
|
|
4
|
+
subject: string;
|
|
5
|
+
recipient: string;
|
|
6
|
+
content: string;
|
|
7
|
+
alias?: 'otp' | 'applications' | 'sign' | 'hello';
|
|
8
|
+
}
|
|
9
|
+
export interface EmailTaskResponse {
|
|
10
|
+
id: string;
|
|
11
|
+
recipient: string;
|
|
12
|
+
alias?: 'otp' | 'applications' | 'sign' | 'hello';
|
|
13
|
+
}
|
|
14
|
+
export declare const EmailTaskInitiator: BaseTaskInitiator<EmailTaskRequest, EmailTaskResponse>;
|
|
15
|
+
export declare const EmailTaskHandler: BaseTaskHandler<EmailTaskRequest, EmailTaskResponse>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email..task.js","sourceRoot":"","sources":["../../../../lib/broker/tasks/email..task.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAgBpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,CAGrD,eAAe,CAAC,CAAC;AAEnB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,eAAe,CAGjD,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/broker/tasks/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BaseTaskHandler, BaseTaskInitiator } from './base.task.js';
|
|
2
|
+
export interface SignTaskRequest {
|
|
3
|
+
populatedSchema: FilledFormSchema;
|
|
4
|
+
template: string;
|
|
5
|
+
excludeVerificationCode?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SignTaskResponse {
|
|
8
|
+
buffer: Buffer<ArrayBuffer>;
|
|
9
|
+
inputs: object;
|
|
10
|
+
templateId: string;
|
|
11
|
+
templateHash: string;
|
|
12
|
+
formSchema: object;
|
|
13
|
+
formSchemaHash: string;
|
|
14
|
+
inputHash: string;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const SignTaskInitiator: BaseTaskInitiator<SignTaskRequest, SignTaskResponse>;
|
|
18
|
+
export declare const SignTaskHandler: BaseTaskHandler<SignTaskRequest, SignTaskResponse>;
|
|
19
|
+
type FilledFormSchema = FilledFormSchemaField[];
|
|
20
|
+
interface EmptyFormSchemaField {
|
|
21
|
+
field: string;
|
|
22
|
+
value?: string;
|
|
23
|
+
type: string;
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
w: number;
|
|
27
|
+
h: number;
|
|
28
|
+
page: number;
|
|
29
|
+
align_h?: 'center' | 'left' | 'right';
|
|
30
|
+
align_v?: 'middle' | 'top' | 'bottom';
|
|
31
|
+
}
|
|
32
|
+
interface FilledFormSchemaField extends EmptyFormSchemaField {
|
|
33
|
+
value: string;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.task.js","sourceRoot":"","sources":["../../../../lib/broker/tasks/sign.task.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAmBpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAGpD,cAAc,CAAC,CAAC;AAElB,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,CAGhD,cAAc,CAAC,CAAC"}
|
package/dist/lib/chat/pb.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import PocketBase from 'pocketbase';
|
|
2
|
-
import { ENV } from '../env.js';
|
|
3
|
-
let _pb = {};
|
|
4
|
-
if (!ENV.BICORE_IGNORE_POCKETBASE) {
|
|
5
|
-
_pb = new PocketBase(ENV.PB_URL);
|
|
6
|
-
_pb.autoCancellation(false);
|
|
7
|
-
}
|
|
8
|
-
export const pb = _pb;
|
|
9
|
-
export const authenticatePocketbase = async () => {
|
|
10
|
-
await _pb
|
|
11
|
-
.collection('_superusers')
|
|
12
|
-
.authWithPassword(ENV.PB_ADMIN_EMAIL, ENV.PB_ADMIN_PASSWORD, { autoRefreshThreshold: 30 * 60 });
|
|
13
|
-
};
|
|
14
|
-
if (!ENV.BICORE_IGNORE_POCKETBASE)
|
|
15
|
-
authenticatePocketbase();
|
|
1
|
+
import PocketBase from 'pocketbase';
|
|
2
|
+
import { ENV } from '../env.js';
|
|
3
|
+
let _pb = {};
|
|
4
|
+
if (!ENV.BICORE_IGNORE_POCKETBASE) {
|
|
5
|
+
_pb = new PocketBase(ENV.PB_URL);
|
|
6
|
+
_pb.autoCancellation(false);
|
|
7
|
+
}
|
|
8
|
+
export const pb = _pb;
|
|
9
|
+
export const authenticatePocketbase = async () => {
|
|
10
|
+
await _pb
|
|
11
|
+
.collection('_superusers')
|
|
12
|
+
.authWithPassword(ENV.PB_ADMIN_EMAIL, ENV.PB_ADMIN_PASSWORD, { autoRefreshThreshold: 30 * 60 });
|
|
13
|
+
};
|
|
14
|
+
if (!ENV.BICORE_IGNORE_POCKETBASE)
|
|
15
|
+
authenticatePocketbase();
|
|
16
16
|
//# sourceMappingURL=pb.js.map
|
package/dist/lib/email/email.js
CHANGED
|
@@ -1,67 +1,91 @@
|
|
|
1
|
-
import { TransactionalEmailsApi } from '@getbrevo/brevo';
|
|
2
|
-
import * as nodemailer from 'nodemailer';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
transacApi
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
1
|
+
import { TransactionalEmailsApi } from '@getbrevo/brevo';
|
|
2
|
+
import * as nodemailer from 'nodemailer';
|
|
3
|
+
import { ENV } from '../env.js';
|
|
4
|
+
const SMTP_EMAIL = ENV.SMTP_EMAIL;
|
|
5
|
+
const SMTP_PASSWORD = ENV.SMTP_PASSWORD;
|
|
6
|
+
if (!SMTP_EMAIL || !SMTP_PASSWORD)
|
|
7
|
+
throw Error('[ERROR:ENV]: Missing SMTP setup.');
|
|
8
|
+
let transacApi = null;
|
|
9
|
+
if (process.env.NODE_ENV !== 'development') {
|
|
10
|
+
const BREVO_API_KEY = process.env.BREVO_API_KEY;
|
|
11
|
+
if (!BREVO_API_KEY)
|
|
12
|
+
throw Error('[ERROR:ENV]: Missing Brevo setup.');
|
|
13
|
+
transacApi = new TransactionalEmailsApi();
|
|
14
|
+
transacApi.setApiKey(0, BREVO_API_KEY);
|
|
15
|
+
}
|
|
16
|
+
const transporterConfig = {
|
|
17
|
+
service: 'Gmail',
|
|
18
|
+
host: 'smtp.gmail.com',
|
|
19
|
+
port: 465,
|
|
20
|
+
secure: true,
|
|
21
|
+
};
|
|
22
|
+
const transporters = {
|
|
23
|
+
hello: nodemailer.createTransport({
|
|
24
|
+
...transporterConfig,
|
|
25
|
+
auth: {
|
|
26
|
+
user: 'hello@betterinternship.com',
|
|
27
|
+
pass: SMTP_PASSWORD,
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
otp: nodemailer.createTransport({
|
|
31
|
+
...transporterConfig,
|
|
32
|
+
auth: {
|
|
33
|
+
user: 'otp@betterinternship.com',
|
|
34
|
+
pass: SMTP_PASSWORD,
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
applications: nodemailer.createTransport({
|
|
38
|
+
...transporterConfig,
|
|
39
|
+
auth: {
|
|
40
|
+
user: 'applications@betterinternship.com',
|
|
41
|
+
pass: SMTP_PASSWORD,
|
|
42
|
+
},
|
|
43
|
+
}),
|
|
44
|
+
sign: nodemailer.createTransport({
|
|
45
|
+
...transporterConfig,
|
|
46
|
+
auth: {
|
|
47
|
+
user: 'sign@betterinternship.com',
|
|
48
|
+
pass: SMTP_PASSWORD,
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
export const sendSingleEmail = async ({ sender, subject, recipient, content, alias = 'hello', }) => {
|
|
53
|
+
if (process.env.NODE_ENV === 'development' || true) {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
transporters[alias].sendMail({
|
|
56
|
+
from: `"${sender ?? 'BetterInternship'}" <${alias}@betterinternship.com>`,
|
|
57
|
+
to: recipient,
|
|
58
|
+
subject,
|
|
59
|
+
html: content,
|
|
60
|
+
}, (error, info) => {
|
|
61
|
+
if (error) {
|
|
62
|
+
console.error('[ERROR] Could not send email.');
|
|
63
|
+
console.error('[-----] ' + error.message);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
resolve({
|
|
67
|
+
messageId: info.messageId,
|
|
68
|
+
response: info.response,
|
|
69
|
+
});
|
|
70
|
+
console.warn('[LOG] Email sent to ' + recipient);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const response = await transacApi?.sendTransacEmail({
|
|
77
|
+
sender: {
|
|
78
|
+
email: `"${sender ?? 'BetterInternship'}" <${alias}@betterinternship.com>`,
|
|
79
|
+
},
|
|
80
|
+
to: [{ email: recipient }],
|
|
81
|
+
subject,
|
|
82
|
+
htmlContent: content,
|
|
83
|
+
});
|
|
84
|
+
console.warn('[LOG] Email sent to ' + recipient);
|
|
85
|
+
return {
|
|
86
|
+
messageId: response?.body?.messageId,
|
|
87
|
+
response: response?.response,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
};
|
|
67
91
|
//# sourceMappingURL=email.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"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"}
|