@endora-commerce/mod-newsletter 0.100.0

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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/dist/admin/api/newsletter-client.d.ts +64 -0
  4. package/dist/admin/api/newsletter-client.d.ts.map +1 -0
  5. package/dist/admin/api/newsletter-client.js +71 -0
  6. package/dist/admin/api/newsletter-client.js.map +1 -0
  7. package/dist/admin/email-variables.d.ts +21 -0
  8. package/dist/admin/email-variables.d.ts.map +1 -0
  9. package/dist/admin/email-variables.js +48 -0
  10. package/dist/admin/email-variables.js.map +1 -0
  11. package/dist/admin/index.d.ts +44 -0
  12. package/dist/admin/index.d.ts.map +1 -0
  13. package/dist/admin/index.js +149 -0
  14. package/dist/admin/index.js.map +1 -0
  15. package/dist/admin/pages/AutomationBuilder.d.ts +8 -0
  16. package/dist/admin/pages/AutomationBuilder.d.ts.map +1 -0
  17. package/dist/admin/pages/AutomationBuilder.js +131 -0
  18. package/dist/admin/pages/AutomationBuilder.js.map +1 -0
  19. package/dist/admin/pages/AutomationsPage.d.ts +8 -0
  20. package/dist/admin/pages/AutomationsPage.d.ts.map +1 -0
  21. package/dist/admin/pages/AutomationsPage.js +43 -0
  22. package/dist/admin/pages/AutomationsPage.js.map +1 -0
  23. package/dist/admin/pages/BlocksPage.d.ts +8 -0
  24. package/dist/admin/pages/BlocksPage.d.ts.map +1 -0
  25. package/dist/admin/pages/BlocksPage.js +110 -0
  26. package/dist/admin/pages/BlocksPage.js.map +1 -0
  27. package/dist/admin/pages/CampaignEditor.d.ts +8 -0
  28. package/dist/admin/pages/CampaignEditor.d.ts.map +1 -0
  29. package/dist/admin/pages/CampaignEditor.js +144 -0
  30. package/dist/admin/pages/CampaignEditor.js.map +1 -0
  31. package/dist/admin/pages/CampaignStats.d.ts +8 -0
  32. package/dist/admin/pages/CampaignStats.d.ts.map +1 -0
  33. package/dist/admin/pages/CampaignStats.js +45 -0
  34. package/dist/admin/pages/CampaignStats.js.map +1 -0
  35. package/dist/admin/pages/CampaignsPage.d.ts +8 -0
  36. package/dist/admin/pages/CampaignsPage.d.ts.map +1 -0
  37. package/dist/admin/pages/CampaignsPage.js +28 -0
  38. package/dist/admin/pages/CampaignsPage.js.map +1 -0
  39. package/dist/admin/pages/ProviderSettingsPage.d.ts +8 -0
  40. package/dist/admin/pages/ProviderSettingsPage.d.ts.map +1 -0
  41. package/dist/admin/pages/ProviderSettingsPage.js +64 -0
  42. package/dist/admin/pages/ProviderSettingsPage.js.map +1 -0
  43. package/dist/admin/pages/SubscribersPage.d.ts +8 -0
  44. package/dist/admin/pages/SubscribersPage.d.ts.map +1 -0
  45. package/dist/admin/pages/SubscribersPage.js +55 -0
  46. package/dist/admin/pages/SubscribersPage.js.map +1 -0
  47. package/dist/admin/pages/TagsPage.d.ts +8 -0
  48. package/dist/admin/pages/TagsPage.d.ts.map +1 -0
  49. package/dist/admin/pages/TagsPage.js +114 -0
  50. package/dist/admin/pages/TagsPage.js.map +1 -0
  51. package/dist/backend/entities/newsletter-automation-run.entity.d.ts +19 -0
  52. package/dist/backend/entities/newsletter-automation-run.entity.d.ts.map +1 -0
  53. package/dist/backend/entities/newsletter-automation-run.entity.js +72 -0
  54. package/dist/backend/entities/newsletter-automation-run.entity.js.map +1 -0
  55. package/dist/backend/entities/newsletter-automation.entity.d.ts +22 -0
  56. package/dist/backend/entities/newsletter-automation.entity.d.ts.map +1 -0
  57. package/dist/backend/entities/newsletter-automation.entity.js +86 -0
  58. package/dist/backend/entities/newsletter-automation.entity.js.map +1 -0
  59. package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts +6 -0
  60. package/dist/backend/entities/newsletter-campaign-subscriber.entity.d.ts.map +1 -0
  61. package/dist/backend/entities/newsletter-campaign-subscriber.entity.js +30 -0
  62. package/dist/backend/entities/newsletter-campaign-subscriber.entity.js.map +1 -0
  63. package/dist/backend/entities/newsletter-campaign.entity.d.ts +22 -0
  64. package/dist/backend/entities/newsletter-campaign.entity.d.ts.map +1 -0
  65. package/dist/backend/entities/newsletter-campaign.entity.js +102 -0
  66. package/dist/backend/entities/newsletter-campaign.entity.js.map +1 -0
  67. package/dist/backend/entities/newsletter-custom-field.entity.d.ts +12 -0
  68. package/dist/backend/entities/newsletter-custom-field.entity.d.ts.map +1 -0
  69. package/dist/backend/entities/newsletter-custom-field.entity.js +53 -0
  70. package/dist/backend/entities/newsletter-custom-field.entity.js.map +1 -0
  71. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts +7 -0
  72. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.d.ts.map +1 -0
  73. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js +35 -0
  74. package/dist/backend/entities/newsletter-email-block-sales-channel.entity.js.map +1 -0
  75. package/dist/backend/entities/newsletter-email-block.entity.d.ts +21 -0
  76. package/dist/backend/entities/newsletter-email-block.entity.d.ts.map +1 -0
  77. package/dist/backend/entities/newsletter-email-block.entity.js +78 -0
  78. package/dist/backend/entities/newsletter-email-block.entity.js.map +1 -0
  79. package/dist/backend/entities/newsletter-engagement-event.entity.d.ts +12 -0
  80. package/dist/backend/entities/newsletter-engagement-event.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/newsletter-engagement-event.entity.js +54 -0
  82. package/dist/backend/entities/newsletter-engagement-event.entity.js.map +1 -0
  83. package/dist/backend/entities/newsletter-send-record.entity.d.ts +23 -0
  84. package/dist/backend/entities/newsletter-send-record.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/newsletter-send-record.entity.js +89 -0
  86. package/dist/backend/entities/newsletter-send-record.entity.js.map +1 -0
  87. package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts +6 -0
  88. package/dist/backend/entities/newsletter-subscriber-tag.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/newsletter-subscriber-tag.entity.js +31 -0
  90. package/dist/backend/entities/newsletter-subscriber-tag.entity.js.map +1 -0
  91. package/dist/backend/entities/newsletter-subscriber.entity.d.ts +63 -0
  92. package/dist/backend/entities/newsletter-subscriber.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/newsletter-subscriber.entity.js +147 -0
  94. package/dist/backend/entities/newsletter-subscriber.entity.js.map +1 -0
  95. package/dist/backend/entities/newsletter-suppression.entity.d.ts +14 -0
  96. package/dist/backend/entities/newsletter-suppression.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/newsletter-suppression.entity.js +51 -0
  98. package/dist/backend/entities/newsletter-suppression.entity.js.map +1 -0
  99. package/dist/backend/entities/newsletter-tag.entity.d.ts +12 -0
  100. package/dist/backend/entities/newsletter-tag.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/newsletter-tag.entity.js +53 -0
  102. package/dist/backend/entities/newsletter-tag.entity.js.map +1 -0
  103. package/dist/backend/index.d.ts +120 -0
  104. package/dist/backend/index.d.ts.map +1 -0
  105. package/dist/backend/index.js +139 -0
  106. package/dist/backend/index.js.map +1 -0
  107. package/dist/backend/plugin.d.ts +114 -0
  108. package/dist/backend/plugin.d.ts.map +1 -0
  109. package/dist/backend/plugin.js +171 -0
  110. package/dist/backend/plugin.js.map +1 -0
  111. package/dist/backend/routes.admin.d.ts +27 -0
  112. package/dist/backend/routes.admin.d.ts.map +1 -0
  113. package/dist/backend/routes.admin.js +118 -0
  114. package/dist/backend/routes.admin.js.map +1 -0
  115. package/dist/backend/routes.self.d.ts +15 -0
  116. package/dist/backend/routes.self.d.ts.map +1 -0
  117. package/dist/backend/routes.self.js +28 -0
  118. package/dist/backend/routes.self.js.map +1 -0
  119. package/dist/backend/routes.storefront.d.ts +24 -0
  120. package/dist/backend/routes.storefront.d.ts.map +1 -0
  121. package/dist/backend/routes.storefront.js +79 -0
  122. package/dist/backend/routes.storefront.js.map +1 -0
  123. package/dist/backend/services/audience-resolver.d.ts +20 -0
  124. package/dist/backend/services/audience-resolver.d.ts.map +1 -0
  125. package/dist/backend/services/audience-resolver.js +41 -0
  126. package/dist/backend/services/audience-resolver.js.map +1 -0
  127. package/dist/backend/services/automation.service.d.ts +58 -0
  128. package/dist/backend/services/automation.service.d.ts.map +1 -0
  129. package/dist/backend/services/automation.service.js +301 -0
  130. package/dist/backend/services/automation.service.js.map +1 -0
  131. package/dist/backend/services/campaign-dispatch.service.d.ts +50 -0
  132. package/dist/backend/services/campaign-dispatch.service.d.ts.map +1 -0
  133. package/dist/backend/services/campaign-dispatch.service.js +130 -0
  134. package/dist/backend/services/campaign-dispatch.service.js.map +1 -0
  135. package/dist/backend/services/campaign.service.d.ts +40 -0
  136. package/dist/backend/services/campaign.service.d.ts.map +1 -0
  137. package/dist/backend/services/campaign.service.js +195 -0
  138. package/dist/backend/services/campaign.service.js.map +1 -0
  139. package/dist/backend/services/consent-block-seeder.d.ts +30 -0
  140. package/dist/backend/services/consent-block-seeder.d.ts.map +1 -0
  141. package/dist/backend/services/consent-block-seeder.js +52 -0
  142. package/dist/backend/services/consent-block-seeder.js.map +1 -0
  143. package/dist/backend/services/content.service.d.ts +52 -0
  144. package/dist/backend/services/content.service.d.ts.map +1 -0
  145. package/dist/backend/services/content.service.js +48 -0
  146. package/dist/backend/services/content.service.js.map +1 -0
  147. package/dist/backend/services/custom-field.service.d.ts +16 -0
  148. package/dist/backend/services/custom-field.service.d.ts.map +1 -0
  149. package/dist/backend/services/custom-field.service.js +67 -0
  150. package/dist/backend/services/custom-field.service.js.map +1 -0
  151. package/dist/backend/services/email-block.service.d.ts +26 -0
  152. package/dist/backend/services/email-block.service.d.ts.map +1 -0
  153. package/dist/backend/services/email-block.service.js +120 -0
  154. package/dist/backend/services/email-block.service.js.map +1 -0
  155. package/dist/backend/services/opt-in.service.d.ts +25 -0
  156. package/dist/backend/services/opt-in.service.d.ts.map +1 -0
  157. package/dist/backend/services/opt-in.service.js +46 -0
  158. package/dist/backend/services/opt-in.service.js.map +1 -0
  159. package/dist/backend/services/provider/console-provider.d.ts +32 -0
  160. package/dist/backend/services/provider/console-provider.d.ts.map +1 -0
  161. package/dist/backend/services/provider/console-provider.js +31 -0
  162. package/dist/backend/services/provider/console-provider.js.map +1 -0
  163. package/dist/backend/services/provider/provider-registry.d.ts +51 -0
  164. package/dist/backend/services/provider/provider-registry.d.ts.map +1 -0
  165. package/dist/backend/services/provider/provider-registry.js +84 -0
  166. package/dist/backend/services/provider/provider-registry.js.map +1 -0
  167. package/dist/backend/services/provider/smtp-provider.d.ts +30 -0
  168. package/dist/backend/services/provider/smtp-provider.d.ts.map +1 -0
  169. package/dist/backend/services/provider/smtp-provider.js +42 -0
  170. package/dist/backend/services/provider/smtp-provider.js.map +1 -0
  171. package/dist/backend/services/provider-admin.service.d.ts +39 -0
  172. package/dist/backend/services/provider-admin.service.d.ts.map +1 -0
  173. package/dist/backend/services/provider-admin.service.js +59 -0
  174. package/dist/backend/services/provider-admin.service.js.map +1 -0
  175. package/dist/backend/services/provider-admin.types.d.ts +6 -0
  176. package/dist/backend/services/provider-admin.types.d.ts.map +1 -0
  177. package/dist/backend/services/provider-admin.types.js +2 -0
  178. package/dist/backend/services/provider-admin.types.js.map +1 -0
  179. package/dist/backend/services/queues/newsletter-queues.d.ts +34 -0
  180. package/dist/backend/services/queues/newsletter-queues.d.ts.map +1 -0
  181. package/dist/backend/services/queues/newsletter-queues.js +58 -0
  182. package/dist/backend/services/queues/newsletter-queues.js.map +1 -0
  183. package/dist/backend/services/self.service.d.ts +17 -0
  184. package/dist/backend/services/self.service.d.ts.map +1 -0
  185. package/dist/backend/services/self.service.js +44 -0
  186. package/dist/backend/services/self.service.js.map +1 -0
  187. package/dist/backend/services/stats.service.d.ts +10 -0
  188. package/dist/backend/services/stats.service.d.ts.map +1 -0
  189. package/dist/backend/services/stats.service.js +45 -0
  190. package/dist/backend/services/stats.service.js.map +1 -0
  191. package/dist/backend/services/subscriber-admin.service.d.ts +26 -0
  192. package/dist/backend/services/subscriber-admin.service.d.ts.map +1 -0
  193. package/dist/backend/services/subscriber-admin.service.js +163 -0
  194. package/dist/backend/services/subscriber-admin.service.js.map +1 -0
  195. package/dist/backend/services/subscriber.service.d.ts +91 -0
  196. package/dist/backend/services/subscriber.service.d.ts.map +1 -0
  197. package/dist/backend/services/subscriber.service.js +280 -0
  198. package/dist/backend/services/subscriber.service.js.map +1 -0
  199. package/dist/backend/services/tag.service.d.ts +16 -0
  200. package/dist/backend/services/tag.service.d.ts.map +1 -0
  201. package/dist/backend/services/tag.service.js +79 -0
  202. package/dist/backend/services/tag.service.js.map +1 -0
  203. package/dist/backend/services/token.helper.d.ts +32 -0
  204. package/dist/backend/services/token.helper.d.ts.map +1 -0
  205. package/dist/backend/services/token.helper.js +76 -0
  206. package/dist/backend/services/token.helper.js.map +1 -0
  207. package/dist/backend/services/tracking.service.d.ts +14 -0
  208. package/dist/backend/services/tracking.service.d.ts.map +1 -0
  209. package/dist/backend/services/tracking.service.js +45 -0
  210. package/dist/backend/services/tracking.service.js.map +1 -0
  211. package/dist/manifest.d.ts +192 -0
  212. package/dist/manifest.d.ts.map +1 -0
  213. package/dist/manifest.js +211 -0
  214. package/dist/manifest.js.map +1 -0
  215. package/dist/migrations/20260629T200954_newsletter_init.d.ts +6 -0
  216. package/dist/migrations/20260629T200954_newsletter_init.d.ts.map +1 -0
  217. package/dist/migrations/20260629T200954_newsletter_init.js +261 -0
  218. package/dist/migrations/20260629T200954_newsletter_init.js.map +1 -0
  219. package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts +116 -0
  220. package/dist/migrations/20260830T212736_newsletter_organization_attribution.d.ts.map +1 -0
  221. package/dist/migrations/20260830T212736_newsletter_organization_attribution.js +186 -0
  222. package/dist/migrations/20260830T212736_newsletter_organization_attribution.js.map +1 -0
  223. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts +6 -0
  224. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.d.ts.map +1 -0
  225. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js +58 -0
  226. package/dist/migrations/20260903T101752_newsletter_namespace_block_names.js.map +1 -0
  227. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts +23 -0
  228. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.d.ts.map +1 -0
  229. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js +27 -0
  230. package/dist/migrations/20260912T125702_newsletter_subscriber_tenant_scope_index.js.map +1 -0
  231. package/dist/migrations/index.d.ts +30 -0
  232. package/dist/migrations/index.d.ts.map +1 -0
  233. package/dist/migrations/index.js +35 -0
  234. package/dist/migrations/index.js.map +1 -0
  235. package/docs/newsletter.md +94 -0
  236. package/i18n/en.json +27 -0
  237. package/i18n/pl.json +27 -0
  238. package/package.json +119 -0
  239. package/tailwind.css +14 -0
@@ -0,0 +1,86 @@
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 { Entity, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * NewsletterAutomation — feature 048. A linear send/wait sequence triggered by
15
+ * all/tag/tag-list. `steps` is an ordered JSON list whose shape leaves room for
16
+ * future branch/condition/tag-action node types (research R9).
17
+ */
18
+ let NewsletterAutomation = class NewsletterAutomation {
19
+ [OptionalProps];
20
+ id = randomUUID();
21
+ name;
22
+ status = 'draft';
23
+ triggerType = 'all';
24
+ triggerTagIds = [];
25
+ salesChannelId = null;
26
+ language;
27
+ reentryPolicy = 'once';
28
+ steps = [];
29
+ version = 1;
30
+ createdAt = new Date();
31
+ updatedAt = new Date();
32
+ };
33
+ __decorate([
34
+ PrimaryKey({ type: 'uuid' }),
35
+ __metadata("design:type", String)
36
+ ], NewsletterAutomation.prototype, "id", void 0);
37
+ __decorate([
38
+ Property({ type: 'string', length: 200 }),
39
+ __metadata("design:type", String)
40
+ ], NewsletterAutomation.prototype, "name", void 0);
41
+ __decorate([
42
+ Property({ type: 'string', length: 16 }),
43
+ __metadata("design:type", String)
44
+ ], NewsletterAutomation.prototype, "status", void 0);
45
+ __decorate([
46
+ Property({ type: 'string', length: 16, fieldName: 'trigger_type' }),
47
+ __metadata("design:type", String)
48
+ ], NewsletterAutomation.prototype, "triggerType", void 0);
49
+ __decorate([
50
+ Property({ type: 'json', fieldName: 'trigger_tag_ids' }),
51
+ __metadata("design:type", Array)
52
+ ], NewsletterAutomation.prototype, "triggerTagIds", void 0);
53
+ __decorate([
54
+ Property({ type: 'uuid', fieldName: 'sales_channel_id', nullable: true }),
55
+ __metadata("design:type", Object)
56
+ ], NewsletterAutomation.prototype, "salesChannelId", void 0);
57
+ __decorate([
58
+ Property({ type: 'string', length: 12 }),
59
+ __metadata("design:type", String)
60
+ ], NewsletterAutomation.prototype, "language", void 0);
61
+ __decorate([
62
+ Property({ type: 'string', length: 16, fieldName: 'reentry_policy' }),
63
+ __metadata("design:type", String)
64
+ ], NewsletterAutomation.prototype, "reentryPolicy", void 0);
65
+ __decorate([
66
+ Property({ type: 'json' }),
67
+ __metadata("design:type", Array)
68
+ ], NewsletterAutomation.prototype, "steps", void 0);
69
+ __decorate([
70
+ Property({ type: 'integer' }),
71
+ __metadata("design:type", Number)
72
+ ], NewsletterAutomation.prototype, "version", void 0);
73
+ __decorate([
74
+ Property({ type: 'datetime', fieldName: 'created_at', onCreate: () => new Date() }),
75
+ __metadata("design:type", Date)
76
+ ], NewsletterAutomation.prototype, "createdAt", void 0);
77
+ __decorate([
78
+ Property({ type: 'datetime', fieldName: 'updated_at', onUpdate: () => new Date() }),
79
+ __metadata("design:type", Date)
80
+ ], NewsletterAutomation.prototype, "updatedAt", void 0);
81
+ NewsletterAutomation = __decorate([
82
+ GlobalEntity(),
83
+ Entity({ tableName: 'newsletter_automations' })
84
+ ], NewsletterAutomation);
85
+ export { NewsletterAutomation };
86
+ //# sourceMappingURL=newsletter-automation.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-automation.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-automation.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;GAIG;AAGI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,CAAC,aAAa,CAAC,CAOC;IAGhB,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,IAAI,CAAU;IAGd,MAAM,GAAkC,OAAO,CAAC;IAGhD,WAAW,GAA+B,KAAK,CAAC;IAGhD,aAAa,GAAa,EAAE,CAAC;IAG7B,cAAc,GAAkB,IAAI,CAAC;IAGrC,QAAQ,CAAU;IAGlB,aAAa,GAA6B,MAAM,CAAC;IAGjD,KAAK,GAAmC,EAAE,CAAC;IAG3C,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AAlCC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;kDAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;oDACO;AAGhD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;;yDACpB;AAGhD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;2DAC5B;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACrC;AAGrC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;sDACvB;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;2DACrB;AAGjD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8BACpB,KAAK;mDAA+B;AAG3C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;qDACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;uDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;uDAAc;AA5ClB,oBAAoB;IAFhC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC;GACnC,oBAAoB,CA6ChC"}
@@ -0,0 +1,6 @@
1
+ /** NewsletterCampaignSubscriber — feature 048. Bridge for `target_type = group`. */
2
+ export declare class NewsletterCampaignSubscriber {
3
+ campaignId: string;
4
+ subscriberId: string;
5
+ }
6
+ //# sourceMappingURL=newsletter-campaign-subscriber.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-campaign-subscriber.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-campaign-subscriber.entity.ts"],"names":[],"mappings":"AAGA,oFAAoF;AACpF,qBAEa,4BAA4B;IAEvC,UAAU,EAAG,MAAM,CAAC;IAGpB,YAAY,EAAG,MAAM,CAAC;CACvB"}
@@ -0,0 +1,30 @@
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 { Entity, PrimaryKey } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ /** NewsletterCampaignSubscriber — feature 048. Bridge for `target_type = group`. */
13
+ let NewsletterCampaignSubscriber = class NewsletterCampaignSubscriber {
14
+ campaignId;
15
+ subscriberId;
16
+ };
17
+ __decorate([
18
+ PrimaryKey({ type: 'uuid', fieldName: 'campaign_id' }),
19
+ __metadata("design:type", String)
20
+ ], NewsletterCampaignSubscriber.prototype, "campaignId", void 0);
21
+ __decorate([
22
+ PrimaryKey({ type: 'uuid', fieldName: 'subscriber_id' }),
23
+ __metadata("design:type", String)
24
+ ], NewsletterCampaignSubscriber.prototype, "subscriberId", void 0);
25
+ NewsletterCampaignSubscriber = __decorate([
26
+ GlobalEntity(),
27
+ Entity({ tableName: 'newsletter_campaign_subscribers' })
28
+ ], NewsletterCampaignSubscriber);
29
+ export { NewsletterCampaignSubscriber };
30
+ //# sourceMappingURL=newsletter-campaign-subscriber.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-campaign-subscriber.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-campaign-subscriber.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,oFAAoF;AAG7E,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IAEvC,UAAU,CAAU;IAGpB,YAAY,CAAU;CACvB,CAAA;AAJC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;;gEACnC;AAGpB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;;kEACnC;AALX,4BAA4B;IAFxC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,CAAC;GAC5C,4BAA4B,CAMxC"}
@@ -0,0 +1,22 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /** NewsletterCampaign — feature 048. A one-off bulk send to a target audience. */
3
+ export declare class NewsletterCampaign {
4
+ [OptionalProps]?: 'salesChannelId' | 'targetTagIds' | 'trackingEnabled' | 'status' | 'scheduledAt' | 'dispatchJobId' | 'stats' | 'version' | 'createdAt' | 'updatedAt';
5
+ id: string;
6
+ name: string;
7
+ subject: string;
8
+ content: Record<string, unknown>;
9
+ salesChannelId: string | null;
10
+ language: string;
11
+ targetType: 'all' | 'group' | 'tag' | 'tag_list';
12
+ targetTagIds: string[];
13
+ trackingEnabled: boolean;
14
+ status: 'draft' | 'scheduled' | 'sending' | 'sent' | 'cancelled';
15
+ scheduledAt: Date | null;
16
+ dispatchJobId: string | null;
17
+ stats: Record<string, unknown>;
18
+ version: number;
19
+ createdAt: Date;
20
+ updatedAt: Date;
21
+ }
22
+ //# sourceMappingURL=newsletter-campaign.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-campaign.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-campaign.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAI9E,kFAAkF;AAClF,qBAEa,kBAAkB;IAC7B,CAAC,aAAa,CAAC,CAAC,EACZ,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,QAAQ,GACR,aAAa,GACb,eAAe,GACf,OAAO,GACP,SAAS,GACT,WAAW,GACX,WAAW,CAAC;IAGhB,EAAE,EAAE,MAAM,CAAgB;IAG1B,IAAI,EAAG,MAAM,CAAC;IAGd,OAAO,EAAG,MAAM,CAAC;IAGjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAGtC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGrC,QAAQ,EAAG,MAAM,CAAC;IAGlB,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,CAAS;IAGzD,YAAY,EAAE,MAAM,EAAE,CAAM;IAG5B,eAAe,EAAE,OAAO,CAAQ;IAGhC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAW;IAG3E,WAAW,EAAE,IAAI,GAAG,IAAI,CAAQ;IAGhC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAGpC,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,102 @@
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 { Entity, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /** NewsletterCampaign — feature 048. A one-off bulk send to a target audience. */
14
+ let NewsletterCampaign = class NewsletterCampaign {
15
+ [OptionalProps];
16
+ id = randomUUID();
17
+ name;
18
+ subject;
19
+ content = {};
20
+ salesChannelId = null;
21
+ language;
22
+ targetType = 'all';
23
+ targetTagIds = [];
24
+ trackingEnabled = true;
25
+ status = 'draft';
26
+ scheduledAt = null;
27
+ dispatchJobId = null;
28
+ stats = {};
29
+ version = 1;
30
+ createdAt = new Date();
31
+ updatedAt = new Date();
32
+ };
33
+ __decorate([
34
+ PrimaryKey({ type: 'uuid' }),
35
+ __metadata("design:type", String)
36
+ ], NewsletterCampaign.prototype, "id", void 0);
37
+ __decorate([
38
+ Property({ type: 'string', length: 200 }),
39
+ __metadata("design:type", String)
40
+ ], NewsletterCampaign.prototype, "name", void 0);
41
+ __decorate([
42
+ Property({ type: 'text' }),
43
+ __metadata("design:type", String)
44
+ ], NewsletterCampaign.prototype, "subject", void 0);
45
+ __decorate([
46
+ Property({ type: 'json' }),
47
+ __metadata("design:type", Object)
48
+ ], NewsletterCampaign.prototype, "content", void 0);
49
+ __decorate([
50
+ Property({ type: 'uuid', fieldName: 'sales_channel_id', nullable: true }),
51
+ __metadata("design:type", Object)
52
+ ], NewsletterCampaign.prototype, "salesChannelId", void 0);
53
+ __decorate([
54
+ Property({ type: 'string', length: 12 }),
55
+ __metadata("design:type", String)
56
+ ], NewsletterCampaign.prototype, "language", void 0);
57
+ __decorate([
58
+ Property({ type: 'string', length: 16, fieldName: 'target_type' }),
59
+ __metadata("design:type", String)
60
+ ], NewsletterCampaign.prototype, "targetType", void 0);
61
+ __decorate([
62
+ Property({ type: 'json', fieldName: 'target_tag_ids' }),
63
+ __metadata("design:type", Array)
64
+ ], NewsletterCampaign.prototype, "targetTagIds", void 0);
65
+ __decorate([
66
+ Property({ type: 'boolean', fieldName: 'tracking_enabled' }),
67
+ __metadata("design:type", Boolean)
68
+ ], NewsletterCampaign.prototype, "trackingEnabled", void 0);
69
+ __decorate([
70
+ Property({ type: 'string', length: 16 }),
71
+ __metadata("design:type", String)
72
+ ], NewsletterCampaign.prototype, "status", void 0);
73
+ __decorate([
74
+ Property({ type: 'datetime', fieldName: 'scheduled_at', nullable: true }),
75
+ __metadata("design:type", Object)
76
+ ], NewsletterCampaign.prototype, "scheduledAt", void 0);
77
+ __decorate([
78
+ Property({ type: 'string', length: 128, fieldName: 'dispatch_job_id', nullable: true }),
79
+ __metadata("design:type", Object)
80
+ ], NewsletterCampaign.prototype, "dispatchJobId", void 0);
81
+ __decorate([
82
+ Property({ type: 'json' }),
83
+ __metadata("design:type", Object)
84
+ ], NewsletterCampaign.prototype, "stats", void 0);
85
+ __decorate([
86
+ Property({ type: 'integer' }),
87
+ __metadata("design:type", Number)
88
+ ], NewsletterCampaign.prototype, "version", void 0);
89
+ __decorate([
90
+ Property({ type: 'datetime', fieldName: 'created_at', onCreate: () => new Date() }),
91
+ __metadata("design:type", Date)
92
+ ], NewsletterCampaign.prototype, "createdAt", void 0);
93
+ __decorate([
94
+ Property({ type: 'datetime', fieldName: 'updated_at', onUpdate: () => new Date() }),
95
+ __metadata("design:type", Date)
96
+ ], NewsletterCampaign.prototype, "updatedAt", void 0);
97
+ NewsletterCampaign = __decorate([
98
+ GlobalEntity(),
99
+ Entity({ tableName: 'newsletter_campaigns' })
100
+ ], NewsletterCampaign);
101
+ export { NewsletterCampaign };
102
+ //# sourceMappingURL=newsletter-campaign.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-campaign.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-campaign.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,kFAAkF;AAG3E,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,CAAC,aAAa,CAAC,CAUC;IAGhB,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,IAAI,CAAU;IAGd,OAAO,CAAU;IAGjB,OAAO,GAA4B,EAAE,CAAC;IAGtC,cAAc,GAAkB,IAAI,CAAC;IAGrC,QAAQ,CAAU;IAGlB,UAAU,GAAyC,KAAK,CAAC;IAGzD,YAAY,GAAa,EAAE,CAAC;IAG5B,eAAe,GAAY,IAAI,CAAC;IAGhC,MAAM,GAA6D,OAAO,CAAC;IAG3E,WAAW,GAAgB,IAAI,CAAC;IAGhC,aAAa,GAAkB,IAAI,CAAC;IAGpC,KAAK,GAA4B,EAAE,CAAC;IAGpC,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA9CC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;gDAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDACV;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDACW;AAGtC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0DACrC;AAGrC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;oDACvB;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;;sDACV;AAGzD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;wDAC5B;AAG5B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;2DAC7B;AAGhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;kDACkC;AAG3E;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAC1C;AAGhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDACpD;AAGpC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;iDACS;AAGpC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;mDACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;qDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;qDAAc;AA3DlB,kBAAkB;IAF9B,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC;GACjC,kBAAkB,CA4D9B"}
@@ -0,0 +1,12 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /** NewsletterCustomField — feature 048. Operator-defined subscriber attribute. */
3
+ export declare class NewsletterCustomField {
4
+ [OptionalProps]?: 'createdAt' | 'updatedAt';
5
+ id: string;
6
+ key: string;
7
+ label: string;
8
+ type: 'text' | 'number' | 'boolean' | 'date';
9
+ createdAt: Date;
10
+ updatedAt: Date;
11
+ }
12
+ //# sourceMappingURL=newsletter-custom-field.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-custom-field.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-custom-field.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAgC,MAAM,iBAAiB,CAAC;AAItF,kFAAkF;AAClF,qBAEa,qBAAqB;IAChC,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IAG5C,EAAE,EAAE,MAAM,CAAgB;IAI1B,GAAG,EAAG,MAAM,CAAC;IAGb,KAAK,EAAG,MAAM,CAAC;IAGf,IAAI,EAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAG9C,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,53 @@
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 { Entity, OptionalProps, PrimaryKey, Property, Unique } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /** NewsletterCustomField — feature 048. Operator-defined subscriber attribute. */
14
+ let NewsletterCustomField = class NewsletterCustomField {
15
+ [OptionalProps];
16
+ id = randomUUID();
17
+ key;
18
+ label;
19
+ type;
20
+ createdAt = new Date();
21
+ updatedAt = new Date();
22
+ };
23
+ __decorate([
24
+ PrimaryKey({ type: 'uuid' }),
25
+ __metadata("design:type", String)
26
+ ], NewsletterCustomField.prototype, "id", void 0);
27
+ __decorate([
28
+ Property({ type: 'string', length: 64 }),
29
+ Unique(),
30
+ __metadata("design:type", String)
31
+ ], NewsletterCustomField.prototype, "key", void 0);
32
+ __decorate([
33
+ Property({ type: 'string', length: 160 }),
34
+ __metadata("design:type", String)
35
+ ], NewsletterCustomField.prototype, "label", void 0);
36
+ __decorate([
37
+ Property({ type: 'string', length: 16 }),
38
+ __metadata("design:type", String)
39
+ ], NewsletterCustomField.prototype, "type", void 0);
40
+ __decorate([
41
+ Property({ type: 'datetime', fieldName: 'created_at', onCreate: () => new Date() }),
42
+ __metadata("design:type", Date)
43
+ ], NewsletterCustomField.prototype, "createdAt", void 0);
44
+ __decorate([
45
+ Property({ type: 'datetime', fieldName: 'updated_at', onUpdate: () => new Date() }),
46
+ __metadata("design:type", Date)
47
+ ], NewsletterCustomField.prototype, "updatedAt", void 0);
48
+ NewsletterCustomField = __decorate([
49
+ GlobalEntity(),
50
+ Entity({ tableName: 'newsletter_custom_fields' })
51
+ ], NewsletterCustomField);
52
+ export { NewsletterCustomField };
53
+ //# sourceMappingURL=newsletter-custom-field.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-custom-field.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-custom-field.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,kFAAkF;AAG3E,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC,CAAC,aAAa,CAAC,CAA6B;IAG5C,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,GAAG,CAAU;IAGb,KAAK,CAAU;IAGf,IAAI,CAA0C;IAG9C,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AAjBC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;iDACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxC,MAAM,EAAE;;kDACI;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDAC3B;AAGf;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;mDACK;AAG9C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;wDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;wDAAc;AApBlB,qBAAqB;IAFjC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC;GACrC,qBAAqB,CAqBjC"}
@@ -0,0 +1,7 @@
1
+ /** NewsletterEmailBlockSalesChannel — feature 048. Optional per-channel block scoping. */
2
+ export declare class NewsletterEmailBlockSalesChannel {
3
+ blockId: string;
4
+ salesChannelId: string;
5
+ code: string;
6
+ }
7
+ //# sourceMappingURL=newsletter-email-block-sales-channel.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-email-block-sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-email-block-sales-channel.entity.ts"],"names":[],"mappings":"AAGA,0FAA0F;AAC1F,qBAEa,gCAAgC;IAE3C,OAAO,EAAG,MAAM,CAAC;IAGjB,cAAc,EAAG,MAAM,CAAC;IAGxB,IAAI,EAAG,MAAM,CAAC;CACf"}
@@ -0,0 +1,35 @@
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 { Entity, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ /** NewsletterEmailBlockSalesChannel — feature 048. Optional per-channel block scoping. */
13
+ let NewsletterEmailBlockSalesChannel = class NewsletterEmailBlockSalesChannel {
14
+ blockId;
15
+ salesChannelId;
16
+ code;
17
+ };
18
+ __decorate([
19
+ PrimaryKey({ type: 'uuid', fieldName: 'block_id' }),
20
+ __metadata("design:type", String)
21
+ ], NewsletterEmailBlockSalesChannel.prototype, "blockId", void 0);
22
+ __decorate([
23
+ PrimaryKey({ type: 'uuid', fieldName: 'sales_channel_id' }),
24
+ __metadata("design:type", String)
25
+ ], NewsletterEmailBlockSalesChannel.prototype, "salesChannelId", void 0);
26
+ __decorate([
27
+ Property({ type: 'string', length: 180 }),
28
+ __metadata("design:type", String)
29
+ ], NewsletterEmailBlockSalesChannel.prototype, "code", void 0);
30
+ NewsletterEmailBlockSalesChannel = __decorate([
31
+ GlobalEntity(),
32
+ Entity({ tableName: 'newsletter_email_block_sales_channels' })
33
+ ], NewsletterEmailBlockSalesChannel);
34
+ export { NewsletterEmailBlockSalesChannel };
35
+ //# sourceMappingURL=newsletter-email-block-sales-channel.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-email-block-sales-channel.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-email-block-sales-channel.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,0FAA0F;AAGnF,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;IAE3C,OAAO,CAAU;IAGjB,cAAc,CAAU;IAGxB,IAAI,CAAU;CACf,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;iEACnC;AAGjB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;wEACpC;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8DAC5B;AARH,gCAAgC;IAF5C,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,uCAAuC,EAAE,CAAC;GAClD,gCAAgC,CAS5C"}
@@ -0,0 +1,21 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * NewsletterEmailBlock — feature 048. Reusable email-safe content fragment
4
+ * (e.g. header/footer) embedded in campaign/automation content. Global when no
5
+ * sales-channel bridge rows exist. System blocks cannot be deleted.
6
+ */
7
+ export declare class NewsletterEmailBlock {
8
+ [OptionalProps]?: 'active' | 'description' | 'isSystem' | 'version' | 'createdAt' | 'updatedAt';
9
+ id: string;
10
+ code: string;
11
+ name: string;
12
+ description: string | null;
13
+ active: boolean;
14
+ /** Content envelope: { schema_version, languages: { lang: tree } }. */
15
+ content: Record<string, unknown>;
16
+ isSystem: boolean;
17
+ version: number;
18
+ createdAt: Date;
19
+ updatedAt: Date;
20
+ }
21
+ //# sourceMappingURL=newsletter-email-block.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-email-block.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-email-block.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;;GAIG;AACH,qBAEa,oBAAoB;IAC/B,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAGhG,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGlC,MAAM,EAAE,OAAO,CAAQ;IAEvB,uEAAuE;IAEvE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAGtC,QAAQ,EAAE,OAAO,CAAS;IAG1B,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
@@ -0,0 +1,78 @@
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 { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /**
14
+ * NewsletterEmailBlock — feature 048. Reusable email-safe content fragment
15
+ * (e.g. header/footer) embedded in campaign/automation content. Global when no
16
+ * sales-channel bridge rows exist. System blocks cannot be deleted.
17
+ */
18
+ let NewsletterEmailBlock = class NewsletterEmailBlock {
19
+ [OptionalProps];
20
+ id = randomUUID();
21
+ code;
22
+ name;
23
+ description = null;
24
+ active = true;
25
+ /** Content envelope: { schema_version, languages: { lang: tree } }. */
26
+ content = {};
27
+ isSystem = false;
28
+ version = 1;
29
+ createdAt = new Date();
30
+ updatedAt = new Date();
31
+ };
32
+ __decorate([
33
+ PrimaryKey({ type: 'uuid' }),
34
+ __metadata("design:type", String)
35
+ ], NewsletterEmailBlock.prototype, "id", void 0);
36
+ __decorate([
37
+ Property({ type: 'string', length: 180 }),
38
+ Index(),
39
+ __metadata("design:type", String)
40
+ ], NewsletterEmailBlock.prototype, "code", void 0);
41
+ __decorate([
42
+ Property({ type: 'string', length: 200 }),
43
+ __metadata("design:type", String)
44
+ ], NewsletterEmailBlock.prototype, "name", void 0);
45
+ __decorate([
46
+ Property({ type: 'text', nullable: true }),
47
+ __metadata("design:type", Object)
48
+ ], NewsletterEmailBlock.prototype, "description", void 0);
49
+ __decorate([
50
+ Property({ type: 'boolean' }),
51
+ __metadata("design:type", Boolean)
52
+ ], NewsletterEmailBlock.prototype, "active", void 0);
53
+ __decorate([
54
+ Property({ type: 'json' }),
55
+ __metadata("design:type", Object)
56
+ ], NewsletterEmailBlock.prototype, "content", void 0);
57
+ __decorate([
58
+ Property({ type: 'boolean', fieldName: 'is_system' }),
59
+ __metadata("design:type", Boolean)
60
+ ], NewsletterEmailBlock.prototype, "isSystem", void 0);
61
+ __decorate([
62
+ Property({ type: 'integer' }),
63
+ __metadata("design:type", Number)
64
+ ], NewsletterEmailBlock.prototype, "version", void 0);
65
+ __decorate([
66
+ Property({ type: 'datetime', fieldName: 'created_at', onCreate: () => new Date() }),
67
+ __metadata("design:type", Date)
68
+ ], NewsletterEmailBlock.prototype, "createdAt", void 0);
69
+ __decorate([
70
+ Property({ type: 'datetime', fieldName: 'updated_at', onUpdate: () => new Date() }),
71
+ __metadata("design:type", Date)
72
+ ], NewsletterEmailBlock.prototype, "updatedAt", void 0);
73
+ NewsletterEmailBlock = __decorate([
74
+ GlobalEntity(),
75
+ Entity({ tableName: 'newsletter_email_blocks' })
76
+ ], NewsletterEmailBlock);
77
+ export { NewsletterEmailBlock };
78
+ //# sourceMappingURL=newsletter-email-block.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-email-block.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-email-block.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;GAIG;AAGI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,CAAC,aAAa,CAAC,CAAiF;IAGhG,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,WAAW,GAAkB,IAAI,CAAC;IAGlC,MAAM,GAAY,IAAI,CAAC;IAEvB,uEAAuE;IAEvE,OAAO,GAA4B,EAAE,CAAC;IAGtC,QAAQ,GAAY,KAAK,CAAC;IAG1B,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA9BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,KAAK,EAAE;;kDACM;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;kDAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;oDACP;AAIvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACW;AAGtC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;;sDAC5B;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;qDACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;uDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;uDAAc;AAjClB,oBAAoB;IAFhC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC;GACpC,oBAAoB,CAkChC"}
@@ -0,0 +1,12 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /** NewsletterEngagementEvent — feature 048. One open/click event per send record. */
3
+ export declare class NewsletterEngagementEvent {
4
+ [OptionalProps]?: 'linkId' | 'url' | 'occurredAt';
5
+ id: string;
6
+ sendRecordId: string;
7
+ type: 'open' | 'click';
8
+ linkId: string | null;
9
+ url: string | null;
10
+ occurredAt: Date;
11
+ }
12
+ //# sourceMappingURL=newsletter-engagement-event.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-engagement-event.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-engagement-event.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF,qFAAqF;AACrF,qBAIa,yBAAyB;IACpC,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,YAAY,CAAC;IAGlD,EAAE,EAAE,MAAM,CAAgB;IAG1B,YAAY,EAAG,MAAM,CAAC;IAGtB,IAAI,EAAG,MAAM,GAAG,OAAO,CAAC;IAGxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG7B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG1B,UAAU,EAAE,IAAI,CAAc;CAC/B"}
@@ -0,0 +1,54 @@
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 { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
11
+ import { GlobalEntity } from '@endora-commerce/platform/tenancy';
12
+ import { randomUUID } from 'crypto';
13
+ /** NewsletterEngagementEvent — feature 048. One open/click event per send record. */
14
+ let NewsletterEngagementEvent = class NewsletterEngagementEvent {
15
+ [OptionalProps];
16
+ id = randomUUID();
17
+ sendRecordId;
18
+ type;
19
+ linkId = null;
20
+ url = null;
21
+ occurredAt = new Date();
22
+ };
23
+ __decorate([
24
+ PrimaryKey({ type: 'uuid' }),
25
+ __metadata("design:type", String)
26
+ ], NewsletterEngagementEvent.prototype, "id", void 0);
27
+ __decorate([
28
+ Property({ type: 'uuid', fieldName: 'send_record_id' }),
29
+ __metadata("design:type", String)
30
+ ], NewsletterEngagementEvent.prototype, "sendRecordId", void 0);
31
+ __decorate([
32
+ Property({ type: 'string', length: 8 }),
33
+ __metadata("design:type", String)
34
+ ], NewsletterEngagementEvent.prototype, "type", void 0);
35
+ __decorate([
36
+ Property({ type: 'string', length: 64, fieldName: 'link_id', nullable: true }),
37
+ __metadata("design:type", Object)
38
+ ], NewsletterEngagementEvent.prototype, "linkId", void 0);
39
+ __decorate([
40
+ Property({ type: 'text', nullable: true }),
41
+ __metadata("design:type", Object)
42
+ ], NewsletterEngagementEvent.prototype, "url", void 0);
43
+ __decorate([
44
+ Property({ type: 'datetime', fieldName: 'occurred_at', onCreate: () => new Date() }),
45
+ __metadata("design:type", Date)
46
+ ], NewsletterEngagementEvent.prototype, "occurredAt", void 0);
47
+ NewsletterEngagementEvent = __decorate([
48
+ GlobalEntity(),
49
+ Entity({ tableName: 'newsletter_engagement_events' }),
50
+ Index({ properties: ['sendRecordId'] }),
51
+ Index({ properties: ['type'] })
52
+ ], NewsletterEngagementEvent);
53
+ export { NewsletterEngagementEvent };
54
+ //# sourceMappingURL=newsletter-engagement-event.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-engagement-event.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-engagement-event.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,qFAAqF;AAK9E,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,CAAC,aAAa,CAAC,CAAmC;IAGlD,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,YAAY,CAAU;IAGtB,IAAI,CAAoB;IAGxB,MAAM,GAAkB,IAAI,CAAC;IAG7B,GAAG,GAAkB,IAAI,CAAC;IAG1B,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;CAC/B,CAAA;AAhBC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;;+DAClC;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;;uDAChB;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAClD;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACjB;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BACzE,IAAI;6DAAc;AAnBnB,yBAAyB;IAJrC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;IACrD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;IACvC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;GACnB,yBAAyB,CAoBrC"}
@@ -0,0 +1,23 @@
1
+ import { OptionalProps } from '@mikro-orm/core';
2
+ /**
3
+ * NewsletterSendRecord — feature 048. Per-recipient send + the atomic
4
+ * idempotency claim (Principle X). `id` is the stable provider messageId.
5
+ * Unique (campaign_id, subscriber_id) / (automation_run_id, step_index,
6
+ * subscriber_id) partial indexes are created in the migration.
7
+ */
8
+ export declare class NewsletterSendRecord {
9
+ [OptionalProps]?: 'campaignId' | 'automationRunId' | 'stepIndex' | 'status' | 'providerMessageId' | 'error' | 'openedAt' | 'clickCount' | 'sentAt' | 'createdAt';
10
+ id: string;
11
+ campaignId: string | null;
12
+ automationRunId: string | null;
13
+ stepIndex: number | null;
14
+ subscriberId: string;
15
+ status: 'queued' | 'sent' | 'failed' | 'bounced' | 'complained';
16
+ providerMessageId: string | null;
17
+ error: string | null;
18
+ openedAt: Date | null;
19
+ clickCount: number;
20
+ sentAt: Date | null;
21
+ createdAt: Date;
22
+ }
23
+ //# sourceMappingURL=newsletter-send-record.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newsletter-send-record.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/newsletter-send-record.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;;;GAKG;AACH,qBAIa,oBAAoB;IAC/B,CAAC,aAAa,CAAC,CAAC,EACZ,YAAY,GACZ,iBAAiB,GACjB,WAAW,GACX,QAAQ,GACR,mBAAmB,GACnB,OAAO,GACP,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,WAAW,CAAC;IAGhB,EAAE,EAAE,MAAM,CAAgB;IAG1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGhC,YAAY,EAAG,MAAM,CAAC;IAGtB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAY;IAG3E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAQ;IAG7B,UAAU,EAAE,MAAM,CAAK;IAGvB,MAAM,EAAE,IAAI,GAAG,IAAI,CAAQ;IAG3B,SAAS,EAAE,IAAI,CAAc;CAC9B"}