@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.
- package/dist/server/model/SocialMailContext.d.ts +2 -1
- package/dist/server/model/SocialMailContext.d.ts.map +1 -1
- package/dist/server/model/SocialMailContext.js +2 -1
- 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 -1
- package/dist/server/model/SocialMailContextEvents.js.map +1 -1
- package/dist/server/model/entities/Store.d.ts +8 -0
- package/dist/server/model/entities/Store.d.ts.map +1 -1
- package/dist/server/model/entities/Store.js +27 -1
- package/dist/server/model/entities/Store.js.map +1 -1
- package/dist/server/model/entities/Tag.d.ts +2 -1
- package/dist/server/model/entities/Tag.d.ts.map +1 -1
- package/dist/server/model/entities/Tag.js.map +1 -1
- package/dist/server/model/events/StoreEvents.d.ts +1 -0
- package/dist/server/model/events/StoreEvents.d.ts.map +1 -1
- package/dist/server/model/events/StoreEvents.js +24 -0
- package/dist/server/model/events/StoreEvents.js.map +1 -1
- package/dist/server/model/events/StoreItemEvents.d.ts +2 -0
- package/dist/server/model/events/StoreItemEvents.d.ts.map +1 -1
- package/dist/server/model/events/StoreItemEvents.js +16 -7
- package/dist/server/model/events/StoreItemEvents.js.map +1 -1
- package/dist/server/model/events/StoreItemFolderTagEvents.d.ts +7 -0
- package/dist/server/model/events/StoreItemFolderTagEvents.d.ts.map +1 -0
- package/dist/server/model/events/StoreItemFolderTagEvents.js +7 -0
- package/dist/server/model/events/StoreItemFolderTagEvents.js.map +1 -0
- package/dist/server/model/events/StoreItemTagEvents.d.ts +1 -0
- package/dist/server/model/events/StoreItemTagEvents.d.ts.map +1 -1
- package/dist/server/model/events/StoreItemTagEvents.js +24 -9
- package/dist/server/model/events/StoreItemTagEvents.js.map +1 -1
- package/dist/server/model/events/TagEvents.d.ts +2 -0
- package/dist/server/model/events/TagEvents.d.ts.map +1 -1
- package/dist/server/model/events/TagEvents.js +3 -0
- package/dist/server/model/events/TagEvents.js.map +1 -1
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/server/model/SocialMailContext.ts +3 -1
- package/src/server/model/SocialMailContextEvents.ts +3 -1
- package/src/server/model/entities/Store.ts +26 -1
- package/src/server/model/entities/Tag.ts +2 -1
- package/src/server/model/events/StoreEvents.ts +12 -0
- package/src/server/model/events/StoreItemEvents.ts +18 -7
- package/src/server/model/events/StoreItemFolderTagEvents.ts +11 -0
- package/src/server/model/events/StoreItemTagEvents.ts +28 -9
- package/src/server/model/events/TagEvents.ts +5 -0
- package/src/server/seed/ui/seed-ui.ts +1 -1
package/package.json
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
}
|