@hszrdm/core 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/.medusa/server/src/admin/index.js +3439 -3192
  2. package/.medusa/server/src/admin/index.mjs +3439 -3192
  3. package/.medusa/server/src/api/admin/email/preview/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/email/preview/route.js +20 -0
  5. package/.medusa/server/src/api/admin/email/templates/[id]/route.d.ts +4 -0
  6. package/.medusa/server/src/api/admin/email/templates/[id]/route.js +25 -0
  7. package/.medusa/server/src/api/admin/email/templates/route.d.ts +3 -0
  8. package/.medusa/server/src/api/admin/email/templates/route.js +40 -0
  9. package/.medusa/server/src/api/admin/email/test-send/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/email/test-send/route.js +64 -0
  11. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.d.ts +2 -0
  12. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.js +15 -0
  13. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.d.ts +4 -0
  14. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.js +39 -0
  15. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.js +14 -0
  17. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.d.ts +2 -0
  18. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.js +17 -0
  19. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.d.ts +2 -0
  20. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.js +23 -0
  21. package/.medusa/server/src/api/admin/newsletter/campaigns/route.d.ts +3 -0
  22. package/.medusa/server/src/api/admin/newsletter/campaigns/route.js +40 -0
  23. package/.medusa/server/src/api/hooks/email/status/route.d.ts +2 -0
  24. package/.medusa/server/src/api/hooks/email/status/route.js +69 -0
  25. package/.medusa/server/src/api/store/email/track/click/[token]/route.d.ts +2 -0
  26. package/.medusa/server/src/api/store/email/track/click/[token]/route.js +19 -0
  27. package/.medusa/server/src/api/store/email/track/open/[token]/route.d.ts +2 -0
  28. package/.medusa/server/src/api/store/email/track/open/[token]/route.js +22 -0
  29. package/.medusa/server/src/api/store/leads/route.js +27 -93
  30. package/.medusa/server/src/api/store/newsletter/route.js +24 -107
  31. package/.medusa/server/src/api/store/quote-requests/route.js +41 -129
  32. package/.medusa/server/src/config.js +38 -15
  33. package/.medusa/server/src/core/customer-email.d.ts +5 -5
  34. package/.medusa/server/src/core/customer-email.js +55 -109
  35. package/.medusa/server/src/core/transactional-email.d.ts +9 -8
  36. package/.medusa/server/src/core/transactional-email.js +74 -244
  37. package/.medusa/server/src/core/version.d.ts +2 -2
  38. package/.medusa/server/src/core/version.js +2 -2
  39. package/.medusa/server/src/jobs/email-campaign-dispatch.d.ts +6 -0
  40. package/.medusa/server/src/jobs/email-campaign-dispatch.js +18 -0
  41. package/.medusa/server/src/modules/email-center/campaign.d.ts +8 -0
  42. package/.medusa/server/src/modules/email-center/campaign.js +193 -0
  43. package/.medusa/server/src/modules/email-center/constants.d.ts +1 -0
  44. package/.medusa/server/src/modules/email-center/constants.js +5 -0
  45. package/.medusa/server/src/modules/email-center/defaults.d.ts +10 -0
  46. package/.medusa/server/src/modules/email-center/defaults.js +49 -0
  47. package/.medusa/server/src/modules/email-center/index.d.ts +11 -0
  48. package/.medusa/server/src/modules/email-center/index.js +42 -0
  49. package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.d.ts +5 -0
  50. package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.js +25 -0
  51. package/.medusa/server/src/modules/email-center/models/email-campaign.d.ts +22 -0
  52. package/.medusa/server/src/modules/email-center/models/email-campaign.js +37 -0
  53. package/.medusa/server/src/modules/email-center/models/email-delivery.d.ts +21 -0
  54. package/.medusa/server/src/modules/email-center/models/email-delivery.js +38 -0
  55. package/.medusa/server/src/modules/email-center/models/email-template.d.ts +13 -0
  56. package/.medusa/server/src/modules/email-center/models/email-template.js +20 -0
  57. package/.medusa/server/src/modules/email-center/render.d.ts +31 -0
  58. package/.medusa/server/src/modules/email-center/render.js +92 -0
  59. package/.medusa/server/src/modules/email-center/send.d.ts +27 -0
  60. package/.medusa/server/src/modules/email-center/send.js +67 -0
  61. package/.medusa/server/src/modules/email-center/service.d.ts +56 -0
  62. package/.medusa/server/src/modules/email-center/service.js +13 -0
  63. package/.medusa/server/src/modules/email-center/tracking.d.ts +9 -0
  64. package/.medusa/server/src/modules/email-center/tracking.js +92 -0
  65. package/.medusa/server/src/providers/email/index.d.ts +2 -0
  66. package/.medusa/server/src/providers/email/index.js +11 -0
  67. package/.medusa/server/src/providers/email/service.d.ts +24 -0
  68. package/.medusa/server/src/providers/email/service.js +117 -0
  69. package/.medusa/server/src/scripts/core-init.js +20 -3
  70. package/.medusa/server/src/scripts/verify-bootstrap.js +1 -7
  71. package/.medusa/server/src/subscribers/transactional-email-shipment-created.js +6 -2
  72. package/package.json +3 -3
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest<Record<string, any>>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const email_center_1 = require("../../../../modules/email-center");
5
+ async function POST(req, res) {
6
+ const body = req.body || {};
7
+ if (body.key) {
8
+ const content = await (0, email_center_1.resolveEmailContent)({ container: req.scope, key: String(body.key), locale: body.locale, data: body.data || {} });
9
+ if (!content)
10
+ return res.status(404).json({ message: "E-mail sablon nem található." });
11
+ return res.json({ content });
12
+ }
13
+ const data = body.data && typeof body.data === "object" ? body.data : {};
14
+ return res.json({ content: {
15
+ subject: (0, email_center_1.renderTemplateString)(String(body.subject || ""), data, false),
16
+ html: (0, email_center_1.renderTemplateString)(String(body.html || ""), data, true),
17
+ text: (0, email_center_1.renderTemplateString)(String(body.text || ""), data, false),
18
+ } });
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2VtYWlsL3ByZXZpZXcvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxvQkFhQztBQWZELG1FQUE0RjtBQUVyRixLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQXVDLEVBQUUsR0FBbUI7SUFDckYsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7SUFDM0IsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsa0NBQW1CLEVBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQWMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQy9JLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxDQUFDLENBQUE7UUFDdEYsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDeEUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFO1lBQ3pCLE9BQU8sRUFBRSxJQUFBLG1DQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7WUFDdEUsSUFBSSxFQUFFLElBQUEsbUNBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztZQUMvRCxJQUFJLEVBQUUsSUFBQSxtQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO1NBQ2pFLEVBQUUsQ0FBQyxDQUFBO0FBQ04sQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
3
+ export declare function POST(req: MedusaRequest<Record<string, unknown>>, res: MedusaResponse): Promise<MedusaResponse>;
4
+ export declare function DELETE(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ exports.DELETE = DELETE;
6
+ const email_center_1 = require("../../../../../modules/email-center");
7
+ async function GET(req, res) {
8
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
9
+ return res.json({ template: await service.retrieveEmailTemplate(req.params.id) });
10
+ }
11
+ async function POST(req, res) {
12
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
13
+ const allowed = ["name", "subject", "html", "text", "enabled", "metadata"];
14
+ const values = { id: req.params.id };
15
+ for (const key of allowed)
16
+ if (key in (req.body || {}))
17
+ values[key] = req.body[key];
18
+ return res.json({ template: await service.updateEmailTemplates(values) });
19
+ }
20
+ async function DELETE(req, res) {
21
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
22
+ await service.deleteEmailTemplates(req.params.id);
23
+ return res.status(200).json({ id: req.params.id, deleted: true });
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2VtYWlsL3RlbXBsYXRlcy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esa0JBR0M7QUFFRCxvQkFNQztBQUVELHdCQUlDO0FBbkJELHNFQUFrRztBQUUzRixLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQXVCLENBQUE7SUFDNUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ25GLENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQTJDLEVBQUUsR0FBbUI7SUFDekYsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQXVCLENBQUE7SUFDNUUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sTUFBTSxHQUE0QixFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFBO0lBQzdELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTztRQUFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNuRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUMsTUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3BGLENBQUM7QUFFTSxLQUFLLFVBQVUsTUFBTSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDbEUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQXVCLENBQUE7SUFDNUUsTUFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNqRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ25FLENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
3
+ export declare function POST(req: MedusaRequest<Record<string, unknown>>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const email_center_1 = require("../../../../modules/email-center");
6
+ async function GET(req, res) {
7
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
8
+ const rows = await service.listEmailTemplates({}, { take: 500, order: { key: "ASC", locale: "ASC" } });
9
+ const overrides = new Map(rows.map((row) => [`${row.key}:${row.locale}`, row]));
10
+ const defaults = email_center_1.DEFAULT_EMAIL_TEMPLATES.map((item) => overrides.get(`${item.key}:${item.locale}`) || { ...item, id: null, enabled: true, system: true, default: true });
11
+ const custom = rows.filter((row) => !email_center_1.DEFAULT_EMAIL_TEMPLATES.some((item) => item.key === row.key && item.locale === row.locale));
12
+ return res.json({ templates: [...defaults, ...custom] });
13
+ }
14
+ async function POST(req, res) {
15
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
16
+ const body = req.body || {};
17
+ const key = required(body.key, "Kulcs");
18
+ const locale = localeOf(body.locale);
19
+ const existing = await service.listEmailTemplates({ key, locale }, { take: 1 });
20
+ const values = {
21
+ key,
22
+ locale,
23
+ name: required(body.name, "Név"),
24
+ subject: required(body.subject, "Tárgy"),
25
+ html: required(body.html, "HTML tartalom"),
26
+ text: required(body.text, "Szöveges tartalom"),
27
+ enabled: body.enabled !== false,
28
+ system: body.system === true,
29
+ metadata: objectOrNull(body.metadata),
30
+ };
31
+ const template = existing[0]
32
+ ? await service.updateEmailTemplates({ id: existing[0].id, ...values })
33
+ : await service.createEmailTemplates(values);
34
+ return res.status(existing[0] ? 200 : 201).json({ template });
35
+ }
36
+ function required(value, label) { const text = typeof value === "string" ? value.trim() : ""; if (!text)
37
+ throw new Error(`${label} megadása kötelező.`); return text; }
38
+ function localeOf(value) { return String(value || "hu-HU").toLowerCase().startsWith("en") ? "en-US" : "hu-HU"; }
39
+ function objectOrNull(value) { return value && typeof value === "object" && !Array.isArray(value) ? value : null; }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2VtYWlsL3RlbXBsYXRlcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLGtCQU9DO0FBRUQsb0JBcUJDO0FBaENELG1FQUF3SDtBQUVqSCxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQXVCLENBQUE7SUFDNUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBVyxDQUEwQyxDQUFBO0lBQ3hKLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0UsTUFBTSxRQUFRLEdBQUcsc0NBQXVCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hLLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENB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
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest<Record<string, any>>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const email_center_1 = require("../../../../modules/email-center");
5
+ async function POST(req, res) {
6
+ const body = req.body || {};
7
+ const to = String(body.to || "").trim().toLowerCase();
8
+ if (!/^\S+@\S+\.\S+$/.test(to)) {
9
+ return res.status(400).json({ message: "Érvényes teszt e-mail-cím szükséges." });
10
+ }
11
+ const data = (0, email_center_1.emailVariables)({
12
+ store_name: "HSZRDM Commerce",
13
+ first_name: "Teszt",
14
+ email: to,
15
+ verification_code: "123456",
16
+ reset_url: "https://example.com/reset-password?token=test",
17
+ order_number: "1001",
18
+ total: "19 990",
19
+ currency_code: "HUF",
20
+ tracking_number: "TEST123456",
21
+ tracking_url: "https://example.com/tracking/TEST123456",
22
+ refund_amount: "5 000",
23
+ contact_name: "Teszt Kapcsolattartó",
24
+ contact_email: to,
25
+ company_name: "Teszt Kft.",
26
+ quote_request_id: "quote_test",
27
+ name: "Teszt Felhasználó",
28
+ phone: "+36 20 123 4567",
29
+ form_key: "contact",
30
+ lead_id: "lead_test",
31
+ confirm_url: "https://example.com/newsletter/confirm?token=test",
32
+ unsubscribe_url: "https://example.com/newsletter/unsubscribe?token=test",
33
+ ...(body.data || {}),
34
+ test_email: true,
35
+ });
36
+ let content = body.use_raw === true
37
+ ? null
38
+ : body.key
39
+ ? await (0, email_center_1.resolveEmailContent)({
40
+ container: req.scope,
41
+ key: String(body.key),
42
+ locale: body.locale,
43
+ data,
44
+ })
45
+ : null;
46
+ if (!content) {
47
+ content = {
48
+ subject: (0, email_center_1.renderTemplateString)(String(body.subject || "Teszt e-mail"), data, false),
49
+ html: (0, email_center_1.renderEmailHtmlDocument)((0, email_center_1.renderTemplateString)(String(body.html || "<p>Teszt e-mail</p>"), data, true), data),
50
+ text: (0, email_center_1.renderTemplateString)(String(body.text || "Teszt e-mail"), data, false),
51
+ };
52
+ }
53
+ const result = await (0, email_center_1.sendManagedEmail)({
54
+ container: req.scope,
55
+ to,
56
+ key: body.key || null,
57
+ locale: body.locale,
58
+ content,
59
+ idempotencyKey: `email-test:${Date.now()}:${to}`,
60
+ track: false,
61
+ });
62
+ return res.status(201).json({ delivery: result.delivery });
63
+ }
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2VtYWlsL3Rlc3Qtc2VuZC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLG9CQW9FQztBQTVFRCxtRUFNeUM7QUFFbEMsS0FBSyxVQUFVLElBQUksQ0FDeEIsR0FBdUMsRUFDdkMsR0FBbUI7SUFFbkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7SUFDM0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDckQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFBLDZCQUFjLEVBQUM7UUFDMUIsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixVQUFVLEVBQUUsT0FBTztRQUNuQixLQUFLLEVBQUUsRUFBRTtRQUNULGlCQUFpQixFQUFFLFFBQVE7UUFDM0IsU0FBUyxFQUFFLCtDQUErQztRQUMxRCxZQUFZLEVBQUUsTUFBTTtRQUNwQixLQUFLLEVBQUUsUUFBUTtRQUNmLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGVBQWUsRUFBRSxZQUFZO1FBQzdCLFlBQVksRUFBRSx5Q0FBeUM7UUFDdkQsYUFBYSxFQUFFLE9BQU87UUFDdEIsWUFBWSxFQUFFLHNCQUFzQjtRQUNwQyxhQUFhLEVBQUUsRUFBRTtRQUNqQixZQUFZLEVBQUUsWUFBWTtRQUMxQixnQkFBZ0IsRUFBRSxZQUFZO1FBQzlCLElBQUksRUFBRSxtQkFBbUI7UUFDekIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixRQUFRLEVBQUUsU0FBUztRQUNuQixPQUFPLEVBQUUsV0FBVztRQUNwQixXQUFXLEVBQUUsbURBQW1EO1FBQ2hFLGVBQWUsRUFBRSx1REFBdUQ7UUFDeEUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BCLFVBQVUsRUFBRSxJQUFJO0tBQ2pCLENBQUMsQ0FBQTtJQUVGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSTtRQUNqQyxDQUFDLENBQUMsSUFBSTtRQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNSLENBQUMsQ0FBQyxNQUFNLElBQUEsa0NBQW1CLEVBQUM7Z0JBQ3hCLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBYztnQkFDN0IsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLElBQUk7YUFDTCxDQUFDO1lBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUVWLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRztZQUNSLE9BQU8sRUFBRSxJQUFBLG1DQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7WUFDbEYsSUFBSSxFQUFFLElBQUEsc0NBQXVCLEVBQzNCLElBQUEsbUNBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUkscUJBQXFCLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQzVFLElBQUksQ0FDTDtZQUNELElBQUksRUFBRSxJQUFBLG1DQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7U0FDN0UsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsK0JBQWdCLEVBQUM7UUFDcEMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxLQUFjO1FBQzdCLEVBQUU7UUFDRixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJO1FBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixPQUFPO1FBQ1AsY0FBYyxFQUFFLGNBQWMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNoRCxLQUFLLEVBQUUsS0FBSztLQUNiLENBQUMsQ0FBQTtJQUNGLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7QUFDNUQsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const email_center_1 = require("../../../../../../modules/email-center");
5
+ async function POST(req, res) {
6
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
7
+ const campaign = await service.retrieveEmailCampaign(req.params.id);
8
+ if (campaign.status === "sent")
9
+ return res.status(409).json({ message: "Elküldött kampány nem állítható le." });
10
+ if (campaign.status === "cancelled")
11
+ return res.json({ campaign });
12
+ const updated = await service.updateEmailCampaigns({ id: campaign.id, status: "cancelled", completed_at: new Date() });
13
+ return res.json({ campaign: updated });
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL25ld3NsZXR0ZXIvY2FtcGFpZ25zL1tpZF0vY2FuY2VsL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esb0JBT0M7QUFURCx5RUFBcUc7QUFFOUYsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtDQUFtQixDQUF1QixDQUFBO0lBQzVFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFtQyxDQUFBO0lBQ3JHLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxDQUFDLENBQUE7SUFDL0csSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBVyxDQUFDLENBQUE7SUFDL0gsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDeEMsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
3
+ export declare function POST(req: MedusaRequest<Record<string, any>>, res: MedusaResponse): Promise<MedusaResponse>;
4
+ export declare function DELETE(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ exports.DELETE = DELETE;
6
+ const email_center_1 = require("../../../../../modules/email-center");
7
+ async function GET(req, res) {
8
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
9
+ const campaign = await service.retrieveEmailCampaign(req.params.id);
10
+ const [deliveries, deliveryCount] = await service.listAndCountEmailDeliveries({ campaign_id: req.params.id }, { take: 100, order: { created_at: "DESC" } });
11
+ return res.json({ campaign, deliveries, delivery_count: deliveryCount });
12
+ }
13
+ async function POST(req, res) {
14
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
15
+ const current = await service.retrieveEmailCampaign(req.params.id);
16
+ if (["sending", "sent"].includes(current.status))
17
+ return res.status(409).json({ message: "Küldés alatt vagy már elküldött kampány tartalma nem módosítható." });
18
+ const body = req.body || {};
19
+ const values = { id: req.params.id };
20
+ for (const key of ["name", "subject", "html", "text", "template_key", "segment", "metadata"])
21
+ if (key in body)
22
+ values[key] = body[key];
23
+ if ("locale" in body)
24
+ values.locale = (0, email_center_1.normalizeLocale)(body.locale);
25
+ if ("scheduled_at" in body) {
26
+ values.scheduled_at = body.scheduled_at ? new Date(body.scheduled_at) : null;
27
+ values.status = body.scheduled_at ? "scheduled" : "draft";
28
+ }
29
+ return res.json({ campaign: await service.updateEmailCampaigns(values) });
30
+ }
31
+ async function DELETE(req, res) {
32
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
33
+ const current = await service.retrieveEmailCampaign(req.params.id);
34
+ if (current.status === "sending")
35
+ return res.status(409).json({ message: "Küldés alatt álló kampány nem törölhető." });
36
+ await service.deleteEmailCampaigns(req.params.id);
37
+ return res.json({ id: req.params.id, deleted: true });
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL25ld3NsZXR0ZXIvY2FtcGFpZ25zL1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxrQkFLQztBQUVELG9CQWFDO0FBRUQsd0JBTUM7QUE5QkQsc0VBQW1IO0FBRTVHLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBdUIsQ0FBQTtJQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsMkJBQTJCLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFXLENBQUMsQ0FBQTtJQUM3SyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQXVDLEVBQUUsR0FBbUI7SUFDckYsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQXVCLENBQUE7SUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQW1DLENBQUE7SUFDcEcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsbUVBQW1FLEVBQUUsQ0FBQyxDQUFBO0lBQy9KLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQzNCLE1BQU0sTUFBTSxHQUE0QixFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFBO0lBQzdELEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7UUFBRSxJQUFJLEdBQUcsSUFBSSxJQUFJO1lBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN0SSxJQUFJLFFBQVEsSUFBSSxJQUFJO1FBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFBLDhCQUFlLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2xFLElBQUksY0FBYyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDNUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUMzRCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDLG9CQUFvQixDQUFDLE1BQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNwRixDQUFDO0FBRU0sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtDQUFtQixDQUF1QixDQUFBO0lBQzVFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFtQyxDQUFBO0lBQ3BHLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxDQUFDLENBQUE7SUFDdEgsTUFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNqRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDdkQsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const email_center_1 = require("../../../../../../modules/email-center");
5
+ async function POST(req, res) {
6
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
7
+ const campaign = await service.retrieveEmailCampaign(req.params.id);
8
+ if (["sent", "cancelled"].includes(campaign.status))
9
+ return res.status(409).json({ message: "Ez a kampány már nem indítható." });
10
+ await service.updateEmailCampaigns({ id: campaign.id, status: "sending", scheduled_at: null, started_at: campaign.started_at || new Date() });
11
+ const updated = await (0, email_center_1.processCampaignBatch)(req.scope, campaign.id);
12
+ return res.json({ campaign: updated });
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL25ld3NsZXR0ZXIvY2FtcGFpZ25zL1tpZF0vc2VuZC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLG9CQU9DO0FBVEQseUVBQTJIO0FBRXBILEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBdUIsQ0FBQTtJQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBbUMsQ0FBQTtJQUNyRyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLENBQUE7SUFDaEksTUFBTSxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBVyxDQUFDLENBQUE7SUFDdEosTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLG1DQUFvQixFQUFDLEdBQUcsQ0FBQyxLQUFjLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzNFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ3hDLENBQUMifQ==
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const email_center_1 = require("../../../../../../modules/email-center");
5
+ async function GET(req, res) {
6
+ await (0, email_center_1.refreshCampaignStats)(req.scope, req.params.id);
7
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
8
+ const campaign = await service.retrieveEmailCampaign(req.params.id);
9
+ const statuses = ["queued", "sent", "delivered", "opened", "clicked", "failed", "bounced"];
10
+ const deliveries = {};
11
+ for (const status of statuses) {
12
+ const [, count] = await service.listAndCountEmailDeliveries({ campaign_id: req.params.id, status }, { take: 1 });
13
+ deliveries[status] = count;
14
+ }
15
+ return res.json({ campaign, deliveries });
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL25ld3NsZXR0ZXIvY2FtcGFpZ25zL1tpZF0vc3RhdHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxrQkFXQztBQWJELHlFQUEySDtBQUVwSCxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxJQUFBLG1DQUFvQixFQUFDLEdBQUcsQ0FBQyxLQUFjLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM3RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBdUIsQ0FBQTtJQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDMUYsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQTtJQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBVyxDQUF3QyxDQUFBO1FBQ3pLLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUE7SUFDNUIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO0FBQzNDLENBQUMifQ==
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest<Record<string, any>>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const email_center_1 = require("../../../../../../modules/email-center");
5
+ async function POST(req, res) {
6
+ const to = String(req.body?.to || "").trim().toLowerCase();
7
+ if (!/^\S+@\S+\.\S+$/.test(to))
8
+ return res.status(400).json({ message: "Érvényes teszt e-mail-cím szükséges." });
9
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
10
+ const campaign = await service.retrieveEmailCampaign(req.params.id);
11
+ const unsubscribeUrl = "https://example.com/unsubscribe-test";
12
+ const data = (0, email_center_1.emailVariables)({ email: to, unsubscribe_url: unsubscribeUrl });
13
+ let content = {
14
+ subject: (0, email_center_1.renderTemplateString)(campaign.subject, data, false),
15
+ html: (0, email_center_1.renderTemplateString)(campaign.html, data, true),
16
+ text: (0, email_center_1.renderTemplateString)(campaign.text, data, false),
17
+ };
18
+ content = (0, email_center_1.ensureMarketingUnsubscribe)(content, unsubscribeUrl, campaign.locale);
19
+ content.html = (0, email_center_1.renderEmailHtmlDocument)(content.html, data);
20
+ const result = await (0, email_center_1.sendManagedEmail)({ container: req.scope, to, content, locale: campaign.locale, idempotencyKey: `campaign-test:${campaign.id}:${Date.now()}:${to}`, track: false });
21
+ return res.status(201).json({ delivery: result.delivery });
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL25ld3NsZXR0ZXIvY2FtcGFpZ25zL1tpZF0vdGVzdC1zZW5kL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esb0JBZ0JDO0FBbEJELHlFQUFrTjtBQUUzTSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQXVDLEVBQUUsR0FBbUI7SUFDckYsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxDQUFDLENBQUE7SUFDaEgsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQXVCLENBQUE7SUFDNUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQW1DLENBQUE7SUFDckcsTUFBTSxjQUFjLEdBQUcsc0NBQXNDLENBQUE7SUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBQSw2QkFBYyxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQTtJQUMzRSxJQUFJLE9BQU8sR0FBRztRQUNaLE9BQU8sRUFBRSxJQUFBLG1DQUFvQixFQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUM1RCxJQUFJLEVBQUUsSUFBQSxtQ0FBb0IsRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDckQsSUFBSSxFQUFFLElBQUEsbUNBQW9CLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO0tBQ3ZELENBQUE7SUFDRCxPQUFPLEdBQUcsSUFBQSx5Q0FBMEIsRUFBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5RSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUEsc0NBQXVCLEVBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsK0JBQWdCLEVBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDaE0sT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtBQUM1RCxDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
3
+ export declare function POST(req: MedusaRequest<Record<string, any>>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const email_center_1 = require("../../../../modules/email-center");
6
+ async function GET(req, res) {
7
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
8
+ const limit = clamp(req.query?.limit, 1, 200, 50);
9
+ const offset = clamp(req.query?.offset, 0, 1000000, 0);
10
+ const filters = {};
11
+ if (typeof req.query?.status === "string" && req.query.status)
12
+ filters.status = req.query.status;
13
+ const [campaigns, count] = await service.listAndCountEmailCampaigns(filters, { take: limit, skip: offset, order: { created_at: "DESC" } });
14
+ return res.json({ campaigns, count, limit, offset });
15
+ }
16
+ async function POST(req, res) {
17
+ const body = req.body || {};
18
+ const name = required(body.name, "Kampánynév");
19
+ const subject = required(body.subject, "Tárgy");
20
+ const html = required(body.html, "HTML tartalom");
21
+ const text = required(body.text, "Szöveges tartalom");
22
+ const scheduledAt = body.scheduled_at ? new Date(body.scheduled_at) : null;
23
+ if (scheduledAt && Number.isNaN(scheduledAt.getTime()))
24
+ return res.status(400).json({ message: "Érvénytelen időzítés." });
25
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
26
+ const campaign = await service.createEmailCampaigns({
27
+ name, subject, html, text,
28
+ locale: (0, email_center_1.normalizeLocale)(body.locale),
29
+ template_key: typeof body.template_key === "string" && body.template_key.trim() ? body.template_key.trim() : null,
30
+ segment: body.segment && typeof body.segment === "object" ? body.segment : null,
31
+ scheduled_at: scheduledAt,
32
+ status: scheduledAt ? "scheduled" : "draft",
33
+ metadata: body.metadata && typeof body.metadata === "object" ? body.metadata : null,
34
+ });
35
+ return res.status(201).json({ campaign });
36
+ }
37
+ function required(value, label) { const text = typeof value === "string" ? value.trim() : ""; if (!text)
38
+ throw new Error(`${label} megadása kötelező.`); return text; }
39
+ function clamp(value, min, max, fallback) { const n = Number(Array.isArray(value) ? value[0] : value); return Number.isInteger(n) ? Math.max(min, Math.min(max, n)) : fallback; }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL25ld3NsZXR0ZXIvY2FtcGFpZ25zL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esa0JBUUM7QUFFRCxvQkFtQkM7QUEvQkQsbUVBQWdIO0FBRXpHLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQ0FBbUIsQ0FBdUIsQ0FBQTtJQUM1RSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNqRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN0RCxNQUFNLE9BQU8sR0FBNEIsRUFBRSxDQUFBO0lBQzNDLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQTtJQUNoRyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLDBCQUEwQixDQUFDLE9BQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFXLENBQUMsQ0FBQTtJQUM1SixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxN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
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function POST(req: MedusaRequest<Record<string, any> | Array<Record<string, any>>>, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const email_center_1 = require("../../../../modules/email-center");
6
+ async function POST(req, res) {
7
+ if (!authorized(req))
8
+ return res.status(401).json({ message: "Unauthorized" });
9
+ const events = Array.isArray(req.body) ? req.body : [req.body || {}];
10
+ const results = [];
11
+ for (const body of events.slice(0, 1000))
12
+ results.push(await processEvent(req, body));
13
+ return res.json({ processed: results.length, results });
14
+ }
15
+ async function processEvent(req, body) {
16
+ const event = normalizeEvent(body.event || body.type);
17
+ if (!event)
18
+ return { ok: false, message: "Unsupported event" };
19
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
20
+ const deliveryId = String(body.delivery_id || body.hszrdm_delivery_id || body.unique_args?.hszrdm_delivery_id || body.custom_args?.hszrdm_delivery_id || "").trim();
21
+ const providerMessageId = String(body.provider_message_id || body.message_id || body.sg_message_id || "").trim();
22
+ let delivery;
23
+ if (deliveryId) {
24
+ try {
25
+ delivery = await service.retrieveEmailDelivery(deliveryId);
26
+ }
27
+ catch {
28
+ delivery = undefined;
29
+ }
30
+ }
31
+ if (!delivery && providerMessageId) {
32
+ const rows = await service.listEmailDeliveries({ provider_message_id: providerMessageId }, { take: 1 });
33
+ delivery = rows[0];
34
+ }
35
+ if (!delivery)
36
+ return { ok: false, message: "Delivery not found", delivery_id: deliveryId || null, provider_message_id: providerMessageId || null };
37
+ const now = new Date();
38
+ const preserveEngagement = ["opened", "clicked"].includes(delivery.status) && event === "delivered";
39
+ const updated = await service.updateEmailDeliveries({
40
+ id: delivery.id,
41
+ status: preserveEngagement ? delivery.status : event,
42
+ provider_message_id: providerMessageId || delivery.provider_message_id || null,
43
+ ...(event === "delivered" ? { delivered_at: delivery.delivered_at || now } : { failed_at: delivery.failed_at || now, error: String(body.error || body.reason || body.response || event).slice(0, 4000) }),
44
+ });
45
+ if (delivery.campaign_id)
46
+ await (0, email_center_1.refreshCampaignStats)(req.scope, delivery.campaign_id);
47
+ return { ok: true, delivery_id: delivery.id, status: preserveEngagement ? delivery.status : event, delivery: updated };
48
+ }
49
+ function normalizeEvent(value) {
50
+ const event = String(value || "").toLowerCase();
51
+ if (["delivered", "delivery"].includes(event))
52
+ return "delivered";
53
+ if (["bounce", "bounced", "blocked", "dropped"].includes(event))
54
+ return "bounced";
55
+ if (["failed", "failure", "deferred"].includes(event))
56
+ return "failed";
57
+ return null;
58
+ }
59
+ function authorized(req) {
60
+ const secret = process.env.EMAIL_WEBHOOK_SECRET || "";
61
+ if (!secret)
62
+ return false;
63
+ const auth = String(req.headers.authorization || "");
64
+ const supplied = auth.startsWith("Bearer ") ? auth.slice(7) : String(req.headers["x-email-webhook-secret"] || "");
65
+ const a = Buffer.from((0, node_crypto_1.createHash)("sha256").update(supplied).digest("hex"));
66
+ const b = Buffer.from((0, node_crypto_1.createHash)("sha256").update(secret).digest("hex"));
67
+ return a.length === b.length && (0, node_crypto_1.timingSafeEqual)(a, b);
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2hvb2tzL2VtYWlsL3N0YXR1cy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLG9CQU1DO0FBVkQsNkNBQXlEO0FBRXpELG1FQUFxSDtBQUU5RyxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQW9FLEVBQUUsR0FBbUI7SUFDbEgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUE7SUFDOUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNwRSxNQUFNLE9BQU8sR0FBbUMsRUFBRSxDQUFBO0lBQ2xELEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNyRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ3pELENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLEdBQWtCLEVBQUUsSUFBeUI7SUFDdkUsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3JELElBQUksQ0FBQyxLQUFLO1FB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
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<void | MedusaResponse>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const email_center_1 = require("../../../../../../modules/email-center");
5
+ async function GET(req, res) {
6
+ const payload = (0, email_center_1.verifyEmailTrackingToken)(req.params.token);
7
+ if (!payload?.url)
8
+ return res.status(400).json({ message: "Érvénytelen tracking link." });
9
+ try {
10
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
11
+ const delivery = await service.retrieveEmailDelivery(payload.delivery_id);
12
+ await service.updateEmailDeliveries({ id: delivery.id, status: "clicked", opened_at: delivery.opened_at || new Date(), clicked_at: delivery.clicked_at || new Date(), click_count: Number(delivery.click_count || 0) + 1 });
13
+ if (delivery.campaign_id)
14
+ await (0, email_center_1.refreshCampaignStats)(req.scope, delivery.campaign_id);
15
+ }
16
+ catch { /* A valid signed URL can still redirect if persistence is unavailable. */ }
17
+ return res.redirect(302, payload.url);
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2VtYWlsL3RyYWNrL2NsaWNrL1t0b2tlbl0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxrQkFVQztBQVpELHlFQUFxSjtBQUU5SSxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBQSx1Q0FBd0IsRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzFELElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRztRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyxDQUFBO0lBQ3pGLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtDQUFtQixDQUF1QixDQUFBO1FBQzVFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQW1DLENBQUE7UUFDM0csTUFBTSxPQUFPLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFXLENBQUMsQ0FBQTtRQUNwTyxJQUFJLFFBQVEsQ0FBQyxXQUFXO1lBQUUsTUFBTSxJQUFBLG1DQUFvQixFQUFDLEdBQUcsQ0FBQyxLQUFjLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ2hHLENBQUM7SUFBQyxNQUFNLENBQUMsQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO0lBQ3RGLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3ZDLENBQUMifQ==
@@ -0,0 +1,2 @@
1
+ import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
2
+ export declare function GET(req: MedusaRequest, res: MedusaResponse): Promise<MedusaResponse>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const email_center_1 = require("../../../../../../modules/email-center");
5
+ const GIF = Buffer.from("R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=", "base64");
6
+ async function GET(req, res) {
7
+ const payload = (0, email_center_1.verifyEmailTrackingToken)(req.params.token);
8
+ if (payload) {
9
+ try {
10
+ const service = req.scope.resolve(email_center_1.EMAIL_CENTER_MODULE);
11
+ const delivery = await service.retrieveEmailDelivery(payload.delivery_id);
12
+ await service.updateEmailDeliveries({ id: delivery.id, status: delivery.status === "clicked" ? "clicked" : "opened", opened_at: delivery.opened_at || new Date(), open_count: Number(delivery.open_count || 0) + 1 });
13
+ if (delivery.campaign_id)
14
+ await (0, email_center_1.refreshCampaignStats)(req.scope, delivery.campaign_id);
15
+ }
16
+ catch { /* Tracking must never break image delivery. */ }
17
+ }
18
+ res.setHeader("Content-Type", "image/gif");
19
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
20
+ return res.status(200).send(GIF);
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2VtYWlsL3RyYWNrL29wZW4vW3Rva2VuXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLGtCQWFDO0FBaEJELHlFQUFxSjtBQUVySixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQ2xFLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHVDQUF3QixFQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtDQUFtQixDQUF1QixDQUFBO1lBQzVFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQW1DLENBQUE7WUFDM0csTUFBTSxPQUFPLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBVyxDQUFDLENBQUE7WUFDOU4sSUFBSSxRQUFRLENBQUMsV0FBVztnQkFBRSxNQUFNLElBQUEsbUNBQW9CLEVBQUMsR0FBRyxDQUFDLEtBQWMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDaEcsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLHVEQUF1RCxDQUFDLENBQUE7SUFDdkYsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNsQyxDQUFDIn0=