@social-mail/social-mail-client 1.2.210 → 1.2.211
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/admin/AdminAppIndex.pack.js +935 -30
- package/dist/admin/AdminAppIndex.pack.js.map +1 -1
- package/dist/admin/AdminAppIndex.pack.min.js +16 -12
- package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
- package/dist/admin/commands/AdminCommands.d.ts +1 -0
- package/dist/admin/commands/AdminCommands.d.ts.map +1 -1
- package/dist/admin/commands/AdminCommands.js +4 -0
- package/dist/admin/commands/AdminCommands.js.map +1 -1
- package/dist/admin/drawer/AdminDrawer.d.ts.map +1 -1
- package/dist/admin/drawer/AdminDrawer.js +4 -0
- package/dist/admin/drawer/AdminDrawer.js.map +1 -1
- package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts +10 -0
- package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/stores/AdminStoreDetailPage.js +92 -0
- package/dist/admin/pages/stores/AdminStoreDetailPage.js.map +1 -0
- package/dist/admin/pages/stores/AdminStoreList.d.ts +13 -0
- package/dist/admin/pages/stores/AdminStoreList.d.ts.map +1 -0
- package/dist/admin/pages/stores/AdminStoreList.js +131 -0
- package/dist/admin/pages/stores/AdminStoreList.js.map +1 -0
- package/dist/admin/pages/users/UserDetailsPage.js +3 -3
- package/dist/admin/pages/users/UserDetailsPage.js.map +1 -1
- package/dist/admin/pages/users/files/EditFileAccessPage.d.ts +1 -1
- package/dist/admin/pages/users/files/EditFileAccessPage.d.ts.map +1 -1
- package/dist/admin/pages/users/files/EditFileAccessPage.js +3 -3
- package/dist/admin/pages/users/files/EditFileAccessPage.js.map +1 -1
- package/dist/common/commands/CommonCommands.d.ts +9 -0
- package/dist/common/commands/CommonCommands.d.ts.map +1 -1
- package/dist/common/commands/CommonCommands.js +15 -0
- package/dist/common/commands/CommonCommands.js.map +1 -1
- package/dist/common/controls/countries/CountrySelect.d.ts +1 -0
- package/dist/common/controls/countries/CountrySelect.d.ts.map +1 -1
- package/dist/common/controls/countries/CountrySelect.js +6 -1
- package/dist/common/controls/countries/CountrySelect.js.map +1 -1
- package/dist/common/pages/folders/ChooserFolderPage.d.ts +1 -0
- package/dist/common/pages/folders/ChooserFolderPage.d.ts.map +1 -1
- package/dist/common/pages/folders/ChooserFolderPage.js +2 -1
- package/dist/common/pages/folders/ChooserFolderPage.js.map +1 -1
- package/dist/common/pages/stores/StoreDetailPage.d.ts +17 -0
- package/dist/common/pages/stores/StoreDetailPage.d.ts.map +1 -0
- package/dist/common/pages/stores/StoreDetailPage.js +96 -0
- package/dist/common/pages/stores/StoreDetailPage.js.map +1 -0
- package/dist/common/pages/stores/orders/EditOrderPage.d.ts +9 -0
- package/dist/common/pages/stores/orders/EditOrderPage.d.ts.map +1 -0
- package/dist/common/pages/stores/orders/EditOrderPage.js +37 -0
- package/dist/common/pages/stores/orders/EditOrderPage.js.map +1 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.d.ts +11 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.d.ts.map +1 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.js +80 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.js.map +1 -0
- package/dist/common/pages/stores/products/EditProductListPage.d.ts +16 -0
- package/dist/common/pages/stores/products/EditProductListPage.d.ts.map +1 -0
- package/dist/common/pages/stores/products/EditProductListPage.js +118 -0
- package/dist/common/pages/stores/products/EditProductListPage.js.map +1 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.d.ts +8 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.d.ts.map +1 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.js +72 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.js.map +1 -0
- package/dist/model/model.d.ts +127 -12
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +60 -8
- package/dist/model/model.js.map +1 -1
- package/dist/public/channel/ChannelView.pack.js +64 -10
- package/dist/public/channel/ChannelView.pack.js.map +1 -1
- package/dist/public/channel/ChannelView.pack.min.js +3 -3
- package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
- package/dist/services/files/LocalFileService.d.ts.map +1 -1
- package/dist/services/files/LocalFileService.js +4 -1
- package/dist/services/files/LocalFileService.js.map +1 -1
- package/dist/services/store/StoreItemService.d.ts +15 -0
- package/dist/services/store/StoreItemService.d.ts.map +1 -0
- package/dist/services/store/StoreItemService.js +65 -0
- package/dist/services/store/StoreItemService.js.map +1 -0
- package/dist/services/store/StoreOrderService.d.ts +15 -0
- package/dist/services/store/StoreOrderService.d.ts.map +1 -0
- package/dist/services/store/StoreOrderService.js +65 -0
- package/dist/services/store/StoreOrderService.js.map +1 -0
- package/dist/services/store/StoreService.d.ts +14 -0
- package/dist/services/store/StoreService.d.ts.map +1 -0
- package/dist/services/store/StoreService.js +74 -0
- package/dist/services/store/StoreService.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/web/AppIndex.pack.js +764 -81
- package/dist/web/AppIndex.pack.js.map +1 -1
- package/dist/web/AppIndex.pack.min.js +12 -12
- package/dist/web/AppIndex.pack.min.js.map +1 -1
- package/dist/web/drawer/AppDrawer.d.ts +1 -0
- package/dist/web/drawer/AppDrawer.d.ts.map +1 -1
- package/dist/web/drawer/AppDrawer.js +23 -7
- package/dist/web/drawer/AppDrawer.js.map +1 -1
- package/dist/web/page/channels/detail/ChannelDetailPage.js +1 -1
- package/dist/web/page/channels/detail/ChannelDetailPage.js.map +1 -1
- package/dist/web/page/files/service/CloudFileService.d.ts +2 -1
- package/dist/web/page/files/service/CloudFileService.d.ts.map +1 -1
- package/dist/web/page/files/service/CloudFileService.js +6 -0
- package/dist/web/page/files/service/CloudFileService.js.map +1 -1
- package/dist/web/page/mails/service/ConversationService.js +1 -1
- package/dist/web/page/mails/service/ConversationService.js.map +1 -1
- package/dist/web/page/mails/service/MailService.d.ts.map +1 -1
- package/dist/web/page/mails/service/MailService.js +2 -9
- package/dist/web/page/mails/service/MailService.js.map +1 -1
- package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js +3 -1
- package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js.map +1 -1
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts +5 -0
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts.map +1 -0
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js +84 -0
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js.map +1 -0
- package/node_modules/@web-atoms/web-controls/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@web-atoms/web-controls/package.json +1 -1
- package/node_modules/@web-atoms/web-controls/src/basic/InlinePopup.tsx +2 -2
- package/node_modules/@web-atoms/web-controls/src/basic/TypeWriter.tsx +85 -0
- package/package.json +2 -2
- package/src/admin/commands/AdminCommands.ts +5 -0
- package/src/admin/drawer/AdminDrawer.tsx +5 -0
- package/src/admin/pages/stores/AdminStoreDetailPage.tsx +74 -0
- package/src/admin/pages/stores/AdminStoreList.tsx +109 -0
- package/src/admin/pages/users/UserDetailsPage.tsx +2 -2
- package/src/admin/pages/users/files/EditFileAccessPage.tsx +1 -1
- package/src/common/commands/CommonCommands.ts +19 -0
- package/src/common/controls/countries/CountrySelect.tsx +7 -1
- package/src/common/pages/folders/ChooserFolderPage.tsx +7 -2
- package/src/common/pages/stores/StoreDetailPage.tsx +84 -0
- package/src/common/pages/stores/orders/EditOrderPage.tsx +30 -0
- package/src/common/pages/stores/products/EditProductDetailPage.tsx +59 -0
- package/src/common/pages/stores/products/EditProductListPage.tsx +106 -0
- package/src/common/pages/stores/products/prices/EditItemPricePage.tsx +53 -0
- package/src/model/model.ts +151 -20
- package/src/services/files/LocalFileService.tsx +4 -1
- package/src/services/store/StoreItemService.ts +49 -0
- package/src/services/store/StoreOrderService.ts +57 -0
- package/src/services/store/StoreService.ts +49 -0
- package/src/web/drawer/AppDrawer.tsx +18 -4
- package/src/web/page/channels/detail/ChannelDetailPage.tsx +1 -1
- package/src/web/page/files/service/CloudFileService.ts +4 -0
- package/src/web/page/mails/service/ConversationService.tsx +1 -1
- package/src/web/page/mails/service/MailService.ts +2 -8
package/src/model/model.ts
CHANGED
|
@@ -28,15 +28,14 @@ export interface IAppFile extends IClrEntity {
|
|
|
28
28
|
dateUpdated?: DateTime | null;
|
|
29
29
|
versions?: number | null;
|
|
30
30
|
sourceUrl?: string;
|
|
31
|
-
url?: string;
|
|
32
31
|
sourceEmailLogID?: number;
|
|
32
|
+
url?: string;
|
|
33
33
|
downloadUrl?: string;
|
|
34
34
|
fileContent?: IFileContent;
|
|
35
35
|
creator?: IUser;
|
|
36
36
|
parent?: IAppFile;
|
|
37
37
|
children?: ICollection<IAppFile>;
|
|
38
38
|
email?: IEmail;
|
|
39
|
-
originalEmails?: ICollection<IEmail>;
|
|
40
39
|
fileVersions?: ICollection<IAppFileVersion>;
|
|
41
40
|
folderVersions?: ICollection<IAppFileVersion>;
|
|
42
41
|
accessList?: ICollection<IAppFileAccess>;
|
|
@@ -53,6 +52,17 @@ export const AppFileContentDispositionArray = [{"label":"attachment","value":"at
|
|
|
53
52
|
|
|
54
53
|
export const AppFile: IModel<IAppFile> = new Model<IAppFile>("AppFile", ["appFileID"], { isFolder: false,name: "",fileSize: 0,contentType: "",isDeleted: false,isShared: false,dateCreated: new DefaultFactory(() => new DateTime()) });
|
|
55
54
|
|
|
55
|
+
export interface IAccessToken extends IClrEntity {
|
|
56
|
+
readonly tokenID?: number;
|
|
57
|
+
userID?: number;
|
|
58
|
+
dateCreated?: DateTime;
|
|
59
|
+
expiryDate?: DateTime;
|
|
60
|
+
displaySecret?: Object;
|
|
61
|
+
user?: IUser;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const AccessToken: IModel<IAccessToken> = new Model<IAccessToken>("AccessToken", ["tokenID"], { dateCreated: new DefaultFactory(() => new DateTime()),expiryDate: new DefaultFactory(() => new DateTime()) });
|
|
65
|
+
|
|
56
66
|
export interface IAppFileVersion extends IClrEntity {
|
|
57
67
|
readonly versionID?: number;
|
|
58
68
|
fileID?: number;
|
|
@@ -107,19 +117,20 @@ export interface IFileContent extends IClrEntity {
|
|
|
107
117
|
contentSize?: number;
|
|
108
118
|
compression?: string | null;
|
|
109
119
|
textDocumentID?: number | null;
|
|
120
|
+
deleted?: boolean;
|
|
110
121
|
textDocument?: ITextDocument;
|
|
111
122
|
appFiles?: ICollection<IAppFile>;
|
|
112
123
|
versions?: ICollection<IAppFileVersion>;
|
|
113
124
|
}
|
|
114
125
|
|
|
115
|
-
export const FileContent: IModel<IFileContent> = new Model<IFileContent>("FileContent", ["fileContentID"], { contentHash: "",contentType: "",contentSize: 0 });
|
|
126
|
+
export const FileContent: IModel<IFileContent> = new Model<IFileContent>("FileContent", ["fileContentID"], { contentHash: "",contentType: "",contentSize: 0,deleted: false });
|
|
116
127
|
|
|
117
128
|
export interface IConfiguration extends IClrEntity {
|
|
118
129
|
name?: string;
|
|
119
|
-
configValue?: string;
|
|
130
|
+
configValue?: string | null;
|
|
120
131
|
}
|
|
121
132
|
|
|
122
|
-
export const Configuration: IModel<IConfiguration> = new Model<IConfiguration>("Configuration", ["name"], {
|
|
133
|
+
export const Configuration: IModel<IConfiguration> = new Model<IConfiguration>("Configuration", ["name"], { });
|
|
123
134
|
|
|
124
135
|
export interface IContact extends IClrEntity {
|
|
125
136
|
readonly contactID?: number;
|
|
@@ -132,7 +143,7 @@ export interface IContact extends IClrEntity {
|
|
|
132
143
|
synchronization?: string | null;
|
|
133
144
|
dateCreated?: DateTime;
|
|
134
145
|
dateUpdated?: DateTime;
|
|
135
|
-
previewID?: number;
|
|
146
|
+
previewID?: number | null;
|
|
136
147
|
user?: IUser;
|
|
137
148
|
mailbox?: IMailbox;
|
|
138
149
|
domain?: IHostedDomain;
|
|
@@ -292,9 +303,10 @@ export interface IEmail extends IClrEntity {
|
|
|
292
303
|
forwardCount?: number;
|
|
293
304
|
replyCount?: number;
|
|
294
305
|
viewCount?: number;
|
|
295
|
-
originalFileID?: number | null;
|
|
296
|
-
originalFileSize?: number;
|
|
297
306
|
mimeFileID?: number | null;
|
|
307
|
+
htmlBodyID?: number | null;
|
|
308
|
+
emailSize?: number;
|
|
309
|
+
originalFileSize?: number;
|
|
298
310
|
workflowID?: string | null;
|
|
299
311
|
parentID?: number | null;
|
|
300
312
|
forwardedID?: number | null;
|
|
@@ -302,14 +314,15 @@ export interface IEmail extends IClrEntity {
|
|
|
302
314
|
tags?: string | null;
|
|
303
315
|
senderEmail?: IEmailAddress;
|
|
304
316
|
senderUser?: IUser;
|
|
305
|
-
|
|
317
|
+
mimeFile?: IEmailLog;
|
|
318
|
+
logs?: ICollection<IEmailLog>;
|
|
319
|
+
htmlBodyFile?: IEmailLog;
|
|
306
320
|
parent?: IEmail;
|
|
307
321
|
children?: ICollection<IEmail>;
|
|
308
322
|
forwarded?: IEmail;
|
|
309
323
|
forwards?: ICollection<IEmail>;
|
|
310
324
|
attachments?: ICollection<IAppFile>;
|
|
311
325
|
engagements?: ICollection<IEmailEngagement>;
|
|
312
|
-
logs?: ICollection<IEmailLog>;
|
|
313
326
|
recipients?: ICollection<IEmailRecipient>;
|
|
314
327
|
emailTags?: ICollection<IEmailTag>;
|
|
315
328
|
mailboxes?: ICollection<IMailboxEmail>;
|
|
@@ -320,7 +333,7 @@ export interface IEmail extends IClrEntity {
|
|
|
320
333
|
|
|
321
334
|
export const EmailStatusArray = [{"label":"queued","value":"queued"},{"label":"received","value":"received"},{"label":"draft","value":"draft"},{"label":"published","value":"published"},{"label":"pending-approval","value":"pending-approval"},{"label":"scheduled","value":"scheduled"},{"label":"sent","value":"sent"},{"label":"sent-failed","value":"sent-failed"},{"label":"deleted","value":"deleted"}];
|
|
322
335
|
|
|
323
|
-
export const Email: IModel<IEmail> = new Model<IEmail>("Email", ["emailID"], { senderName: "",received: false,dateReceived: new DefaultFactory(() => new DateTime()),dateCreated: new DefaultFactory(() => new DateTime()),status: "queued",forwardCount: 0,replyCount: 0,viewCount: 0,originalFileSize: 0 });
|
|
336
|
+
export const Email: IModel<IEmail> = new Model<IEmail>("Email", ["emailID"], { senderName: "",received: false,dateReceived: new DefaultFactory(() => new DateTime()),dateCreated: new DefaultFactory(() => new DateTime()),status: "queued",forwardCount: 0,replyCount: 0,viewCount: 0,emailSize: 0,originalFileSize: 0 });
|
|
324
337
|
|
|
325
338
|
export interface IEmailEngagement extends IClrEntity {
|
|
326
339
|
emailID?: number;
|
|
@@ -329,30 +342,33 @@ export interface IEmailEngagement extends IClrEntity {
|
|
|
329
342
|
email?: IEmail;
|
|
330
343
|
}
|
|
331
344
|
|
|
332
|
-
export const EmailEngagement: IModel<IEmailEngagement> = new Model<IEmailEngagement>("EmailEngagement", ["emailID"], {
|
|
345
|
+
export const EmailEngagement: IModel<IEmailEngagement> = new Model<IEmailEngagement>("EmailEngagement", ["emailID","engagement"], { count: 0 });
|
|
333
346
|
|
|
334
347
|
export interface IEmailLog extends IClrEntity {
|
|
335
348
|
readonly logID?: number;
|
|
336
349
|
emailID?: number;
|
|
337
350
|
fileName?: string;
|
|
351
|
+
fileSize?: number;
|
|
338
352
|
compression?: string;
|
|
339
353
|
dateCreated?: DateTime;
|
|
340
354
|
cloudPath?: string;
|
|
341
355
|
url?: string;
|
|
342
356
|
email?: IEmail;
|
|
357
|
+
mimeFileEmails?: ICollection<IEmail>;
|
|
358
|
+
htmlBodyFileEmails?: ICollection<IEmail>;
|
|
343
359
|
}
|
|
344
360
|
|
|
345
|
-
export const EmailLog: IModel<IEmailLog> = new Model<IEmailLog>("EmailLog", ["logID"], { fileName: "",compression: "",dateCreated: new DefaultFactory(() => new DateTime()),cloudPath: "" });
|
|
361
|
+
export const EmailLog: IModel<IEmailLog> = new Model<IEmailLog>("EmailLog", ["logID"], { fileName: "",fileSize: 0,compression: "",dateCreated: new DefaultFactory(() => new DateTime()),cloudPath: "" });
|
|
346
362
|
|
|
347
363
|
export interface IEmailRecipient extends IClrEntity {
|
|
348
364
|
emailID?: number;
|
|
349
365
|
emailAddressID?: number;
|
|
350
366
|
type?: "from" | "to" | "cc" | "bcc" | "viewer" | "editor";
|
|
351
367
|
name?: string | null;
|
|
352
|
-
replyTo?: string | null;
|
|
353
368
|
dateSent?: DateTime | null;
|
|
354
369
|
error?: string | null;
|
|
355
370
|
status?: string | null;
|
|
371
|
+
replyTo?: string | null;
|
|
356
372
|
emailAddressText?: string;
|
|
357
373
|
email?: IEmail;
|
|
358
374
|
emailAddress?: IEmailAddress;
|
|
@@ -520,9 +536,9 @@ export interface IMailboxSyncTarget extends IClrEntity {
|
|
|
520
536
|
lastSync?: DateTime | null;
|
|
521
537
|
lastSyncStatus?: "none" | "success" | "failed" | null;
|
|
522
538
|
lastSyncError?: string | null;
|
|
523
|
-
syncLog?: string;
|
|
524
539
|
/** Set this property to change password */
|
|
525
540
|
newPassword?: string;
|
|
541
|
+
syncLog?: string;
|
|
526
542
|
mailbox?: IMailbox;
|
|
527
543
|
}
|
|
528
544
|
|
|
@@ -586,6 +602,101 @@ export interface ISearchWordIndex extends IClrEntity {
|
|
|
586
602
|
|
|
587
603
|
export const SearchWordIndex: IModel<ISearchWordIndex> = new Model<ISearchWordIndex>("SearchWordIndex", ["wordID","fileContentID"], { rank: 0 });
|
|
588
604
|
|
|
605
|
+
export interface IStore extends IClrEntity {
|
|
606
|
+
readonly storeID?: number;
|
|
607
|
+
name?: string;
|
|
608
|
+
storeUsers?: ICollection<IStoreUser>;
|
|
609
|
+
storeItems?: ICollection<IStoreItem>;
|
|
610
|
+
storeOrders?: ICollection<IStoreOrder>;
|
|
611
|
+
storeWebsites?: ICollection<IWebSiteStore>;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export const Store: IModel<IStore> = new Model<IStore>("Store", ["storeID"], { name: "" });
|
|
615
|
+
|
|
616
|
+
export interface IStoreUser extends IClrEntity {
|
|
617
|
+
storeID?: number;
|
|
618
|
+
userID?: number;
|
|
619
|
+
store?: IStore;
|
|
620
|
+
user?: IUser;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
export const StoreUser: IModel<IStoreUser> = new Model<IStoreUser>("StoreUser", ["storeID","userID"], { });
|
|
624
|
+
|
|
625
|
+
export interface IStoreItem extends IClrEntity {
|
|
626
|
+
readonly storeItemID?: number;
|
|
627
|
+
storeID?: number;
|
|
628
|
+
name?: string;
|
|
629
|
+
description?: string | null;
|
|
630
|
+
taxName?: string | null;
|
|
631
|
+
taxID?: string | null;
|
|
632
|
+
itemType?: string;
|
|
633
|
+
store?: IStore;
|
|
634
|
+
storeItemPrices?: ICollection<IStoreItemPrice>;
|
|
635
|
+
storeItemTags?: ICollection<IStoreItemTag>;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
export const StoreItem: IModel<IStoreItem> = new Model<IStoreItem>("StoreItem", ["storeItemID"], { name: "",itemType: "" });
|
|
639
|
+
|
|
640
|
+
export interface IStoreItemPrice extends IClrEntity {
|
|
641
|
+
readonly priceID?: number;
|
|
642
|
+
storeItemID?: number;
|
|
643
|
+
startDate?: DateTime;
|
|
644
|
+
endDate?: DateTime;
|
|
645
|
+
currency?: string;
|
|
646
|
+
amount?: number;
|
|
647
|
+
storeItem?: IStoreItem;
|
|
648
|
+
storeOrderItems?: ICollection<IStoreOrderItem>;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
export const StoreItemPrice: IModel<IStoreItemPrice> = new Model<IStoreItemPrice>("StoreItemPrice", ["priceID"], { startDate: new DefaultFactory(() => new DateTime()),endDate: new DefaultFactory(() => new DateTime()),currency: "",amount: 0 });
|
|
652
|
+
|
|
653
|
+
export interface IStoreOrder extends IClrEntity {
|
|
654
|
+
readonly orderID?: number;
|
|
655
|
+
storeID?: number;
|
|
656
|
+
customerID?: number | null;
|
|
657
|
+
externalCustomerID?: string | null;
|
|
658
|
+
customerTaxID?: string | null;
|
|
659
|
+
emailAddressID?: number | null;
|
|
660
|
+
orderNumber?: string;
|
|
661
|
+
dateCreated?: DateTime;
|
|
662
|
+
dateUpdated?: DateTime;
|
|
663
|
+
startDate?: DateTime | null;
|
|
664
|
+
endDate?: DateTime | null;
|
|
665
|
+
status?: "new" | "pending" | "paid" | "delivered" | "deleted";
|
|
666
|
+
store?: IStore;
|
|
667
|
+
customer?: IUser;
|
|
668
|
+
storeOrderItems?: ICollection<IStoreOrderItem>;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
export const StoreOrderStatusArray = [{"label":"new","value":"new"},{"label":"pending","value":"pending"},{"label":"paid","value":"paid"},{"label":"delivered","value":"delivered"},{"label":"deleted","value":"deleted"}];
|
|
672
|
+
|
|
673
|
+
export const StoreOrder: IModel<IStoreOrder> = new Model<IStoreOrder>("StoreOrder", ["orderID"], { orderNumber: "",dateCreated: new DefaultFactory(() => new DateTime()),dateUpdated: new DefaultFactory(() => new DateTime()),status: "new" });
|
|
674
|
+
|
|
675
|
+
export interface IStoreOrderItem extends IClrEntity {
|
|
676
|
+
readonly orderItemID?: number;
|
|
677
|
+
orderID?: number;
|
|
678
|
+
storeItemPriceID?: number;
|
|
679
|
+
sourceOrderItemID?: number | null;
|
|
680
|
+
quantity?: number;
|
|
681
|
+
amount?: number;
|
|
682
|
+
storeOrder?: IStoreOrder;
|
|
683
|
+
storeItemPrice?: IStoreItemPrice;
|
|
684
|
+
source?: IStoreOrderItem;
|
|
685
|
+
relatedOrderItems?: ICollection<IStoreOrderItem>;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
export const StoreOrderItem: IModel<IStoreOrderItem> = new Model<IStoreOrderItem>("StoreOrderItem", ["orderItemID"], { quantity: 0,amount: 0 });
|
|
689
|
+
|
|
690
|
+
export interface IStoreItemTag extends IClrEntity {
|
|
691
|
+
storeItemID?: number;
|
|
692
|
+
tagID?: number;
|
|
693
|
+
tagValue?: string | null;
|
|
694
|
+
storeItem?: IStoreItem;
|
|
695
|
+
tag?: ITag;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
export const StoreItemTag: IModel<IStoreItemTag> = new Model<IStoreItemTag>("StoreItemTag", ["storeItemID","tagID"], { });
|
|
699
|
+
|
|
589
700
|
export interface IUser extends IClrEntity {
|
|
590
701
|
readonly userID?: number;
|
|
591
702
|
userName?: string;
|
|
@@ -594,16 +705,23 @@ export interface IUser extends IClrEntity {
|
|
|
594
705
|
isExternal?: boolean;
|
|
595
706
|
readonly multiFactor?: boolean;
|
|
596
707
|
dateUpdated?: DateTime;
|
|
708
|
+
readonly storage?: number;
|
|
709
|
+
maxStorage?: number;
|
|
597
710
|
/** Save this to change password */
|
|
598
711
|
changePassword?: { oldPassword?: string;newPassword?: string;forceChangePasswordOnLogin?: boolean };
|
|
599
712
|
createFolder?: boolean;
|
|
713
|
+
createWebSite?: boolean;
|
|
714
|
+
autoEnableMF?: boolean;
|
|
600
715
|
createdFiles?: ICollection<IAppFile>;
|
|
601
716
|
sentEmails?: ICollection<IEmail>;
|
|
717
|
+
accessTokens?: ICollection<IAccessToken>;
|
|
602
718
|
versions?: ICollection<IAppFileVersion>;
|
|
603
719
|
sessions?: ICollection<ILoginSession>;
|
|
604
720
|
fileAccessList?: ICollection<IAppFileAccess>;
|
|
605
721
|
contacts?: ICollection<IContact>;
|
|
606
722
|
domainUsers?: ICollection<IDomainUser>;
|
|
723
|
+
stores?: ICollection<IStoreUser>;
|
|
724
|
+
storeOrders?: ICollection<IStoreOrder>;
|
|
607
725
|
pins?: ICollection<IUserPin>;
|
|
608
726
|
userPushSubscriptions?: ICollection<IUserPushSubscription>;
|
|
609
727
|
roles?: ICollection<IUserRole>;
|
|
@@ -614,7 +732,7 @@ export interface IUser extends IClrEntity {
|
|
|
614
732
|
|
|
615
733
|
export const UserStatusArray = [{"label":"active","value":"active"},{"label":"blocked","value":"blocked"},{"label":"locked","value":"locked"},{"label":"change-password","value":"change-password"},{"label":"external","value":"external"}];
|
|
616
734
|
|
|
617
|
-
export const User: IModel<IUser> = new Model<IUser>("User", ["userID"], { userName: "",displayName: "",status: "active",isExternal: false,multiFactor: false,dateUpdated: new DefaultFactory(() => new DateTime()) });
|
|
735
|
+
export const User: IModel<IUser> = new Model<IUser>("User", ["userID"], { userName: "",displayName: "",status: "active",isExternal: false,multiFactor: false,dateUpdated: new DefaultFactory(() => new DateTime()),storage: 0,maxStorage: 0 });
|
|
618
736
|
|
|
619
737
|
export interface IUserPin extends IClrEntity {
|
|
620
738
|
readonly pinID?: number;
|
|
@@ -660,7 +778,7 @@ export const UserMailbox: IModel<IUserMailbox> = new Model<IUserMailbox>("UserMa
|
|
|
660
778
|
export interface IUserAuthFactor extends IClrEntity {
|
|
661
779
|
readonly authFactorID?: number;
|
|
662
780
|
userID?: number;
|
|
663
|
-
method?: "totp" | "hotp" | "fido2" | "one-time";
|
|
781
|
+
method?: "totp" | "hotp" | "fido2" | "one-time" | "otp";
|
|
664
782
|
hint?: string | null;
|
|
665
783
|
verified?: boolean;
|
|
666
784
|
dateUpdated?: DateTime;
|
|
@@ -670,7 +788,7 @@ export interface IUserAuthFactor extends IClrEntity {
|
|
|
670
788
|
user?: IUser;
|
|
671
789
|
}
|
|
672
790
|
|
|
673
|
-
export const UserAuthFactorMethodArray = [{"label":"totp","value":"totp"},{"label":"hotp","value":"hotp"},{"label":"fido2","value":"fido2"},{"label":"one-time","value":"one-time"}];
|
|
791
|
+
export const UserAuthFactorMethodArray = [{"label":"totp","value":"totp"},{"label":"hotp","value":"hotp"},{"label":"fido2","value":"fido2"},{"label":"one-time","value":"one-time"},{"label":"otp","value":"otp"}];
|
|
674
792
|
|
|
675
793
|
export const UserAuthFactor: IModel<IUserAuthFactor> = new Model<IUserAuthFactor>("UserAuthFactor", ["authFactorID"], { method: "totp",verified: false,dateUpdated: new DefaultFactory(() => new DateTime()) });
|
|
676
794
|
|
|
@@ -678,15 +796,17 @@ export interface IWebSiteFolder extends IClrEntity {
|
|
|
678
796
|
folderID?: number;
|
|
679
797
|
currentVersionID?: number | null;
|
|
680
798
|
isStatic?: boolean;
|
|
681
|
-
isModified?: boolean;
|
|
682
799
|
isTemplate?: boolean;
|
|
800
|
+
isModified?: boolean;
|
|
801
|
+
sourceWebSiteID?: number | null;
|
|
683
802
|
folder?: IAppFile;
|
|
684
803
|
hosts?: ICollection<IWebSiteFolderHost>;
|
|
685
804
|
versions?: ICollection<IWebSiteFolderVersion>;
|
|
686
805
|
channels?: ICollection<IWebSiteChannel>;
|
|
806
|
+
websiteStores?: ICollection<IWebSiteStore>;
|
|
687
807
|
}
|
|
688
808
|
|
|
689
|
-
export const WebSiteFolder: IModel<IWebSiteFolder> = new Model<IWebSiteFolder>("WebSiteFolder", ["folderID"], { isStatic: false,isModified: false });
|
|
809
|
+
export const WebSiteFolder: IModel<IWebSiteFolder> = new Model<IWebSiteFolder>("WebSiteFolder", ["folderID"], { isStatic: false,isTemplate: false,isModified: false });
|
|
690
810
|
|
|
691
811
|
export interface IWebSiteFolderHost extends IClrEntity {
|
|
692
812
|
host?: string;
|
|
@@ -721,6 +841,15 @@ export interface IWebSiteChannel extends IClrEntity {
|
|
|
721
841
|
|
|
722
842
|
export const WebSiteChannel: IModel<IWebSiteChannel> = new Model<IWebSiteChannel>("WebSiteChannel", ["folderID","channelID"], { });
|
|
723
843
|
|
|
844
|
+
export interface IWebSiteStore extends IClrEntity {
|
|
845
|
+
folderID?: number;
|
|
846
|
+
storeID?: number;
|
|
847
|
+
website?: IWebSiteFolder;
|
|
848
|
+
store?: IStore;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
export const WebSiteStore: IModel<IWebSiteStore> = new Model<IWebSiteStore>("WebSiteStore", ["folderID","storeID"], { });
|
|
852
|
+
|
|
724
853
|
export interface ILoginSession extends IClrEntity {
|
|
725
854
|
readonly sessionID?: number;
|
|
726
855
|
userID?: number;
|
|
@@ -731,6 +860,7 @@ export interface ILoginSession extends IClrEntity {
|
|
|
731
860
|
deviceTokenType?: string | null;
|
|
732
861
|
userName?: string;
|
|
733
862
|
checkPassword?: string;
|
|
863
|
+
passwordIsAccessToken?: boolean;
|
|
734
864
|
newPassword?: string;
|
|
735
865
|
/** Multi Factor Auth Token */
|
|
736
866
|
timeToken?: string;
|
|
@@ -762,6 +892,7 @@ export interface ITag extends IClrEntity {
|
|
|
762
892
|
fileTags?: ICollection<IAppFileTag>;
|
|
763
893
|
emailTags?: ICollection<IEmailTag>;
|
|
764
894
|
mailboxContactTags?: ICollection<IMailboxContactTag>;
|
|
895
|
+
storeItemTags?: ICollection<IStoreItemTag>;
|
|
765
896
|
}
|
|
766
897
|
|
|
767
898
|
export const Tag: IModel<ITag> = new Model<ITag>("Tag", ["tagID"], { name: "",isSystemTag: false });
|
|
@@ -186,7 +186,10 @@ export default class LocalFileService extends TaskManager {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
if (file.size > 4 * 1024 * 1024) {
|
|
189
|
-
|
|
189
|
+
if (folder) {
|
|
190
|
+
extra ??= {};
|
|
191
|
+
extra.folder = folder;
|
|
192
|
+
}
|
|
190
193
|
return await this.uploadFileParts(file, extra, ct, progress);
|
|
191
194
|
}
|
|
192
195
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import DISingleton from "@web-atoms/core/dist/di/DISingleton";
|
|
2
|
+
import { Inject } from "@web-atoms/core/dist/di/Inject";
|
|
3
|
+
import EntityService from "../EntityService";
|
|
4
|
+
import { IStoreItem, StoreItem } from "../../model/model";
|
|
5
|
+
import { Sql } from "../../common/Sql";
|
|
6
|
+
|
|
7
|
+
@DISingleton()
|
|
8
|
+
export default class StoreItemService {
|
|
9
|
+
|
|
10
|
+
@Inject
|
|
11
|
+
entityService: EntityService;
|
|
12
|
+
|
|
13
|
+
get(id: any) {
|
|
14
|
+
return this.entityService.query(StoreItem)
|
|
15
|
+
.where({ id }, (p) => (x) => x.storeItemID === p.id)
|
|
16
|
+
.include((x) => [x.storeItemPrices, x.storeItemTags])
|
|
17
|
+
.firstOrDefault();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async list({
|
|
21
|
+
start = 0,
|
|
22
|
+
size = 100,
|
|
23
|
+
search = "",
|
|
24
|
+
storeID = void 0,
|
|
25
|
+
cancelToken
|
|
26
|
+
}) {
|
|
27
|
+
let q = this.entityService.query(StoreItem)
|
|
28
|
+
.where({ storeID }, (p) => (x) => x.storeID === p.storeID);
|
|
29
|
+
if (search) {
|
|
30
|
+
search = search + "%";
|
|
31
|
+
q = q.where({ search }, (p) => (x) => Sql.text.iLike(x.name, p.search)
|
|
32
|
+
|| Sql.text.iLike(x.description, p.search));
|
|
33
|
+
}
|
|
34
|
+
return q.orderByDescending((x) => x.storeItemID)
|
|
35
|
+
.toPagedList({
|
|
36
|
+
start,
|
|
37
|
+
size,
|
|
38
|
+
cancelToken
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async save(storeItem: IStoreItem) {
|
|
43
|
+
await this.entityService.save(storeItem, (x) =>
|
|
44
|
+
x.include((x) => x.storeItemPrices)
|
|
45
|
+
.include((x) => x.storeItemTags));
|
|
46
|
+
return storeItem;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import DISingleton from "@web-atoms/core/dist/di/DISingleton";
|
|
2
|
+
import { Inject } from "@web-atoms/core/dist/di/Inject";
|
|
3
|
+
import EntityService from "../EntityService";
|
|
4
|
+
import { IStoreOrder, StoreOrder } from "../../model/model";
|
|
5
|
+
import { Sql } from "../../common/Sql";
|
|
6
|
+
|
|
7
|
+
@DISingleton()
|
|
8
|
+
export default class StoreOrderService {
|
|
9
|
+
|
|
10
|
+
@Inject
|
|
11
|
+
entityService: EntityService;
|
|
12
|
+
|
|
13
|
+
get(orderID) {
|
|
14
|
+
return this.entityService.query(StoreOrder)
|
|
15
|
+
.where({ orderID }, (p) => (x) => x.orderID === p.orderID)
|
|
16
|
+
.include((x) => [
|
|
17
|
+
x.storeOrderItems.forEach((oi) => [oi.storeItemPrice.storeItem.store]),
|
|
18
|
+
x.customer
|
|
19
|
+
])
|
|
20
|
+
.firstOrDefault();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async list({
|
|
24
|
+
storeID = void 0,
|
|
25
|
+
start = 0,
|
|
26
|
+
size = 100,
|
|
27
|
+
search = "",
|
|
28
|
+
cancelToken = void 0
|
|
29
|
+
}) {
|
|
30
|
+
let q = this.entityService.query(StoreOrder)
|
|
31
|
+
.where({ storeID }, (p) => (x) => x.storeID === p.storeID);
|
|
32
|
+
|
|
33
|
+
if (search) {
|
|
34
|
+
search = search + "%";
|
|
35
|
+
q = q.where({ search }, (p) => (x) => Sql.text.iLike(x.customer.displayName, p.search)
|
|
36
|
+
|| x.storeOrderItems.some((oi) => Sql.text.iLike(oi.storeItemPrice.storeItem.name, p.search))
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return q
|
|
41
|
+
.orderByDescending((x) => x.orderID)
|
|
42
|
+
.toPagedList({
|
|
43
|
+
start,
|
|
44
|
+
size,
|
|
45
|
+
cancelToken
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async save(order: IStoreOrder) {
|
|
50
|
+
await this.entityService.save(order, (c) => c
|
|
51
|
+
.include((x) => x.storeOrderItems )
|
|
52
|
+
.thenInclude((x) => x.relatedOrderItems)
|
|
53
|
+
);
|
|
54
|
+
return order;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import DISingleton from "@web-atoms/core/dist/di/DISingleton";
|
|
2
|
+
import { Inject } from "@web-atoms/core/dist/di/Inject";
|
|
3
|
+
import EntityService from "../EntityService";
|
|
4
|
+
import { IStore, Store } from "../../model/model";
|
|
5
|
+
import { Sql } from "../../common/Sql";
|
|
6
|
+
|
|
7
|
+
@DISingleton()
|
|
8
|
+
export default class StoreService {
|
|
9
|
+
|
|
10
|
+
@Inject
|
|
11
|
+
private entityService: EntityService;
|
|
12
|
+
|
|
13
|
+
async get(storeID) {
|
|
14
|
+
return this.entityService.query(Store)
|
|
15
|
+
.where({ storeID }, (p) => (x) => x.storeID === p.storeID)
|
|
16
|
+
.include((x) => [x.storeUsers, x.storeWebsites.forEach((w) => w.website.folder)])
|
|
17
|
+
.firstOrDefault();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async top() {
|
|
21
|
+
const { items } = await this.stores({ size: 3, cancelToken: null });
|
|
22
|
+
return items;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async stores({
|
|
26
|
+
search = "",
|
|
27
|
+
start = 0,
|
|
28
|
+
size = 100,
|
|
29
|
+
cancelToken
|
|
30
|
+
}) {
|
|
31
|
+
let q = this.entityService.query(Store);
|
|
32
|
+
if (search) {
|
|
33
|
+
search = search + "%";
|
|
34
|
+
q = q.where({ search }, (p) => (x) => Sql.text.like(x.name, p.search));
|
|
35
|
+
}
|
|
36
|
+
return q
|
|
37
|
+
.orderByDescending((x) => x.storeID)
|
|
38
|
+
.toPagedList({
|
|
39
|
+
start,
|
|
40
|
+
size,
|
|
41
|
+
cancelToken
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async save(store: IStore) {
|
|
46
|
+
await this.entityService.save(store, (x) => x);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
@@ -13,6 +13,7 @@ import { toFileSize } from "../../common/NumberFormats";
|
|
|
13
13
|
import Action from "@web-atoms/core/dist/view-model/Action";
|
|
14
14
|
import CommonCommands from "../../common/commands/CommonCommands";
|
|
15
15
|
import LoginService from "../../services/LoginService";
|
|
16
|
+
import StoreService from "../../services/store/StoreService";
|
|
16
17
|
|
|
17
18
|
const css = styled.css `
|
|
18
19
|
min-width: 300px;
|
|
@@ -49,7 +50,7 @@ export default class AppDrawer extends Drawer {
|
|
|
49
50
|
|
|
50
51
|
this.user = SocialMailApp.user;
|
|
51
52
|
|
|
52
|
-
const { mailboxes, channels, drives, websites } = await this.getItems();
|
|
53
|
+
const { mailboxes, channels, drives, websites, stores } = await this.getItems();
|
|
53
54
|
|
|
54
55
|
this.renderer = <div>
|
|
55
56
|
<div
|
|
@@ -128,6 +129,17 @@ export default class AppDrawer extends Drawer {
|
|
|
128
129
|
commandLink={AppCommands.openWebSiteList.displayRoute({})}
|
|
129
130
|
/>
|
|
130
131
|
</ExpanderMenu> }
|
|
132
|
+
{stores.length && <ExpanderMenu isExpanded={false}>
|
|
133
|
+
<MenuItem
|
|
134
|
+
icon="fas fa-dollar"
|
|
135
|
+
label="Stores"
|
|
136
|
+
commandLink={null}
|
|
137
|
+
/>
|
|
138
|
+
{ ... stores.map((s) => <MenuItem
|
|
139
|
+
label={s.name}
|
|
140
|
+
commandLink={AppCommands.editStore.displayRoute({ id: s.storeID})}
|
|
141
|
+
/>)}
|
|
142
|
+
</ExpanderMenu>}
|
|
131
143
|
{ mailboxes.length && <MenuItem
|
|
132
144
|
icon="fas fa-money-check-pen"
|
|
133
145
|
label="Templates"
|
|
@@ -174,13 +186,15 @@ export default class AppDrawer extends Drawer {
|
|
|
174
186
|
async getItems() {
|
|
175
187
|
const ms = this.resolve(MailboxService);
|
|
176
188
|
const fs = this.resolve(CloudFileService);
|
|
177
|
-
const
|
|
189
|
+
const ss = this.resolve(StoreService);
|
|
190
|
+
const [mailboxes, channels, drives, websites, stores] = await Promise.all([
|
|
178
191
|
ms.top(),
|
|
179
192
|
ms.top({ isChannel: true }),
|
|
180
193
|
fs.top(),
|
|
181
|
-
fs.top(true)
|
|
194
|
+
fs.top(true),
|
|
195
|
+
ss.top()
|
|
182
196
|
]);
|
|
183
|
-
return { mailboxes, channels, drives, websites };
|
|
197
|
+
return { mailboxes, channels, drives, websites, stores };
|
|
184
198
|
}
|
|
185
199
|
|
|
186
200
|
@Action({ onEvent: "user-logout"})
|
|
@@ -156,7 +156,7 @@ export default class ChannelDetailPage extends ContentPage {
|
|
|
156
156
|
label="Details"
|
|
157
157
|
/>
|
|
158
158
|
<MenuItem
|
|
159
|
-
href={ apiPath(`/api/
|
|
159
|
+
href={ apiPath(`/api/emails/logs//${email.mimeFileID}/${email.emailID}.eml`)}
|
|
160
160
|
icon="fas fa-download"
|
|
161
161
|
label="Download"
|
|
162
162
|
/>
|
|
@@ -50,6 +50,7 @@ export default class CloudFileService {
|
|
|
50
50
|
size = 50,
|
|
51
51
|
search = "",
|
|
52
52
|
version = 1,
|
|
53
|
+
contentType = void 0 as string,
|
|
53
54
|
cancelToken
|
|
54
55
|
}) {
|
|
55
56
|
const userID = SocialMailApp.user.userID;
|
|
@@ -58,6 +59,9 @@ export default class CloudFileService {
|
|
|
58
59
|
if (search) {
|
|
59
60
|
q = q.where({ search }, (p) => (x) => Sql.text.includes(x.creator.userName, p.search));
|
|
60
61
|
}
|
|
62
|
+
if (contentType) {
|
|
63
|
+
q = q.where({ contentType }, (p) => (x) => x.contentType === p.contentType);
|
|
64
|
+
}
|
|
61
65
|
return q.include((x) => x.creator)
|
|
62
66
|
.orderByDescending({userID} , (p) => (x) => x.userPins.some((s) => p.userID === s.userID))
|
|
63
67
|
.thenByDescending((x) => x.fileSize)
|
|
@@ -164,7 +164,7 @@ export default class ConversationService {
|
|
|
164
164
|
q = q.where({ search }, (p) => (x) =>
|
|
165
165
|
Sql.text.iLike(x.email.subject, p.search)
|
|
166
166
|
|| Sql.text.iLike(x.email.textBody, p.search)
|
|
167
|
-
|| Sql.text.iLike(
|
|
167
|
+
|| x.email.attachments.some((a) => Sql.text.iLike(a.fileContent.textDocument.searchable, p.search))
|
|
168
168
|
);
|
|
169
169
|
}
|
|
170
170
|
const emails = await q
|
|
@@ -56,14 +56,8 @@ export default class MailService {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
async raw(email: IEmail) {
|
|
59
|
-
const { mimeFileID
|
|
60
|
-
|
|
61
|
-
if (mimeFileID) {
|
|
62
|
-
return FetchBuilder.get( apiPath(`/api/emails/logs/${mimeFileID}/${email.emailID}.eml`)).responseAsText();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const file = await this.entityService.query(AppFile).where({ originalFileID }, (p) => (x) => x.appFileID === p.originalFileID).firstOrDefault();
|
|
66
|
-
return FetchBuilder.get(file.url).responseAsText();
|
|
59
|
+
const { mimeFileID } = email;
|
|
60
|
+
return FetchBuilder.get( apiPath(`/api/emails/logs/${mimeFileID}/${email.emailID}.eml`)).responseAsText();
|
|
67
61
|
}
|
|
68
62
|
|
|
69
63
|
async send(email: IEmail) {
|