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

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 (40) 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 +26 -0
  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/StoreItemEvents.d.ts.map +1 -1
  16. package/dist/server/model/events/StoreItemEvents.js +12 -1
  17. package/dist/server/model/events/StoreItemEvents.js.map +1 -1
  18. package/dist/server/model/events/StoreItemTagEvents.d.ts +2 -0
  19. package/dist/server/model/events/StoreItemTagEvents.d.ts.map +1 -1
  20. package/dist/server/model/events/StoreItemTagEvents.js +33 -0
  21. package/dist/server/model/events/StoreItemTagEvents.js.map +1 -1
  22. package/dist/server/model/events/StoreTagEvents.d.ts +7 -0
  23. package/dist/server/model/events/StoreTagEvents.d.ts.map +1 -0
  24. package/dist/server/model/events/StoreTagEvents.js +7 -0
  25. package/dist/server/model/events/StoreTagEvents.js.map +1 -0
  26. package/dist/server/services/payment-gateways/Gateway.js +1 -1
  27. package/dist/server/services/payment-gateways/Gateway.js.map +1 -1
  28. package/dist/server/services/payment-gateways/PhonePeGateway.js +1 -1
  29. package/dist/server/services/payment-gateways/PhonePeGateway.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +1 -1
  32. package/src/server/model/SocialMailContext.ts +3 -1
  33. package/src/server/model/SocialMailContextEvents.ts +3 -1
  34. package/src/server/model/entities/Store.ts +26 -0
  35. package/src/server/model/entities/Tag.ts +2 -1
  36. package/src/server/model/events/StoreItemEvents.ts +13 -1
  37. package/src/server/model/events/StoreItemTagEvents.ts +36 -0
  38. package/src/server/model/events/StoreTagEvents.ts +11 -0
  39. package/src/server/services/payment-gateways/Gateway.ts +1 -1
  40. package/src/server/services/payment-gateways/PhonePeGateway.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.853",
3
+ "version": "1.4.855",
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, StoreUser } from "./entities/Store.js";
40
+ import Store, { StoreConfig, StoreInsight, StoreItem, StoreItemFolder, 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";
@@ -153,6 +153,8 @@ export default class SocialMailContext extends EntityContext {
153
153
 
154
154
  public storeItemTaxes = this.model.register(StoreItemTax);
155
155
 
156
+ public storeTags = this.model.register(StoreTag);
157
+
156
158
  // public storeOrders = this.model.register(StoreBill);
157
159
 
158
160
  // public storeOrderItem = this.model.register(StoreBillLine);
@@ -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, StoreUser } from "./entities/Store.js";
71
+ import Store, { StoreConfig, StoreInsight, StoreItem, StoreItemFolder, 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";
@@ -93,6 +93,7 @@ import IncomingSmsSource from "./entities/IncomingSmsSource.js";
93
93
  import IncomingSmsSourceEvents from "./events/IncomingSmsSourceEvents.js";
94
94
  import VerificationToken from "./entities/VerificationToken.js";
95
95
  import VerificationTokenEvents from "./events/VerificationTokenEvents.js";
96
+ import StoreTagEvents from "./events/StoreTagEvents.js";
96
97
 
97
98
  @RegisterSingleton
98
99
  export default class SocialMailContextEvents extends ContextEvents {
@@ -143,6 +144,7 @@ export default class SocialMailContextEvents extends ContextEvents {
143
144
  this.register(StoreMediaFile, StoreMediaFileEvents);
144
145
  this.register(StoreConfig, StoreConfigEvents);
145
146
  this.register(StoreItemTax, StoreItemTaxEvents);
147
+ this.register(StoreTag, StoreTagEvents);
146
148
  // this.register(StorePriceAddOn, StorePriceAddOnEvents);
147
149
  // this.register(StoreBill, StoreOrderEvents);
148
150
  // this.register(StoreBillLine, StoreOrderItemEvents);
@@ -67,6 +67,32 @@ export default class Store {
67
67
  journals: StoreJournal[];
68
68
  itemFolders: StoreItemFolder[];
69
69
  configs: StoreConfig[];
70
+ tags: StoreTag[];
71
+ }
72
+
73
+ @Table("StoreTags")
74
+ export class StoreTag {
75
+
76
+ @Column({ dataType: "BigInt", key: true})
77
+ @RelateTo(Store, {
78
+ property: (x) => x.store,
79
+ inverseProperty: (x) => x.tags
80
+ })
81
+ public storeID: number;
82
+
83
+ @Column({ dataType: "BigInt", key: true})
84
+ @RelateTo(Tag, {
85
+ property: (x) => x.tag,
86
+ inverseProperty: (x) => x.storeTags
87
+ })
88
+ public tagID: number;
89
+
90
+ @Column({ dataType: "Int"})
91
+ public count: number;
92
+
93
+ public store: Store;
94
+
95
+ public tag: Tag;
70
96
  }
71
97
 
72
98
  @Table("StoreLedger")
@@ -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 } from "./Store.js";
11
+ import type { 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
@@ -76,4 +76,5 @@ export default class Tag {
76
76
  public contactTags: ContactTag[];
77
77
 
78
78
  public storeItemTags: StoreItemTag[];
79
+ storeTags: StoreTag[];
79
80
  }
@@ -7,6 +7,7 @@ import External from "@entity-access/server-pages/dist/decorators/External.js";
7
7
  import Page from "@entity-access/server-pages/dist/Page.js";
8
8
  import { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
9
9
  import SocialMailContext from "../SocialMailContext.js";
10
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
10
11
 
11
12
  export default class StoreItemEvents extends AuthenticatedEvents<StoreItem> {
12
13
 
@@ -58,11 +59,22 @@ export default class StoreItemEvents extends AuthenticatedEvents<StoreItem> {
58
59
  async beforeUpdate(entity: StoreItem, entry: ChangeEntry<StoreItem>) {
59
60
  this.sessionUser.ensureLoggedIn();
60
61
 
62
+ const db = ServiceProvider.resolve(this, SocialMailContext);
61
63
  if (entity.folderID) {
62
- const db = ServiceProvider.resolve(this, SocialMailContext);
63
64
  await db.appFiles.where(entity, (p) => (x) => x.appFileID === p.folderID)
64
65
  .update({ name: `${entity.name} (${entity.storeItemID})`}, (p) => (x) => ({ name: p.name }));
65
66
  }
67
+
68
+ if (entry.isModified("active")) {
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
+ }));
77
+ }
66
78
  }
67
79
 
68
80
  }
@@ -3,6 +3,9 @@ import AuthenticatedEvents from "./AuthenticatedEvents.js";
3
3
  import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
4
4
  import { StoreItemTag } from "../entities/Store.js";
5
5
  import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
6
+ import { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
7
+ import SocialMailContext from "../SocialMailContext.js";
8
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
6
9
 
7
10
  export default class StoreItemTagEvents extends AuthenticatedEvents<StoreItemTag> {
8
11
 
@@ -43,4 +46,37 @@ export default class StoreItemTagEvents extends AuthenticatedEvents<StoreItemTag
43
46
  beforeUpdate(entity: StoreItemTag, entry: ChangeEntry<StoreItemTag>) {
44
47
  this.sessionUser.ensureLoggedIn();
45
48
  }
49
+
50
+ async afterInsert(entity: StoreItemTag, entry: ChangeEntry<StoreItemTag>) {
51
+ const db = ServiceProvider.resolve(this, SocialMailContext);
52
+ await entry.loadNavigationAsync((x) => x.storeItem);
53
+ 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)
56
+ .update({ diff }, (p) => (x) => ({
57
+ count: x.count + Sql.cast.asInteger(p.diff)
58
+ }));
59
+ if (!updated) {
60
+ // insert one...
61
+ const { storeID } = storeItem;
62
+ const { tagID } = entity;
63
+ const count = await db.storeItemTags.where({ storeID, tagID }, (p) => (x) => x.storeItem.active === true
64
+ && x.tagID === p.tagID
65
+ && x.storeItem.storeID === p.storeID)
66
+ .count();
67
+
68
+ await db.storeTags.statements.upsert({ storeID, tagID, count }, void 0, { storeID, tagID });
69
+ }
70
+ }
71
+
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)
78
+ .update({ diff }, (p) => (x) => ({
79
+ count: x.count + Sql.cast.asInteger(p.diff)
80
+ }));
81
+ }
46
82
  }
@@ -0,0 +1,11 @@
1
+ import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
2
+ import { StoreTag } from "../entities/Store.js";
3
+ import AuthenticatedEvents from "./AuthenticatedEvents.js";
4
+
5
+ export default class StoreTagEvents extends AuthenticatedEvents<StoreTag> {
6
+
7
+ filter(query: IEntityQuery<StoreTag>): IEntityQuery<StoreTag> {
8
+ return query;
9
+ }
10
+
11
+ }
@@ -33,7 +33,7 @@ export abstract class PaymentGateway {
33
33
 
34
34
  async createPaymentLink({ itemID, host, testMode = false, currency = "USD"}) {
35
35
  const { price, taxes } = await this.configService.getPrice(itemID, currency);
36
- const amount = price.amount + price.taxAmount;
36
+ const amount = Number(price.amount) + Number(price.taxAmount);
37
37
 
38
38
  return this.create({
39
39
  storeID: price.storeItem.storeID,
@@ -36,7 +36,7 @@ export default class PhonePeGateway extends PaymentGateway {
36
36
  merchantId,
37
37
  merchantTransactionId,
38
38
  merchantUserId: userID ?? randomUUID().replaceAll("-", ""),
39
- amount: amount * 100,
39
+ amount: Number(amount) * 100,
40
40
  callbackUrl: `https://${host}/callbacks/phonepe-callback/${merchantTransactionId}`,
41
41
  redirectUrl: `https://${host}/callbacks/phonepe-success/${merchantTransactionId}`,
42
42
  paymentInstrument: {