@social-mail/social-mail-web-server 1.8.67 → 1.8.72
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/common/globalEnv.d.ts +1 -0
- package/dist/common/globalEnv.d.ts.map +1 -1
- package/dist/common/globalEnv.js +1 -0
- package/dist/common/globalEnv.js.map +1 -1
- package/dist/reports/wwwroot/routes/social-mail/reports/api/entity/invoke/[entityName]/[methodName]/index.d.ts +1 -1
- package/dist/reports/wwwroot/routes/social-mail/reports/api/entity/invoke/[entityName]/[methodName]/index.d.ts.map +1 -1
- package/dist/reports/wwwroot/routes/social-mail/reports/api/entity/invoke/[entityName]/[methodName]/index.js +1 -1
- package/dist/reports/wwwroot/routes/social-mail/reports/api/entity/invoke/[entityName]/[methodName]/index.js.map +1 -1
- package/dist/server/model/entities/VerificationToken.d.ts +1 -0
- package/dist/server/model/entities/VerificationToken.d.ts.map +1 -1
- package/dist/server/model/entities/VerificationToken.js +4 -0
- package/dist/server/model/entities/VerificationToken.js.map +1 -1
- package/dist/server/model/events/VerificationTokenEvents.d.ts +4 -3
- package/dist/server/model/events/VerificationTokenEvents.d.ts.map +1 -1
- package/dist/server/model/events/VerificationTokenEvents.js +21 -50
- package/dist/server/model/events/VerificationTokenEvents.js.map +1 -1
- package/dist/server/seed/seed.d.ts.map +1 -1
- package/dist/server/seed/seed.js +4 -0
- package/dist/server/seed/seed.js.map +1 -1
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/services/store/gateways/paypal.d.ts +13 -3
- package/dist/server/services/store/gateways/paypal.d.ts.map +1 -1
- package/dist/server/services/store/gateways/paypal.js +120 -49
- package/dist/server/services/store/gateways/paypal.js.map +1 -1
- package/dist/server/services/user/email-verification/EmailVerificationService.d.ts +17 -0
- package/dist/server/services/user/email-verification/EmailVerificationService.d.ts.map +1 -0
- package/dist/server/services/user/email-verification/EmailVerificationService.js +80 -0
- package/dist/server/services/user/email-verification/EmailVerificationService.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/social-mail/site/signup/post.d.ts +4 -1
- package/dist/wwwroot/routes/social-mail/site/signup/post.d.ts.map +1 -1
- package/dist/wwwroot/routes/social-mail/site/signup/post.js +37 -6
- package/dist/wwwroot/routes/social-mail/site/signup/post.js.map +1 -1
- package/package.json +3 -2
- package/src/common/globalEnv.ts +1 -0
- package/src/reports/wwwroot/routes/social-mail/reports/api/entity/invoke/[entityName]/[methodName]/index.tsx +1 -1
- package/src/server/model/entities/VerificationToken.ts +3 -0
- package/src/server/model/events/VerificationTokenEvents.ts +19 -52
- package/src/server/seed/seed.ts +4 -0
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/services/store/gateways/paypal.tsx +136 -54
- package/src/server/services/user/email-verification/EmailVerificationService.ts +78 -0
- package/src/wwwroot/routes/social-mail/site/signup/post.tsx +39 -7
|
@@ -7,9 +7,10 @@ import EmailAddressService from "../../../../../server/services/EmailAddressServ
|
|
|
7
7
|
import CaptchaService from "../../../../../server/services/captcha/CaptchaService.js";
|
|
8
8
|
import WebSiteContentService from "../../../../../server/services/files/WebSiteContentService.js";
|
|
9
9
|
import OtpToUserService from "../../../../../server/services/user/otp-to-user/OtpToUserService.js";
|
|
10
|
+
import SessionSecurity from "@entity-access/server-pages/dist/services/SessionSecurity.js";
|
|
11
|
+
import EmailVerificationService from "../../../../../server/services/user/email-verification/EmailVerificationService.js";
|
|
10
12
|
export interface ISignup {
|
|
11
13
|
userID: number;
|
|
12
|
-
password: string;
|
|
13
14
|
name: string;
|
|
14
15
|
phoneNumber: string;
|
|
15
16
|
emailAddress: string;
|
|
@@ -31,6 +32,8 @@ export default class ExternalSignup extends Page {
|
|
|
31
32
|
otpService: OtpToUserService;
|
|
32
33
|
db: SocialMailContext;
|
|
33
34
|
websiteService: WebSiteContentService;
|
|
35
|
+
sessionSecurity: SessionSecurity;
|
|
36
|
+
evs: EmailVerificationService;
|
|
34
37
|
run(): Promise<import("@entity-access/server-pages/dist/Content.js").default>;
|
|
35
38
|
}
|
|
36
39
|
//# sourceMappingURL=post.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/site/signup/post.tsx"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAC3F,OAAO,iBAAiB,MAAM,2DAA2D,CAAC;AAC1F,OAAO,aAAa,MAAM,iDAAiD,CAAC;AAC5E,OAAO,mBAAmB,MAAM,uDAAuD,CAAC;AACxF,OAAO,cAAc,MAAM,0DAA0D,CAAC;AACtF,OAAO,qBAAqB,MAAM,+DAA+D,CAAC;AAClG,OAAO,gBAAgB,MAAM,qEAAqE,CAAC;
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/site/signup/post.tsx"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAC3F,OAAO,iBAAiB,MAAM,2DAA2D,CAAC;AAC1F,OAAO,aAAa,MAAM,iDAAiD,CAAC;AAC5E,OAAO,mBAAmB,MAAM,uDAAuD,CAAC;AACxF,OAAO,cAAc,MAAM,0DAA0D,CAAC;AACtF,OAAO,qBAAqB,MAAM,+DAA+D,CAAC;AAClG,OAAO,gBAAgB,MAAM,qEAAqE,CAAC;AACnG,OAAO,eAAe,MAAM,8DAA8D,CAAC;AAC3F,OAAO,wBAAwB,MAAM,oFAAoF,CAAC;AAE1H,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC3C;AAED;;GAEG;AAIH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,IAAI;IAG5C,cAAc,EAAE,cAAc,CAAC;IAG/B,aAAa,EAAE,aAAa,CAAC;IAG7B,mBAAmB,EAAE,mBAAmB,CAAC;IAGzC,UAAU,EAAE,gBAAgB,CAAC;IAG7B,EAAE,EAAE,iBAAiB,CAAC;IAGtB,cAAc,EAAE,qBAAqB,CAAC;IAGtC,eAAe,EAAE,eAAe,CAAC;IAGjC,GAAG,EAAE,wBAAwB,CAAC;IAExB,GAAG;CAyLZ"}
|
|
@@ -19,6 +19,8 @@ import EmailAddressService from "../../../../../server/services/EmailAddressServ
|
|
|
19
19
|
import CaptchaService from "../../../../../server/services/captcha/CaptchaService.js";
|
|
20
20
|
import WebSiteContentService from "../../../../../server/services/files/WebSiteContentService.js";
|
|
21
21
|
import OtpToUserService from "../../../../../server/services/user/otp-to-user/OtpToUserService.js";
|
|
22
|
+
import SessionSecurity from "@entity-access/server-pages/dist/services/SessionSecurity.js";
|
|
23
|
+
import EmailVerificationService from "../../../../../server/services/user/email-verification/EmailVerificationService.js";
|
|
22
24
|
/**
|
|
23
25
|
* External Signup is used for signing up for Blog or Store.
|
|
24
26
|
*/
|
|
@@ -28,19 +30,40 @@ let ExternalSignup = class ExternalSignup extends Page {
|
|
|
28
30
|
db.verifyFilters = false;
|
|
29
31
|
db.raiseEvents = false;
|
|
30
32
|
const model = this.body;
|
|
31
|
-
|
|
32
|
-
model.phoneNumber = model.phone.verifyAddresses;
|
|
33
|
+
// first verify captcha...
|
|
33
34
|
const w = await this.websiteService.getWebSite(this.request.hostName);
|
|
34
35
|
const storeID = w.folderID;
|
|
35
36
|
if (!storeID) {
|
|
36
37
|
throw new EntityAccessError(`Signup not allowed`);
|
|
37
38
|
}
|
|
38
|
-
model.password = model.password?.trim();
|
|
39
39
|
if (!model.emailAddress) {
|
|
40
40
|
throw new EntityAccessError("Email is required");
|
|
41
41
|
}
|
|
42
42
|
model.phoneNumber = `+${model.phoneNumber.replace(/[^0-9]/g, "")}`;
|
|
43
|
-
|
|
43
|
+
let verificationGenerated = false;
|
|
44
|
+
if (!model.phone.verificationID) {
|
|
45
|
+
verificationGenerated = true;
|
|
46
|
+
// generate new one...
|
|
47
|
+
const vp = await this.otpService.create({ phone: model.phone.phone });
|
|
48
|
+
model.phone.verificationID = vp.id;
|
|
49
|
+
const v = await db.verificationTokens.where(vp, (p) => (x) => x.verificationID === p.id).first();
|
|
50
|
+
// inject public key
|
|
51
|
+
await this.sessionSecurity.injectPublicKey(v);
|
|
52
|
+
model.phone.accessCode = v.accessCode;
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
54
|
+
// @ts-expect-error
|
|
55
|
+
model.phone.$key = v.$key;
|
|
56
|
+
}
|
|
57
|
+
if (!model.email.verificationID) {
|
|
58
|
+
verificationGenerated = true;
|
|
59
|
+
const v = await this.evs.create({ email: model.emailAddress, ipAddress: this.request.remoteIPAddress });
|
|
60
|
+
model.email.verificationID = v.verificationID;
|
|
61
|
+
// @ts-expect-error unknown fields
|
|
62
|
+
model.email.$key = v.$key;
|
|
63
|
+
}
|
|
64
|
+
if (verificationGenerated) {
|
|
65
|
+
return this.json(model);
|
|
66
|
+
}
|
|
44
67
|
for (const v1 of [model.captcha, model.email, model.phone]) {
|
|
45
68
|
const { verificationID, accessCode } = v1;
|
|
46
69
|
const vr = await db.verificationTokens.statements.select({}, { verificationID, accessCode });
|
|
@@ -62,9 +85,9 @@ let ExternalSignup = class ExternalSignup extends Page {
|
|
|
62
85
|
if (exists) {
|
|
63
86
|
throw new EntityAccessError(`Phone number is already registered.`);
|
|
64
87
|
}
|
|
65
|
-
|
|
88
|
+
const password = randomUUID();
|
|
66
89
|
const passwordSalt = this.cryptoService.generateSalt();
|
|
67
|
-
const passwordHash = this.cryptoService.hash(passwordSalt,
|
|
90
|
+
const passwordHash = this.cryptoService.hash(passwordSalt, password);
|
|
68
91
|
const dateCreated = DateTime.now;
|
|
69
92
|
const phoneNumberE64 = model.phoneNumber;
|
|
70
93
|
const name = model.name;
|
|
@@ -178,6 +201,14 @@ __decorate([
|
|
|
178
201
|
Inject,
|
|
179
202
|
__metadata("design:type", WebSiteContentService)
|
|
180
203
|
], ExternalSignup.prototype, "websiteService", void 0);
|
|
204
|
+
__decorate([
|
|
205
|
+
Inject,
|
|
206
|
+
__metadata("design:type", SessionSecurity)
|
|
207
|
+
], ExternalSignup.prototype, "sessionSecurity", void 0);
|
|
208
|
+
__decorate([
|
|
209
|
+
Inject,
|
|
210
|
+
__metadata("design:type", EmailVerificationService)
|
|
211
|
+
], ExternalSignup.prototype, "evs", void 0);
|
|
181
212
|
ExternalSignup = __decorate([
|
|
182
213
|
Prepare.parseJsonBody,
|
|
183
214
|
Prepare.authorize
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/site/signup/post.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,iBAAiB,MAAM,+DAA+D,CAAC;AAC9F,OAAO,MAAM,MAAM,4CAA4C,CAAC;AAChE,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AAGjF,OAAO,aAAa,MAAM,iDAAiD,CAAC;AAC5E,OAAO,mBAAmB,MAAM,uDAAuD,CAAC;AACxF,OAAO,cAAc,MAAM,0DAA0D,CAAC;AACtF,OAAO,qBAAqB,MAAM,+DAA+D,CAAC;AAClG,OAAO,gBAAgB,MAAM,qEAAqE,CAAC;
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/social-mail/site/signup/post.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@social-mail/social-mail-web-server",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.72",
|
|
4
4
|
"description": "## Phase 1",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"@aws-sdk/client-s3": "^3.717.0",
|
|
23
23
|
"@azure/storage-blob": "^12.25.0",
|
|
24
24
|
"@entity-access/entity-access": "^1.0.499",
|
|
25
|
-
"@entity-access/server-pages": "^1.1.
|
|
25
|
+
"@entity-access/server-pages": "^1.1.506",
|
|
26
|
+
"@paypal/paypal-server-sdk": "^1.0.0",
|
|
26
27
|
"@peculiar/asn1-schema": "^2.3.15",
|
|
27
28
|
"@social-mail/shared": "^1.0.29",
|
|
28
29
|
"@socket.io/cluster-adapter": "^0.2.2",
|
package/src/common/globalEnv.ts
CHANGED
|
@@ -66,6 +66,7 @@ export const globalEnv = {
|
|
|
66
66
|
parentApiToken: process.env.SOCIAL_MAIL_PARENT_API_TOKEN,
|
|
67
67
|
forceHttp1: false,
|
|
68
68
|
isTestMode,
|
|
69
|
+
isLocalTestMode: process.env.SOCIAL_MAIL_LOCAL_TEST || false,
|
|
69
70
|
puppeteer: {
|
|
70
71
|
port: process.env.SOCIAL_MAIL_PUPPETEER_PORT || 8123,
|
|
71
72
|
host: process.env.SOCIAL_MAIL_PUPPETEER_HOST || "puppeteer",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Index from "@entity-access/server-pages/dist/routes/api/entity/
|
|
1
|
+
import Index from "@entity-access/server-pages/dist/routes/api/entity/run/[entity]/[methodName]/index.js";
|
|
2
2
|
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
3
3
|
import ReportDbContext from "../../../../../../../../../model/ReportDbContext.js";
|
|
4
4
|
|
|
@@ -34,6 +34,9 @@ export default class VerificationToken {
|
|
|
34
34
|
@Column({ default: () => Sql.date.addMinutes(Sql.date.now(), 15)})
|
|
35
35
|
expiry: DateTime;
|
|
36
36
|
|
|
37
|
+
@Column({ dataType: "Char", length: 200, nullable: true})
|
|
38
|
+
email: string;
|
|
39
|
+
|
|
37
40
|
@Column({ dataType: "Char", length: 20, nullable: true})
|
|
38
41
|
phone: string;
|
|
39
42
|
|
|
@@ -23,6 +23,7 @@ import OtpToUserService from "../../services/user/otp-to-user/OtpToUserService.j
|
|
|
23
23
|
import SessionSecurity from "@entity-access/server-pages/dist/services/SessionSecurity.js";
|
|
24
24
|
import EncryptionService from "../../services/encryption/EncryptionService.js";
|
|
25
25
|
import { TempFileResult } from "@entity-access/server-pages/dist/Content.js";
|
|
26
|
+
import EmailVerificationService from "../../services/user/email-verification/EmailVerificationService.js";
|
|
26
27
|
|
|
27
28
|
export default class VerificationTokenEvents extends AuthenticatedEvents<VerificationToken> {
|
|
28
29
|
|
|
@@ -41,6 +42,9 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
41
42
|
@Inject
|
|
42
43
|
captchaService: CaptchaService;
|
|
43
44
|
|
|
45
|
+
@Inject
|
|
46
|
+
evs: EmailVerificationService;
|
|
47
|
+
|
|
44
48
|
@ExternalInvoke
|
|
45
49
|
async updatePhone(entity: VerificationToken, phone: string) {
|
|
46
50
|
const { db } = this;
|
|
@@ -105,15 +109,10 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
105
109
|
// }
|
|
106
110
|
|
|
107
111
|
@ExternalInvoke
|
|
108
|
-
async resendCode(entity: VerificationToken
|
|
109
|
-
if(entity.verificationID !== id || entity.accessCode !== accessCode) {
|
|
110
|
-
throw new EntityAccessError("Invalid id/access code");
|
|
111
|
-
}
|
|
112
|
+
async resendCode(entity: VerificationToken) {
|
|
112
113
|
switch(entity.type) {
|
|
113
114
|
case "email":
|
|
114
|
-
|
|
115
|
-
const entry = db.changeSet.getEntry(entity);
|
|
116
|
-
await this.sendVerificationEmail(entity, entry);
|
|
115
|
+
await this.evs.send(entity);
|
|
117
116
|
break;
|
|
118
117
|
case "sms-to-user":
|
|
119
118
|
const sp = ServiceProvider.resolve(this, OtpToUserService);
|
|
@@ -128,13 +127,11 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
128
127
|
}
|
|
129
128
|
|
|
130
129
|
@ExternalInvoke
|
|
131
|
-
async verifyCode(entity: VerificationToken,
|
|
132
|
-
if(entity.verificationID !== id || entity.accessCode !== accessCode) {
|
|
133
|
-
throw new EntityAccessError("Invalid id/access code");
|
|
134
|
-
}
|
|
135
|
-
|
|
130
|
+
async verifyCode(entity: VerificationToken, code: string) {
|
|
136
131
|
const db = ServiceProvider.resolve(this, SocialMailContext);
|
|
137
132
|
|
|
133
|
+
const id = entity.verificationID;
|
|
134
|
+
|
|
138
135
|
switch(entity.type) {
|
|
139
136
|
case "captcha":
|
|
140
137
|
if(entity.code !== code) {
|
|
@@ -152,8 +149,6 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
152
149
|
if(entity.code !== code) {
|
|
153
150
|
throw new EntityAccessError("Invalid code");
|
|
154
151
|
}
|
|
155
|
-
const address = await db.verificationTokenAddresses.where({ id }, (p) => (x) => x.verificationID === p.id)
|
|
156
|
-
.first();
|
|
157
152
|
|
|
158
153
|
const ws = ServiceProvider.resolve(this, WebSiteContentService);
|
|
159
154
|
const page = ServiceProvider.resolve(this, Page as any) as Page;
|
|
@@ -161,8 +156,9 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
161
156
|
if(page?.request?.hostName) {
|
|
162
157
|
const w = await ws.getWebSite(page.request.hostName);
|
|
163
158
|
if (w) {
|
|
159
|
+
const { email } = entity;
|
|
164
160
|
webSiteFolderID = w.folderID;
|
|
165
|
-
const user = await db.users.where({ webSiteFolderID, email
|
|
161
|
+
const user = await db.users.where({ webSiteFolderID, email }, (p) => (x) =>
|
|
166
162
|
x.storeAccount.storeID === p.webSiteFolderID
|
|
167
163
|
&& x.storeAccount.emails.some((e) =>
|
|
168
164
|
e.emailAddress.emailAddress === p.email
|
|
@@ -311,11 +307,13 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
311
307
|
console.log(`Email Code is ${entity.code}`);
|
|
312
308
|
entity.accessCode = randomUUID();
|
|
313
309
|
|
|
314
|
-
entity.
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
310
|
+
if (!entity.email) {
|
|
311
|
+
entity.addresses = [
|
|
312
|
+
db.verificationTokenAddresses.add({
|
|
313
|
+
address: entity.verifyAddresses
|
|
314
|
+
})
|
|
315
|
+
];
|
|
316
|
+
}
|
|
319
317
|
|
|
320
318
|
break;
|
|
321
319
|
// case "sms":
|
|
@@ -356,7 +354,7 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
356
354
|
// we need to make sure we are sending email..
|
|
357
355
|
switch(entity.type) {
|
|
358
356
|
case "email":
|
|
359
|
-
await this.
|
|
357
|
+
await this.evs.send(entity);
|
|
360
358
|
break;
|
|
361
359
|
case "sms-to-user":
|
|
362
360
|
if (entity.phone) {
|
|
@@ -366,37 +364,6 @@ export default class VerificationTokenEvents extends AuthenticatedEvents<Verific
|
|
|
366
364
|
}
|
|
367
365
|
}
|
|
368
366
|
|
|
369
|
-
async sendVerificationEmail(entity: VerificationToken, entry: ChangeEntry<VerificationToken>) {
|
|
370
|
-
if (entity.type !== "email") {
|
|
371
|
-
throw new EntityAccessError(`Invalid verification type`);
|
|
372
|
-
}
|
|
373
|
-
const db = ServiceProvider.resolve(this, SocialMailContext);
|
|
374
|
-
await entry.loadNavigationAsync((x) => x.addresses);
|
|
375
|
-
|
|
376
|
-
const senderEmail = globalEnv.senderEmailForNotification;
|
|
377
|
-
if (!senderEmail) {
|
|
378
|
-
throw new EntityAccessError(`Sender for Notification is not set, cannot send email.`);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
const textBody = `Social Mail Verification Code for your request is ${entity.code}`;
|
|
382
|
-
const htmlBody = `<pre>Social Mail Verification Code for<br/>your request is ${entity.code}</pre>`;
|
|
383
|
-
|
|
384
|
-
const ms = ServiceProvider.resolve(this, MailService);
|
|
385
|
-
|
|
386
|
-
const eas = ServiceProvider.resolve(this, EmailAddressService);
|
|
387
|
-
const hosted = await eas.getHostedMailboxID(senderEmail);
|
|
388
|
-
|
|
389
|
-
await ms.sendNotificationEmail(`notify-email-${entity.verificationID}-${Date.now().toFixed(0)}`, {
|
|
390
|
-
from: senderEmail,
|
|
391
|
-
fromName: "Social Mail Verification Code",
|
|
392
|
-
subject: "Social Mail Verification Code",
|
|
393
|
-
htmlBody,
|
|
394
|
-
textBody,
|
|
395
|
-
to: entity.addresses[0].address,
|
|
396
|
-
external: !hosted
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
|
|
400
367
|
preJson(entity: VerificationToken): VerificationToken {
|
|
401
368
|
entity.externalID = void 0;
|
|
402
369
|
const { code, verificationID } = entity;
|
package/src/server/seed/seed.ts
CHANGED
|
@@ -5,7 +5,7 @@ export default async function seedUI(config: DBConfig) {
|
|
|
5
5
|
await config.saveVersion(UIPackageConfig, {
|
|
6
6
|
package: "@social-mail/social-mail-client",
|
|
7
7
|
view: "dist/web/AppIndex",
|
|
8
|
-
version: "1.8.
|
|
8
|
+
version: "1.8.244"
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
await config.saveVersion(WebComponentsPackageConfig, {
|
|
@@ -1,87 +1,169 @@
|
|
|
1
|
-
import Inject from "@entity-access/entity-access/dist/di/di.js";
|
|
1
|
+
import Inject, { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
2
|
import { StoreJournal } from "../../../model/entities/StoreJournal.js";
|
|
3
3
|
import StorePaymentAttempt from "../../../model/entities/StorePaymentAttempt.js";
|
|
4
4
|
import StorePaymentGateway from "../../../model/entities/StorePaymentGateway.js";
|
|
5
5
|
import EncryptionService from "../../encryption/EncryptionService.js";
|
|
6
6
|
import LedgerPaymentGateway from "../LedgerPaymentGateway.js";
|
|
7
|
-
import FetchBuilder from "@web-atoms/fetch-builder";
|
|
8
7
|
import SocialMailContext from "../../../model/SocialMailContext.js";
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
|
|
8
|
+
import { CaptureStatus, CheckoutPaymentIntent, Client, Environment, OrdersController, OrderStatus, PayeePaymentMethodPreference, PaypalExperienceLandingPage, PaypalExperienceUserAction } from "@paypal/paypal-server-sdk";
|
|
9
|
+
import TimedCache from "@entity-access/entity-access/dist/common/cache/TimedCache.js";
|
|
10
|
+
|
|
11
|
+
@RegisterSingleton
|
|
12
|
+
class PaypalClientCache {
|
|
13
|
+
|
|
14
|
+
cache = new TimedCache<any, Client>();
|
|
15
|
+
|
|
16
|
+
@Inject
|
|
17
|
+
ecs: EncryptionService;
|
|
18
|
+
|
|
19
|
+
getClient(gateway: StorePaymentGateway) {
|
|
20
|
+
return this.cache.getOrCreate(gateway.accountID, gateway, (k, p) => {
|
|
21
|
+
const secret = this.ecs.secure.decrypt(p.encryptedSecret);
|
|
22
|
+
|
|
23
|
+
return new Client({
|
|
24
|
+
environment: gateway.url ? Environment.Sandbox : Environment.Production,
|
|
25
|
+
clientCredentialsAuthCredentials: {
|
|
26
|
+
oAuthClientId: gateway.clientID,
|
|
27
|
+
oAuthClientSecret: secret
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
}
|
|
12
34
|
|
|
13
35
|
export default class extends LedgerPaymentGateway {
|
|
14
36
|
|
|
15
37
|
@Inject
|
|
16
38
|
ecs: EncryptionService;
|
|
17
39
|
|
|
40
|
+
@Inject
|
|
41
|
+
pc: PaypalClientCache;
|
|
42
|
+
|
|
18
43
|
@Inject
|
|
19
44
|
db: SocialMailContext;
|
|
20
45
|
|
|
21
46
|
|
|
22
47
|
async createPayment(host: string, gateway: StorePaymentGateway, order: StoreJournal, pa: StorePaymentAttempt) {
|
|
23
48
|
|
|
24
|
-
const secret = this.ecs.secure.decrypt(gateway.encryptedSecret);
|
|
25
|
-
|
|
26
49
|
const pID = this.ecs.general.encrypt(pa.attemptID.toString());
|
|
27
50
|
|
|
28
51
|
const items = await this.db.storeJournalLineItems.where(order, (p) => (x) => x.journalID === p.journalID)
|
|
29
52
|
.include((x) => x.itemPrice.storeItem)
|
|
30
53
|
.toArray();
|
|
31
54
|
|
|
32
|
-
const
|
|
55
|
+
const client = this.pc.getClient(gateway);
|
|
56
|
+
|
|
57
|
+
const { emailAddress: { emailAddress: emailAddress}} = await this.db.storeAccountEmails
|
|
33
58
|
.where(order, (p) => (x) => x.accountID === p.buyerID)
|
|
34
59
|
.include((x) => x.emailAddress)
|
|
35
60
|
.first();
|
|
36
61
|
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
62
|
+
const orders = new OrdersController(client);
|
|
63
|
+
|
|
64
|
+
const currencyCode = items[0].itemPrice.currency;
|
|
65
|
+
|
|
66
|
+
const returnUrl = `https://${host}/store/checkout-callback/${pID}`;
|
|
67
|
+
const cancelUrl = `https://${host}/store/checkout-callback/${pID}`;
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
const pr = await orders.createOrder({
|
|
71
|
+
body: {
|
|
72
|
+
intent: CheckoutPaymentIntent.Capture,
|
|
73
|
+
paymentSource: {
|
|
74
|
+
paypal: {
|
|
75
|
+
experienceContext: {
|
|
76
|
+
paymentMethodPreference: PayeePaymentMethodPreference.ImmediatePaymentRequired,
|
|
77
|
+
brandName: host,
|
|
78
|
+
landingPage: PaypalExperienceLandingPage.NoPreference,
|
|
79
|
+
userAction: PaypalExperienceUserAction.PayNow,
|
|
80
|
+
returnUrl,
|
|
81
|
+
cancelUrl,
|
|
82
|
+
},
|
|
83
|
+
emailAddress
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
// applicationContext: {
|
|
87
|
+
// brandName: host,
|
|
88
|
+
// paymentMethod: {
|
|
89
|
+
// payeePreferred: PayeePaymentMethodPreference.Unrestricted,
|
|
90
|
+
// },
|
|
91
|
+
// landingPage: OrderApplicationContextLandingPage.Billing,
|
|
92
|
+
// userAction: OrderApplicationContextUserAction.PayNow,
|
|
93
|
+
// returnUrl,
|
|
94
|
+
// cancelUrl,
|
|
95
|
+
// },
|
|
96
|
+
purchaseUnits: [{
|
|
97
|
+
invoiceId: `${order.journalID}`,
|
|
98
|
+
referenceId: `${order.journalID}`,
|
|
99
|
+
amount: {
|
|
100
|
+
currencyCode,
|
|
101
|
+
value: order.total.toString(2),
|
|
102
|
+
breakdown: {
|
|
103
|
+
itemTotal: {
|
|
104
|
+
currencyCode,
|
|
105
|
+
value: order.total.toString(2)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
52
108
|
},
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
109
|
+
items: items.map((x) => ({
|
|
110
|
+
name: x.item.name,
|
|
111
|
+
quantity: Number(`${x.quantity || 1}`).toFixed(0),
|
|
112
|
+
currency: x.itemPrice.currency,
|
|
113
|
+
unitAmount: {
|
|
114
|
+
currencyCode,
|
|
115
|
+
value: (Number(x.total) / x.quantity).toFixed(2)
|
|
116
|
+
},
|
|
117
|
+
}))
|
|
118
|
+
}]
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const link = pr.result.links.find((x) => x.rel === "payer-action");
|
|
123
|
+
|
|
124
|
+
pa.externalID = pr.result.id;
|
|
125
|
+
|
|
126
|
+
await this.db.storePaymentAttempts.statements.update({ externalID: pa.externalID }, { attemptID: pa.attemptID });
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
url: link.href
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// return Content.html(<HtmlDocument>
|
|
133
|
+
// <head>
|
|
134
|
+
// <title>Preparing Paypal Order</title>
|
|
135
|
+
// </head>
|
|
136
|
+
// <body>
|
|
137
|
+
// <script>
|
|
138
|
+
// location.href = {JSON.stringify(link.href)};
|
|
139
|
+
// </script>
|
|
140
|
+
// </body>
|
|
141
|
+
// </HtmlDocument>);
|
|
82
142
|
}
|
|
83
|
-
|
|
84
|
-
|
|
143
|
+
|
|
144
|
+
async isSuccessful(pa: StorePaymentAttempt) {
|
|
145
|
+
|
|
146
|
+
const { gateway, externalID: id } = pa;
|
|
147
|
+
|
|
148
|
+
const client = this.pc.getClient(gateway);
|
|
149
|
+
|
|
150
|
+
const oc = new OrdersController(client);
|
|
151
|
+
|
|
152
|
+
let pr = await oc.getOrder({ id });
|
|
153
|
+
|
|
154
|
+
if (pr.result.status === OrderStatus.Approved) {
|
|
155
|
+
// let us capture...
|
|
156
|
+
pr = await oc.captureOrder({ id });
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return pr.result
|
|
160
|
+
.purchaseUnits
|
|
161
|
+
.every((x) => x.payments
|
|
162
|
+
.captures
|
|
163
|
+
.every((c) => c.status === CaptureStatus.Completed));
|
|
164
|
+
// console.log(captures);
|
|
165
|
+
|
|
166
|
+
// throw new Error("Method not implemented.");
|
|
85
167
|
}
|
|
86
168
|
|
|
87
169
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import Inject, { RegisterScoped, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
|
+
import VerificationToken from "../../../model/entities/VerificationToken.js";
|
|
3
|
+
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
4
|
+
import { globalEnv } from "../../../../common/globalEnv.js";
|
|
5
|
+
import SocialMailContext from "../../../model/SocialMailContext.js";
|
|
6
|
+
import EmailAddressService from "../../EmailAddressService.js";
|
|
7
|
+
import MailService from "../../emails/MailService.js";
|
|
8
|
+
import SessionSecurity from "@entity-access/server-pages/dist/services/SessionSecurity.js";
|
|
9
|
+
import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
|
|
10
|
+
|
|
11
|
+
@RegisterScoped
|
|
12
|
+
export default class EmailVerificationService {
|
|
13
|
+
|
|
14
|
+
@Inject
|
|
15
|
+
db: SocialMailContext;
|
|
16
|
+
|
|
17
|
+
@Inject
|
|
18
|
+
eas: EmailAddressService;
|
|
19
|
+
|
|
20
|
+
@Inject
|
|
21
|
+
ms: MailService;
|
|
22
|
+
|
|
23
|
+
@Inject
|
|
24
|
+
sessionSecurity: SessionSecurity;
|
|
25
|
+
|
|
26
|
+
async create({ email, ipAddress }) {
|
|
27
|
+
|
|
28
|
+
let code = Date.now().toString();
|
|
29
|
+
code = code.substring(code.length-5);
|
|
30
|
+
|
|
31
|
+
console.log(`Email Code is ${code}`);
|
|
32
|
+
|
|
33
|
+
const v = await this.db.verificationTokens.statements.insert({
|
|
34
|
+
type: "email",
|
|
35
|
+
email,
|
|
36
|
+
code,
|
|
37
|
+
dateCreated: DateTime.now,
|
|
38
|
+
ipAddress
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// send..
|
|
42
|
+
await this.send(v);
|
|
43
|
+
|
|
44
|
+
this.sessionSecurity.injectPublicKey(v);
|
|
45
|
+
v.code = void 0;
|
|
46
|
+
v.ipAddress = void 0;
|
|
47
|
+
return v;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async send(entity: VerificationToken) {
|
|
52
|
+
if (entity.type !== "email") {
|
|
53
|
+
throw new EntityAccessError(`Invalid verification type`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const senderEmail = globalEnv.senderEmailForNotification;
|
|
57
|
+
if (!senderEmail) {
|
|
58
|
+
throw new EntityAccessError(`Sender for Notification is not set, cannot send email.`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const textBody = `Social Mail Verification Code for your request is ${entity.code}`;
|
|
62
|
+
const htmlBody = `<pre>Social Mail Verification Code for<br/>your request is ${entity.code}</pre>`;
|
|
63
|
+
|
|
64
|
+
const { eas, ms } = this;
|
|
65
|
+
|
|
66
|
+
const hosted = await eas.getHostedMailboxID(senderEmail);
|
|
67
|
+
|
|
68
|
+
await ms.sendNotificationEmail(`notify-email-${entity.verificationID}-${Date.now().toFixed(0)}`, {
|
|
69
|
+
from: senderEmail,
|
|
70
|
+
fromName: "Social Mail Verification Code",
|
|
71
|
+
subject: "Social Mail Verification Code",
|
|
72
|
+
htmlBody,
|
|
73
|
+
textBody,
|
|
74
|
+
to: entity.email,
|
|
75
|
+
external: !hosted
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|