medusa-contact-us 0.0.17 → 0.0.20

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 (24) hide show
  1. package/.medusa/server/src/api/admin/contact-requests/[id]/route.js +17 -0
  2. package/.medusa/server/src/api/admin/contact-requests/[id]/status/route.js +24 -0
  3. package/.medusa/server/src/api/admin/contact-requests/route.js +67 -0
  4. package/.medusa/server/src/api/admin/contact-requests/validators.js +29 -0
  5. package/.medusa/server/src/api/store/contact-requests/route.js +23 -0
  6. package/.medusa/server/src/api/store/contact-requests/validators.js +11 -0
  7. package/.medusa/server/src/helpers/contact-request.js +52 -0
  8. package/.medusa/server/src/helpers/index.js +5 -2
  9. package/.medusa/server/src/index.js +10 -2
  10. package/.medusa/server/src/modules/contact-requests/index.js +14 -0
  11. package/.medusa/server/src/modules/contact-requests/migrations/Migration20241129163317.js +47 -0
  12. package/.medusa/server/src/modules/contact-requests/models/contact-request.js +15 -0
  13. package/.medusa/server/src/modules/contact-requests/service.js +236 -0
  14. package/.medusa/server/src/modules/contact-requests/utils/resolve-options.js +48 -0
  15. package/.medusa/server/src/types/contact-request.js +3 -0
  16. package/.medusa/server/src/workflows/create-contact-request-workflow.js +13 -0
  17. package/.medusa/server/src/workflows/index.js +8 -0
  18. package/.medusa/server/src/workflows/steps/create-contact-request-step.js +13 -0
  19. package/.medusa/server/src/workflows/steps/resolve-status-transition-step.js +15 -0
  20. package/.medusa/server/src/workflows/steps/send-status-notification-step.js +56 -0
  21. package/.medusa/server/src/workflows/steps/update-contact-request-status-step.js +17 -0
  22. package/.medusa/server/src/workflows/update-contact-request-status-workflow.js +33 -0
  23. package/README.md +376 -5
  24. package/package.json +2 -1
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const contact_requests_1 = require("../../../../modules/contact-requests");
5
+ const GET = async (req, res) => {
6
+ const { id } = req.params;
7
+ const service = req.scope.resolve(contact_requests_1.CONTACT_REQUEST_MODULE);
8
+ const request = await service.getRequest(id);
9
+ // Get next allowed statuses for the admin UI
10
+ const nextAllowedStatuses = service.getNextAllowedStatuses(request.status);
11
+ res.status(200).json({
12
+ request,
13
+ next_allowed_statuses: nextAllowedStatuses,
14
+ });
15
+ };
16
+ exports.GET = GET;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvbnRhY3QtcmVxdWVzdHMvW2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwyRUFBNkU7QUFHdEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBRXpCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUMvQix5Q0FBc0IsQ0FDdkIsQ0FBQTtJQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUU1Qyw2Q0FBNkM7SUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLE9BQU87UUFDUCxxQkFBcUIsRUFBRSxtQkFBbUI7S0FDM0MsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBaEJZLFFBQUEsR0FBRyxPQWdCZiJ9
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.POST = void 0;
7
+ const validators_1 = require("../../validators");
8
+ const update_contact_request_status_workflow_1 = __importDefault(require("../../../../../workflows/update-contact-request-status-workflow"));
9
+ const POST = async (req, res) => {
10
+ const { id } = req.params;
11
+ const body = validators_1.AdminUpdateContactRequestStatusSchema.parse(req.body ?? {});
12
+ const authContext = req.auth_context;
13
+ const actorId = authContext?.actor_id || authContext?.user_id || "admin";
14
+ const { result } = await (0, update_contact_request_status_workflow_1.default)(req.scope).run({
15
+ input: {
16
+ id,
17
+ status: body.status,
18
+ changed_by: actorId,
19
+ },
20
+ });
21
+ res.status(200).json({ request: result.request });
22
+ };
23
+ exports.POST = POST;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvbnRhY3QtcmVxdWVzdHMvW2lkXS9zdGF0dXMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsaURBQXdFO0FBQ3hFLDZJQUFnSDtBQUV6RyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFDekIsTUFBTSxJQUFJLEdBQUcsa0RBQXFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7SUFFeEUsTUFBTSxXQUFXLEdBQUksR0FFbkIsQ0FBQyxZQUFZLENBQUE7SUFDZixNQUFNLE9BQU8sR0FBRyxXQUFXLEVBQUUsUUFBUSxJQUFJLFdBQVcsRUFBRSxPQUFPLElBQUksT0FBTyxDQUFBO0lBRXhFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsZ0RBQWtDLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN6RSxLQUFLLEVBQUU7WUFDTCxFQUFFO1lBQ0YsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFVBQVUsRUFBRSxPQUFPO1NBQ3BCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDbkQsQ0FBQyxDQUFBO0FBbEJZLFFBQUEsSUFBSSxRQWtCaEIifQ==
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.POST = exports.GET = void 0;
7
+ const contact_requests_1 = require("../../../modules/contact-requests");
8
+ const validators_1 = require("./validators");
9
+ const create_contact_request_workflow_1 = __importDefault(require("../../../workflows/create-contact-request-workflow"));
10
+ const GET = async (req, res) => {
11
+ const query = validators_1.AdminListContactRequestsSchema.parse(req.query ?? {});
12
+ const service = req.scope.resolve(contact_requests_1.CONTACT_REQUEST_MODULE);
13
+ const selector = {};
14
+ if (query.email) {
15
+ selector.email = { $ilike: `%${query.email}%` };
16
+ }
17
+ if (query.status) {
18
+ selector.status = query.status;
19
+ }
20
+ if (query.source) {
21
+ selector.source = query.source;
22
+ }
23
+ if (query.created_at) {
24
+ selector.created_at = {};
25
+ if (query.created_at.gte) {
26
+ selector.created_at.$gte = new Date(query.created_at.gte);
27
+ }
28
+ if (query.created_at.lte) {
29
+ selector.created_at.$lte = new Date(query.created_at.lte);
30
+ }
31
+ }
32
+ const order = {};
33
+ if (query.order) {
34
+ order[query.order] = query.order_direction ?? "DESC";
35
+ }
36
+ else {
37
+ order.created_at = query.order_direction ?? "DESC";
38
+ }
39
+ const [requests, count] = await service.listRequests(selector, {
40
+ take: query.limit,
41
+ skip: query.offset,
42
+ order,
43
+ });
44
+ res.status(200).json({
45
+ requests,
46
+ count,
47
+ offset: query.offset,
48
+ limit: query.limit,
49
+ });
50
+ };
51
+ exports.GET = GET;
52
+ const POST = async (req, res) => {
53
+ const body = validators_1.AdminCreateContactRequestSchema.parse(req.body ?? {});
54
+ const authContext = req.auth_context;
55
+ const actorId = authContext?.actor_id || authContext?.user_id || "admin";
56
+ const { result } = await (0, create_contact_request_workflow_1.default)(req.scope).run({
57
+ input: {
58
+ email: body.email,
59
+ payload: body.payload,
60
+ metadata: body.metadata,
61
+ source: body.source ?? "admin",
62
+ },
63
+ });
64
+ res.status(200).json({ request: result.request });
65
+ };
66
+ exports.POST = POST;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvbnRhY3QtcmVxdWVzdHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esd0VBQTBFO0FBRTFFLDZDQUdxQjtBQUNyQix5SEFBNkY7QUFFdEYsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sS0FBSyxHQUFHLDJDQUE4QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUMvQix5Q0FBc0IsQ0FDdkIsQ0FBQTtJQUVELE1BQU0sUUFBUSxHQVFWLEVBQUUsQ0FBQTtJQUVOLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQixRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7SUFDaEMsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JCLFFBQVEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUEyQixFQUFFLENBQUE7SUFDeEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQTtJQUN0RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUE7SUFDcEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUM3RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDakIsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ2xCLEtBQUs7S0FDTixDQUFDLENBQUE7SUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuQixRQUFRO1FBQ1IsS0FBSztRQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7S0FDbkIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBekRZLFFBQUEsR0FBRyxPQXlEZjtBQUVNLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLElBQUksR0FBRyw0Q0FBK0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVsRSxNQUFNLFdBQVcsR0FBSSxHQUVuQixDQUFDLFlBQVksQ0FBQTtJQUNmLE1BQU0sT0FBTyxHQUFHLFdBQVcsRUFBRSxRQUFRLElBQUksV0FBVyxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUE7SUFFeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSx5Q0FBNEIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ25FLEtBQUssRUFBRTtZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU87U0FDL0I7S0FDRixDQUFDLENBQUE7SUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtBQUNuRCxDQUFDLENBQUE7QUFsQlksUUFBQSxJQUFJLFFBa0JoQiJ9
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdminUpdateContactRequestStatusSchema = exports.AdminListContactRequestsSchema = exports.AdminCreateContactRequestSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.AdminCreateContactRequestSchema = zod_1.z.object({
6
+ email: zod_1.z.string().email(),
7
+ payload: zod_1.z.record(zod_1.z.unknown()).optional(),
8
+ metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
9
+ source: zod_1.z.string().optional(),
10
+ });
11
+ exports.AdminListContactRequestsSchema = zod_1.z.object({
12
+ email: zod_1.z.string().optional(),
13
+ status: zod_1.z.string().optional(),
14
+ source: zod_1.z.string().optional(),
15
+ created_at: zod_1.z
16
+ .object({
17
+ gte: zod_1.z.string().datetime().optional(),
18
+ lte: zod_1.z.string().datetime().optional(),
19
+ })
20
+ .optional(),
21
+ limit: zod_1.z.coerce.number().int().positive().max(100).default(20),
22
+ offset: zod_1.z.coerce.number().int().nonnegative().default(0),
23
+ order: zod_1.z.enum(["created_at", "updated_at", "email"]).optional(),
24
+ order_direction: zod_1.z.enum(["ASC", "DESC"]).default("DESC"),
25
+ });
26
+ exports.AdminUpdateContactRequestStatusSchema = zod_1.z.object({
27
+ status: zod_1.z.string(),
28
+ });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vY29udGFjdC1yZXF1ZXN0cy92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF1QjtBQUVWLFFBQUEsK0JBQStCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0RCxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRTtJQUN6QixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDekMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzFDLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzlCLENBQUMsQ0FBQTtBQU1XLFFBQUEsOEJBQThCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyRCxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM3QixNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM3QixVQUFVLEVBQUUsT0FBQztTQUNWLE1BQU0sQ0FBQztRQUNOLEdBQUcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQ3JDLEdBQUcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQ3RDLENBQUM7U0FDRCxRQUFRLEVBQUU7SUFDYixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUM5RCxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hELEtBQUssRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUMvRCxlQUFlLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Q0FDekQsQ0FBQyxDQUFBO0FBTVcsUUFBQSxxQ0FBcUMsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVELE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0NBQ25CLENBQUMsQ0FBQSJ9
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.POST = exports.AUTHENTICATE = void 0;
7
+ const validators_1 = require("./validators");
8
+ const create_contact_request_workflow_1 = __importDefault(require("../../../workflows/create-contact-request-workflow"));
9
+ exports.AUTHENTICATE = false;
10
+ const POST = async (req, res) => {
11
+ const body = validators_1.StoreCreateContactRequestSchema.parse(req.body ?? {});
12
+ const { result } = await (0, create_contact_request_workflow_1.default)(req.scope).run({
13
+ input: {
14
+ email: body.email,
15
+ payload: body.payload,
16
+ metadata: body.metadata,
17
+ source: body.source ?? "storefront",
18
+ },
19
+ });
20
+ res.status(200).json({ request: result.request });
21
+ };
22
+ exports.POST = POST;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NvbnRhY3QtcmVxdWVzdHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsNkNBQThEO0FBQzlELHlIQUE2RjtBQUVoRixRQUFBLFlBQVksR0FBRyxLQUFLLENBQUE7QUFFMUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sSUFBSSxHQUFHLDRDQUErQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWxFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEseUNBQTRCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNuRSxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZO1NBQ3BDO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDbkQsQ0FBQyxDQUFBO0FBYlksUUFBQSxJQUFJLFFBYWhCIn0=
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StoreCreateContactRequestSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.StoreCreateContactRequestSchema = zod_1.z.object({
6
+ email: zod_1.z.string().email(),
7
+ payload: zod_1.z.record(zod_1.z.unknown()).optional(),
8
+ metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
9
+ source: zod_1.z.string().optional(),
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvY29udGFjdC1yZXF1ZXN0cy92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF1QjtBQUVWLFFBQUEsK0JBQStCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0RCxLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRTtJQUN6QixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDekMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzFDLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzlCLENBQUMsQ0FBQSJ9
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSubmitContactRequest = exports.submitContactRequest = void 0;
4
+ const base_client_1 = require("./base-client");
5
+ const CONTACT_REQUEST_ENDPOINT = "/store/contact-requests";
6
+ const resolveEndpoint = (endpoint) => endpoint?.startsWith("/") ? endpoint : CONTACT_REQUEST_ENDPOINT;
7
+ const submitContactRequest = async (input, options = {}) => {
8
+ const endpoint = resolveEndpoint(input.endpoint);
9
+ const payload = {
10
+ email: input.email,
11
+ payload: input.payload,
12
+ metadata: input.metadata,
13
+ source: input.source,
14
+ };
15
+ const clientRequest = (0, base_client_1.getClientRequest)(options.client);
16
+ if (clientRequest) {
17
+ const headers = (0, base_client_1.buildHeaders)(options);
18
+ const raw = await clientRequest(endpoint, {
19
+ method: "POST",
20
+ body: JSON.stringify(payload),
21
+ headers,
22
+ });
23
+ if (!raw || typeof raw !== "object" || !("request" in raw)) {
24
+ throw new Error("Invalid response from contact request endpoint");
25
+ }
26
+ return raw;
27
+ }
28
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
29
+ if (!fetchImpl) {
30
+ throw new Error("No fetch implementation available. Provide `fetchImpl` or a Medusa client.");
31
+ }
32
+ const url = `${(0, base_client_1.normalizeBaseUrl)(options.baseUrl)}${endpoint}`;
33
+ const headers = (0, base_client_1.buildHeaders)(options);
34
+ const response = await fetchImpl(url || endpoint, {
35
+ method: "POST",
36
+ headers,
37
+ body: JSON.stringify(payload),
38
+ });
39
+ if (!response.ok) {
40
+ const body = await response.text();
41
+ throw new Error(body || `Failed to submit contact request (status ${response.status})`);
42
+ }
43
+ const json = await response.json();
44
+ if (!json || typeof json !== "object" || !("request" in json)) {
45
+ throw new Error("Invalid response format from contact request endpoint");
46
+ }
47
+ return json;
48
+ };
49
+ exports.submitContactRequest = submitContactRequest;
50
+ const createSubmitContactRequest = (options = {}) => (input) => (0, exports.submitContactRequest)(input, options);
51
+ exports.createSubmitContactRequest = createSubmitContactRequest;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hlbHBlcnMvY29udGFjdC1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLCtDQUtzQjtBQUV0QixNQUFNLHdCQUF3QixHQUFHLHlCQUF5QixDQUFBO0FBRTFELE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBaUIsRUFBRSxFQUFFLENBQzVDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUE7QUFZMUQsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQ3ZDLEtBQWdDLEVBQ2hDLFVBQXVDLEVBQUUsRUFDRixFQUFFO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEQsTUFBTSxPQUFPLEdBQUc7UUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1FBQ3RCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07S0FDckIsQ0FBQTtJQUVELE1BQU0sYUFBYSxHQUFHLElBQUEsOEJBQWdCLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBQSwwQkFBWSxFQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUN4QyxNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUM3QixPQUFPO1NBQ1IsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtRQUNuRSxDQUFDO1FBRUQsT0FBTyxHQUFtQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUE7SUFDdkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FDYiw0RUFBNEUsQ0FDN0UsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUEsOEJBQWdCLEVBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFBO0lBQzdELE1BQU0sT0FBTyxHQUFHLElBQUEsMEJBQVksRUFBQyxPQUFPLENBQUMsQ0FBQTtJQUVyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFO1FBQ2hELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTztRQUNQLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztLQUM5QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQ2IsSUFBSSxJQUFJLDRDQUE0QyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQ3ZFLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDbEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsT0FBTyxJQUFvQyxDQUFBO0FBQzdDLENBQUMsQ0FBQTtBQXpEWSxRQUFBLG9CQUFvQix3QkF5RGhDO0FBRU0sTUFBTSwwQkFBMEIsR0FDckMsQ0FBQyxVQUF1QyxFQUFFLEVBQUUsRUFBRSxDQUM5QyxDQUFDLEtBQWdDLEVBQUUsRUFBRSxDQUNuQyxJQUFBLDRCQUFvQixFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUgzQixRQUFBLDBCQUEwQiw4QkFHQyJ9
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createUpsertContactSubscription = exports.upsertContactSubscription = void 0;
3
+ exports.createSubmitContactRequest = exports.submitContactRequest = exports.createUpsertContactSubscription = exports.upsertContactSubscription = void 0;
4
4
  var contact_subscription_1 = require("./contact-subscription");
5
5
  Object.defineProperty(exports, "upsertContactSubscription", { enumerable: true, get: function () { return contact_subscription_1.upsertContactSubscription; } });
6
6
  Object.defineProperty(exports, "createUpsertContactSubscription", { enumerable: true, get: function () { return contact_subscription_1.createUpsertContactSubscription; } });
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFHK0I7QUFGN0IsaUlBQUEseUJBQXlCLE9BQUE7QUFDekIsdUlBQUEsK0JBQStCLE9BQUEifQ==
7
+ var contact_request_1 = require("./contact-request");
8
+ Object.defineProperty(exports, "submitContactRequest", { enumerable: true, get: function () { return contact_request_1.submitContactRequest; } });
9
+ Object.defineProperty(exports, "createSubmitContactRequest", { enumerable: true, get: function () { return contact_request_1.createSubmitContactRequest; } });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFHK0I7QUFGN0IsaUlBQUEseUJBQXlCLE9BQUE7QUFDekIsdUlBQUEsK0JBQStCLE9BQUE7QUFFakMscURBRzBCO0FBRnhCLHVIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLDZIQUFBLDBCQUEwQixPQUFBIn0=
@@ -17,14 +17,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.ContactSubscriptionModuleService = exports.ContactSubscriptionModule = exports.CONTACT_SUBSCRIPTION_MODULE = void 0;
20
+ exports.ContactRequestModuleService = exports.ContactRequestModule = exports.ContactSubscriptionModuleService = exports.ContactSubscriptionModule = exports.CONTACT_REQUEST_MODULE = exports.CONTACT_SUBSCRIPTION_MODULE = void 0;
21
21
  // Export module constants for backward compatibility
22
22
  var contact_subscriptions_1 = require("./modules/contact-subscriptions");
23
23
  Object.defineProperty(exports, "CONTACT_SUBSCRIPTION_MODULE", { enumerable: true, get: function () { return contact_subscriptions_1.CONTACT_SUBSCRIPTION_MODULE; } });
24
+ var contact_requests_1 = require("./modules/contact-requests");
25
+ Object.defineProperty(exports, "CONTACT_REQUEST_MODULE", { enumerable: true, get: function () { return contact_requests_1.CONTACT_REQUEST_MODULE; } });
24
26
  __exportStar(require("./helpers/contact-subscription"), exports);
27
+ __exportStar(require("./helpers/contact-request"), exports);
25
28
  __exportStar(require("./types"), exports);
29
+ __exportStar(require("./types/contact-request"), exports);
26
30
  var contact_subscriptions_2 = require("./modules/contact-subscriptions");
27
31
  Object.defineProperty(exports, "ContactSubscriptionModule", { enumerable: true, get: function () { return __importDefault(contact_subscriptions_2).default; } });
28
32
  var contact_subscriptions_3 = require("./modules/contact-subscriptions");
29
33
  Object.defineProperty(exports, "ContactSubscriptionModuleService", { enumerable: true, get: function () { return contact_subscriptions_3.ContactSubscriptionModuleService; } });
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUQ7QUFDckQseUVBQTZFO0FBQXBFLG9JQUFBLDJCQUEyQixPQUFBO0FBRXBDLGlFQUE4QztBQUM5QywwQ0FBdUI7QUFDdkIseUVBRXdDO0FBRHRDLG1KQUFBLE9BQU8sT0FBNkI7QUFFdEMseUVBQWtGO0FBQXpFLHlJQUFBLGdDQUFnQyxPQUFBIn0=
34
+ var contact_requests_2 = require("./modules/contact-requests");
35
+ Object.defineProperty(exports, "ContactRequestModule", { enumerable: true, get: function () { return __importDefault(contact_requests_2).default; } });
36
+ var contact_requests_3 = require("./modules/contact-requests");
37
+ Object.defineProperty(exports, "ContactRequestModuleService", { enumerable: true, get: function () { return contact_requests_3.ContactRequestModuleService; } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUQ7QUFDckQseUVBQTZFO0FBQXBFLG9JQUFBLDJCQUEyQixPQUFBO0FBQ3BDLCtEQUFtRTtBQUExRCwwSEFBQSxzQkFBc0IsT0FBQTtBQUUvQixpRUFBOEM7QUFDOUMsNERBQXlDO0FBQ3pDLDBDQUF1QjtBQUN2QiwwREFBdUM7QUFDdkMseUVBRXdDO0FBRHRDLG1KQUFBLE9BQU8sT0FBNkI7QUFFdEMseUVBQWtGO0FBQXpFLHlJQUFBLGdDQUFnQyxPQUFBO0FBQ3pDLCtEQUVtQztBQURqQyx5SUFBQSxPQUFPLE9BQXdCO0FBRWpDLCtEQUF3RTtBQUEvRCwrSEFBQSwyQkFBMkIsT0FBQSJ9
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ContactRequestModuleService = exports.CONTACT_REQUEST_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.ContactRequestModuleService = service_1.default;
10
+ exports.CONTACT_REQUEST_MODULE = "contact_requests";
11
+ exports.default = (0, utils_1.Module)(exports.CONTACT_REQUEST_MODULE, {
12
+ service: service_1.default,
13
+ });
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jb250YWN0LXJlcXVlc3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFrRDtBQUNsRCx3REFBbUQ7QUFRMUMsc0NBUkYsaUJBQTJCLENBUUU7QUFOdkIsUUFBQSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQTtBQUV4RCxrQkFBZSxJQUFBLGNBQU0sRUFBQyw4QkFBc0IsRUFBRTtJQUM1QyxPQUFPLEVBQUUsaUJBQTJCO0NBQ3JDLENBQUMsQ0FBQSJ9
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20241129163317 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20241129163317 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`
8
+ CREATE TABLE IF NOT EXISTS "contact_request" (
9
+ "id" text PRIMARY KEY,
10
+ "email" text NOT NULL,
11
+ "payload" jsonb NULL,
12
+ "status" text NOT NULL,
13
+ "status_history" jsonb NULL,
14
+ "metadata" jsonb NULL,
15
+ "source" text NULL,
16
+ "created_at" timestamptz NOT NULL DEFAULT now(),
17
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
18
+ "deleted_at" timestamptz NULL
19
+ );
20
+ `);
21
+ this.addSql(`
22
+ CREATE INDEX IF NOT EXISTS "IDX_contact_request_email"
23
+ ON "contact_request" ("email");
24
+ `);
25
+ this.addSql(`
26
+ CREATE INDEX IF NOT EXISTS "IDX_contact_request_status"
27
+ ON "contact_request" ("status");
28
+ `);
29
+ this.addSql(`
30
+ CREATE INDEX IF NOT EXISTS "IDX_contact_request_source"
31
+ ON "contact_request" ("source");
32
+ `);
33
+ this.addSql(`
34
+ CREATE INDEX IF NOT EXISTS "IDX_contact_request_created_at"
35
+ ON "contact_request" ("created_at");
36
+ `);
37
+ this.addSql(`
38
+ CREATE INDEX IF NOT EXISTS "IDX_contact_request_deleted_at"
39
+ ON "contact_request" ("deleted_at");
40
+ `);
41
+ }
42
+ async down() {
43
+ this.addSql(`DROP TABLE IF EXISTS "contact_request";`);
44
+ }
45
+ }
46
+ exports.Migration20241129163317 = Migration20241129163317;
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNDExMjkxNjMzMTcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jb250YWN0LXJlcXVlc3RzL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNDExMjkxNjMzMTcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQWlEO0FBRWpELE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDcEQsS0FBSyxDQUFDLEVBQUU7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0tBYVgsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO0lBQ3hELENBQUM7Q0FDRjtBQTlDRCwwREE4Q0MifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContactRequest = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ exports.ContactRequest = utils_1.model.define("contact_request", {
6
+ id: utils_1.model.id().primaryKey(),
7
+ email: utils_1.model.text().searchable(),
8
+ payload: utils_1.model.json().nullable(),
9
+ status: utils_1.model.text().searchable(),
10
+ status_history: utils_1.model.json().nullable(),
11
+ metadata: utils_1.model.json().nullable(),
12
+ source: utils_1.model.text().nullable(),
13
+ });
14
+ exports.default = exports.ContactRequest;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY29udGFjdC1yZXF1ZXN0cy9tb2RlbHMvY29udGFjdC1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFpRDtBQUVwQyxRQUFBLGNBQWMsR0FBRyxhQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFO0lBQzVELEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQ2hDLE9BQU8sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQ2pDLGNBQWMsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2pDLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2hDLENBQUMsQ0FBQTtBQUVGLGtCQUFlLHNCQUFjLENBQUEifQ==
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const index_1 = require("./index");
5
+ const contact_request_1 = require("./models/contact-request");
6
+ const resolve_options_1 = require("./utils/resolve-options");
7
+ class ContactRequestModuleService extends (0, utils_1.MedusaService)({
8
+ ContactRequest: contact_request_1.ContactRequest,
9
+ }) {
10
+ constructor(container, moduleOptions, moduleDeclaration) {
11
+ super(container, moduleOptions, moduleDeclaration);
12
+ this.manager_ = container.manager;
13
+ const resolvedOptions = moduleDeclaration?.options ?? moduleOptions ?? {};
14
+ this.options_ = (0, resolve_options_1.resolveContactUsOptions)(resolvedOptions);
15
+ }
16
+ get moduleKey() {
17
+ return index_1.CONTACT_REQUEST_MODULE;
18
+ }
19
+ getOptions() {
20
+ return this.options_;
21
+ }
22
+ getNextAllowedStatuses(currentStatus) {
23
+ return (0, resolve_options_1.getNextAllowedStatuses)(currentStatus, this.options_.status_transitions);
24
+ }
25
+ getStatusTransition(from, to) {
26
+ return (0, resolve_options_1.getStatusTransition)(from, to, this.options_.status_transitions);
27
+ }
28
+ normalizeContactRequest(raw) {
29
+ if (!raw ||
30
+ typeof raw !== "object" ||
31
+ !("id" in raw) ||
32
+ !("email" in raw) ||
33
+ !("status" in raw)) {
34
+ throw new Error("Invalid contact request data");
35
+ }
36
+ const request = raw;
37
+ return {
38
+ id: request.id,
39
+ email: request.email,
40
+ payload: request.payload && typeof request.payload === "object"
41
+ ? request.payload
42
+ : null,
43
+ status: request.status,
44
+ status_history: request.status_history && Array.isArray(request.status_history)
45
+ ? request.status_history
46
+ : null,
47
+ metadata: request.metadata && typeof request.metadata === "object"
48
+ ? request.metadata
49
+ : null,
50
+ source: request.source ?? null,
51
+ created_at: new Date(request.created_at ?? new Date()),
52
+ updated_at: new Date(request.updated_at ?? new Date()),
53
+ deleted_at: request.deleted_at ? new Date(request.deleted_at) : null,
54
+ };
55
+ }
56
+ validatePayload(payload, fields) {
57
+ if (!payload || Object.keys(payload).length === 0) {
58
+ return;
59
+ }
60
+ for (const field of fields) {
61
+ if (field.required && !(field.key in payload)) {
62
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' is required`);
63
+ }
64
+ const value = payload[field.key];
65
+ if (value === undefined || value === null) {
66
+ continue;
67
+ }
68
+ // Type validation
69
+ switch (field.type) {
70
+ case "number":
71
+ if (typeof value !== "number") {
72
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be a number`);
73
+ }
74
+ if (field.validation) {
75
+ if (field.validation.min !== undefined &&
76
+ value < field.validation.min) {
77
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be at least ${field.validation.min}`);
78
+ }
79
+ if (field.validation.max !== undefined &&
80
+ value > field.validation.max) {
81
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be at most ${field.validation.max}`);
82
+ }
83
+ }
84
+ break;
85
+ case "email":
86
+ if (typeof value !== "string" || !value.includes("@")) {
87
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be a valid email`);
88
+ }
89
+ break;
90
+ case "text":
91
+ case "textarea":
92
+ if (typeof value !== "string") {
93
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be a string`);
94
+ }
95
+ break;
96
+ case "checkbox":
97
+ if (typeof value !== "boolean") {
98
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be a boolean`);
99
+ }
100
+ break;
101
+ case "select":
102
+ if (typeof value !== "string") {
103
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be a string`);
104
+ }
105
+ if (field.options) {
106
+ const validValues = field.options.map((opt) => opt.value);
107
+ if (!validValues.includes(value)) {
108
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Field '${field.key}' must be one of: ${validValues.join(", ")}`);
109
+ }
110
+ }
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ async createRequest(input) {
116
+ // Validate email
117
+ if (!input.email || typeof input.email !== "string") {
118
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
119
+ }
120
+ const email = input.email.trim().toLowerCase();
121
+ if (!email.includes("@")) {
122
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email must be a valid email address");
123
+ }
124
+ // Validate payload against configured fields
125
+ if (input.payload) {
126
+ this.validatePayload(input.payload, this.options_.payload_fields);
127
+ }
128
+ const status = this.options_.default_status;
129
+ const statusHistory = [
130
+ {
131
+ from: null,
132
+ to: status,
133
+ changed_at: new Date(),
134
+ },
135
+ ];
136
+ const created = await this.createContactRequests({
137
+ email,
138
+ payload: input.payload ?? null,
139
+ status,
140
+ status_history: statusHistory,
141
+ metadata: input.metadata ?? null,
142
+ source: input.source ?? "storefront",
143
+ });
144
+ return this.normalizeContactRequest(created);
145
+ }
146
+ async updateStatus(input) {
147
+ const existing = await this.retrieveContactRequest(input.id);
148
+ if (!existing) {
149
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Contact request with id ${input.id} not found`);
150
+ }
151
+ const currentStatus = this.normalizeContactRequest(existing).status;
152
+ // Validate transition
153
+ const transition = this.getStatusTransition(currentStatus, input.status);
154
+ if (!transition) {
155
+ const allowedStatuses = this.getNextAllowedStatuses(currentStatus);
156
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid status transition from '${currentStatus}' to '${input.status}'. Allowed next statuses: ${allowedStatuses.join(", ")}`);
157
+ }
158
+ // Validate that target status is in allowed statuses
159
+ if (!this.options_.allowed_statuses.includes(input.status)) {
160
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Status '${input.status}' is not in allowed statuses`);
161
+ }
162
+ // Update status history
163
+ const existingHistory = (this.normalizeContactRequest(existing).status_history ?? []);
164
+ const newHistoryEntry = {
165
+ from: currentStatus,
166
+ to: input.status,
167
+ changed_at: new Date(),
168
+ changed_by: input.changed_by,
169
+ };
170
+ const updatedHistory = [...existingHistory, newHistoryEntry];
171
+ await this.updateContactRequests({
172
+ selector: { id: input.id },
173
+ data: {
174
+ status: input.status,
175
+ status_history: updatedHistory,
176
+ },
177
+ });
178
+ const updated = await this.retrieveContactRequest(input.id);
179
+ return this.normalizeContactRequest(updated);
180
+ }
181
+ async listRequests(selector = {}, config) {
182
+ const query = {};
183
+ // Handle both ContactRequestListInput and direct query format
184
+ if ("email" in selector && selector.email) {
185
+ if (typeof selector.email === "string") {
186
+ query.email = { $ilike: `%${selector.email}%` };
187
+ }
188
+ else if (typeof selector.email === "object" && "$ilike" in selector.email) {
189
+ query.email = selector.email;
190
+ }
191
+ }
192
+ if ("status" in selector && selector.status) {
193
+ query.status = selector.status;
194
+ }
195
+ if ("source" in selector && selector.source) {
196
+ query.source = selector.source;
197
+ }
198
+ if ("created_at" in selector && selector.created_at) {
199
+ if (typeof selector.created_at === "object") {
200
+ const dateQuery = {};
201
+ if ("gte" in selector.created_at && selector.created_at.gte) {
202
+ dateQuery.$gte = selector.created_at.gte;
203
+ }
204
+ if ("lte" in selector.created_at && selector.created_at.lte) {
205
+ dateQuery.$lte = selector.created_at.lte;
206
+ }
207
+ if ("$gte" in selector.created_at) {
208
+ dateQuery.$gte = selector.created_at.$gte;
209
+ }
210
+ if ("$lte" in selector.created_at) {
211
+ dateQuery.$lte = selector.created_at.$lte;
212
+ }
213
+ if (Object.keys(dateQuery).length > 0) {
214
+ query.created_at = dateQuery;
215
+ }
216
+ else {
217
+ query.created_at = selector.created_at;
218
+ }
219
+ }
220
+ }
221
+ const [requests, count] = await this.listAndCountContactRequests(query, config);
222
+ return [
223
+ requests.map((request) => this.normalizeContactRequest(request)),
224
+ count,
225
+ ];
226
+ }
227
+ async getRequest(id) {
228
+ const request = await this.retrieveContactRequest(id);
229
+ if (!request) {
230
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Contact request with id ${id} not found`);
231
+ }
232
+ return this.normalizeContactRequest(request);
233
+ }
234
+ }
235
+ exports.default = ContactRequestModuleService;
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NvbnRhY3QtcmVxdWVzdHMvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFzRTtBQUV0RSxtQ0FBZ0Q7QUFPaEQsOERBQXlEO0FBQ3pELDZEQUtnQztBQVdoQyxNQUFxQiwyQkFBNEIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDckUsY0FBYyxFQUFkLGdDQUFjO0NBQ2YsQ0FBQztJQUlBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBc0MsRUFDdEMsaUJBQXdEO1FBRXhELEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7UUFFbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFBO1FBRWpDLE1BQU0sZUFBZSxHQUNuQixpQkFBaUIsRUFBRSxPQUFPLElBQUksYUFBYSxJQUFJLEVBQUUsQ0FBQTtRQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEseUNBQXVCLEVBQUMsZUFBZSxDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sOEJBQXNCLENBQUE7SUFDL0IsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDdEIsQ0FBQztJQUVELHNCQUFzQixDQUFDLGFBQXFCO1FBQzFDLE9BQU8sSUFBQSx3Q0FBc0IsRUFDM0IsYUFBYSxFQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQ2pDLENBQUE7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLElBQW1CLEVBQ25CLEVBQVU7UUFFVixPQUFPLElBQUEscUNBQW1CLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVTLHVCQUF1QixDQUFDLEdBQVk7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