@social-mail/social-mail-web-server 1.5.415 → 1.5.416
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/Mailto.d.ts +17 -0
- package/dist/common/Mailto.d.ts.map +1 -0
- package/dist/common/Mailto.js +27 -0
- package/dist/common/Mailto.js.map +1 -0
- package/dist/common/cacheFor.d.ts +10 -1
- package/dist/common/cacheFor.d.ts.map +1 -1
- package/dist/common/cacheFor.js +18 -2
- package/dist/common/cacheFor.js.map +1 -1
- package/dist/server/model/SocialMailContext.d.ts +2 -0
- package/dist/server/model/SocialMailContext.d.ts.map +1 -1
- package/dist/server/model/SocialMailContext.js +2 -0
- package/dist/server/model/SocialMailContext.js.map +1 -1
- package/dist/server/model/SocialMailContextEvents.d.ts.map +1 -1
- package/dist/server/model/SocialMailContextEvents.js +3 -0
- package/dist/server/model/SocialMailContextEvents.js.map +1 -1
- package/dist/server/model/entities/Email.d.ts +2 -0
- package/dist/server/model/entities/Email.d.ts.map +1 -1
- package/dist/server/model/entities/Email.js.map +1 -1
- package/dist/server/model/entities/EmailAddress.d.ts +2 -0
- package/dist/server/model/entities/EmailAddress.d.ts.map +1 -1
- package/dist/server/model/entities/EmailAddress.js.map +1 -1
- package/dist/server/model/entities/EmailRecipient.d.ts +1 -1
- package/dist/server/model/entities/EmailRecipient.d.ts.map +1 -1
- package/dist/server/model/entities/EmailRecipient.js +2 -2
- package/dist/server/model/entities/EmailRecipient.js.map +1 -1
- package/dist/server/model/entities/Mailbox.d.ts +1 -0
- package/dist/server/model/entities/Mailbox.d.ts.map +1 -1
- package/dist/server/model/entities/Mailbox.js +4 -0
- package/dist/server/model/entities/Mailbox.js.map +1 -1
- package/dist/server/model/entities/ThreadParticipant.d.ts +22 -0
- package/dist/server/model/entities/ThreadParticipant.d.ts.map +1 -0
- package/dist/server/model/entities/ThreadParticipant.js +53 -0
- package/dist/server/model/entities/ThreadParticipant.js.map +1 -0
- package/dist/server/model/events/EmailEvents.d.ts.map +1 -1
- package/dist/server/model/events/EmailEvents.js +17 -7
- package/dist/server/model/events/EmailEvents.js.map +1 -1
- package/dist/server/model/events/MailboxEvents.d.ts.map +1 -1
- package/dist/server/model/events/MailboxEvents.js +2 -0
- package/dist/server/model/events/MailboxEvents.js.map +1 -1
- package/dist/server/model/events/ThreadParticipantEvents.d.ts +8 -0
- package/dist/server/model/events/ThreadParticipantEvents.d.ts.map +1 -0
- package/dist/server/model/events/ThreadParticipantEvents.js +19 -0
- package/dist/server/model/events/ThreadParticipantEvents.js.map +1 -0
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/services/EmailAddressService.d.ts +4 -2
- package/dist/server/services/EmailAddressService.d.ts.map +1 -1
- package/dist/server/services/EmailAddressService.js +4 -4
- package/dist/server/services/EmailAddressService.js.map +1 -1
- package/dist/server/services/StoreFileService.d.ts +3 -1
- package/dist/server/services/StoreFileService.d.ts.map +1 -1
- package/dist/server/services/StoreFileService.js.map +1 -1
- package/dist/server/services/TemplateExpander.js +1 -1
- package/dist/server/services/TemplateExpander.js.map +1 -1
- package/dist/server/services/accounts/sales/SalesInvoiceService.d.ts +3 -1
- package/dist/server/services/accounts/sales/SalesInvoiceService.d.ts.map +1 -1
- package/dist/server/services/accounts/sales/SalesInvoiceService.js.map +1 -1
- package/dist/server/services/channels/ChannelModerationService.d.ts +8 -0
- package/dist/server/services/channels/ChannelModerationService.d.ts.map +1 -0
- package/dist/server/{smtp/services/EmailThreadService.js → services/channels/ChannelModerationService.js} +19 -7
- package/dist/server/services/channels/ChannelModerationService.js.map +1 -0
- package/dist/server/services/dom/HtmlSanitizer.d.ts.map +1 -1
- package/dist/server/services/dom/HtmlSanitizer.js +7 -1
- package/dist/server/services/dom/HtmlSanitizer.js.map +1 -1
- package/dist/server/services/domain-keys/DomainKeyService.d.ts +3 -1
- package/dist/server/services/domain-keys/DomainKeyService.d.ts.map +1 -1
- package/dist/server/services/domain-keys/DomainKeyService.js.map +1 -1
- package/dist/server/services/files/FileAccessService.d.ts +3 -1
- package/dist/server/services/files/FileAccessService.d.ts.map +1 -1
- package/dist/server/services/files/FileAccessService.js +0 -2
- package/dist/server/services/files/FileAccessService.js.map +1 -1
- package/dist/server/services/files/SnapshotService.d.ts +3 -1
- package/dist/server/services/files/SnapshotService.d.ts.map +1 -1
- package/dist/server/services/files/SnapshotService.js.map +1 -1
- package/dist/server/services/files/WebSiteService.d.ts +3 -1
- package/dist/server/services/files/WebSiteService.d.ts.map +1 -1
- package/dist/server/services/files/WebSiteService.js.map +1 -1
- package/dist/server/services/store/StoreConfigService.d.ts +3 -1
- package/dist/server/services/store/StoreConfigService.d.ts.map +1 -1
- package/dist/server/services/store/StoreConfigService.js.map +1 -1
- package/dist/server/services/threads/EmailThreadService.d.ts +7 -0
- package/dist/server/services/threads/EmailThreadService.d.ts.map +1 -0
- package/dist/server/services/threads/EmailThreadService.js +45 -0
- package/dist/server/services/threads/EmailThreadService.js.map +1 -0
- package/dist/server/smtp/dns/DnsService.d.ts +3 -1
- package/dist/server/smtp/dns/DnsService.d.ts.map +1 -1
- package/dist/server/smtp/dns/DnsService.js.map +1 -1
- package/dist/server/smtp/services/AccessTokenService.d.ts +4 -2
- package/dist/server/smtp/services/AccessTokenService.d.ts.map +1 -1
- package/dist/server/smtp/services/AccessTokenService.js +23 -28
- package/dist/server/smtp/services/AccessTokenService.js.map +1 -1
- package/dist/server/smtp/services/CachedEmailService.d.ts.map +1 -1
- package/dist/server/smtp/services/CachedEmailService.js +6 -1
- package/dist/server/smtp/services/CachedEmailService.js.map +1 -1
- package/dist/server/smtp/services/EmailPostReceiveService.d.ts +8 -0
- package/dist/server/smtp/services/EmailPostReceiveService.d.ts.map +1 -1
- package/dist/server/smtp/services/EmailPostReceiveService.js +48 -6
- package/dist/server/smtp/services/EmailPostReceiveService.js.map +1 -1
- package/dist/server/smtp/services/EngagementService.d.ts.map +1 -1
- package/dist/server/smtp/services/EngagementService.js +5 -0
- package/dist/server/smtp/services/EngagementService.js.map +1 -1
- package/dist/server/smtp/services/WebSiteChannelService.d.ts +3 -3
- package/dist/server/smtp/services/WebSiteChannelService.d.ts.map +1 -1
- package/dist/server/smtp/services/WebSiteChannelService.js +27 -26
- package/dist/server/smtp/services/WebSiteChannelService.js.map +1 -1
- package/dist/server/storage/TempFileService.d.ts.map +1 -1
- package/dist/server/storage/TempFileService.js +7 -2
- package/dist/server/storage/TempFileService.js.map +1 -1
- package/dist/server/templates/channel/SubscriberRequested.d.ts.map +1 -1
- package/dist/server/templates/channel/SubscriberRequested.js +5 -1
- package/dist/server/templates/channel/SubscriberRequested.js.map +1 -1
- package/dist/server/workflows/pending/PendingPostReceiveWorkflow.d.ts.map +1 -1
- package/dist/server/workflows/pending/PendingPostReceiveWorkflow.js +3 -14
- package/dist/server/workflows/pending/PendingPostReceiveWorkflow.js.map +1 -1
- package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts +3 -1
- package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts.map +1 -1
- package/dist/server/workflows/smtp/DispatchEmailToMX.js +30 -4
- package/dist/server/workflows/smtp/DispatchEmailToMX.js.map +1 -1
- package/dist/server/workflows/smtp/MailDispatcherService.d.ts.map +1 -1
- package/dist/server/workflows/smtp/MailDispatcherService.js +5 -1
- package/dist/server/workflows/smtp/MailDispatcherService.js.map +1 -1
- package/dist/server/workflows/smtp/PrepareEmailToSend.d.ts +3 -1
- package/dist/server/workflows/smtp/PrepareEmailToSend.d.ts.map +1 -1
- package/dist/server/workflows/smtp/PrepareEmailToSend.js +15 -4
- package/dist/server/workflows/smtp/PrepareEmailToSend.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/@[channel]/[slug]/index.js +4 -4
- package/dist/wwwroot/routes/@[channel]/[slug]/index.js.map +1 -1
- package/dist/wwwroot/routes/api/site/snapshot/index.d.ts.map +1 -1
- package/dist/wwwroot/routes/api/site/snapshot/index.js.map +1 -1
- package/package.json +3 -3
- package/src/common/Mailto.ts +39 -0
- package/src/common/cacheFor.ts +26 -4
- package/src/server/model/SocialMailContext.ts +3 -0
- package/src/server/model/SocialMailContextEvents.ts +4 -0
- package/src/server/model/entities/Email.ts +2 -0
- package/src/server/model/entities/EmailAddress.ts +2 -0
- package/src/server/model/entities/EmailRecipient.ts +2 -2
- package/src/server/model/entities/Mailbox.ts +3 -0
- package/src/server/model/entities/ThreadParticipant.ts +45 -0
- package/src/server/model/events/EmailEvents.ts +19 -7
- package/src/server/model/events/MailboxEvents.ts +2 -0
- package/src/server/model/events/ThreadParticipantEvents.ts +27 -0
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/services/EmailAddressService.ts +8 -5
- package/src/server/services/StoreFileService.ts +6 -2
- package/src/server/services/TemplateExpander.ts +1 -1
- package/src/server/services/accounts/sales/SalesInvoiceService.ts +5 -2
- package/src/server/services/channels/ChannelModerationService.ts +27 -0
- package/src/server/services/dom/HtmlSanitizer.ts +7 -1
- package/src/server/services/domain-keys/DomainKeyService.ts +4 -2
- package/src/server/services/files/FileAccessService.ts +4 -5
- package/src/server/services/files/SnapshotService.ts +5 -2
- package/src/server/services/files/WebSiteService.ts +5 -2
- package/src/server/services/store/StoreConfigService.ts +5 -2
- package/src/server/services/tags/TagService.ts +1 -1
- package/src/server/services/threads/EmailThreadService.ts +39 -0
- package/src/server/smtp/dns/DnsService.ts +4 -3
- package/src/server/smtp/services/AccessTokenService.ts +20 -22
- package/src/server/smtp/services/CachedEmailService.ts +5 -1
- package/src/server/smtp/services/EmailPostReceiveService.ts +54 -9
- package/src/server/smtp/services/EngagementService.ts +6 -0
- package/src/server/smtp/services/WebSiteChannelService.ts +17 -17
- package/src/server/storage/TempFileService.ts +7 -2
- package/src/server/templates/channel/SubscriberRequested.tsx +5 -1
- package/src/server/workflows/pending/PendingPostReceiveWorkflow.ts +3 -16
- package/src/server/workflows/smtp/DispatchEmailToMX.ts +33 -3
- package/src/server/workflows/smtp/MailDispatcherService.ts +6 -1
- package/src/server/workflows/smtp/PrepareEmailToSend.ts +16 -3
- package/src/wwwroot/routes/@[channel]/[slug]/index.tsx +4 -4
- package/src/wwwroot/routes/api/site/snapshot/index.ts +1 -0
- package/dist/server/smtp/services/EmailThreadService.d.ts +0 -7
- package/dist/server/smtp/services/EmailThreadService.d.ts.map +0 -1
- package/dist/server/smtp/services/EmailThreadService.js.map +0 -1
- package/src/server/smtp/services/EmailThreadService.ts +0 -15
|
@@ -61,13 +61,13 @@ export default class default_1 extends Page {
|
|
|
61
61
|
const { meta } = await this.channelPageService.getEmailMeta(host, this.request.URL.toString(), mb.mailboxID, mb.emailID);
|
|
62
62
|
if (meta?.length) {
|
|
63
63
|
body = body.replace(/\<head[^\>]*\>/, (s, v) => {
|
|
64
|
-
return s + meta.map((x) => x.render()).join("\r\n");
|
|
64
|
+
return s + meta.map((x) => x.render()).join("\r\n") + "\r\n";
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
-
body = body.replace(/\<head[^\>]*\>/, (s, v) => {
|
|
68
|
-
return s + `<script>var socialMail = ${socialMail};</script>`;
|
|
69
|
-
});
|
|
70
67
|
}
|
|
68
|
+
body = body.replace(/\<head[^\>]*\>/, (s, v) => {
|
|
69
|
+
return s + `\r\n<script>var socialMail = ${socialMail};</script>\r\n`;
|
|
70
|
+
});
|
|
71
71
|
// const body = await this.channelPageService.modifyPage({
|
|
72
72
|
// host,
|
|
73
73
|
// url: this.request.URL.toString(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/wwwroot/routes/@[channel]/[slug]/index.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/wwwroot/routes/@[channel]/[slug]/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/site/snapshot/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,IAAI,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/site/snapshot/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAW5D;;;;GAIG;AAEH,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,OAAO,CAAC,EAAE,CAAoB;IAG9B,OAAO,CAAC,cAAc,CAAiB;IAGvC,OAAO,CAAC,YAAY,CAAe;IAGnC,OAAO,CAAC,WAAW,CAAqB;IAGxC,OAAO,CAAC,GAAG,CAAkB;IAEvB,GAAG;IAwDH,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;CA+ChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/site/snapshot/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,iBAAiB,MAAM,kDAAkD,CAAC;AACjF,OAAO,cAAc,MAAM,wDAAwD,CAAC;AACpF,OAAO,eAAe,MAAM,kDAAkD,CAAC;AAC/E,OAAO,qBAAqB,MAAM,yEAAyE,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAC7E,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D,OAAO,GAAG,MAAM,8CAA8C,CAAC;AAC/D,OAAO,kBAAkB,MAAM,mEAAmE,CAAC;AACnG,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,YAAY,MAAM,sDAAsD,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,UAAU,MAAM,8DAA8D,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/wwwroot/routes/api/site/snapshot/index.ts"],"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.5.
|
|
3
|
+
"version": "1.5.416",
|
|
4
4
|
"description": "## Phase 1",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@aws-sdk/client-s3": "^3.609.0",
|
|
23
23
|
"@azure/storage-blob": "^12.25.0",
|
|
24
|
-
"@entity-access/entity-access": "^1.0.
|
|
25
|
-
"@entity-access/server-pages": "^1.1.
|
|
24
|
+
"@entity-access/entity-access": "^1.0.380",
|
|
25
|
+
"@entity-access/server-pages": "^1.1.335",
|
|
26
26
|
"@ffmpeg/core-mt": "^0.12.6",
|
|
27
27
|
"@ffmpeg/ffmpeg": "^0.12.10",
|
|
28
28
|
"@ffmpeg/util": "^0.12.1",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const Mailto = {
|
|
2
|
+
|
|
3
|
+
templateLink({emoji}) {
|
|
4
|
+
return `mailto:[{senderEmail}]?subject=${emoji}:[{uid}]:[{accessCode}]`;
|
|
5
|
+
},
|
|
6
|
+
|
|
7
|
+
create({
|
|
8
|
+
subject = "",
|
|
9
|
+
command = void 0 as {
|
|
10
|
+
emoji: string,
|
|
11
|
+
messageID: string,
|
|
12
|
+
uid?: string,
|
|
13
|
+
},
|
|
14
|
+
to = "",
|
|
15
|
+
body = "",
|
|
16
|
+
inReplyTo = ""
|
|
17
|
+
}) {
|
|
18
|
+
const usp = new URLSearchParams();
|
|
19
|
+
if (command) {
|
|
20
|
+
const { emoji, messageID } = command;
|
|
21
|
+
let { uid = "0" } = command;
|
|
22
|
+
if (uid) {
|
|
23
|
+
uid = uid + ":";
|
|
24
|
+
}
|
|
25
|
+
subject = `${emoji}:${uid}${messageID}:${subject}`;
|
|
26
|
+
}
|
|
27
|
+
if (subject) {
|
|
28
|
+
usp.append("subject", subject);
|
|
29
|
+
}
|
|
30
|
+
if (body) {
|
|
31
|
+
usp.append("body", body);
|
|
32
|
+
}
|
|
33
|
+
if (inReplyTo) {
|
|
34
|
+
usp.append("in-reply-to", inReplyTo);
|
|
35
|
+
}
|
|
36
|
+
return `mailto:${to}?${usp.toString()}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
};
|
package/src/common/cacheFor.ts
CHANGED
|
@@ -1,12 +1,34 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
import TimedCache from "@entity-access/entity-access/dist/common/cache/TimedCache.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
|
|
5
|
+
export class ObjectCache<T> {
|
|
6
|
+
|
|
7
|
+
private cache: Map<any, TimedCache> = new Map();
|
|
8
|
+
|
|
9
|
+
for(name: keyof T) {
|
|
10
|
+
let tc = this.cache.get(name);
|
|
11
|
+
if (!tc) {
|
|
12
|
+
tc = new TimedCache();
|
|
13
|
+
this.cache.set(name, tc);
|
|
14
|
+
}
|
|
15
|
+
return tc;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
clear(name: keyof T) {
|
|
19
|
+
this.cache.get(name)?.clear();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export interface ICacheContainer<T> {
|
|
24
|
+
cache: ObjectCache<T> | undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function cacheFor<T>() {
|
|
28
|
+
return function(target:ICacheContainer<T>, key) {
|
|
7
29
|
const oldMethod = target[key] as (... a: any[]) => any;
|
|
8
30
|
function value(... a: any[]) {
|
|
9
|
-
const cache
|
|
31
|
+
const cache = (this.cache ??= new ObjectCache()).get(key) as TimedCache;
|
|
10
32
|
const cacheKey = a.join();
|
|
11
33
|
const r = cache.getOrCreate(cacheKey, a, (k) => oldMethod.apply(this, a));
|
|
12
34
|
r?.catch((error) => {
|
|
@@ -71,6 +71,7 @@ import StoreCoupon from "./entities/StoreCoupon.js";
|
|
|
71
71
|
import StoreJournalCoupon from "./entities/StoreJournalCoupon.js";
|
|
72
72
|
import WebHook from "./entities/WebHook.js";
|
|
73
73
|
import WebHookEvent from "./entities/WebHookEvent.js";
|
|
74
|
+
import ThreadParticipant from "./entities/ThreadParticipant.js";
|
|
74
75
|
|
|
75
76
|
@RegisterScoped
|
|
76
77
|
export default class SocialMailContext extends EntityContext {
|
|
@@ -247,6 +248,8 @@ export default class SocialMailContext extends EntityContext {
|
|
|
247
248
|
|
|
248
249
|
public emailAddressNames = this.model.register(EmailAddressName);
|
|
249
250
|
|
|
251
|
+
public threadParticipants = this.model.register(ThreadParticipant);
|
|
252
|
+
|
|
250
253
|
public tags = this.model.register(Tag);
|
|
251
254
|
|
|
252
255
|
}
|
|
@@ -129,6 +129,8 @@ import WebHook from "./entities/WebHook.js";
|
|
|
129
129
|
import WebHookEvents from "./events/WebHookEvents.js";
|
|
130
130
|
import WebHookEvent from "./entities/WebHookEvent.js";
|
|
131
131
|
import WebHookEventEvents from "./events/WebHookEventEvents.js";
|
|
132
|
+
import ThreadParticipant from "./entities/ThreadParticipant.js";
|
|
133
|
+
import ThreadParticipantEvents from "./events/ThreadParticipantEvents.js";
|
|
132
134
|
|
|
133
135
|
|
|
134
136
|
@RegisterSingleton
|
|
@@ -219,6 +221,8 @@ export default class SocialMailContextEvents extends ContextEvents {
|
|
|
219
221
|
this.register(WebHook, WebHookEvents);
|
|
220
222
|
this.register(WebHookEvent, WebHookEventEvents);
|
|
221
223
|
|
|
224
|
+
this.register(ThreadParticipant, ThreadParticipantEvents);
|
|
225
|
+
|
|
222
226
|
}
|
|
223
227
|
|
|
224
228
|
}
|
|
@@ -19,6 +19,7 @@ import type EmailEngagement from "./EmailEngagement.js";
|
|
|
19
19
|
import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
|
|
20
20
|
import { apiPath } from "../../../common/globalEnv.js";
|
|
21
21
|
import type MailboxContactEvent from "./MailboxContactEvent.js";
|
|
22
|
+
import type ThreadParticipant from "./ThreadParticipant.js";
|
|
22
23
|
|
|
23
24
|
const emailStatuses = [ "queued", "received", "draft", "published", "pending-approval", "scheduled", "sent", "sent-failed", "deleted", "closed"] as const;
|
|
24
25
|
export type emailStatusType = typeof emailStatuses[number];
|
|
@@ -298,6 +299,7 @@ export class Email {
|
|
|
298
299
|
|
|
299
300
|
public engagements: EmailEngagement[];
|
|
300
301
|
mailboxContactEvents: MailboxContactEvent[];
|
|
302
|
+
threadParticipants: ThreadParticipant[];
|
|
301
303
|
}
|
|
302
304
|
|
|
303
305
|
@Table("EmailLogs")
|
|
@@ -11,6 +11,7 @@ import type { ContactEmail } from "./Contact.js";
|
|
|
11
11
|
import type SubscriberActivity from "./SubscriberActivity.js";
|
|
12
12
|
import type EmailAddressName from "./EmailAddressName.js";
|
|
13
13
|
import type StoreAccountEmail from "./StoreAccountEmail.js";
|
|
14
|
+
import type ThreadParticipant from "./ThreadParticipant.js";
|
|
14
15
|
|
|
15
16
|
@Table("EmailAddresses")
|
|
16
17
|
@Index({
|
|
@@ -54,5 +55,6 @@ export default class EmailAddress {
|
|
|
54
55
|
public subscriberActivities: SubscriberActivity[];
|
|
55
56
|
names: EmailAddressName[];
|
|
56
57
|
storeAccounts: StoreAccountEmail[];
|
|
58
|
+
threadParticipants: ThreadParticipant[];
|
|
57
59
|
|
|
58
60
|
}
|
|
@@ -6,7 +6,7 @@ import EmailAddress from "./EmailAddress.js";
|
|
|
6
6
|
import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
|
|
7
7
|
import { JsonProperty } from "@entity-access/server-pages/dist/services/ModelService.js";
|
|
8
8
|
|
|
9
|
-
const emailRecipientTypes = [ "from", "to", "cc", "bcc", "viewer", "editor"] as const;
|
|
9
|
+
const emailRecipientTypes = [ "from", "to", "cc", "bcc", "viewer", "editor", "unsubscribed"] as const;
|
|
10
10
|
export type emailRecipientType = typeof emailRecipientTypes[number];
|
|
11
11
|
|
|
12
12
|
@Table("EmailRecipients")
|
|
@@ -33,7 +33,7 @@ export default class EmailRecipient {
|
|
|
33
33
|
})
|
|
34
34
|
public emailAddressID: number;
|
|
35
35
|
|
|
36
|
-
@Column({ dataType: "Char", length:
|
|
36
|
+
@Column({ dataType: "Char", length: 20, enum: emailRecipientTypes })
|
|
37
37
|
public type: emailRecipientType;
|
|
38
38
|
|
|
39
39
|
@Column({ dataType: "Char", length: 200, nullable: true })
|
|
@@ -156,6 +156,9 @@ export default class Mailbox {
|
|
|
156
156
|
@Column({ dataType: "Boolean", default: () => true })
|
|
157
157
|
public requiresCommentModeration: boolean;
|
|
158
158
|
|
|
159
|
+
@Column({ dataType: "Boolean", default: () => true })
|
|
160
|
+
public requiresSignup: boolean;
|
|
161
|
+
|
|
159
162
|
@Column({ dataType: "Int", default: () => 0 })
|
|
160
163
|
public subscriberCount: number;
|
|
161
164
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Column from "@entity-access/entity-access/dist/decorators/Column.js";
|
|
2
|
+
import { RelateTo } from "@entity-access/entity-access/dist/decorators/Relate.js";
|
|
3
|
+
import Table from "@entity-access/entity-access/dist/decorators/Table.js";
|
|
4
|
+
import { Email } from "./Email.js";
|
|
5
|
+
import EmailAddress from "./EmailAddress.js";
|
|
6
|
+
import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
|
|
7
|
+
import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* This class is a separate entity instead of using EmailRecipient,
|
|
11
|
+
* the reason is, for simplicity and faster index.
|
|
12
|
+
*
|
|
13
|
+
* 1. As EmailRecipients will be serialized for every email through JSON
|
|
14
|
+
* 2. Adding filter to remove participants will be extra pressure on database
|
|
15
|
+
* 3. Thread Participant may only exist at top thread.
|
|
16
|
+
* 4. Normal email communication will not involve thread participants.
|
|
17
|
+
* 5. This can further include fields related to Projects and other
|
|
18
|
+
* Task Management related data such as assignee etc. Which will make
|
|
19
|
+
* EmailRecipient simpler.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
@Table("ThreadParticipants")
|
|
23
|
+
export default class ThreadParticipant {
|
|
24
|
+
|
|
25
|
+
@Column({ dataType: "BigInt", key: true})
|
|
26
|
+
@RelateTo(Email, {
|
|
27
|
+
property: (x) => x.email,
|
|
28
|
+
inverseProperty: (x) => x.threadParticipants
|
|
29
|
+
})
|
|
30
|
+
emailID: number;
|
|
31
|
+
|
|
32
|
+
@Column({ dataType: "BigInt", key: true })
|
|
33
|
+
@RelateTo(EmailAddress, {
|
|
34
|
+
property: (x) => x.emailAddress,
|
|
35
|
+
inverseProperty: (x) => x.threadParticipants
|
|
36
|
+
})
|
|
37
|
+
emailAddressID: number;
|
|
38
|
+
|
|
39
|
+
@Column({ dataType: "Boolean", default: () => false})
|
|
40
|
+
unsubscribed: boolean;
|
|
41
|
+
|
|
42
|
+
email: Email;
|
|
43
|
+
emailAddress: EmailAddress;
|
|
44
|
+
|
|
45
|
+
}
|
|
@@ -140,16 +140,28 @@ export default class EmailEvents extends AuthenticatedEvents<Email> {
|
|
|
140
140
|
|
|
141
141
|
// deny changes back to draft... unless email was still in queue...
|
|
142
142
|
const change = entry.getChange("status");
|
|
143
|
-
if (change
|
|
143
|
+
if (change) {
|
|
144
|
+
|
|
145
|
+
if (change.oldValue === "pending-approval") {
|
|
146
|
+
// check if user is approval
|
|
147
|
+
if (this.verify) {
|
|
148
|
+
this.sessionUser.ensureIsAdmin();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
throw new EntityAccessError(`Cannot change status from pending approval`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (change.newValue === "draft" && change.newValue !== change.oldValue) {
|
|
144
155
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
156
|
+
const dateSent = entry.getChange("dateSent");
|
|
157
|
+
const isPending = change.oldValue === "scheduled"
|
|
158
|
+
&& dateSent?.oldValue && (DateTime.from(dateSent.oldValue).diff(DateTime.now).totalSeconds > 1);
|
|
148
159
|
|
|
149
|
-
|
|
150
|
-
|
|
160
|
+
if(!isPending) {
|
|
161
|
+
throw new EntityAccessError(`Status cannot be set to draft from ${change.oldValue}`);
|
|
162
|
+
}
|
|
163
|
+
entity.workflowID = null;
|
|
151
164
|
}
|
|
152
|
-
entity.workflowID = null;
|
|
153
165
|
}
|
|
154
166
|
|
|
155
167
|
if (entry.isModified("parentID")) {
|
|
@@ -199,6 +199,8 @@ export default class MailboxEvents extends AuthenticatedEvents<Mailbox> {
|
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
async afterInsert(entity: Mailbox) {
|
|
202
|
+
this.emailAddressService.cache?.clear("getHostedMailbox");
|
|
203
|
+
this.emailAddressService.cache?.clear("getHostedMailboxID");
|
|
202
204
|
await this.updateFolders(entity);
|
|
203
205
|
return this.updateIndex(entity);
|
|
204
206
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
|
|
2
|
+
import ThreadParticipant from "../entities/ThreadParticipant.js";
|
|
3
|
+
import AuthenticatedEvents from "./AuthenticatedEvents.js";
|
|
4
|
+
|
|
5
|
+
export default class ThreadParticipantEvents extends AuthenticatedEvents<ThreadParticipant> {
|
|
6
|
+
|
|
7
|
+
filter(query: IEntityQuery<ThreadParticipant>) {
|
|
8
|
+
if (!this.verify) {
|
|
9
|
+
return query;
|
|
10
|
+
}
|
|
11
|
+
this.sessionUser.ensureLoggedIn();
|
|
12
|
+
if (this.sessionUser.isAdmin) {
|
|
13
|
+
return query;
|
|
14
|
+
}
|
|
15
|
+
const { userID } = this.sessionUser;
|
|
16
|
+
return query.where({ userID }, (p) => (x) =>
|
|
17
|
+
x.email.mailboxes.some((m) =>
|
|
18
|
+
m.mailbox.userMailboxes.some((mu) => mu.userID === p.userID)
|
|
19
|
+
|| m.mailbox.domain.hostedDomain.domainUsers.some((du) => du.userID === p.userID && du.isAdmin === true)
|
|
20
|
+
)
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
includeFilter(query: IEntityQuery<ThreadParticipant>, type?: any, key?: string) {
|
|
25
|
+
return query;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -3,14 +3,17 @@ import { RegisterSingleton, ServiceProvider } from "@entity-access/entity-access
|
|
|
3
3
|
import SocialMailContext from "../model/SocialMailContext.js";
|
|
4
4
|
import { globalServices } from "../../globalServices.js";
|
|
5
5
|
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
6
|
-
import { cacheFor } from "../../common/cacheFor.js";
|
|
6
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../common/cacheFor.js";
|
|
7
7
|
import Domain from "../model/entities/Domain.js";
|
|
8
8
|
import WorkflowContext from "@entity-access/entity-access/dist/workflows/WorkflowContext.js";
|
|
9
9
|
import RepairEmailNameTagsWorkflow from "../workflows/repair/tags/RepairEmailNameTagsWorkflow.js";
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
|
|
12
13
|
@RegisterSingleton
|
|
13
|
-
export default class EmailAddressService {
|
|
14
|
+
export default class EmailAddressService implements ICacheContainer<EmailAddressService> {
|
|
15
|
+
|
|
16
|
+
cache: ObjectCache<EmailAddressService>;
|
|
14
17
|
|
|
15
18
|
@cacheFor()
|
|
16
19
|
public async getOrCreateDomain(name: string) {
|
|
@@ -96,11 +99,11 @@ export default class EmailAddressService {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
@cacheFor()
|
|
99
|
-
public async getHostedMailbox(
|
|
100
|
-
emailAddress = emailAddress.trim().toLocaleLowerCase();
|
|
102
|
+
public async getHostedMailbox(mailboxID: number) {
|
|
101
103
|
using scope = globalServices.createScope();
|
|
102
104
|
const db = scope.resolve(SocialMailContext);
|
|
103
|
-
return await db.mailboxes.where({
|
|
105
|
+
return await db.mailboxes.where({ mailboxID }, (p) => (x) => x.mailboxID === p.mailboxID)
|
|
106
|
+
.include((x) => x.emailAddress)
|
|
104
107
|
.first();
|
|
105
108
|
}
|
|
106
109
|
|
|
@@ -5,12 +5,15 @@ import AtomicFolderService from "./files/AtomicFolderService.js";
|
|
|
5
5
|
import { SafeFileName } from "../../common/SafeFileName.js";
|
|
6
6
|
import { Base36 } from "../../common/Base36.js";
|
|
7
7
|
import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
|
|
8
|
-
import { cacheFor } from "../../common/cacheFor.js";
|
|
8
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../common/cacheFor.js";
|
|
9
9
|
import WorkflowContext from "@entity-access/entity-access/dist/workflows/WorkflowContext.js";
|
|
10
10
|
import UpdateFolderSize from "../workflows/storage/files/UpdateFolderSize.js";
|
|
11
11
|
|
|
12
|
+
|
|
12
13
|
@RegisterScoped
|
|
13
|
-
export default class StoreFileService {
|
|
14
|
+
export default class StoreFileService implements ICacheContainer<StoreFileService> {
|
|
15
|
+
|
|
16
|
+
cache: ObjectCache<StoreFileService>;
|
|
14
17
|
|
|
15
18
|
@Inject
|
|
16
19
|
db: SocialMailContext;
|
|
@@ -21,6 +24,7 @@ export default class StoreFileService {
|
|
|
21
24
|
@Inject
|
|
22
25
|
context: WorkflowContext;
|
|
23
26
|
|
|
27
|
+
|
|
24
28
|
async changeFolder(item: StoreItem) {
|
|
25
29
|
const folderName = SafeFileName.rename(item.name, `(${Base36.encode(item.storeItemID)})`);
|
|
26
30
|
await this.db.appFiles.statements.update({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const expandPlaceholders = (text: string, a: Record<string, any>) => {
|
|
2
2
|
const keys = Object.keys(a).map((x) => ({ key: x.toLocaleLowerCase(), value: x }));
|
|
3
3
|
return text.replaceAll(/(\$([^\$\s]{3,50})\$)|(\[\{([^\}\s]{3,50})\}\])/g,(original, g1, gv1, g2, gv2) => {
|
|
4
|
-
let key = gv1?.
|
|
4
|
+
let key = gv1?.toLowerCase() ?? gv2?.toLowerCase();
|
|
5
5
|
if (!key) {
|
|
6
6
|
return original;
|
|
7
7
|
}
|
|
@@ -2,13 +2,16 @@ import Inject, { RegisterTransient } from "@entity-access/entity-access/dist/di/
|
|
|
2
2
|
import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
|
|
3
3
|
import ChartOfAccounts from "../chart-of-accounts/ChartOfAccounts.js";
|
|
4
4
|
import SocialMailContext from "../../../model/SocialMailContext.js";
|
|
5
|
-
import { cacheFor } from "../../../../common/cacheFor.js";
|
|
5
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../../../common/cacheFor.js";
|
|
6
6
|
import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
|
|
7
7
|
import { StoreJournal } from "../../../model/entities/StoreJournal.js";
|
|
8
8
|
import CouponService from "../../coupons/CouponService.js";
|
|
9
9
|
|
|
10
|
+
|
|
10
11
|
@RegisterTransient
|
|
11
|
-
export default class SalesInvoiceService {
|
|
12
|
+
export default class SalesInvoiceService implements ICacheContainer<SalesInvoiceService> {
|
|
13
|
+
|
|
14
|
+
cache: ObjectCache<SalesInvoiceService>;
|
|
12
15
|
|
|
13
16
|
@Inject
|
|
14
17
|
chartOfAccounts: ChartOfAccounts;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import Inject, { RegisterScoped } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
|
+
import SocialMailContext from "../../model/SocialMailContext.js";
|
|
3
|
+
import Mailbox from "../../model/entities/Mailbox.js";
|
|
4
|
+
import MailboxContact from "../../model/entities/MailboxContact.js";
|
|
5
|
+
|
|
6
|
+
@RegisterScoped
|
|
7
|
+
export default class ChannelModerationService {
|
|
8
|
+
|
|
9
|
+
@Inject
|
|
10
|
+
db: SocialMailContext;
|
|
11
|
+
|
|
12
|
+
async addToQueue(channel: Mailbox, emailID: any, mc: MailboxContact) {
|
|
13
|
+
if(!channel.requiresPostModeration) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (mc.isOwner) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
await this.db.emails.statements.update({
|
|
20
|
+
status: "pending-approval"
|
|
21
|
+
}, {
|
|
22
|
+
emailID
|
|
23
|
+
});
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
}
|
|
@@ -185,10 +185,16 @@ export default class HtmlSanitizer {
|
|
|
185
185
|
|
|
186
186
|
// replace all attributes
|
|
187
187
|
for (const iterator of e.attributes) {
|
|
188
|
+
if (!iterator.nodeValue) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
188
191
|
iterator.nodeValue = expandPlaceholders(iterator.nodeValue, replace);
|
|
189
192
|
}
|
|
190
193
|
if(e.childElementCount === 0) {
|
|
191
|
-
|
|
194
|
+
const { textContent } = e;
|
|
195
|
+
if (textContent) {
|
|
196
|
+
e.textContent = expandPlaceholders(textContent, replace);
|
|
197
|
+
}
|
|
192
198
|
}
|
|
193
199
|
this.updateCommandAttributes(e, replace);
|
|
194
200
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { RegisterSingleton, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
|
-
import { cacheFor } from "../../../common/cacheFor.js";
|
|
2
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../../common/cacheFor.js";
|
|
3
3
|
import SocialMailContext from "../../model/SocialMailContext.js";
|
|
4
4
|
|
|
5
5
|
@RegisterSingleton
|
|
6
|
-
export default class DomainKeyService {
|
|
6
|
+
export default class DomainKeyService implements ICacheContainer<DomainKeyService> {
|
|
7
|
+
|
|
8
|
+
cache: ObjectCache<DomainKeyService>;
|
|
7
9
|
|
|
8
10
|
@cacheFor()
|
|
9
11
|
getDomainKey(mailboxID: number) {
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
import { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
|
|
3
3
|
import AppFile, { AppFileAccess, ExternalUser } from "../../model/entities/AppFile.js";
|
|
4
4
|
import { globalServices } from "../../../globalServices.js";
|
|
5
5
|
import SocialMailContext from "../../model/SocialMailContext.js";
|
|
6
|
-
import { cacheFor } from "../../../common/cacheFor.js";
|
|
6
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../../common/cacheFor.js";
|
|
7
7
|
import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
|
|
8
8
|
import CryptoService from "../CryptoService.js";
|
|
9
9
|
import { randomUUID } from "crypto";
|
|
10
10
|
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
11
11
|
|
|
12
|
-
const cache = new TimedCache<number, AppFileAccess[]>();
|
|
13
|
-
|
|
14
12
|
@RegisterSingleton
|
|
15
|
-
export default class FileAccessService {
|
|
13
|
+
export default class FileAccessService implements ICacheContainer<FileAccessService> {
|
|
16
14
|
|
|
15
|
+
cache: ObjectCache<FileAccessService>;
|
|
17
16
|
|
|
18
17
|
public async getWriteList(userID: number) {
|
|
19
18
|
const list = await this.getList(userID);
|
|
@@ -8,13 +8,14 @@ import AppFile from "../../model/entities/AppFile.js";
|
|
|
8
8
|
import BaseStorage from "../../storage/BaseStorage.js";
|
|
9
9
|
import TempFileService from "../../storage/TempFileService.js";
|
|
10
10
|
import { join } from "path";
|
|
11
|
-
import { cacheFor } from "../../../common/cacheFor.js";
|
|
11
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../../common/cacheFor.js";
|
|
12
12
|
import { globalEnv } from "../../../common/globalEnv.js";
|
|
13
13
|
import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
|
|
14
14
|
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
15
15
|
import type { LocalFile } from "@entity-access/server-pages/dist/core/LocalFile.js";
|
|
16
16
|
import { tokenizeCssUrl } from "../../../protocols/core/tokenizer.js";
|
|
17
17
|
|
|
18
|
+
|
|
18
19
|
let cdn = globalEnv.cdn || "";
|
|
19
20
|
if (cdn) {
|
|
20
21
|
cdn = `//${cdn}`;
|
|
@@ -40,7 +41,9 @@ const joinPath = (root: string, path: string) => {
|
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
@RegisterTransient
|
|
43
|
-
export default class SnapshotService {
|
|
44
|
+
export default class SnapshotService implements ICacheContainer<SnapshotService> {
|
|
45
|
+
|
|
46
|
+
cache: ObjectCache<SnapshotService>;
|
|
44
47
|
|
|
45
48
|
@Inject
|
|
46
49
|
db: SocialMailContext;
|
|
@@ -2,7 +2,7 @@ import Inject, { RegisterSingleton, ServiceProvider } from "@entity-access/entit
|
|
|
2
2
|
import WebSiteFolder, { WebSiteFolderVersion } from "../../model/entities/WebSiteFolder.js";
|
|
3
3
|
import { globalServices } from "../../../globalServices.js";
|
|
4
4
|
import SocialMailContext from "../../model/SocialMailContext.js";
|
|
5
|
-
import { cacheFor } from "../../../common/cacheFor.js";
|
|
5
|
+
import {ICacheContainer, ObjectCache, cacheFor } from "../../../common/cacheFor.js";
|
|
6
6
|
import BaseStorage from "../../storage/BaseStorage.js";
|
|
7
7
|
import AppFile from "../../model/entities/AppFile.js";
|
|
8
8
|
import SnapshotService from "./SnapshotService.js";
|
|
@@ -12,10 +12,13 @@ import TempFileService from "../../storage/TempFileService.js";
|
|
|
12
12
|
import Content from "@entity-access/server-pages/dist/Content.js";
|
|
13
13
|
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
14
14
|
|
|
15
|
+
|
|
15
16
|
const empty = new WebSiteFolder();
|
|
16
17
|
|
|
17
18
|
@RegisterSingleton
|
|
18
|
-
export default class WebSiteService {
|
|
19
|
+
export default class WebSiteService implements ICacheContainer<WebSiteService> {
|
|
20
|
+
|
|
21
|
+
cache: ObjectCache<WebSiteService>;
|
|
19
22
|
|
|
20
23
|
@Inject
|
|
21
24
|
private storage: BaseStorage;
|