@social-mail/social-mail-web-server 1.4.855 → 1.4.857

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 (47) hide show
  1. package/dist/server/model/SocialMailContext.d.ts +2 -1
  2. package/dist/server/model/SocialMailContext.d.ts.map +1 -1
  3. package/dist/server/model/SocialMailContext.js +2 -1
  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 -1
  7. package/dist/server/model/SocialMailContextEvents.js.map +1 -1
  8. package/dist/server/model/entities/Store.d.ts +8 -0
  9. package/dist/server/model/entities/Store.d.ts.map +1 -1
  10. package/dist/server/model/entities/Store.js +27 -1
  11. package/dist/server/model/entities/Store.js.map +1 -1
  12. package/dist/server/model/entities/Tag.d.ts +2 -1
  13. package/dist/server/model/entities/Tag.d.ts.map +1 -1
  14. package/dist/server/model/entities/Tag.js.map +1 -1
  15. package/dist/server/model/events/StoreEvents.d.ts +1 -0
  16. package/dist/server/model/events/StoreEvents.d.ts.map +1 -1
  17. package/dist/server/model/events/StoreEvents.js +24 -0
  18. package/dist/server/model/events/StoreEvents.js.map +1 -1
  19. package/dist/server/model/events/StoreItemEvents.d.ts +2 -0
  20. package/dist/server/model/events/StoreItemEvents.d.ts.map +1 -1
  21. package/dist/server/model/events/StoreItemEvents.js +16 -7
  22. package/dist/server/model/events/StoreItemEvents.js.map +1 -1
  23. package/dist/server/model/events/StoreItemFolderTagEvents.d.ts +7 -0
  24. package/dist/server/model/events/StoreItemFolderTagEvents.d.ts.map +1 -0
  25. package/dist/server/model/events/StoreItemFolderTagEvents.js +7 -0
  26. package/dist/server/model/events/StoreItemFolderTagEvents.js.map +1 -0
  27. package/dist/server/model/events/StoreItemTagEvents.d.ts +1 -0
  28. package/dist/server/model/events/StoreItemTagEvents.d.ts.map +1 -1
  29. package/dist/server/model/events/StoreItemTagEvents.js +24 -9
  30. package/dist/server/model/events/StoreItemTagEvents.js.map +1 -1
  31. package/dist/server/model/events/TagEvents.d.ts +2 -0
  32. package/dist/server/model/events/TagEvents.d.ts.map +1 -1
  33. package/dist/server/model/events/TagEvents.js +3 -0
  34. package/dist/server/model/events/TagEvents.js.map +1 -1
  35. package/dist/server/seed/ui/seed-ui.js +1 -1
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/src/server/model/SocialMailContext.ts +3 -1
  39. package/src/server/model/SocialMailContextEvents.ts +3 -1
  40. package/src/server/model/entities/Store.ts +26 -1
  41. package/src/server/model/entities/Tag.ts +2 -1
  42. package/src/server/model/events/StoreEvents.ts +12 -0
  43. package/src/server/model/events/StoreItemEvents.ts +18 -7
  44. package/src/server/model/events/StoreItemFolderTagEvents.ts +11 -0
  45. package/src/server/model/events/StoreItemTagEvents.ts +28 -9
  46. package/src/server/model/events/TagEvents.ts +5 -0
  47. package/src/server/seed/ui/seed-ui.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.4.855",
3
+ "version": "1.4.857",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -37,7 +37,7 @@ import EmailEngagement from "./entities/EmailEngagement.js";
37
37
  import MailboxContactTag from "./entities/MailboxContactTag.js";
38
38
  import ChannelConfig from "./entities/ChannelConfig.js";
39
39
  import UserPushSubscription from "./entities/UserSubscriptions.js";
40
- import Store, { StoreConfig, StoreInsight, StoreItem, StoreItemFolder, StoreItemPrice, StoreItemTag, StoreItemTax, StoreJournal, StoreJournalEntry, StoreJournalLineItem, StoreLedger, StoreMediaFile, StoreTag, StoreUser } from "./entities/Store.js";
40
+ import Store, { StoreConfig, StoreInsight, StoreItem, StoreItemFolder, StoreItemFolderTag, StoreItemPrice, StoreItemTag, StoreItemTax, StoreJournal, StoreJournalEntry, StoreJournalLineItem, StoreLedger, StoreMediaFile, StoreTag, StoreUser } from "./entities/Store.js";
41
41
  import RateLimitToken from "./entities/RateLimitToken.js";
42
42
  import AccessToken from "./entities/AccessToken.js";
43
43
  import ServerActivity from "./entities/ServerActivity.js";
@@ -135,6 +135,8 @@ export default class SocialMailContext extends EntityContext {
135
135
 
136
136
  public storeItemFolders = this.model.register(StoreItemFolder);
137
137
 
138
+ public storeItemFolderTags = this.model.register(StoreItemFolderTag);
139
+
138
140
  public storeItemPrices = this.model.register(StoreItemPrice);
139
141
 
140
142
  // public storePriceAddOns = this.model.register(StorePriceAddOn);
@@ -68,7 +68,7 @@ import UserPushSubscription from "./entities/UserSubscriptions.js";
68
68
  import UserPushSubscriptionEvents from "./events/UserPushSubscriptionEvents.js";
69
69
  import EmailEngagement from "./entities/EmailEngagement.js";
70
70
  import EmailEngagementEvents from "./events/EmailEngagementEvents.js";
71
- import Store, { StoreConfig, StoreInsight, StoreItem, StoreItemFolder, StoreItemPrice, StoreItemTag, StoreItemTax, StoreJournal, StoreJournalEntry, StoreJournalLineItem, StoreLedger, StoreMediaFile, StoreTag, StoreUser } from "./entities/Store.js";
71
+ import Store, { StoreConfig, StoreInsight, StoreItem, StoreItemFolder, StoreItemFolderTag, StoreItemPrice, StoreItemTag, StoreItemTax, StoreJournal, StoreJournalEntry, StoreJournalLineItem, StoreLedger, StoreMediaFile, StoreTag, StoreUser } from "./entities/Store.js";
72
72
  import StoreEvents from "./events/StoreEvents.js";
73
73
  import StoreItemEvents from "./events/StoreItemEvents.js";
74
74
  // import StoreOrderEvents from "./events/StoreOrderEvents.js";
@@ -94,6 +94,7 @@ import IncomingSmsSourceEvents from "./events/IncomingSmsSourceEvents.js";
94
94
  import VerificationToken from "./entities/VerificationToken.js";
95
95
  import VerificationTokenEvents from "./events/VerificationTokenEvents.js";
96
96
  import StoreTagEvents from "./events/StoreTagEvents.js";
97
+ import StoreItemFolderTagEvents from "./events/StoreItemFolderTagEvents.js";
97
98
 
98
99
  @RegisterSingleton
99
100
  export default class SocialMailContextEvents extends ContextEvents {
@@ -141,6 +142,7 @@ export default class SocialMailContextEvents extends ContextEvents {
141
142
  this.register(StoreJournalEntry, StoreJournalEntryEvents);
142
143
  this.register(StoreJournalLineItem, StoreJournalLineItemEvents);
143
144
  this.register(StoreItemFolder, StoreItemFolderEvents);
145
+ this.register(StoreItemFolderTag, StoreItemFolderTagEvents);
144
146
  this.register(StoreMediaFile, StoreMediaFileEvents);
145
147
  this.register(StoreConfig, StoreConfigEvents);
146
148
  this.register(StoreItemTax, StoreItemTaxEvents);
@@ -87,7 +87,7 @@ export class StoreTag {
87
87
  })
88
88
  public tagID: number;
89
89
 
90
- @Column({ dataType: "Int"})
90
+ @Column({ dataType: "Int", default: () => 0 })
91
91
  public count: number;
92
92
 
93
93
  public store: Store;
@@ -414,8 +414,33 @@ export class StoreItemFolder {
414
414
  parent: StoreItemFolder;
415
415
  children: StoreItemFolder[];
416
416
  items: StoreItem[];
417
+ tags: StoreItemFolderTag[];
417
418
  }
418
419
 
420
+ @Table("StoreItemFolderTags")
421
+ export class StoreItemFolderTag {
422
+
423
+ @Column({ dataType: "BigInt", key: true })
424
+ @RelateTo(StoreItemFolder, {
425
+ property: (x) => x.itemFolder,
426
+ inverseProperty: (x) => x.tags
427
+ })
428
+ itemFolderID: number;
429
+
430
+ @Column({ dataType: "BigInt", key: true })
431
+ @RelateTo(Tag, {
432
+ property: (x) => x.tag,
433
+ inverseProperty: (x) => x.storeItemFolderTags
434
+ })
435
+ tagID: number;
436
+
437
+ @Column({ dataType: "Int", default: () => 0 })
438
+ count: number;
439
+
440
+ itemFolder: StoreItemFolder;
441
+
442
+ tag: Tag;
443
+ }
419
444
 
420
445
  @Table("StoreItems")
421
446
  export class StoreItem {
@@ -8,7 +8,7 @@ import type { ContactTag } from "./Contact.js";
8
8
  import { IgnoreJsonProperty, ReadOnlyJsonProperty } from "@entity-access/server-pages/dist/services/ModelService.js";
9
9
  import type MailboxContactTag from "./MailboxContactTag.js";
10
10
  import type EmailTag from "./EmailTag.js";
11
- import type { StoreItemTag, StoreTag } from "./Store.js";
11
+ import type { StoreItemFolderTag, StoreItemTag, StoreTag } from "./Store.js";
12
12
 
13
13
  /**
14
14
  * The reason tags table exists in form of string,bigint pair is, we need
@@ -77,4 +77,5 @@ export default class Tag {
77
77
 
78
78
  public storeItemTags: StoreItemTag[];
79
79
  storeTags: StoreTag[];
80
+ storeItemFolderTags: StoreItemFolderTag[];
80
81
  }
@@ -5,9 +5,21 @@ import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAc
5
5
  import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
6
6
  import SocialMailContext from "../SocialMailContext.js";
7
7
  import { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
8
+ import External from "@entity-access/server-pages/dist/decorators/External.js";
9
+ import Page from "@entity-access/server-pages/dist/Page.js";
8
10
 
9
11
  export default class StoreEvents extends AuthenticatedEvents<Store> {
10
12
 
13
+ @External
14
+ storeQuery() {
15
+ const page = ServiceProvider.resolve(this, Page as any) as Page;
16
+ const host = page.request.host;
17
+
18
+ const db = ServiceProvider.resolve(this, SocialMailContext);
19
+ const q = db.stores.where({ host }, (p) => (x) => x.storeWebsites.some((w) => w.website.hosts.some((h) => h.host === p.host)));
20
+ return q;
21
+ }
22
+
11
23
  filter(query: IEntityQuery<Store>) {
12
24
  if (!this.verify) {
13
25
  return query;
@@ -67,14 +67,25 @@ export default class StoreItemEvents extends AuthenticatedEvents<StoreItem> {
67
67
 
68
68
  if (entry.isModified("active")) {
69
69
  const diff = entity.active ? 1 : -1;
70
- const { storeItemID } = entity;
71
- await db.storeTags.where(entity, (p) => (x) => x.storeID === p.storeID)
72
- .update({ diff, storeItemID }, (p) => (x) => ({
73
- count: x.count + Sql.coll.sum(x.store.storeItems
74
- .map((si) => Sql.coll.sum(si.storeItemTags
75
- .map((t) => Sql.cast.asBoolean(p.diff) ? 1 : -1 ))))
76
- }));
70
+ await this.updateCounts(entity, diff);
77
71
  }
78
72
  }
79
73
 
74
+ async afterInsert(entity: StoreItem, entry: ChangeEntry<StoreItem>) {
75
+ if (entity.active) {
76
+ await this.updateCounts(entity, 1);
77
+ }
78
+ }
79
+
80
+
81
+ private async updateCounts(entity: StoreItem, diff: number) {
82
+ const db = ServiceProvider.resolve(this, SocialMailContext);
83
+ const { storeItemID } = entity;
84
+ await db.storeTags.where(entity, (p) => (x) => x.storeID === p.storeID)
85
+ .update({ diff, storeItemID }, (p) => (x) => ({
86
+ count: x.count + Sql.coll.sum(x.store.storeItems
87
+ .map((si) => Sql.coll.sum(si.storeItemTags
88
+ .map((t) => Sql.cast.asBoolean(p.diff) ? 1 : -1))))
89
+ }));
90
+ }
80
91
  }
@@ -0,0 +1,11 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
2
+ import { StoreItemFolderTag } from "../entities/Store.js";
3
+ import AuthenticatedEvents from "./AuthenticatedEvents.js";
4
+
5
+ export default class StoreItemFolderTagEvents extends AuthenticatedEvents<StoreItemFolderTag> {
6
+
7
+ filter(query: IEntityQuery<StoreItemFolderTag>): IEntityQuery<StoreItemFolderTag> {
8
+ return query;
9
+ }
10
+
11
+ }
@@ -48,11 +48,21 @@ export default class StoreItemTagEvents extends AuthenticatedEvents<StoreItemTag
48
48
  }
49
49
 
50
50
  async afterInsert(entity: StoreItemTag, entry: ChangeEntry<StoreItemTag>) {
51
+ const diff = entity.storeItem.active ? 1 : 0;
52
+ await this.updateTagCounts(entry, entity, diff);
53
+ }
54
+
55
+ async afterDelete(entity: StoreItemTag, entry: ChangeEntry<StoreItemTag>) {
56
+ await entry.loadNavigationAsync((x) => x.storeItem);
57
+ const diff = entity.storeItem.active ? -1 : 0;
58
+ await this.updateTagCounts(entry, entity, diff);
59
+ }
60
+
61
+ private async updateTagCounts(entry: ChangeEntry<StoreItemTag>, entity: StoreItemTag, diff: number) {
51
62
  const db = ServiceProvider.resolve(this, SocialMailContext);
52
63
  await entry.loadNavigationAsync((x) => x.storeItem);
53
64
  const { storeItem } = entity;
54
- const diff = entity.storeItem.active ? 1 : 0;
55
- const updated = await db.storeTags.where(storeItem, (p) => (x) => x.storeID === p.storeID)
65
+ let updated = await db.storeTags.where(storeItem, (p) => (x) => x.storeID === p.storeID)
56
66
  .update({ diff }, (p) => (x) => ({
57
67
  count: x.count + Sql.cast.asInteger(p.diff)
58
68
  }));
@@ -67,16 +77,25 @@ export default class StoreItemTagEvents extends AuthenticatedEvents<StoreItemTag
67
77
 
68
78
  await db.storeTags.statements.upsert({ storeID, tagID, count }, void 0, { storeID, tagID });
69
79
  }
70
- }
71
80
 
72
- async afterDelete(entity: StoreItemTag, entry: ChangeEntry<StoreItemTag>) {
73
- const db = ServiceProvider.resolve(this, SocialMailContext);
74
- await entry.loadNavigationAsync((x) => x.storeItem);
75
- const { storeItem } = entity;
76
- const diff = entity.storeItem.active ? -1 : 0;
77
- await db.storeTags.where(storeItem, (p) => (x) => x.storeID === p.storeID)
81
+ if (!storeItem.itemFolderID) {
82
+ return;
83
+ }
84
+ updated = await db.storeItemFolderTags.where(storeItem, (p) => (x) => x.itemFolderID === p.itemFolderID)
78
85
  .update({ diff }, (p) => (x) => ({
79
86
  count: x.count + Sql.cast.asInteger(p.diff)
80
87
  }));
88
+ if (!updated) {
89
+ // insert one...
90
+ const { itemFolderID } = storeItem;
91
+ const { tagID } = entity;
92
+ const count = await db.storeItemFolderTags.where({ itemFolderID, tagID }, (p) => (x) => x.itemFolder.items.some((si) => si.active === true)
93
+ && x.tagID === p.tagID
94
+ && x.itemFolderID === p.itemFolderID)
95
+ .count();
96
+
97
+ await db.storeItemFolderTags.statements.upsert({ itemFolderID, tagID, count }, void 0, { itemFolderID, tagID });
98
+ }
81
99
  }
100
+
82
101
  }
@@ -5,6 +5,7 @@ import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeE
5
5
  import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
6
6
  import SocialMailContext from "../SocialMailContext.js";
7
7
  import TagService from "../../services/tags/TagService.js";
8
+ import { ForeignKeyFilter } from "@entity-access/entity-access/dist/model/events/EntityEvents.js";
8
9
 
9
10
  export default class TagEvents extends AuthenticatedEvents<Tag> {
10
11
 
@@ -29,6 +30,10 @@ export default class TagEvents extends AuthenticatedEvents<Tag> {
29
30
  );
30
31
  }
31
32
 
33
+ onForeignKeyFilter(filter: ForeignKeyFilter<Tag, any>): IEntityQuery<any> {
34
+ return filter.unfiltered();
35
+ }
36
+
32
37
  includeFilter(query: IEntityQuery<Tag>, type?: any, key?: string | undefined): IEntityQuery<Tag> {
33
38
  return query;
34
39
  }
@@ -3,7 +3,7 @@ import semver from "semver";
3
3
 
4
4
  export default async function seedUI(config: DBConfig) {
5
5
 
6
- const version = "1.2.324";
6
+ const version = "1.2.329";
7
7
 
8
8
  const existing = await config.getValue(UIPackageConfig, false);
9
9
  if (existing) {