@endora-commerce/mod-transactional-emails 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.
- package/LICENSE +21 -0
- package/README.md +63 -0
- package/dist/admin/api/transactional-emails-client.d.ts +43 -0
- package/dist/admin/api/transactional-emails-client.d.ts.map +1 -0
- package/dist/admin/api/transactional-emails-client.js +47 -0
- package/dist/admin/api/transactional-emails-client.js.map +1 -0
- package/dist/admin/components/BrandingPanel.d.ts +10 -0
- package/dist/admin/components/BrandingPanel.d.ts.map +1 -0
- package/dist/admin/components/BrandingPanel.js +58 -0
- package/dist/admin/components/BrandingPanel.js.map +1 -0
- package/dist/admin/components/EmailEditorPane.d.ts +7 -0
- package/dist/admin/components/EmailEditorPane.d.ts.map +1 -0
- package/dist/admin/components/EmailEditorPane.js +48 -0
- package/dist/admin/components/EmailEditorPane.js.map +1 -0
- package/dist/admin/index.d.ts +46 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +92 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/EmailBlockEditorPage.d.ts +16 -0
- package/dist/admin/pages/EmailBlockEditorPage.d.ts.map +1 -0
- package/dist/admin/pages/EmailBlockEditorPage.js +19 -0
- package/dist/admin/pages/EmailBlockEditorPage.js.map +1 -0
- package/dist/admin/pages/EmailBlocksPage.d.ts +8 -0
- package/dist/admin/pages/EmailBlocksPage.d.ts.map +1 -0
- package/dist/admin/pages/EmailBlocksPage.js +55 -0
- package/dist/admin/pages/EmailBlocksPage.js.map +1 -0
- package/dist/admin/pages/EmailEditor.d.ts +8 -0
- package/dist/admin/pages/EmailEditor.d.ts.map +1 -0
- package/dist/admin/pages/EmailEditor.js +126 -0
- package/dist/admin/pages/EmailEditor.js.map +1 -0
- package/dist/admin/pages/EmailFragmentEditor.d.ts +9 -0
- package/dist/admin/pages/EmailFragmentEditor.d.ts.map +1 -0
- package/dist/admin/pages/EmailFragmentEditor.js +93 -0
- package/dist/admin/pages/EmailFragmentEditor.js.map +1 -0
- package/dist/admin/pages/EmailTemplateEditorPage.d.ts +12 -0
- package/dist/admin/pages/EmailTemplateEditorPage.d.ts.map +1 -0
- package/dist/admin/pages/EmailTemplateEditorPage.js +15 -0
- package/dist/admin/pages/EmailTemplateEditorPage.js.map +1 -0
- package/dist/admin/pages/EmailTemplatesPage.d.ts +8 -0
- package/dist/admin/pages/EmailTemplatesPage.d.ts.map +1 -0
- package/dist/admin/pages/EmailTemplatesPage.js +55 -0
- package/dist/admin/pages/EmailTemplatesPage.js.map +1 -0
- package/dist/admin/pages/EmailsList.d.ts +8 -0
- package/dist/admin/pages/EmailsList.d.ts.map +1 -0
- package/dist/admin/pages/EmailsList.js +85 -0
- package/dist/admin/pages/EmailsList.js.map +1 -0
- package/dist/backend/commands/email-activation.commands.d.ts +42 -0
- package/dist/backend/commands/email-activation.commands.d.ts.map +1 -0
- package/dist/backend/commands/email-activation.commands.js +51 -0
- package/dist/backend/commands/email-activation.commands.js.map +1 -0
- package/dist/backend/entities/email-block-sales-channel.entity.d.ts +11 -0
- package/dist/backend/entities/email-block-sales-channel.entity.d.ts.map +1 -0
- package/dist/backend/entities/email-block-sales-channel.entity.js +39 -0
- package/dist/backend/entities/email-block-sales-channel.entity.js.map +1 -0
- package/dist/backend/entities/email-block.entity.d.ts +24 -0
- package/dist/backend/entities/email-block.entity.d.ts.map +1 -0
- package/dist/backend/entities/email-block.entity.js +85 -0
- package/dist/backend/entities/email-block.entity.js.map +1 -0
- package/dist/backend/entities/email-template-sales-channel.entity.d.ts +10 -0
- package/dist/backend/entities/email-template-sales-channel.entity.d.ts.map +1 -0
- package/dist/backend/entities/email-template-sales-channel.entity.js +38 -0
- package/dist/backend/entities/email-template-sales-channel.entity.js.map +1 -0
- package/dist/backend/entities/email-template.entity.d.ts +19 -0
- package/dist/backend/entities/email-template.entity.d.ts.map +1 -0
- package/dist/backend/entities/email-template.entity.js +76 -0
- package/dist/backend/entities/email-template.entity.js.map +1 -0
- package/dist/backend/entities/transactional-email-content.entity.d.ts +25 -0
- package/dist/backend/entities/transactional-email-content.entity.d.ts.map +1 -0
- package/dist/backend/entities/transactional-email-content.entity.js +77 -0
- package/dist/backend/entities/transactional-email-content.entity.js.map +1 -0
- package/dist/backend/entities/transactional-email.entity.d.ts +32 -0
- package/dist/backend/entities/transactional-email.entity.d.ts.map +1 -0
- package/dist/backend/entities/transactional-email.entity.js +100 -0
- package/dist/backend/entities/transactional-email.entity.js.map +1 -0
- package/dist/backend/index.d.ts +105 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +126 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +49 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +54 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +23 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +133 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/services/branding.service.d.ts +63 -0
- package/dist/backend/services/branding.service.d.ts.map +1 -0
- package/dist/backend/services/branding.service.js +119 -0
- package/dist/backend/services/branding.service.js.map +1 -0
- package/dist/backend/services/content-resolver.d.ts +28 -0
- package/dist/backend/services/content-resolver.d.ts.map +1 -0
- package/dist/backend/services/content-resolver.js +64 -0
- package/dist/backend/services/content-resolver.js.map +1 -0
- package/dist/backend/services/email-block.service.d.ts +25 -0
- package/dist/backend/services/email-block.service.d.ts.map +1 -0
- package/dist/backend/services/email-block.service.js +162 -0
- package/dist/backend/services/email-block.service.js.map +1 -0
- package/dist/backend/services/email-builder-registry.d.ts +9 -0
- package/dist/backend/services/email-builder-registry.d.ts.map +1 -0
- package/dist/backend/services/email-builder-registry.js +14 -0
- package/dist/backend/services/email-builder-registry.js.map +1 -0
- package/dist/backend/services/email-defaults-registry.d.ts +63 -0
- package/dist/backend/services/email-defaults-registry.d.ts.map +1 -0
- package/dist/backend/services/email-defaults-registry.js +60 -0
- package/dist/backend/services/email-defaults-registry.js.map +1 -0
- package/dist/backend/services/email-template.service.d.ts +23 -0
- package/dist/backend/services/email-template.service.d.ts.map +1 -0
- package/dist/backend/services/email-template.service.js +155 -0
- package/dist/backend/services/email-template.service.js.map +1 -0
- package/dist/backend/services/embed-resolver.d.ts +21 -0
- package/dist/backend/services/embed-resolver.d.ts.map +1 -0
- package/dist/backend/services/embed-resolver.js +68 -0
- package/dist/backend/services/embed-resolver.js.map +1 -0
- package/dist/backend/services/manifest-reconciler.d.ts +28 -0
- package/dist/backend/services/manifest-reconciler.d.ts.map +1 -0
- package/dist/backend/services/manifest-reconciler.js +98 -0
- package/dist/backend/services/manifest-reconciler.js.map +1 -0
- package/dist/backend/services/template-email.d.ts +26 -0
- package/dist/backend/services/template-email.d.ts.map +1 -0
- package/dist/backend/services/template-email.js +69 -0
- package/dist/backend/services/template-email.js.map +1 -0
- package/dist/backend/services/transactional-email.service.d.ts +138 -0
- package/dist/backend/services/transactional-email.service.d.ts.map +1 -0
- package/dist/backend/services/transactional-email.service.js +410 -0
- package/dist/backend/services/transactional-email.service.js.map +1 -0
- package/dist/manifest.d.ts +195 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +367 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260629T113442_transactional_emails_init.d.ts +6 -0
- package/dist/migrations/20260629T113442_transactional_emails_init.d.ts.map +1 -0
- package/dist/migrations/20260629T113442_transactional_emails_init.js +133 -0
- package/dist/migrations/20260629T113442_transactional_emails_init.js.map +1 -0
- package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.d.ts +6 -0
- package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.d.ts.map +1 -0
- package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.js +49 -0
- package/dist/migrations/20260801T111001_transactional_emails_email_defaults_reseed.js.map +1 -0
- package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.d.ts +6 -0
- package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.d.ts.map +1 -0
- package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.js +60 -0
- package/dist/migrations/20260903T101748_transactional_emails_namespace_block_names.js.map +1 -0
- package/dist/migrations/index.d.ts +29 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +33 -0
- package/dist/migrations/index.js.map +1 -0
- package/docs/transactional-emails.md +176 -0
- package/i18n/en.json +92 -0
- package/i18n/pl.json +92 -0
- package/package.json +113 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmailBlockSalesChannel — feature 047 (US3) bridge. Scopes an email block to a
|
|
3
|
+
* sales channel. No rows for a block => the block is global. `code` is
|
|
4
|
+
* denormalized for per-channel uniqueness (enforced by a unique index).
|
|
5
|
+
*/
|
|
6
|
+
export declare class EmailBlockSalesChannel {
|
|
7
|
+
blockId: string;
|
|
8
|
+
salesChannelId: string;
|
|
9
|
+
code: string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=email-block-sales-channel.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-block-sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-block-sales-channel.entity.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,qBAEa,sBAAsB;IAEjC,OAAO,EAAG,MAAM,CAAC;IAGjB,cAAc,EAAG,MAAM,CAAC;IAGxB,IAAI,EAAG,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
/**
|
|
13
|
+
* EmailBlockSalesChannel — feature 047 (US3) bridge. Scopes an email block to a
|
|
14
|
+
* sales channel. No rows for a block => the block is global. `code` is
|
|
15
|
+
* denormalized for per-channel uniqueness (enforced by a unique index).
|
|
16
|
+
*/
|
|
17
|
+
let EmailBlockSalesChannel = class EmailBlockSalesChannel {
|
|
18
|
+
blockId;
|
|
19
|
+
salesChannelId;
|
|
20
|
+
code;
|
|
21
|
+
};
|
|
22
|
+
__decorate([
|
|
23
|
+
PrimaryKey({ type: 'uuid', fieldName: 'block_id' }),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], EmailBlockSalesChannel.prototype, "blockId", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
PrimaryKey({ type: 'uuid', fieldName: 'sales_channel_id' }),
|
|
28
|
+
__metadata("design:type", String)
|
|
29
|
+
], EmailBlockSalesChannel.prototype, "salesChannelId", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
Property({ type: 'string', length: 180 }),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], EmailBlockSalesChannel.prototype, "code", void 0);
|
|
34
|
+
EmailBlockSalesChannel = __decorate([
|
|
35
|
+
GlobalEntity(),
|
|
36
|
+
Entity({ tableName: 'email_block_sales_channels' })
|
|
37
|
+
], EmailBlockSalesChannel);
|
|
38
|
+
export { EmailBlockSalesChannel };
|
|
39
|
+
//# sourceMappingURL=email-block-sales-channel.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-block-sales-channel.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/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;;;;GAIG;AAGI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAEjC,OAAO,CAAU;IAGjB,cAAc,CAAU;IAGxB,IAAI,CAAU;CACf,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;uDACnC;AAGjB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;8DACpC;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDAC5B;AARH,sBAAsB;IAFlC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;GACvC,sBAAsB,CASlC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { OptionalProps } from '@mikro-orm/core';
|
|
2
|
+
/**
|
|
3
|
+
* EmailBlock — feature 047 (US3). A reusable, email-safe content fragment
|
|
4
|
+
* embedded by code via the EmailInsertBlock component. May be global (no bridge
|
|
5
|
+
* rows = available to all channels) or channel-scoped (via
|
|
6
|
+
* email_block_sales_channels). System blocks (default header/footer) cannot be
|
|
7
|
+
* deleted.
|
|
8
|
+
*/
|
|
9
|
+
export declare class EmailBlock {
|
|
10
|
+
[OptionalProps]?: 'active' | 'isSystem' | 'description' | 'version' | 'createdAt' | 'updatedAt';
|
|
11
|
+
id: string;
|
|
12
|
+
code: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string | null;
|
|
15
|
+
active: boolean;
|
|
16
|
+
/** Content envelope: { schema_version, languages: { lang: tree } }. */
|
|
17
|
+
content: Record<string, unknown>;
|
|
18
|
+
languages: string[];
|
|
19
|
+
isSystem: boolean;
|
|
20
|
+
version: number;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
updatedAt: Date;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=email-block.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-block.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-block.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;;;;GAMG;AACH,qBAEa,UAAU;IACrB,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,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,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,EAAG,MAAM,EAAE,CAAC;IAGrB,QAAQ,EAAE,OAAO,CAAS;IAG1B,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
* EmailBlock — feature 047 (US3). A reusable, email-safe content fragment
|
|
15
|
+
* embedded by code via the EmailInsertBlock component. May be global (no bridge
|
|
16
|
+
* rows = available to all channels) or channel-scoped (via
|
|
17
|
+
* email_block_sales_channels). System blocks (default header/footer) cannot be
|
|
18
|
+
* deleted.
|
|
19
|
+
*/
|
|
20
|
+
let EmailBlock = class EmailBlock {
|
|
21
|
+
[OptionalProps];
|
|
22
|
+
id = randomUUID();
|
|
23
|
+
code;
|
|
24
|
+
name;
|
|
25
|
+
description = null;
|
|
26
|
+
active = true;
|
|
27
|
+
/** Content envelope: { schema_version, languages: { lang: tree } }. */
|
|
28
|
+
content;
|
|
29
|
+
languages;
|
|
30
|
+
isSystem = false;
|
|
31
|
+
version = 1;
|
|
32
|
+
createdAt = new Date();
|
|
33
|
+
updatedAt = new Date();
|
|
34
|
+
};
|
|
35
|
+
__decorate([
|
|
36
|
+
PrimaryKey({ type: 'uuid' }),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], EmailBlock.prototype, "id", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
Property({ type: 'string', length: 180 }),
|
|
41
|
+
Index(),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], EmailBlock.prototype, "code", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
Property({ type: 'string', length: 200 }),
|
|
46
|
+
__metadata("design:type", String)
|
|
47
|
+
], EmailBlock.prototype, "name", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
Property({ type: 'text', nullable: true }),
|
|
50
|
+
__metadata("design:type", Object)
|
|
51
|
+
], EmailBlock.prototype, "description", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
Property({ type: 'boolean' }),
|
|
54
|
+
__metadata("design:type", Boolean)
|
|
55
|
+
], EmailBlock.prototype, "active", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
Property({ type: 'json' }),
|
|
58
|
+
__metadata("design:type", Object)
|
|
59
|
+
], EmailBlock.prototype, "content", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
Property({ type: 'json' }),
|
|
62
|
+
__metadata("design:type", Array)
|
|
63
|
+
], EmailBlock.prototype, "languages", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
Property({ type: 'boolean' }),
|
|
66
|
+
__metadata("design:type", Boolean)
|
|
67
|
+
], EmailBlock.prototype, "isSystem", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
Property({ type: 'integer' }),
|
|
70
|
+
__metadata("design:type", Number)
|
|
71
|
+
], EmailBlock.prototype, "version", void 0);
|
|
72
|
+
__decorate([
|
|
73
|
+
Property({ type: 'datetime', onCreate: () => new Date() }),
|
|
74
|
+
__metadata("design:type", Date)
|
|
75
|
+
], EmailBlock.prototype, "createdAt", void 0);
|
|
76
|
+
__decorate([
|
|
77
|
+
Property({ type: 'datetime', onUpdate: () => new Date() }),
|
|
78
|
+
__metadata("design:type", Date)
|
|
79
|
+
], EmailBlock.prototype, "updatedAt", void 0);
|
|
80
|
+
EmailBlock = __decorate([
|
|
81
|
+
GlobalEntity(),
|
|
82
|
+
Entity({ tableName: 'email_blocks' })
|
|
83
|
+
], EmailBlock);
|
|
84
|
+
export { EmailBlock };
|
|
85
|
+
//# sourceMappingURL=email-block.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-block.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/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;;;;;;GAMG;AAGI,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,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,CAA2B;IAGlC,SAAS,CAAY;IAGrB,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;AAjCC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sCACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,KAAK,EAAE;;wCACM;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wCAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0CACP;AAIvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2CACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACN;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACJ;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;2CACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;6CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;6CAAc;AApClB,UAAU;IAFtB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;GACzB,UAAU,CAqCtB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmailTemplateSalesChannel — feature 047 (US3) bridge. Scopes an email
|
|
3
|
+
* template to a sales channel. No rows for a template => global.
|
|
4
|
+
*/
|
|
5
|
+
export declare class EmailTemplateSalesChannel {
|
|
6
|
+
templateId: string;
|
|
7
|
+
salesChannelId: string;
|
|
8
|
+
code: string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=email-template-sales-channel.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-template-sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-template-sales-channel.entity.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAEa,yBAAyB;IAEpC,UAAU,EAAG,MAAM,CAAC;IAGpB,cAAc,EAAG,MAAM,CAAC;IAGxB,IAAI,EAAG,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
/**
|
|
13
|
+
* EmailTemplateSalesChannel — feature 047 (US3) bridge. Scopes an email
|
|
14
|
+
* template to a sales channel. No rows for a template => global.
|
|
15
|
+
*/
|
|
16
|
+
let EmailTemplateSalesChannel = class EmailTemplateSalesChannel {
|
|
17
|
+
templateId;
|
|
18
|
+
salesChannelId;
|
|
19
|
+
code;
|
|
20
|
+
};
|
|
21
|
+
__decorate([
|
|
22
|
+
PrimaryKey({ type: 'uuid', fieldName: 'template_id' }),
|
|
23
|
+
__metadata("design:type", String)
|
|
24
|
+
], EmailTemplateSalesChannel.prototype, "templateId", void 0);
|
|
25
|
+
__decorate([
|
|
26
|
+
PrimaryKey({ type: 'uuid', fieldName: 'sales_channel_id' }),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], EmailTemplateSalesChannel.prototype, "salesChannelId", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
Property({ type: 'string', length: 180 }),
|
|
31
|
+
__metadata("design:type", String)
|
|
32
|
+
], EmailTemplateSalesChannel.prototype, "code", void 0);
|
|
33
|
+
EmailTemplateSalesChannel = __decorate([
|
|
34
|
+
GlobalEntity(),
|
|
35
|
+
Entity({ tableName: 'email_template_sales_channels' })
|
|
36
|
+
], EmailTemplateSalesChannel);
|
|
37
|
+
export { EmailTemplateSalesChannel };
|
|
38
|
+
//# sourceMappingURL=email-template-sales-channel.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-template-sales-channel.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/email-template-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;;;GAGG;AAGI,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAEpC,UAAU,CAAU;IAGpB,cAAc,CAAU;IAGxB,IAAI,CAAU;CACf,CAAA;AAPC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;;6DACnC;AAGpB;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;;iEACpC;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;uDAC5B;AARH,yBAAyB;IAFrC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,+BAA+B,EAAE,CAAC;GAC1C,yBAAyB,CASrC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { OptionalProps } from '@mikro-orm/core';
|
|
2
|
+
/**
|
|
3
|
+
* EmailTemplate — feature 047 (US3). Like EmailBlock but without an `active`
|
|
4
|
+
* flag (mirrors CMS templates). Embedded by code via EmailInsertTemplate.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EmailTemplate {
|
|
7
|
+
[OptionalProps]?: 'isSystem' | 'description' | 'version' | 'createdAt' | 'updatedAt';
|
|
8
|
+
id: string;
|
|
9
|
+
code: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string | null;
|
|
12
|
+
content: Record<string, unknown>;
|
|
13
|
+
languages: string[];
|
|
14
|
+
isSystem: boolean;
|
|
15
|
+
version: number;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
updatedAt: Date;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=email-template.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-template.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/email-template.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAIrF;;;GAGG;AACH,qBAEa,aAAa;IACxB,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAGrF,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGlC,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,EAAG,MAAM,EAAE,CAAC;IAGrB,QAAQ,EAAE,OAAO,CAAS;IAG1B,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
* EmailTemplate — feature 047 (US3). Like EmailBlock but without an `active`
|
|
15
|
+
* flag (mirrors CMS templates). Embedded by code via EmailInsertTemplate.
|
|
16
|
+
*/
|
|
17
|
+
let EmailTemplate = class EmailTemplate {
|
|
18
|
+
[OptionalProps];
|
|
19
|
+
id = randomUUID();
|
|
20
|
+
code;
|
|
21
|
+
name;
|
|
22
|
+
description = null;
|
|
23
|
+
content;
|
|
24
|
+
languages;
|
|
25
|
+
isSystem = false;
|
|
26
|
+
version = 1;
|
|
27
|
+
createdAt = new Date();
|
|
28
|
+
updatedAt = new Date();
|
|
29
|
+
};
|
|
30
|
+
__decorate([
|
|
31
|
+
PrimaryKey({ type: 'uuid' }),
|
|
32
|
+
__metadata("design:type", String)
|
|
33
|
+
], EmailTemplate.prototype, "id", void 0);
|
|
34
|
+
__decorate([
|
|
35
|
+
Property({ type: 'string', length: 180 }),
|
|
36
|
+
Index(),
|
|
37
|
+
__metadata("design:type", String)
|
|
38
|
+
], EmailTemplate.prototype, "code", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
Property({ type: 'string', length: 200 }),
|
|
41
|
+
__metadata("design:type", String)
|
|
42
|
+
], EmailTemplate.prototype, "name", void 0);
|
|
43
|
+
__decorate([
|
|
44
|
+
Property({ type: 'text', nullable: true }),
|
|
45
|
+
__metadata("design:type", Object)
|
|
46
|
+
], EmailTemplate.prototype, "description", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
Property({ type: 'json' }),
|
|
49
|
+
__metadata("design:type", Object)
|
|
50
|
+
], EmailTemplate.prototype, "content", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
Property({ type: 'json' }),
|
|
53
|
+
__metadata("design:type", Array)
|
|
54
|
+
], EmailTemplate.prototype, "languages", void 0);
|
|
55
|
+
__decorate([
|
|
56
|
+
Property({ type: 'boolean' }),
|
|
57
|
+
__metadata("design:type", Boolean)
|
|
58
|
+
], EmailTemplate.prototype, "isSystem", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
Property({ type: 'integer' }),
|
|
61
|
+
__metadata("design:type", Number)
|
|
62
|
+
], EmailTemplate.prototype, "version", void 0);
|
|
63
|
+
__decorate([
|
|
64
|
+
Property({ type: 'datetime', onCreate: () => new Date() }),
|
|
65
|
+
__metadata("design:type", Date)
|
|
66
|
+
], EmailTemplate.prototype, "createdAt", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
Property({ type: 'datetime', onUpdate: () => new Date() }),
|
|
69
|
+
__metadata("design:type", Date)
|
|
70
|
+
], EmailTemplate.prototype, "updatedAt", void 0);
|
|
71
|
+
EmailTemplate = __decorate([
|
|
72
|
+
GlobalEntity(),
|
|
73
|
+
Entity({ tableName: 'email_templates' })
|
|
74
|
+
], EmailTemplate);
|
|
75
|
+
export { EmailTemplate };
|
|
76
|
+
//# sourceMappingURL=email-template.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-template.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/email-template.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;;;GAGG;AAGI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,CAAC,aAAa,CAAC,CAAsE;IAGrF,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,WAAW,GAAkB,IAAI,CAAC;IAGlC,OAAO,CAA2B;IAGlC,SAAS,CAAY;IAGrB,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;AA7BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yCACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,KAAK,EAAE;;2CACM;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;gDACN;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;+CACJ;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;gDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;gDAAc;AAhClB,aAAa;IAFzB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;GAC5B,aAAa,CAiCzB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OptionalProps } from '@mikro-orm/core';
|
|
2
|
+
/**
|
|
3
|
+
* TransactionalEmailContent — feature 047 (US1/US2).
|
|
4
|
+
*
|
|
5
|
+
* An admin customization of an email's subject + content for one scope and
|
|
6
|
+
* language. `salesChannelId === null` is the global scope; a non-null value is a
|
|
7
|
+
* per-channel override. The absence of a row means "fall back" (resolution:
|
|
8
|
+
* channel -> global -> module default). Reset deletes the row. `version`
|
|
9
|
+
* provides optimistic concurrency. Uniqueness is enforced by two partial
|
|
10
|
+
* indexes in the migration (NULLs are distinct in Postgres unique indexes).
|
|
11
|
+
*/
|
|
12
|
+
export declare class TransactionalEmailContent {
|
|
13
|
+
[OptionalProps]?: 'version' | 'salesChannelId' | 'createdAt' | 'updatedAt';
|
|
14
|
+
id: string;
|
|
15
|
+
emailId: string;
|
|
16
|
+
salesChannelId: string | null;
|
|
17
|
+
language: string;
|
|
18
|
+
subject: string;
|
|
19
|
+
/** Single-language Puck data tree. */
|
|
20
|
+
content: Record<string, unknown>;
|
|
21
|
+
version: number;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
updatedAt: Date;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=transactional-email-content.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactional-email-content.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email-content.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAwB,MAAM,iBAAiB,CAAC;AAI9E;;;;;;;;;GASG;AACH,qBAEa,yBAAyB;IACpC,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC;IAG3E,EAAE,EAAE,MAAM,CAAgB;IAG1B,OAAO,EAAG,MAAM,CAAC;IAGjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGrC,QAAQ,EAAG,MAAM,CAAC;IAGlB,OAAO,EAAG,MAAM,CAAC;IAEjB,sCAAsC;IAEtC,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,OAAO,EAAE,MAAM,CAAK;IAGpB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
* TransactionalEmailContent — feature 047 (US1/US2).
|
|
15
|
+
*
|
|
16
|
+
* An admin customization of an email's subject + content for one scope and
|
|
17
|
+
* language. `salesChannelId === null` is the global scope; a non-null value is a
|
|
18
|
+
* per-channel override. The absence of a row means "fall back" (resolution:
|
|
19
|
+
* channel -> global -> module default). Reset deletes the row. `version`
|
|
20
|
+
* provides optimistic concurrency. Uniqueness is enforced by two partial
|
|
21
|
+
* indexes in the migration (NULLs are distinct in Postgres unique indexes).
|
|
22
|
+
*/
|
|
23
|
+
let TransactionalEmailContent = class TransactionalEmailContent {
|
|
24
|
+
[OptionalProps];
|
|
25
|
+
id = randomUUID();
|
|
26
|
+
emailId;
|
|
27
|
+
salesChannelId = null;
|
|
28
|
+
language;
|
|
29
|
+
subject;
|
|
30
|
+
/** Single-language Puck data tree. */
|
|
31
|
+
content;
|
|
32
|
+
version = 1;
|
|
33
|
+
createdAt = new Date();
|
|
34
|
+
updatedAt = new Date();
|
|
35
|
+
};
|
|
36
|
+
__decorate([
|
|
37
|
+
PrimaryKey({ type: 'uuid' }),
|
|
38
|
+
__metadata("design:type", String)
|
|
39
|
+
], TransactionalEmailContent.prototype, "id", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
Property({ type: 'uuid', fieldName: 'email_id' }),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], TransactionalEmailContent.prototype, "emailId", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
Property({ type: 'uuid', fieldName: 'sales_channel_id', nullable: true }),
|
|
46
|
+
__metadata("design:type", Object)
|
|
47
|
+
], TransactionalEmailContent.prototype, "salesChannelId", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
Property({ type: 'string', length: 12 }),
|
|
50
|
+
__metadata("design:type", String)
|
|
51
|
+
], TransactionalEmailContent.prototype, "language", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
Property({ type: 'text' }),
|
|
54
|
+
__metadata("design:type", String)
|
|
55
|
+
], TransactionalEmailContent.prototype, "subject", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
Property({ type: 'json' }),
|
|
58
|
+
__metadata("design:type", Object)
|
|
59
|
+
], TransactionalEmailContent.prototype, "content", void 0);
|
|
60
|
+
__decorate([
|
|
61
|
+
Property({ type: 'integer' }),
|
|
62
|
+
__metadata("design:type", Number)
|
|
63
|
+
], TransactionalEmailContent.prototype, "version", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
Property({ type: 'datetime', onCreate: () => new Date() }),
|
|
66
|
+
__metadata("design:type", Date)
|
|
67
|
+
], TransactionalEmailContent.prototype, "createdAt", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
Property({ type: 'datetime', onUpdate: () => new Date() }),
|
|
70
|
+
__metadata("design:type", Date)
|
|
71
|
+
], TransactionalEmailContent.prototype, "updatedAt", void 0);
|
|
72
|
+
TransactionalEmailContent = __decorate([
|
|
73
|
+
GlobalEntity(),
|
|
74
|
+
Entity({ tableName: 'transactional_email_contents' })
|
|
75
|
+
], TransactionalEmailContent);
|
|
76
|
+
export { TransactionalEmailContent };
|
|
77
|
+
//# sourceMappingURL=transactional-email-content.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactional-email-content.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email-content.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;;;;;;;;;GASG;AAGI,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,CAAC,aAAa,CAAC,CAA4D;IAG3E,EAAE,GAAW,UAAU,EAAE,CAAC;IAG1B,OAAO,CAAU;IAGjB,cAAc,GAAkB,IAAI,CAAC;IAGrC,QAAQ,CAAU;IAGlB,OAAO,CAAU;IAEjB,sCAAsC;IAEtC,OAAO,CAA2B;IAGlC,OAAO,GAAW,CAAC,CAAC;IAGpB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA1BC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACH;AAG1B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;0DACjC;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iEACrC;AAGrC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;2DACvB;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACV;AAIjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACO;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;0DACV;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;4DAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;4DAAc;AA7BlB,yBAAyB;IAFrC,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;GACzC,yBAAyB,CA8BrC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { OptionalProps } from '@mikro-orm/core';
|
|
2
|
+
import type { EmailVariableDescriptor } from '@endora-commerce/contracts';
|
|
3
|
+
/**
|
|
4
|
+
* TransactionalEmail — feature 047 (US1/US5).
|
|
5
|
+
*
|
|
6
|
+
* The canonical definition of one transactional email plus the CURRENT
|
|
7
|
+
* module-provided defaults. Rows are reconciled at boot from module manifests +
|
|
8
|
+
* the EmailDefaultsRegistry; admin customizations live separately in
|
|
9
|
+
* `transactional_email_contents`, so refreshing defaults here never overwrites
|
|
10
|
+
* customizations. `code` is the stable send key.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TransactionalEmail {
|
|
13
|
+
[OptionalProps]?: 'active' | 'description' | 'groupCode' | 'createdAt' | 'updatedAt';
|
|
14
|
+
id: string;
|
|
15
|
+
code: string;
|
|
16
|
+
name: string;
|
|
17
|
+
ownerModule: string;
|
|
18
|
+
description: string | null;
|
|
19
|
+
groupCode: string | null;
|
|
20
|
+
/** Declared variables: [{ key, label, sampleValue?, description? }]. */
|
|
21
|
+
variables: EmailVariableDescriptor[];
|
|
22
|
+
/** Supported BCP-47 language codes. */
|
|
23
|
+
languages: string[];
|
|
24
|
+
/** Module default subject per language: { lang: string }. */
|
|
25
|
+
defaultSubject: Record<string, string>;
|
|
26
|
+
/** Module default content envelope: { schema_version, languages: { lang: tree } }. */
|
|
27
|
+
defaultContent: Record<string, unknown>;
|
|
28
|
+
active: boolean;
|
|
29
|
+
createdAt: Date;
|
|
30
|
+
updatedAt: Date;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=transactional-email.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactional-email.entity.d.ts","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAgC,MAAM,iBAAiB,CAAC;AAGtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAEa,kBAAkB;IAC7B,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAGrF,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,WAAW,EAAG,MAAM,CAAC;IAGrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGlC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhC,wEAAwE;IAExE,SAAS,EAAG,uBAAuB,EAAE,CAAC;IAEtC,uCAAuC;IAEvC,SAAS,EAAG,MAAM,EAAE,CAAC;IAErB,6DAA6D;IAE7D,cAAc,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,sFAAsF;IAEtF,cAAc,EAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGzC,MAAM,EAAE,OAAO,CAAQ;IAGvB,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
/**
|
|
14
|
+
* TransactionalEmail — feature 047 (US1/US5).
|
|
15
|
+
*
|
|
16
|
+
* The canonical definition of one transactional email plus the CURRENT
|
|
17
|
+
* module-provided defaults. Rows are reconciled at boot from module manifests +
|
|
18
|
+
* the EmailDefaultsRegistry; admin customizations live separately in
|
|
19
|
+
* `transactional_email_contents`, so refreshing defaults here never overwrites
|
|
20
|
+
* customizations. `code` is the stable send key.
|
|
21
|
+
*/
|
|
22
|
+
let TransactionalEmail = class TransactionalEmail {
|
|
23
|
+
[OptionalProps];
|
|
24
|
+
id = randomUUID();
|
|
25
|
+
code;
|
|
26
|
+
name;
|
|
27
|
+
ownerModule;
|
|
28
|
+
description = null;
|
|
29
|
+
groupCode = null;
|
|
30
|
+
/** Declared variables: [{ key, label, sampleValue?, description? }]. */
|
|
31
|
+
variables;
|
|
32
|
+
/** Supported BCP-47 language codes. */
|
|
33
|
+
languages;
|
|
34
|
+
/** Module default subject per language: { lang: string }. */
|
|
35
|
+
defaultSubject;
|
|
36
|
+
/** Module default content envelope: { schema_version, languages: { lang: tree } }. */
|
|
37
|
+
defaultContent;
|
|
38
|
+
active = true;
|
|
39
|
+
createdAt = new Date();
|
|
40
|
+
updatedAt = new Date();
|
|
41
|
+
};
|
|
42
|
+
__decorate([
|
|
43
|
+
PrimaryKey({ type: 'uuid' }),
|
|
44
|
+
__metadata("design:type", String)
|
|
45
|
+
], TransactionalEmail.prototype, "id", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
Property({ type: 'string', length: 160 }),
|
|
48
|
+
Unique(),
|
|
49
|
+
__metadata("design:type", String)
|
|
50
|
+
], TransactionalEmail.prototype, "code", void 0);
|
|
51
|
+
__decorate([
|
|
52
|
+
Property({ type: 'string', length: 200 }),
|
|
53
|
+
__metadata("design:type", String)
|
|
54
|
+
], TransactionalEmail.prototype, "name", void 0);
|
|
55
|
+
__decorate([
|
|
56
|
+
Property({ type: 'string', length: 64 }),
|
|
57
|
+
__metadata("design:type", String)
|
|
58
|
+
], TransactionalEmail.prototype, "ownerModule", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
Property({ type: 'text', nullable: true }),
|
|
61
|
+
__metadata("design:type", Object)
|
|
62
|
+
], TransactionalEmail.prototype, "description", void 0);
|
|
63
|
+
__decorate([
|
|
64
|
+
Property({ type: 'string', length: 64, nullable: true }),
|
|
65
|
+
__metadata("design:type", Object)
|
|
66
|
+
], TransactionalEmail.prototype, "groupCode", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
Property({ type: 'json' }),
|
|
69
|
+
__metadata("design:type", Array)
|
|
70
|
+
], TransactionalEmail.prototype, "variables", void 0);
|
|
71
|
+
__decorate([
|
|
72
|
+
Property({ type: 'json' }),
|
|
73
|
+
__metadata("design:type", Array)
|
|
74
|
+
], TransactionalEmail.prototype, "languages", void 0);
|
|
75
|
+
__decorate([
|
|
76
|
+
Property({ type: 'json' }),
|
|
77
|
+
__metadata("design:type", Object)
|
|
78
|
+
], TransactionalEmail.prototype, "defaultSubject", void 0);
|
|
79
|
+
__decorate([
|
|
80
|
+
Property({ type: 'json' }),
|
|
81
|
+
__metadata("design:type", Object)
|
|
82
|
+
], TransactionalEmail.prototype, "defaultContent", void 0);
|
|
83
|
+
__decorate([
|
|
84
|
+
Property({ type: 'boolean' }),
|
|
85
|
+
__metadata("design:type", Boolean)
|
|
86
|
+
], TransactionalEmail.prototype, "active", void 0);
|
|
87
|
+
__decorate([
|
|
88
|
+
Property({ type: 'datetime', onCreate: () => new Date() }),
|
|
89
|
+
__metadata("design:type", Date)
|
|
90
|
+
], TransactionalEmail.prototype, "createdAt", void 0);
|
|
91
|
+
__decorate([
|
|
92
|
+
Property({ type: 'datetime', onUpdate: () => new Date() }),
|
|
93
|
+
__metadata("design:type", Date)
|
|
94
|
+
], TransactionalEmail.prototype, "updatedAt", void 0);
|
|
95
|
+
TransactionalEmail = __decorate([
|
|
96
|
+
GlobalEntity(),
|
|
97
|
+
Entity({ tableName: 'transactional_emails' })
|
|
98
|
+
], TransactionalEmail);
|
|
99
|
+
export { TransactionalEmail };
|
|
100
|
+
//# sourceMappingURL=transactional-email.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactional-email.entity.js","sourceRoot":"","sources":["../../../src/backend/entities/transactional-email.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;AAGpC;;;;;;;;GAQG;AAGI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,CAAC,aAAa,CAAC,CAAsE;IAGrF,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,WAAW,CAAU;IAGrB,WAAW,GAAkB,IAAI,CAAC;IAGlC,SAAS,GAAkB,IAAI,CAAC;IAEhC,wEAAwE;IAExE,SAAS,CAA6B;IAEtC,uCAAuC;IAEvC,SAAS,CAAY;IAErB,6DAA6D;IAE7D,cAAc,CAA0B;IAExC,sFAAsF;IAEtF,cAAc,CAA2B;IAGzC,MAAM,GAAY,IAAI,CAAC;IAGvB,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AA1CC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,MAAM,EAAE;;gDACK;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;gDAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;uDACpB;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDACT;AAGlC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDACzB;AAIhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACW;AAItC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDACN;AAIrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACa;AAIxC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DACc;AAGzC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;kDACP;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;qDAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;8BAChD,IAAI;qDAAc;AA7ClB,kBAAkB;IAF9B,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC;GACjC,kBAAkB,CA8C9B"}
|