@social-mail/social-mail-web-server 1.8.455 → 1.8.456

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.
Files changed (68) hide show
  1. package/dist/server/model/SocialMailContext.d.ts +2 -4
  2. package/dist/server/model/SocialMailContext.d.ts.map +1 -1
  3. package/dist/server/model/SocialMailContext.js +2 -4
  4. package/dist/server/model/SocialMailContext.js.map +1 -1
  5. package/dist/server/model/SocialMailContextEvents.d.ts.map +1 -1
  6. package/dist/server/model/SocialMailContextEvents.js +3 -6
  7. package/dist/server/model/SocialMailContextEvents.js.map +1 -1
  8. package/dist/server/model/entities/Email.d.ts +2 -2
  9. package/dist/server/model/entities/Email.d.ts.map +1 -1
  10. package/dist/server/model/entities/EmailText.d.ts +7 -0
  11. package/dist/server/model/entities/EmailText.d.ts.map +1 -0
  12. package/dist/server/model/entities/{SearchTokenEmail.js → EmailText.js} +13 -23
  13. package/dist/server/model/entities/EmailText.js.map +1 -0
  14. package/dist/server/model/events/EmailTextEvents.d.ts +5 -0
  15. package/dist/server/model/events/EmailTextEvents.d.ts.map +1 -0
  16. package/dist/server/model/events/EmailTextEvents.js +4 -0
  17. package/dist/server/model/events/EmailTextEvents.js.map +1 -0
  18. package/dist/server/seed/ui/seed-ui.js +1 -1
  19. package/dist/server/services/emails/IndexEmailService.d.ts +0 -3
  20. package/dist/server/services/emails/IndexEmailService.d.ts.map +1 -1
  21. package/dist/server/services/emails/IndexEmailService.js +8 -28
  22. package/dist/server/services/emails/IndexEmailService.js.map +1 -1
  23. package/dist/server/workflows/SocialWorkflowContext.js +2 -2
  24. package/dist/server/workflows/SocialWorkflowContext.js.map +1 -1
  25. package/dist/server/workflows/daily/DailyWorkflow.js +2 -2
  26. package/dist/server/workflows/daily/DailyWorkflow.js.map +1 -1
  27. package/dist/server/workflows/email/index/{IndexEmailContentWorkflow.d.ts → IndexEmailTextContentWorkflow.d.ts} +2 -2
  28. package/dist/server/workflows/email/index/IndexEmailTextContentWorkflow.d.ts.map +1 -0
  29. package/dist/server/workflows/email/index/{IndexEmailContentWorkflow.js → IndexEmailTextContentWorkflow.js} +7 -7
  30. package/dist/server/workflows/email/index/IndexEmailTextContentWorkflow.js.map +1 -0
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +1 -1
  33. package/src/server/model/SocialMailContext.ts +3 -6
  34. package/src/server/model/SocialMailContextEvents.ts +3 -7
  35. package/src/server/model/entities/Email.ts +2 -2
  36. package/src/server/model/entities/EmailText.ts +20 -0
  37. package/src/server/model/events/EmailTextEvents.ts +6 -0
  38. package/src/server/seed/ui/seed-ui.ts +1 -1
  39. package/src/server/services/emails/IndexEmailService.ts +11 -28
  40. package/src/server/workflows/SocialWorkflowContext.ts +2 -2
  41. package/src/server/workflows/daily/DailyWorkflow.ts +2 -2
  42. package/src/server/workflows/email/index/{IndexEmailContentWorkflow.ts → IndexEmailTextContentWorkflow.ts} +3 -3
  43. package/dist/server/model/entities/SearchToken.d.ts +0 -8
  44. package/dist/server/model/entities/SearchToken.d.ts.map +0 -1
  45. package/dist/server/model/entities/SearchToken.js +0 -37
  46. package/dist/server/model/entities/SearchToken.js.map +0 -1
  47. package/dist/server/model/entities/SearchTokenEmail.d.ts +0 -12
  48. package/dist/server/model/entities/SearchTokenEmail.d.ts.map +0 -1
  49. package/dist/server/model/entities/SearchTokenEmail.js.map +0 -1
  50. package/dist/server/model/events/SearchTokenEmailEvents.d.ts +0 -5
  51. package/dist/server/model/events/SearchTokenEmailEvents.d.ts.map +0 -1
  52. package/dist/server/model/events/SearchTokenEmailEvents.js +0 -4
  53. package/dist/server/model/events/SearchTokenEmailEvents.js.map +0 -1
  54. package/dist/server/model/events/SearchTokenEvents.d.ts +0 -5
  55. package/dist/server/model/events/SearchTokenEvents.d.ts.map +0 -1
  56. package/dist/server/model/events/SearchTokenEvents.js +0 -4
  57. package/dist/server/model/events/SearchTokenEvents.js.map +0 -1
  58. package/dist/server/services/search/SearchTokenService.d.ts +0 -7
  59. package/dist/server/services/search/SearchTokenService.d.ts.map +0 -1
  60. package/dist/server/services/search/SearchTokenService.js +0 -107
  61. package/dist/server/services/search/SearchTokenService.js.map +0 -1
  62. package/dist/server/workflows/email/index/IndexEmailContentWorkflow.d.ts.map +0 -1
  63. package/dist/server/workflows/email/index/IndexEmailContentWorkflow.js.map +0 -1
  64. package/src/server/model/entities/SearchToken.ts +0 -26
  65. package/src/server/model/entities/SearchTokenEmail.ts +0 -34
  66. package/src/server/model/events/SearchTokenEmailEvents.ts +0 -6
  67. package/src/server/model/events/SearchTokenEvents.ts +0 -6
  68. package/src/server/services/search/SearchTokenService.ts +0 -33
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.8.455",
3
+ "version": "1.8.456",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -80,8 +80,7 @@ import UserGroupMember from "./entities/UserGroupMember.js";
80
80
  import WebSiteTag from "./entities/WebSiteTag.js";
81
81
  import AppDbContext from "@entity-access/server-pages/dist/core/AppDbContext.js";
82
82
  import AppPassword from "./entities/AppPassword.js";
83
- import SearchToken from "./entities/SearchToken.js";
84
- import SearchTokenEmail from "./entities/SearchTokenEmail.js";
83
+ import EmailText from "./entities/EmailText.js";
85
84
 
86
85
  @RegisterScoped
87
86
  export default class SocialMailContext extends AppDbContext {
@@ -152,6 +151,8 @@ export default class SocialMailContext extends AppDbContext {
152
151
 
153
152
  public emailTemplates = this.model.register(EmailTemplate);
154
153
 
154
+ public emailTexts = this.model.register(EmailText);
155
+
155
156
  public mailboxes = this.model.register(Mailbox);
156
157
 
157
158
  public channelEmails = this.model.register(ChannelEmail);
@@ -180,10 +181,6 @@ export default class SocialMailContext extends AppDbContext {
180
181
 
181
182
  public subscriberActivities = this.model.register(SubscriberActivity);
182
183
 
183
- public searchTokens = this.model.register(SearchToken);
184
-
185
- public searchTokenEmails = this.model.register(SearchTokenEmail);
186
-
187
184
  public searchWords = this.model.register(SearchWord);
188
185
 
189
186
  public searchWordIndexes = this.model.register(SearchWordIndex);
@@ -146,10 +146,8 @@ import WebSiteTag from "./entities/WebSiteTag.js";
146
146
  import WebSiteTagEvents from "./events/WebSiteTagEvents.js";
147
147
  import AppPassword from "./entities/AppPassword.js";
148
148
  import AppPasswordEvents from "./events/AppPasswordEvents.js";
149
- import SearchToken from "./entities/SearchToken.js";
150
- import SearchTokenEvents from "./events/SearchTokenEvents.js";
151
- import SearchTokenEmail from "./entities/SearchTokenEmail.js";
152
- import SearchTokenEmailEvents from "./events/SearchTokenEmailEvents.js";
149
+ import EmailText from "./entities/EmailText.js";
150
+ import EmailTextEvents from "./events/EmailTextEvents.js";
153
151
 
154
152
 
155
153
  @RegisterSingleton
@@ -188,6 +186,7 @@ export default class SocialMailContextEvents extends ContextEvents {
188
186
  this.register(EmailRecipient, EmailRecipientEvents);
189
187
  this.register(EmailTag, EmailTagEvents);
190
188
  this.register(EmailTemplate, EmailTemplateEvents);
189
+ this.register(EmailText, EmailTextEvents);
191
190
  this.register(FileContent, FileContentEvents);
192
191
  this.register(Mailbox, MailboxEvents);
193
192
  this.register(MailboxSyncTarget, MailboxSyncTargetEvents);
@@ -200,9 +199,6 @@ export default class SocialMailContextEvents extends ContextEvents {
200
199
  this.register(ChannelEmail, MailboxEmailEvents);
201
200
  this.register(NameToken, NameTokenEvents);
202
201
 
203
- this.register(SearchToken, SearchTokenEvents);
204
- this.register(SearchTokenEmail, SearchTokenEmailEvents);
205
-
206
202
  this.register(StoreItem, StoreItemEvents);
207
203
  this.register(StoreItemPrice, StoreItemPriceEvents);
208
204
  this.register(StoreAccount, StoreAccountEvents);
@@ -18,7 +18,7 @@ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
18
18
  import { apiPath } from "../../../common/globalEnv.js";
19
19
  import type MailboxContactEvent from "./MailboxContactEvent.js";
20
20
  import type ThreadParticipant from "./ThreadParticipant.js";
21
- import type SearchTokenEmail from "./SearchTokenEmail.js";
21
+ import type EmailText from "./EmailText.js";
22
22
 
23
23
  const emailStatuses = [ "queued", "received", "draft", "published", "pending-approval", "approved", "scheduled", "sent", "sent-failed", "deleted", "closed"] as const;
24
24
  export type emailStatusType = typeof emailStatuses[number];
@@ -323,7 +323,7 @@ export class Email {
323
323
  mailboxContactEvents: MailboxContactEvent[];
324
324
  threadParticipants: ThreadParticipant[];
325
325
  channelEmails: ChannelEmail[];
326
- searchTokenEmails: SearchTokenEmail[];
326
+ emailText: EmailText;
327
327
  }
328
328
 
329
329
  @Table("EmailLogs")
@@ -0,0 +1,20 @@
1
+ import Column from "@entity-access/entity-access/dist/decorators/Column.js";
2
+ import { RelateToOne } 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
+
6
+ @Table("EmailTexts")
7
+ export default class EmailText {
8
+
9
+ @Column( { dataType: "BigInt", key: true })
10
+ @RelateToOne(Email, {
11
+ property: (x) => x.email,
12
+ inverseProperty: (x) => x.emailText
13
+ })
14
+ emailID: number;
15
+
16
+ @Column({ dataType: "Char" })
17
+ text: string;
18
+
19
+ email: Email;
20
+ }
@@ -0,0 +1,6 @@
1
+ import EmailText from "../entities/EmailText.js";
2
+ import ReadOnlyEvents from "./ReadOnlyEvents.js";
3
+
4
+ export default class EmailTextEvents extends ReadOnlyEvents<EmailText> {
5
+
6
+ }
@@ -17,7 +17,7 @@ export default async function seedUI(config: DBConfig) {
17
17
  await config.saveVersion(UIPackageConfig, {
18
18
  package: "@social-mail/social-mail-client",
19
19
  view: "dist/web/AppIndex",
20
- version: "1.9.90"
20
+ version: "1.9.92"
21
21
  });
22
22
 
23
23
  await config.saveVersion(WebComponentsPackageConfig, {
@@ -1,8 +1,6 @@
1
1
  import Inject, { RegisterScoped } from "@entity-access/entity-access/dist/di/di.js";
2
2
  import SocialMailContext from "../../model/SocialMailContext.js";
3
3
  import { Email } from "../../model/entities/Email.js";
4
- import SearchTokenService from "../search/SearchTokenService.js";
5
- import { tokenKindType } from "../../model/entities/SearchTokenEmail.js";
6
4
  import TextExtractorService from "../extract/TextExtractorService.js";
7
5
  import TempFileService from "../../storage/TempFileService.js";
8
6
 
@@ -12,9 +10,6 @@ export default class IndexEmailService {
12
10
  @Inject
13
11
  db: SocialMailContext;
14
12
 
15
- @Inject
16
- sts: SearchTokenService;
17
-
18
13
  @Inject
19
14
  te: TextExtractorService;
20
15
 
@@ -26,8 +21,10 @@ export default class IndexEmailService {
26
21
  // delete all search email tokens if exists
27
22
  const { db } = this;
28
23
 
24
+ let text = "";
25
+
29
26
  if(textBody) {
30
- await this.insertText(emailID, textBody, "body");
27
+ text = textBody;
31
28
  }
32
29
 
33
30
  // for all attachments...
@@ -37,34 +34,20 @@ export default class IndexEmailService {
37
34
  const txt = await db.textDocuments
38
35
  .statements.select({}, { textDocumentID: att.fileContentID});
39
36
  if (txt) {
40
- await this.insertText(emailID, txt.searchable, "attachment");
37
+ text += " " + txt.searchable;
41
38
  continue;
42
39
  }
43
40
  const tf = await this.tempFileService.downloadAppFile(att);
44
41
  const textFile = await this.te.extract(tf);
45
- for await(const line of textFile.lines()) {
46
- if (!line) {
47
- continue;
48
- }
49
- await this.insertText(emailID, line, "attachment");
50
- }
42
+ text += " " + await textFile.readAsText();
51
43
  }
52
- }
53
44
 
45
+ text = text.replace(/\s+/g, " ").trim().toLowerCase();
54
46
 
55
- private async insertText(emailID: number, line: string, tokenKind: tokenKindType) {
56
- const words = line.match(/\b[\w\.]{2,399}\b/g);
57
- if (!words) {
58
- return;
59
- }
60
- for (const word of words) {
61
- const w = word.trim().toLowerCase();
62
- if (!w) {
63
- continue;
64
- }
65
- const token = await this.sts.getToken(w);
66
- const ste = { tokenID: token.tokenID, emailID, tokenKind };
67
- await this.db.searchTokenEmails.statements.selectOrInsert(ste, ste);
68
- }
47
+ // deduplication
48
+ // text = Array.from(new Set(text.split(" "))).join(" ");
49
+
50
+ await db.emailTexts.statements.selectOrInsert({ text, emailID }, { emailID });
69
51
  }
52
+
70
53
  }
@@ -55,7 +55,7 @@ import SendLibraryContentWorkflow from "./channel/library/SendLibraryContentWork
55
55
  import CreateChannelWorkflow from "./channel/creation/CreateChannelWorkflow.js";
56
56
  import { AppWorkflowContext } from "./AppWorkflowContext.js";
57
57
  import DeleteFileHistoryWorkflow from "./files/DeleteFileHistoryWorkflow.js";
58
- import IndexEmailContentWorkflow from "./email/index/IndexEmailContentWorkflow.js";
58
+ import IndexEmailTextContentWorkflow from "./email/index/IndexEmailTextContentWorkflow.js";
59
59
  import IndexEmailAddressWorkflow from "./email/index/IndexEmailAddressWorkflow.js";
60
60
 
61
61
  @RegisterSingleton
@@ -123,7 +123,7 @@ export default class SocialWorkflowContext extends AppWorkflowContext {
123
123
  this.register(SendLibraryContentWorkflow);
124
124
  this.register(CreateChannelWorkflow);
125
125
 
126
- this.register(IndexEmailContentWorkflow);
126
+ this.register(IndexEmailTextContentWorkflow);
127
127
  this.register(IndexEmailAddressWorkflow);
128
128
 
129
129
  // start processing...
@@ -13,7 +13,7 @@ import PendingPostReceiveWorkflow from "../pending/PendingPostReceiveWorkflow.js
13
13
  import PendingReferencesWorkflow from "../pending/PendingReferencesWorkflow.js";
14
14
  import MessagingService from "../../services/message-events/MessagingService.js";
15
15
  import FetchCheckoutResultWorkflow from "../store/FetchCheckoutResultWorkflow.js";
16
- import IndexEmailContentWorkflow from "../email/index/IndexEmailContentWorkflow.js";
16
+ import IndexEmailTextContentWorkflow from "../email/index/IndexEmailTextContentWorkflow.js";
17
17
  import IndexEmailAddressWorkflow from "../email/index/IndexEmailAddressWorkflow.js";
18
18
 
19
19
  export default class DailyWorkflow extends Workflow<any,any> {
@@ -57,7 +57,7 @@ export default class DailyWorkflow extends Workflow<any,any> {
57
57
 
58
58
  await PendingPostReceiveWorkflow.queue(this.context);
59
59
  await PendingReferencesWorkflow.queue(this.context);
60
- await IndexEmailContentWorkflow.queue(this.context);
60
+ await IndexEmailTextContentWorkflow.queue(this.context);
61
61
  await IndexEmailAddressWorkflow.queue(this.context);
62
62
 
63
63
  const all = await db.mailboxSyncTargets
@@ -8,13 +8,13 @@ import TimeSpan from "@entity-access/entity-access/dist/types/TimeSpan.js";
8
8
  import { globalEnv } from "../../../../common/globalEnv.js";
9
9
  import AsyncTaskManager from "../../../../common/AsyncTaskManager.js";
10
10
 
11
- export default class IndexEmailContentWorkflow extends Workflow {
11
+ export default class IndexEmailTextContentWorkflow extends Workflow {
12
12
 
13
13
  static taskGroup = "batch";
14
14
 
15
15
  static queue(context: WorkflowContext) {
16
- return context.queue(IndexEmailContentWorkflow, "", {
17
- id: `index-email`,
16
+ return context.queue(IndexEmailTextContentWorkflow, "", {
17
+ id: `index-email-content`,
18
18
  });
19
19
  }
20
20
 
@@ -1,8 +0,0 @@
1
- import type SearchTokenEmail from "./SearchTokenEmail.js";
2
- export default class SearchToken {
3
- tokenID: number;
4
- word: string;
5
- doNotIndex: boolean;
6
- tokenEmails: SearchTokenEmail[];
7
- }
8
- //# sourceMappingURL=SearchToken.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchToken.d.ts","sourceRoot":"","sources":["../../../../src/server/model/entities/SearchToken.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAS1D,MAAM,CAAC,OAAO,OAAO,WAAW;IAG5B,OAAO,EAAE,MAAM,CAAC;IAGhB,IAAI,EAAE,MAAM,CAAC;IAGb,UAAU,EAAE,OAAO,CAAC;IAEpB,WAAW,EAAE,gBAAgB,EAAE,CAAC;CAEnC"}
@@ -1,37 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import Column from "@entity-access/entity-access/dist/decorators/Column.js";
11
- import Index from "@entity-access/entity-access/dist/decorators/Index.js";
12
- import Table from "@entity-access/entity-access/dist/decorators/Table.js";
13
- let SearchToken = class SearchToken {
14
- };
15
- __decorate([
16
- Column({ dataType: "BigInt", key: true, generated: "identity" }),
17
- __metadata("design:type", Number)
18
- ], SearchToken.prototype, "tokenID", void 0);
19
- __decorate([
20
- Column({ dataType: "Char", length: 400, nullable: false }),
21
- __metadata("design:type", String)
22
- ], SearchToken.prototype, "word", void 0);
23
- __decorate([
24
- Column({ dataType: "Boolean", default: () => false }),
25
- __metadata("design:type", Boolean)
26
- ], SearchToken.prototype, "doNotIndex", void 0);
27
- SearchToken = __decorate([
28
- Table("SearchTokens"),
29
- Index({
30
- name: "UX_SearchTokens_Word",
31
- columns: [{ name: (x) => x.word, descending: false, operatorClass: "varchar_pattern" }],
32
- include: [(x) => x.doNotIndex],
33
- unique: true
34
- })
35
- ], SearchToken);
36
- export default SearchToken;
37
- //# sourceMappingURL=SearchToken.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchToken.js","sourceRoot":"","sources":["../../../../src/server/model/entities/SearchToken.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,wDAAwD,CAAC;AAC5E,OAAO,KAAK,MAAM,uDAAuD,CAAC;AAC1E,OAAO,KAAK,MAAM,uDAAuD,CAAC;AAU3D,IAAM,WAAW,GAAjB,MAAM,WAAW;CAa/B,CAAA;AAVG;IADC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAC,CAAC;;4CAChD;AAGhB;IADC,MAAM,CAAC,EAAE,QAAQ,EAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;yCAC7C;AAGb;IADC,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;;+CAClC;AATH,WAAW;IAP/B,KAAK,CAAC,cAAc,CAAC;IACrB,KAAK,CAAC;QACH,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAE;QACzF,OAAO,EAAE,CAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/B,MAAM,EAAE,IAAI;KACf,CAAC;GACmB,WAAW,CAa/B;eAboB,WAAW"}
@@ -1,12 +0,0 @@
1
- import SearchToken from "./SearchToken.js";
2
- import { Email } from "./Email.js";
3
- export declare const tokenKind: readonly ["body", "attachment"];
4
- export type tokenKindType = typeof tokenKind[number];
5
- export default class SearchTokenEmail {
6
- tokenID: number;
7
- tokenKind: tokenKindType;
8
- emailID: number;
9
- token: SearchToken;
10
- email: Email;
11
- }
12
- //# sourceMappingURL=SearchTokenEmail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenEmail.d.ts","sourceRoot":"","sources":["../../../../src/server/model/entities/SearchTokenEmail.ts"],"names":[],"mappings":"AAGA,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,eAAO,MAAM,SAAS,iCAAkC,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAGrD,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAOjC,OAAO,EAAE,MAAM,CAAC;IAGhB,SAAS,EAAE,aAAa,CAAC;IAOzB,OAAO,EAAE,MAAM,CAAC;IAEhB,KAAK,EAAE,WAAW,CAAC;IAEnB,KAAK,EAAE,KAAK,CAAC;CAEhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenEmail.js","sourceRoot":"","sources":["../../../../src/server/model/entities/SearchTokenEmail.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,wDAAwD,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,wDAAwD,CAAC;AAClF,OAAO,KAAK,MAAM,uDAAuD,CAAC;AAC1E,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,YAAY,CAAU,CAAC;AAI1C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAuBpC,CAAA;AAhBG;IALC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;QACxB,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW;KACxC,CAAC;;iDACc;AAGhB;IADC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;mDAC3B;AAOzB;IALC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK;QACxB,eAAe,EAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB;KAC/C,CAAC;;iDACc;AAjBC,gBAAgB;IADpC,KAAK,CAAC,mBAAmB,CAAC;GACN,gBAAgB,CAuBpC;eAvBoB,gBAAgB"}
@@ -1,5 +0,0 @@
1
- import SearchTokenEmail from "../entities/SearchTokenEmail.js";
2
- import ReadOnlyEvents from "./ReadOnlyEvents.js";
3
- export default class SearchTokenEmailEvents extends ReadOnlyEvents<SearchTokenEmail> {
4
- }
5
- //# sourceMappingURL=SearchTokenEmailEvents.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenEmailEvents.d.ts","sourceRoot":"","sources":["../../../../src/server/model/events/SearchTokenEmailEvents.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,iCAAiC,CAAC;AAC/D,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,cAAc,CAAC,gBAAgB,CAAC;CAEnF"}
@@ -1,4 +0,0 @@
1
- import ReadOnlyEvents from "./ReadOnlyEvents.js";
2
- export default class SearchTokenEmailEvents extends ReadOnlyEvents {
3
- }
4
- //# sourceMappingURL=SearchTokenEmailEvents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenEmailEvents.js","sourceRoot":"","sources":["../../../../src/server/model/events/SearchTokenEmailEvents.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,cAAgC;CAEnF"}
@@ -1,5 +0,0 @@
1
- import SearchToken from "../entities/SearchToken.js";
2
- import ReadOnlyEvents from "./ReadOnlyEvents.js";
3
- export default class SearchTokenEvents extends ReadOnlyEvents<SearchToken> {
4
- }
5
- //# sourceMappingURL=SearchTokenEvents.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenEvents.d.ts","sourceRoot":"","sources":["../../../../src/server/model/events/SearchTokenEvents.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,4BAA4B,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,cAAc,CAAC,WAAW,CAAC;CAEzE"}
@@ -1,4 +0,0 @@
1
- import ReadOnlyEvents from "./ReadOnlyEvents.js";
2
- export default class SearchTokenEvents extends ReadOnlyEvents {
3
- }
4
- //# sourceMappingURL=SearchTokenEvents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenEvents.js","sourceRoot":"","sources":["../../../../src/server/model/events/SearchTokenEvents.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,cAA2B;CAEzE"}
@@ -1,7 +0,0 @@
1
- import { ICacheContainer, ObjectCache } from "../../../common/cacheFor.js";
2
- export default class SearchTokenService implements ICacheContainer<SearchTokenService> {
3
- cache: ObjectCache<SearchTokenService>;
4
- getToken(word: string): Promise<import("../../model/entities/SearchToken.js").default>;
5
- private getRegisteredToken;
6
- }
7
- //# sourceMappingURL=SearchTokenService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenService.d.ts","sourceRoot":"","sources":["../../../../src/server/services/search/SearchTokenService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,eAAe,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAKrF,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,eAAe,CAAC,kBAAkB,CAAC;IAElF,KAAK,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEjC,QAAQ,CAAC,IAAI,EAAE,MAAM;YASb,kBAAkB;CAYnC"}
@@ -1,107 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
11
- if (value !== null && value !== void 0) {
12
- if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
13
- var dispose, inner;
14
- if (async) {
15
- if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
16
- dispose = value[Symbol.asyncDispose];
17
- }
18
- if (dispose === void 0) {
19
- if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
20
- dispose = value[Symbol.dispose];
21
- if (async) inner = dispose;
22
- }
23
- if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
24
- if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
25
- env.stack.push({ value: value, dispose: dispose, async: async });
26
- }
27
- else if (async) {
28
- env.stack.push({ async: true });
29
- }
30
- return value;
31
- };
32
- var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
33
- return function (env) {
34
- function fail(e) {
35
- env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
36
- env.hasError = true;
37
- }
38
- var r, s = 0;
39
- function next() {
40
- while (r = env.stack.pop()) {
41
- try {
42
- if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
43
- if (r.dispose) {
44
- var result = r.dispose.call(r.value);
45
- if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
46
- }
47
- else s |= 1;
48
- }
49
- catch (e) {
50
- fail(e);
51
- }
52
- }
53
- if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
54
- if (env.hasError) throw env.error;
55
- }
56
- return next();
57
- };
58
- })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
59
- var e = new Error(message);
60
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
61
- });
62
- import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
63
- import { RegisterSingleton, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
64
- import { cacheFor } from "../../../common/cacheFor.js";
65
- import SocialMailContext from "../../model/SocialMailContext.js";
66
- import ReadOnlySocialMailContext from "../../model/ReadOnlySocialMailContext.js";
67
- let SearchTokenService = class SearchTokenService {
68
- async getToken(word) {
69
- word = word.trim().toLowerCase();
70
- if (!word) {
71
- throw new EntityAccessError("Word cannot be empty");
72
- }
73
- return this.getRegisteredToken(word);
74
- }
75
- async getRegisteredToken(word) {
76
- const env_1 = { stack: [], error: void 0, hasError: false };
77
- try {
78
- const scope = __addDisposableResource(env_1, ServiceProvider.createScope(this), false);
79
- const replica = scope.resolve(ReadOnlySocialMailContext);
80
- let existing = await replica.searchTokens.statements.select({}, { word });
81
- if (existing) {
82
- return existing;
83
- }
84
- const db = scope.resolve(SocialMailContext);
85
- existing = await db.searchTokens.statements.selectOrInsert({ word }, { word });
86
- return existing;
87
- }
88
- catch (e_1) {
89
- env_1.error = e_1;
90
- env_1.hasError = true;
91
- }
92
- finally {
93
- __disposeResources(env_1);
94
- }
95
- }
96
- };
97
- __decorate([
98
- cacheFor(),
99
- __metadata("design:type", Function),
100
- __metadata("design:paramtypes", [String]),
101
- __metadata("design:returntype", Promise)
102
- ], SearchTokenService.prototype, "getRegisteredToken", null);
103
- SearchTokenService = __decorate([
104
- RegisterSingleton
105
- ], SearchTokenService);
106
- export default SearchTokenService;
107
- //# sourceMappingURL=SearchTokenService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchTokenService.js","sourceRoot":"","sources":["../../../../src/server/services/search/SearchTokenService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,iBAAiB,MAAM,+DAA+D,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAgC,MAAM,6BAA6B,CAAC;AACrF,OAAO,iBAAiB,MAAM,kCAAkC,CAAC;AACjE,OAAO,yBAAyB,MAAM,0CAA0C,CAAC;AAGlE,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAInC,KAAK,CAAC,QAAQ,CAAC,IAAY;QACvB,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjC,IAAK,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAGa,AAAN,KAAK,CAAC,kBAAkB,CAAC,IAAY;;;YACzC,MAAM,KAAK,kCAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAA,CAAC;YAChD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YACzD,IAAI,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,QAAQ,EAAE,CAAC;gBACX,OAAO,QAAQ,CAAC;YACpB,CAAC;YACD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC5C,QAAQ,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/E,OAAO,QAAQ,CAAC;;;;;;;;;KACnB;CAEJ,CAAA;AAZiB;IADb,QAAQ,EAAE;;;;4DAWV;AAvBgB,kBAAkB;IADtC,iBAAiB;GACG,kBAAkB,CAyBtC;eAzBoB,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"IndexEmailContentWorkflow.d.ts","sourceRoot":"","sources":["../../../../../src/server/workflows/email/index/IndexEmailContentWorkflow.ts"],"names":[],"mappings":"AAEA,OAAO,QAA4B,MAAM,yDAAyD,CAAC;AACnG,OAAO,eAAe,MAAM,gEAAgE,CAAC;AAC7F,OAAO,iBAAiB,MAAM,qCAAqC,CAAC;AAMpE,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,QAAQ;IAE3D,MAAM,CAAC,SAAS,SAAW;IAE3B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe;IAM/B,GAAG;IAMH,KAAK,CACC,EAAE,CAAC,EAAE,iBAAiB;IAgC5B,UAAU,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;KAAE;CAajE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"IndexEmailContentWorkflow.js","sourceRoot":"","sources":["../../../../../src/server/workflows/email/index/IndexEmailContentWorkflow.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import Column from "@entity-access/entity-access/dist/decorators/Column.js";
2
- import Index from "@entity-access/entity-access/dist/decorators/Index.js";
3
- import Table from "@entity-access/entity-access/dist/decorators/Table.js";
4
- import type SearchTokenEmail from "./SearchTokenEmail.js";
5
-
6
- @Table("SearchTokens")
7
- @Index({
8
- name: "UX_SearchTokens_Word",
9
- columns: [ { name: (x) => x.word, descending: false, operatorClass: "varchar_pattern" } ],
10
- include: [ (x) => x.doNotIndex],
11
- unique: true
12
- })
13
- export default class SearchToken {
14
-
15
- @Column({ dataType: "BigInt", key: true, generated: "identity"})
16
- tokenID: number;
17
-
18
- @Column({ dataType:"Char", length: 400, nullable: false })
19
- word: string;
20
-
21
- @Column({ dataType: "Boolean", default: () => false })
22
- doNotIndex: boolean;
23
-
24
- tokenEmails: SearchTokenEmail[];
25
-
26
- }
@@ -1,34 +0,0 @@
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 SearchToken from "./SearchToken.js";
5
- import { Email } from "./Email.js";
6
-
7
- export const tokenKind = ["body", "attachment"] as const;
8
- export type tokenKindType = typeof tokenKind[number];
9
-
10
- @Table("SearchTokenEmails")
11
- export default class SearchTokenEmail {
12
-
13
- @Column({ dataType: "BigInt", key: true})
14
- @RelateTo(SearchToken, {
15
- property: (x) => x.token,
16
- inverseProperty: (x) => x.tokenEmails,
17
- })
18
- tokenID: number;
19
-
20
- @Column({ dataType: "Char", key: true, length: 20 })
21
- tokenKind: tokenKindType;
22
-
23
- @Column({ dataType: "BigInt", key: true })
24
- @RelateTo(Email, {
25
- property: (x) => x.email,
26
- inverseProperty: (x) => x.searchTokenEmails
27
- })
28
- emailID: number;
29
-
30
- token: SearchToken;
31
-
32
- email: Email;
33
-
34
- }
@@ -1,6 +0,0 @@
1
- import SearchTokenEmail from "../entities/SearchTokenEmail.js";
2
- import ReadOnlyEvents from "./ReadOnlyEvents.js";
3
-
4
- export default class SearchTokenEmailEvents extends ReadOnlyEvents<SearchTokenEmail> {
5
-
6
- }
@@ -1,6 +0,0 @@
1
- import SearchToken from "../entities/SearchToken.js";
2
- import ReadOnlyEvents from "./ReadOnlyEvents.js";
3
-
4
- export default class SearchTokenEvents extends ReadOnlyEvents<SearchToken> {
5
-
6
- }
@@ -1,33 +0,0 @@
1
- import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
2
- import { RegisterSingleton, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
3
- import { cacheFor, ICacheContainer, ObjectCache } from "../../../common/cacheFor.js";
4
- import SocialMailContext from "../../model/SocialMailContext.js";
5
- import ReadOnlySocialMailContext from "../../model/ReadOnlySocialMailContext.js";
6
-
7
- @RegisterSingleton
8
- export default class SearchTokenService implements ICacheContainer<SearchTokenService>{
9
-
10
- cache: ObjectCache<SearchTokenService>;
11
-
12
- async getToken(word: string) {
13
- word = word.trim().toLowerCase();
14
- if (!word) {
15
- throw new EntityAccessError("Word cannot be empty");
16
- }
17
- return this.getRegisteredToken(word);
18
- }
19
-
20
- @cacheFor()
21
- private async getRegisteredToken(word: string) {
22
- using scope = ServiceProvider.createScope(this);
23
- const replica = scope.resolve(ReadOnlySocialMailContext);
24
- let existing = await replica.searchTokens.statements.select({}, { word });
25
- if (existing) {
26
- return existing;
27
- }
28
- const db = scope.resolve(SocialMailContext);
29
- existing = await db.searchTokens.statements.selectOrInsert({ word }, { word });
30
- return existing;
31
- }
32
-
33
- }