strapi-plugin-magic-mail 2.2.4 → 2.2.6

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 (71) hide show
  1. package/README.md +0 -2
  2. package/dist/server/index.js +1 -1
  3. package/dist/server/index.mjs +1 -1
  4. package/package.json +1 -3
  5. package/admin/jsconfig.json +0 -10
  6. package/admin/src/components/AddAccountModal.jsx +0 -1943
  7. package/admin/src/components/Initializer.jsx +0 -14
  8. package/admin/src/components/LicenseGuard.jsx +0 -475
  9. package/admin/src/components/PluginIcon.jsx +0 -5
  10. package/admin/src/hooks/useAuthRefresh.js +0 -44
  11. package/admin/src/hooks/useLicense.js +0 -158
  12. package/admin/src/index.js +0 -87
  13. package/admin/src/pages/Analytics.jsx +0 -762
  14. package/admin/src/pages/App.jsx +0 -111
  15. package/admin/src/pages/EmailDesigner/EditorPage.jsx +0 -1424
  16. package/admin/src/pages/EmailDesigner/TemplateList.jsx +0 -1807
  17. package/admin/src/pages/HomePage.jsx +0 -1170
  18. package/admin/src/pages/LicensePage.jsx +0 -430
  19. package/admin/src/pages/RoutingRules.jsx +0 -1141
  20. package/admin/src/pages/Settings.jsx +0 -603
  21. package/admin/src/pluginId.js +0 -3
  22. package/admin/src/translations/de.json +0 -71
  23. package/admin/src/translations/en.json +0 -70
  24. package/admin/src/translations/es.json +0 -71
  25. package/admin/src/translations/fr.json +0 -71
  26. package/admin/src/translations/pt.json +0 -71
  27. package/admin/src/utils/fetchWithRetry.js +0 -123
  28. package/admin/src/utils/getTranslation.js +0 -5
  29. package/admin/src/utils/theme.js +0 -85
  30. package/server/jsconfig.json +0 -10
  31. package/server/src/bootstrap.js +0 -157
  32. package/server/src/config/features.js +0 -260
  33. package/server/src/config/index.js +0 -9
  34. package/server/src/content-types/email-account/schema.json +0 -93
  35. package/server/src/content-types/email-event/index.js +0 -8
  36. package/server/src/content-types/email-event/schema.json +0 -57
  37. package/server/src/content-types/email-link/index.js +0 -8
  38. package/server/src/content-types/email-link/schema.json +0 -49
  39. package/server/src/content-types/email-log/index.js +0 -8
  40. package/server/src/content-types/email-log/schema.json +0 -106
  41. package/server/src/content-types/email-template/schema.json +0 -74
  42. package/server/src/content-types/email-template-version/schema.json +0 -60
  43. package/server/src/content-types/index.js +0 -33
  44. package/server/src/content-types/routing-rule/schema.json +0 -59
  45. package/server/src/controllers/accounts.js +0 -229
  46. package/server/src/controllers/analytics.js +0 -361
  47. package/server/src/controllers/controller.js +0 -26
  48. package/server/src/controllers/email-designer.js +0 -474
  49. package/server/src/controllers/index.js +0 -21
  50. package/server/src/controllers/license.js +0 -269
  51. package/server/src/controllers/oauth.js +0 -474
  52. package/server/src/controllers/routing-rules.js +0 -129
  53. package/server/src/controllers/test.js +0 -301
  54. package/server/src/destroy.js +0 -27
  55. package/server/src/index.js +0 -25
  56. package/server/src/middlewares/index.js +0 -3
  57. package/server/src/policies/index.js +0 -3
  58. package/server/src/register.js +0 -5
  59. package/server/src/routes/admin.js +0 -469
  60. package/server/src/routes/content-api.js +0 -37
  61. package/server/src/routes/index.js +0 -9
  62. package/server/src/services/account-manager.js +0 -329
  63. package/server/src/services/analytics.js +0 -512
  64. package/server/src/services/email-designer.js +0 -717
  65. package/server/src/services/email-router.js +0 -1446
  66. package/server/src/services/index.js +0 -17
  67. package/server/src/services/license-guard.js +0 -423
  68. package/server/src/services/oauth.js +0 -515
  69. package/server/src/services/service.js +0 -7
  70. package/server/src/utils/encryption.js +0 -81
  71. package/server/src/utils/logger.js +0 -84
@@ -1,260 +0,0 @@
1
- /**
2
- * MagicMail Feature Definitions
3
- * Defines which features are available for each license tier
4
- */
5
-
6
- module.exports = {
7
- // FREE/DEMO Features
8
- free: {
9
- maxAccounts: 3, // 3 Accounts (can be OAuth!)
10
- maxRoutingRules: 5,
11
- maxEmailTemplates: 25, // 25 Templates - Genug zum Testen & kleine Projekte!
12
- providers: ['smtp', 'gmail-oauth', 'microsoft-oauth', 'yahoo-oauth'], // Alle Provider erlaubt!
13
- features: [
14
- 'basic-smtp',
15
- 'oauth-gmail',
16
- 'oauth-microsoft',
17
- 'oauth-yahoo',
18
- 'basic-routing',
19
- 'email-logging',
20
- 'account-testing',
21
- 'strapi-service-override',
22
- 'email-designer-basic', // Basic Email Designer
23
- 'email-designer-import-export', // Import/Export auch in Free! (Community-freundlich)
24
- ],
25
- },
26
-
27
- // PREMIUM Features
28
- premium: {
29
- maxAccounts: 10, // 10 Accounts - Perfekt für kleine Teams
30
- maxRoutingRules: 20,
31
- maxEmailTemplates: 100, // 100 Templates - Mehr als genug für die meisten Projekte
32
- providers: ['smtp', 'gmail-oauth', 'microsoft-oauth', 'yahoo-oauth'],
33
- features: [
34
- 'basic-smtp',
35
- 'basic-routing',
36
- 'email-logging',
37
- 'oauth-gmail',
38
- 'oauth-microsoft',
39
- 'oauth-yahoo',
40
- 'account-testing',
41
- 'strapi-service-override',
42
- 'email-designer-basic',
43
- 'email-designer-templates',
44
- 'email-designer-import-export',
45
- 'email-designer-versioning', // NEU in Premium: Versionierung!
46
- 'analytics-basic', // Basic Analytics
47
- ],
48
- },
49
-
50
- // ADVANCED Features
51
- advanced: {
52
- maxAccounts: -1, // Unlimited
53
- maxRoutingRules: -1, // Unlimited
54
- maxEmailTemplates: 500, // 500 Templates - Für größere Projekte
55
- providers: ['smtp', 'gmail-oauth', 'microsoft-oauth', 'yahoo-oauth', 'sendgrid', 'mailgun'],
56
- features: [
57
- 'basic-smtp',
58
- 'basic-routing',
59
- 'email-logging',
60
- 'oauth-gmail',
61
- 'oauth-microsoft',
62
- 'oauth-yahoo',
63
- 'sendgrid',
64
- 'mailgun',
65
- 'dkim-signing',
66
- 'priority-headers',
67
- 'list-unsubscribe',
68
- 'security-validation',
69
- 'analytics-dashboard',
70
- 'advanced-routing',
71
- 'account-testing',
72
- 'strapi-service-override',
73
- 'email-designer-basic', // NEW
74
- 'email-designer-templates', // NEW
75
- 'email-designer-versioning', // NEW: Template Versioning
76
- 'email-designer-import-export', // NEW: Import/Export
77
- ],
78
- },
79
-
80
- // ENTERPRISE Features
81
- enterprise: {
82
- maxAccounts: -1, // Unlimited
83
- maxRoutingRules: -1, // Unlimited
84
- maxEmailTemplates: -1, // Unlimited Templates - Keine Limits!
85
- providers: ['smtp', 'gmail-oauth', 'microsoft-oauth', 'yahoo-oauth', 'sendgrid', 'mailgun'],
86
- features: [
87
- 'basic-smtp',
88
- 'basic-routing',
89
- 'email-logging',
90
- 'oauth-gmail',
91
- 'oauth-microsoft',
92
- 'oauth-yahoo',
93
- 'sendgrid',
94
- 'mailgun',
95
- 'dkim-signing',
96
- 'priority-headers',
97
- 'list-unsubscribe',
98
- 'security-validation',
99
- 'analytics-dashboard',
100
- 'advanced-routing',
101
- 'multi-tenant',
102
- 'compliance-reports',
103
- 'custom-security-rules',
104
- 'priority-support',
105
- 'account-testing',
106
- 'strapi-service-override',
107
- 'email-designer-basic', // NEW
108
- 'email-designer-templates', // NEW
109
- 'email-designer-versioning', // NEW
110
- 'email-designer-import-export', // NEW
111
- 'email-designer-custom-blocks', // NEW: Custom Blocks
112
- 'email-designer-team-library', // NEW: Team Library
113
- 'email-designer-a-b-testing', // NEW: A/B Testing
114
- ],
115
- },
116
-
117
- /**
118
- * Check if a feature is available for given license tier
119
- */
120
- hasFeature(licenseData, featureName) {
121
- /** console.log(`[features.js] [CHECK] hasFeature called with:`, {
122
- featureName,
123
- hasLicenseData: !!licenseData,
124
- licenseDataKeys: licenseData ? Object.keys(licenseData) : [],
125
- featuresObject: licenseData?.features,
126
- tier: licenseData?.tier,
127
- // Show actual feature flag values
128
- featureAdvanced: licenseData?.featureAdvanced,
129
- featureEnterprise: licenseData?.featureEnterprise,
130
- featurePremium: licenseData?.featurePremium,
131
- });
132
- */
133
- if (!licenseData) {
134
- console.log(`[features.js] [WARNING] No license data → using FREE tier`);
135
- // Demo mode - only free features
136
- return this.free.features.includes(featureName);
137
- }
138
-
139
- // Determine tier: check multiple possible formats
140
- let isEnterprise = false;
141
- let isAdvanced = false;
142
- let isPremium = false;
143
-
144
- // Check tier field directly
145
- if (licenseData.tier) {
146
- isEnterprise = licenseData.tier === 'enterprise';
147
- isAdvanced = licenseData.tier === 'advanced';
148
- isPremium = licenseData.tier === 'premium';
149
- }
150
-
151
- // Check features object (for backward compatibility)
152
- if (licenseData.features) {
153
- isEnterprise = isEnterprise || licenseData.features.enterprise === true;
154
- isAdvanced = isAdvanced || licenseData.features.advanced === true;
155
- isPremium = isPremium || licenseData.features.premium === true;
156
- }
157
-
158
- // Check feature flags directly on licenseData (magicapi format)
159
- // These are boolean fields from the API
160
- if (licenseData.featureEnterprise === true) {
161
- isEnterprise = true;
162
- }
163
- if (licenseData.featureAdvanced === true) {
164
- isAdvanced = true;
165
- }
166
- if (licenseData.featurePremium === true) {
167
- isPremium = true;
168
- }
169
-
170
- /* console.log(`[features.js] [CHECK] Tier detection:`, {
171
- isEnterprise,
172
- isAdvanced,
173
- isPremium,
174
- tierField: licenseData.tier,
175
- featureAdvanced: licenseData.featureAdvanced,
176
- featureEnterprise: licenseData.featureEnterprise,
177
- featurePremium: licenseData.featurePremium,
178
- featuresAdvanced: licenseData.features?.advanced,
179
- featuresEnterprise: licenseData.features?.enterprise,
180
- featuresPremium: licenseData.features?.premium,
181
- });
182
- */
183
- // Check tiers in order: enterprise > advanced > premium > free
184
- if (isEnterprise && this.enterprise.features.includes(featureName)) {
185
- console.log(`[features.js] [SUCCESS] ENTERPRISE tier has feature "${featureName}"`);
186
- return true;
187
- }
188
- if (isAdvanced && this.advanced.features.includes(featureName)) {
189
- console.log(`[features.js] [SUCCESS] ADVANCED tier has feature "${featureName}"`);
190
- return true;
191
- }
192
- if (isPremium && this.premium.features.includes(featureName)) {
193
- console.log(`[features.js] [SUCCESS] PREMIUM tier has feature "${featureName}"`);
194
- return true;
195
- }
196
-
197
- const inFree = this.free.features.includes(featureName);
198
- console.log(`[features.js] ${inFree ? '[SUCCESS]' : '[ERROR]'} FREE tier check for "${featureName}": ${inFree}`);
199
- return inFree;
200
- },
201
-
202
- /**
203
- * Get max allowed accounts for license tier
204
- */
205
- getMaxAccounts(licenseData) {
206
- if (!licenseData) return this.free.maxAccounts;
207
-
208
- // Check both formats: features object and direct feature flags
209
- if (licenseData.featureEnterprise === true || licenseData.features?.enterprise === true) return this.enterprise.maxAccounts;
210
- if (licenseData.featureAdvanced === true || licenseData.features?.advanced === true) return this.advanced.maxAccounts;
211
- if (licenseData.featurePremium === true || licenseData.features?.premium === true) return this.premium.maxAccounts;
212
-
213
- return this.free.maxAccounts;
214
- },
215
-
216
- /**
217
- * Get max allowed routing rules for license tier
218
- */
219
- getMaxRoutingRules(licenseData) {
220
- if (!licenseData) return this.free.maxRoutingRules;
221
-
222
- // Check both formats: features object and direct feature flags
223
- if (licenseData.featureEnterprise === true || licenseData.features?.enterprise === true) return this.enterprise.maxRoutingRules;
224
- if (licenseData.featureAdvanced === true || licenseData.features?.advanced === true) return this.advanced.maxRoutingRules;
225
- if (licenseData.featurePremium === true || licenseData.features?.premium === true) return this.premium.maxRoutingRules;
226
-
227
- return this.free.maxRoutingRules;
228
- },
229
-
230
- /**
231
- * Check if provider is allowed for license tier
232
- */
233
- isProviderAllowed(licenseData, provider) {
234
- if (!licenseData) {
235
- return this.free.providers.includes(provider);
236
- }
237
-
238
- // Check both formats: features object and direct feature flags
239
- if (licenseData.featureEnterprise === true || licenseData.features?.enterprise === true) return this.enterprise.providers.includes(provider);
240
- if (licenseData.featureAdvanced === true || licenseData.features?.advanced === true) return this.advanced.providers.includes(provider);
241
- if (licenseData.featurePremium === true || licenseData.features?.premium === true) return this.premium.providers.includes(provider);
242
-
243
- return this.free.providers.includes(provider);
244
- },
245
-
246
- /**
247
- * Get max allowed email templates for license tier
248
- */
249
- getMaxEmailTemplates(licenseData) {
250
- if (!licenseData) return this.free.maxEmailTemplates;
251
-
252
- // Check both formats: features object and direct feature flags
253
- if (licenseData.featureEnterprise === true || licenseData.features?.enterprise === true) return this.enterprise.maxEmailTemplates;
254
- if (licenseData.featureAdvanced === true || licenseData.features?.advanced === true) return this.advanced.maxEmailTemplates;
255
- if (licenseData.featurePremium === true || licenseData.features?.premium === true) return this.premium.maxEmailTemplates;
256
-
257
- return this.free.maxEmailTemplates;
258
- },
259
- };
260
-
@@ -1,9 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = {
4
- default: {
5
- // Enable debug logging (set to true to see all plugin logs)
6
- debug: false,
7
- },
8
- validator() {},
9
- };
@@ -1,93 +0,0 @@
1
- {
2
- "kind": "collectionType",
3
- "collectionName": "magic_mail_accounts",
4
- "info": {
5
- "singularName": "email-account",
6
- "pluralName": "email-accounts",
7
- "displayName": "Email Account",
8
- "description": "Email provider accounts for multi-account email sending"
9
- },
10
- "options": {
11
- "draftAndPublish": false
12
- },
13
- "pluginOptions": {
14
- "content-manager": {
15
- "visible": false
16
- },
17
- "content-type-builder": {
18
- "visible": false
19
- }
20
- },
21
- "attributes": {
22
- "name": {
23
- "type": "string",
24
- "required": true,
25
- "unique": true
26
- },
27
- "description": {
28
- "type": "text"
29
- },
30
- "provider": {
31
- "type": "enumeration",
32
- "enum": ["smtp", "gmail-oauth", "microsoft-oauth", "yahoo-oauth", "sendgrid", "mailgun", "ses", "nodemailer"],
33
- "required": true,
34
- "default": "smtp"
35
- },
36
- "config": {
37
- "type": "json",
38
- "required": true
39
- },
40
- "oauth": {
41
- "type": "json"
42
- },
43
- "fromEmail": {
44
- "type": "email",
45
- "required": true
46
- },
47
- "fromName": {
48
- "type": "string"
49
- },
50
- "replyTo": {
51
- "type": "email"
52
- },
53
- "isActive": {
54
- "type": "boolean",
55
- "default": true,
56
- "required": true
57
- },
58
- "isPrimary": {
59
- "type": "boolean",
60
- "default": false
61
- },
62
- "priority": {
63
- "type": "integer",
64
- "default": 1,
65
- "min": 1,
66
- "max": 10
67
- },
68
- "dailyLimit": {
69
- "type": "integer",
70
- "default": 0
71
- },
72
- "hourlyLimit": {
73
- "type": "integer",
74
- "default": 0
75
- },
76
- "emailsSentToday": {
77
- "type": "integer",
78
- "default": 0
79
- },
80
- "emailsSentThisHour": {
81
- "type": "integer",
82
- "default": 0
83
- },
84
- "totalEmailsSent": {
85
- "type": "integer",
86
- "default": 0
87
- },
88
- "lastUsed": {
89
- "type": "datetime"
90
- }
91
- }
92
- }
93
-
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- const schema = require('./schema.json');
4
-
5
- module.exports = {
6
- schema,
7
- };
8
-
@@ -1,57 +0,0 @@
1
- {
2
- "kind": "collectionType",
3
- "collectionName": "magic_mail_email_events",
4
- "info": {
5
- "singularName": "email-event",
6
- "pluralName": "email-events",
7
- "displayName": "Email Event",
8
- "description": "Individual email tracking events (opens, clicks, bounces)"
9
- },
10
- "options": {
11
- "draftAndPublish": false
12
- },
13
- "pluginOptions": {
14
- "content-manager": {
15
- "visible": false
16
- },
17
- "content-type-builder": {
18
- "visible": false
19
- }
20
- },
21
- "attributes": {
22
- "emailLog": {
23
- "type": "relation",
24
- "relation": "manyToOne",
25
- "target": "plugin::magic-mail.email-log",
26
- "inversedBy": "events"
27
- },
28
- "type": {
29
- "type": "enumeration",
30
- "enum": ["open", "click", "bounce", "complaint", "unsubscribe"],
31
- "required": true
32
- },
33
- "timestamp": {
34
- "type": "datetime",
35
- "required": true
36
- },
37
- "ipAddress": {
38
- "type": "string"
39
- },
40
- "userAgent": {
41
- "type": "text"
42
- },
43
- "location": {
44
- "type": "json"
45
- },
46
- "linkUrl": {
47
- "type": "text"
48
- },
49
- "linkText": {
50
- "type": "string"
51
- },
52
- "metadata": {
53
- "type": "json"
54
- }
55
- }
56
- }
57
-
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- const schema = require('./schema.json');
4
-
5
- module.exports = {
6
- schema,
7
- };
8
-
@@ -1,49 +0,0 @@
1
- {
2
- "kind": "collectionType",
3
- "collectionName": "magic_mail_email_links",
4
- "info": {
5
- "singularName": "email-link",
6
- "pluralName": "email-links",
7
- "displayName": "Email Link",
8
- "description": "Stores click tracking links for emails"
9
- },
10
- "options": {
11
- "draftAndPublish": false
12
- },
13
- "pluginOptions": {
14
- "content-manager": {
15
- "visible": false
16
- },
17
- "content-type-builder": {
18
- "visible": false
19
- }
20
- },
21
- "attributes": {
22
- "emailLog": {
23
- "type": "relation",
24
- "relation": "manyToOne",
25
- "target": "plugin::magic-mail.email-log",
26
- "inversedBy": "links"
27
- },
28
- "linkHash": {
29
- "type": "string",
30
- "required": true,
31
- "unique": false
32
- },
33
- "originalUrl": {
34
- "type": "text",
35
- "required": true
36
- },
37
- "clickCount": {
38
- "type": "integer",
39
- "default": 0
40
- },
41
- "firstClickedAt": {
42
- "type": "datetime"
43
- },
44
- "lastClickedAt": {
45
- "type": "datetime"
46
- }
47
- }
48
- }
49
-
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- const schema = require('./schema.json');
4
-
5
- module.exports = {
6
- schema,
7
- };
8
-
@@ -1,106 +0,0 @@
1
- {
2
- "kind": "collectionType",
3
- "collectionName": "magic_mail_email_logs",
4
- "info": {
5
- "singularName": "email-log",
6
- "pluralName": "email-logs",
7
- "displayName": "Email Log",
8
- "description": "Tracks all sent emails with user association"
9
- },
10
- "options": {
11
- "draftAndPublish": false
12
- },
13
- "pluginOptions": {
14
- "content-manager": {
15
- "visible": false
16
- },
17
- "content-type-builder": {
18
- "visible": false
19
- }
20
- },
21
- "attributes": {
22
- "emailId": {
23
- "type": "string",
24
- "required": true,
25
- "unique": true
26
- },
27
- "user": {
28
- "type": "relation",
29
- "relation": "manyToOne",
30
- "target": "plugin::users-permissions.user"
31
- },
32
- "recipient": {
33
- "type": "email",
34
- "required": true
35
- },
36
- "recipientName": {
37
- "type": "string"
38
- },
39
- "subject": {
40
- "type": "string",
41
- "required": true
42
- },
43
- "templateId": {
44
- "type": "integer"
45
- },
46
- "templateName": {
47
- "type": "string"
48
- },
49
- "accountId": {
50
- "type": "integer"
51
- },
52
- "accountName": {
53
- "type": "string"
54
- },
55
- "sentAt": {
56
- "type": "datetime",
57
- "required": true
58
- },
59
- "deliveredAt": {
60
- "type": "datetime"
61
- },
62
- "firstOpenedAt": {
63
- "type": "datetime"
64
- },
65
- "lastOpenedAt": {
66
- "type": "datetime"
67
- },
68
- "openCount": {
69
- "type": "integer",
70
- "default": 0
71
- },
72
- "clickCount": {
73
- "type": "integer",
74
- "default": 0
75
- },
76
- "bounced": {
77
- "type": "boolean",
78
- "default": false
79
- },
80
- "bounceReason": {
81
- "type": "text"
82
- },
83
- "unsubscribed": {
84
- "type": "boolean",
85
- "default": false
86
- },
87
- "unsubscribedAt": {
88
- "type": "datetime"
89
- },
90
- "metadata": {
91
- "type": "json"
92
- },
93
- "events": {
94
- "type": "relation",
95
- "relation": "oneToMany",
96
- "target": "plugin::magic-mail.email-event",
97
- "mappedBy": "emailLog"
98
- },
99
- "links": {
100
- "type": "relation",
101
- "relation": "oneToMany",
102
- "target": "plugin::magic-mail.email-link",
103
- "mappedBy": "emailLog"
104
- }
105
- }
106
- }
@@ -1,74 +0,0 @@
1
- {
2
- "kind": "collectionType",
3
- "collectionName": "magic_mail_email_templates",
4
- "info": {
5
- "singularName": "email-template",
6
- "pluralName": "email-templates",
7
- "displayName": "Email Template",
8
- "description": "Email templates created with the visual designer"
9
- },
10
- "options": {
11
- "draftAndPublish": false,
12
- "timestamps": true
13
- },
14
- "pluginOptions": {
15
- "content-manager": {
16
- "visible": false
17
- },
18
- "content-type-builder": {
19
- "visible": false
20
- }
21
- },
22
- "attributes": {
23
- "templateReferenceId": {
24
- "type": "integer",
25
- "required": true,
26
- "unique": true,
27
- "configurable": false
28
- },
29
- "name": {
30
- "type": "string",
31
- "required": true,
32
- "configurable": false
33
- },
34
- "subject": {
35
- "type": "string",
36
- "required": true,
37
- "configurable": false
38
- },
39
- "design": {
40
- "type": "json",
41
- "configurable": false
42
- },
43
- "bodyHtml": {
44
- "type": "text",
45
- "configurable": false
46
- },
47
- "bodyText": {
48
- "type": "text",
49
- "configurable": false
50
- },
51
- "category": {
52
- "type": "enumeration",
53
- "enum": ["transactional", "marketing", "notification", "custom"],
54
- "default": "custom",
55
- "configurable": false
56
- },
57
- "isActive": {
58
- "type": "boolean",
59
- "default": true,
60
- "configurable": false
61
- },
62
- "tags": {
63
- "type": "json",
64
- "configurable": false
65
- },
66
- "versions": {
67
- "type": "relation",
68
- "relation": "oneToMany",
69
- "target": "plugin::magic-mail.email-template-version",
70
- "mappedBy": "template"
71
- }
72
- }
73
- }
74
-