strapi-plugin-magic-mail 2.2.3 → 2.2.5

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 (70) hide show
  1. package/dist/server/index.js +1 -1
  2. package/dist/server/index.mjs +1 -1
  3. package/package.json +1 -3
  4. package/admin/jsconfig.json +0 -10
  5. package/admin/src/components/AddAccountModal.jsx +0 -1943
  6. package/admin/src/components/Initializer.jsx +0 -14
  7. package/admin/src/components/LicenseGuard.jsx +0 -475
  8. package/admin/src/components/PluginIcon.jsx +0 -5
  9. package/admin/src/hooks/useAuthRefresh.js +0 -44
  10. package/admin/src/hooks/useLicense.js +0 -158
  11. package/admin/src/index.js +0 -87
  12. package/admin/src/pages/Analytics.jsx +0 -762
  13. package/admin/src/pages/App.jsx +0 -111
  14. package/admin/src/pages/EmailDesigner/EditorPage.jsx +0 -1424
  15. package/admin/src/pages/EmailDesigner/TemplateList.jsx +0 -1807
  16. package/admin/src/pages/HomePage.jsx +0 -1170
  17. package/admin/src/pages/LicensePage.jsx +0 -430
  18. package/admin/src/pages/RoutingRules.jsx +0 -1141
  19. package/admin/src/pages/Settings.jsx +0 -603
  20. package/admin/src/pluginId.js +0 -3
  21. package/admin/src/translations/de.json +0 -71
  22. package/admin/src/translations/en.json +0 -70
  23. package/admin/src/translations/es.json +0 -71
  24. package/admin/src/translations/fr.json +0 -71
  25. package/admin/src/translations/pt.json +0 -71
  26. package/admin/src/utils/fetchWithRetry.js +0 -123
  27. package/admin/src/utils/getTranslation.js +0 -5
  28. package/admin/src/utils/theme.js +0 -85
  29. package/server/jsconfig.json +0 -10
  30. package/server/src/bootstrap.js +0 -157
  31. package/server/src/config/features.js +0 -260
  32. package/server/src/config/index.js +0 -9
  33. package/server/src/content-types/email-account/schema.json +0 -93
  34. package/server/src/content-types/email-event/index.js +0 -8
  35. package/server/src/content-types/email-event/schema.json +0 -57
  36. package/server/src/content-types/email-link/index.js +0 -8
  37. package/server/src/content-types/email-link/schema.json +0 -49
  38. package/server/src/content-types/email-log/index.js +0 -8
  39. package/server/src/content-types/email-log/schema.json +0 -106
  40. package/server/src/content-types/email-template/schema.json +0 -74
  41. package/server/src/content-types/email-template-version/schema.json +0 -60
  42. package/server/src/content-types/index.js +0 -33
  43. package/server/src/content-types/routing-rule/schema.json +0 -59
  44. package/server/src/controllers/accounts.js +0 -229
  45. package/server/src/controllers/analytics.js +0 -361
  46. package/server/src/controllers/controller.js +0 -26
  47. package/server/src/controllers/email-designer.js +0 -474
  48. package/server/src/controllers/index.js +0 -21
  49. package/server/src/controllers/license.js +0 -269
  50. package/server/src/controllers/oauth.js +0 -474
  51. package/server/src/controllers/routing-rules.js +0 -129
  52. package/server/src/controllers/test.js +0 -301
  53. package/server/src/destroy.js +0 -27
  54. package/server/src/index.js +0 -25
  55. package/server/src/middlewares/index.js +0 -3
  56. package/server/src/policies/index.js +0 -3
  57. package/server/src/register.js +0 -5
  58. package/server/src/routes/admin.js +0 -469
  59. package/server/src/routes/content-api.js +0 -37
  60. package/server/src/routes/index.js +0 -9
  61. package/server/src/services/account-manager.js +0 -329
  62. package/server/src/services/analytics.js +0 -512
  63. package/server/src/services/email-designer.js +0 -717
  64. package/server/src/services/email-router.js +0 -1446
  65. package/server/src/services/index.js +0 -17
  66. package/server/src/services/license-guard.js +0 -423
  67. package/server/src/services/oauth.js +0 -515
  68. package/server/src/services/service.js +0 -7
  69. package/server/src/utils/encryption.js +0 -81
  70. 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
-