medusajs-documents-plugin 1.1.13 → 1.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +53 -29
- package/.medusa/server/src/admin/index.mjs +54 -30
- package/.medusa/server/src/api/admin/documents/[id]/sync-zoho/route.js +21 -4
- package/.medusa/server/src/api/admin/documents/custom/route.js +6 -4
- package/.medusa/server/src/api/admin/documents/manual/route.js +6 -4
- package/.medusa/server/src/api/admin/documents/templates/preview/route.js +1 -1
- package/.medusa/server/src/api/admin/documents/zoho/list/route.js +18 -7
- package/.medusa/server/src/api/api/store/documents/r/[code]/route.js +3 -42
- package/.medusa/server/src/api/documents/r/[code]/route.js +3 -37
- package/.medusa/server/src/api/documents/templates/preview/route.js +1 -1
- package/.medusa/server/src/api/r/[code]/route.js +3 -55
- package/.medusa/server/src/api/store/documents/r/[code]/route.js +4 -31
- package/.medusa/server/src/modules/documents/service.js +23 -7
- package/.medusa/server/src/services/notification-sender.js +5 -5
- package/.medusa/server/src/services/pdfkit-generator.js +58 -20
- package/.medusa/server/src/services/zoho-books.js +6 -4
- package/.medusa/server/src/subscribers/order-documents.js +17 -6
- package/.medusa/server/src/subscribers/repair-documents.js +45 -7
- package/.medusa/server/src/utils/shortlink-resolver.js +168 -0
- package/CHANGELOG.md +39 -0
- package/package.json +1 -1
|
@@ -6,26 +6,28 @@ const documents_1 = require("../../../../modules/documents");
|
|
|
6
6
|
async function POST(req, res) {
|
|
7
7
|
try {
|
|
8
8
|
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE);
|
|
9
|
-
const { display_id, title, type = "invoice", customer, items = [], currency_code = "
|
|
9
|
+
const { display_id, title, type = "invoice", customer, items = [], currency_code = "kes", notes, terms, force_source, auto_send = false, send_email_now = false, notification_channels, email_subject, custom_email_message, } = req.body || {};
|
|
10
10
|
let total = 0;
|
|
11
11
|
for (const item of items) {
|
|
12
12
|
const qty = Number(item.quantity || 1);
|
|
13
13
|
const rate = Number(item.unit_price || 0);
|
|
14
14
|
total += qty * rate;
|
|
15
15
|
}
|
|
16
|
+
const companyName = customer?.company_name || req.body?.company_name;
|
|
16
17
|
const result = await documentService.generateDocument({
|
|
17
18
|
display_id,
|
|
18
19
|
title: title || (type === "invoice" ? "Tax Invoice" : "Quotation"),
|
|
19
20
|
type: type,
|
|
20
21
|
customer: {
|
|
21
|
-
name: customer?.name || "Customer",
|
|
22
|
+
name: companyName || customer?.name || "Customer",
|
|
23
|
+
company_name: companyName || undefined,
|
|
22
24
|
email: customer?.email,
|
|
23
25
|
phone: customer?.phone,
|
|
24
26
|
address: customer?.address,
|
|
25
27
|
},
|
|
26
28
|
items,
|
|
27
29
|
total,
|
|
28
|
-
currency_code,
|
|
30
|
+
currency_code: currency_code || "kes",
|
|
29
31
|
notes,
|
|
30
32
|
force_source,
|
|
31
33
|
auto_send: auto_send || send_email_now,
|
|
@@ -43,4 +45,4 @@ async function POST(req, res) {
|
|
|
43
45
|
return res.status(500).json({ message: err.message, success: false });
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy9tYW51YWwvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxvQkErREM7QUFuRUQsNkRBQWlFO0FBR2pFLCtCQUErQjtBQUN4QixLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQXVCLEVBQUUsR0FBbUI7SUFDckUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUFnQixDQUFDLENBQUM7UUFFbkYsTUFBTSxFQUNKLFVBQVUsRUFDVixLQUFLLEVBQ0wsSUFBSSxHQUFHLFNBQVMsRUFDaEIsUUFBUSxFQUNSLEtBQUssR0FBRyxFQUFFLEVBQ1YsYUFBYSxHQUFHLEtBQUssRUFDckIsS0FBSyxFQUNMLEtBQUssRUFDTCxZQUFZLEVBQ1osU0FBUyxHQUFHLEtBQUssRUFDakIsY0FBYyxHQUFHLEtBQUssRUFDdEIscUJBQXFCLEVBQ3JCLGFBQWEsRUFDYixvQkFBb0IsR0FDckIsR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVuQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFDLEtBQUssSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxRQUFRLEVBQUUsWUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO1FBRXJFLE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLGdCQUFnQixDQUNuRDtZQUNFLFVBQVU7WUFDVixLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDbEUsSUFBSSxFQUFFLElBQVc7WUFDakIsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxXQUFXLElBQUksUUFBUSxFQUFFLElBQUksSUFBSSxVQUFVO2dCQUNqRCxZQUFZLEVBQUUsV0FBVyxJQUFJLFNBQVM7Z0JBQ3RDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSztnQkFDdEIsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLO2dCQUN0QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU87YUFDM0I7WUFDRCxLQUFLO1lBQ0wsS0FBSztZQUNMLGFBQWEsRUFBRSxhQUFhLElBQUksS0FBSztZQUNyQyxLQUFLO1lBQ0wsWUFBWTtZQUNaLFNBQVMsRUFBRSxTQUFTLElBQUksY0FBYztZQUN0QyxxQkFBcUI7WUFDckIsYUFBYTtZQUNiLG9CQUFvQjtTQUNyQixFQUNELEdBQUcsQ0FBQyxLQUFLLENBQ1YsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTTtZQUN2QixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxtREFBbUQsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckcsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -115,7 +115,7 @@ async function GET(req, res) {
|
|
|
115
115
|
tax_total: (isJobCard || isPackingSlip || isCustom) ? undefined : 24.9,
|
|
116
116
|
discount_total: (isJobCard || isPackingSlip || isCustom) ? undefined : 10.0,
|
|
117
117
|
total: (isJobCard || isPackingSlip || isCustom) ? 0 : 263.9,
|
|
118
|
-
currency_code: "
|
|
118
|
+
currency_code: "kes",
|
|
119
119
|
payment_status: isReceipt ? "paid" : "unpaid",
|
|
120
120
|
payment_link: (type === "invoice" || isEstimate) ? "https://store.urbandevicecare.co.uk/pay/sample-preview-token" : undefined,
|
|
121
121
|
qr_url: (type === "invoice" || isEstimate || isJobCard) ? "https://store.urbandevicecare.co.uk/track/JOB-1042" : undefined,
|
|
@@ -5,9 +5,17 @@ const documents_1 = require("../../../../../modules/documents");
|
|
|
5
5
|
const zoho_books_1 = require("../../../../../services/zoho-books");
|
|
6
6
|
// GET /admin/documents/zoho/list?type=invoices | estimates | payments
|
|
7
7
|
async function GET(req, res) {
|
|
8
|
-
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE);
|
|
8
|
+
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE, { allowUnregistered: true });
|
|
9
|
+
if (!documentService) {
|
|
10
|
+
return res.json({
|
|
11
|
+
enabled: false,
|
|
12
|
+
message: "Documents service unavailable.",
|
|
13
|
+
items: [],
|
|
14
|
+
});
|
|
15
|
+
}
|
|
9
16
|
const settings = await documentService.getSettings();
|
|
10
|
-
|
|
17
|
+
const hasCredentials = Boolean(settings.zoho_client_id && settings.zoho_client_secret);
|
|
18
|
+
if (!settings.zoho_books_enabled && !hasCredentials) {
|
|
11
19
|
return res.json({
|
|
12
20
|
enabled: false,
|
|
13
21
|
message: "Zoho Books integration is not configured or disabled.",
|
|
@@ -21,7 +29,7 @@ async function GET(req, res) {
|
|
|
21
29
|
refresh_token: settings.zoho_refresh_token,
|
|
22
30
|
organization_id: settings.zoho_organization_id,
|
|
23
31
|
domain: settings.zoho_domain || "com",
|
|
24
|
-
}, req.scope.resolve("logger"));
|
|
32
|
+
}, req.scope.resolve("logger", { allowUnregistered: true }));
|
|
25
33
|
const type = req.query.type || "invoices";
|
|
26
34
|
let items = [];
|
|
27
35
|
if (type === "estimates") {
|
|
@@ -33,19 +41,22 @@ async function GET(req, res) {
|
|
|
33
41
|
else {
|
|
34
42
|
items = await zoho.listInvoices();
|
|
35
43
|
}
|
|
36
|
-
res.json({
|
|
44
|
+
return res.json({
|
|
37
45
|
enabled: true,
|
|
38
46
|
type,
|
|
39
47
|
items,
|
|
40
48
|
});
|
|
41
49
|
}
|
|
42
50
|
catch (error) {
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
try {
|
|
52
|
+
req.scope.resolve("logger", { allowUnregistered: true })?.error?.(`[Documents-API] Failed to fetch Zoho documents: ${error.message}`);
|
|
53
|
+
}
|
|
54
|
+
catch (_) { }
|
|
55
|
+
return res.json({
|
|
45
56
|
enabled: true,
|
|
46
57
|
error: error.message,
|
|
47
58
|
items: [],
|
|
48
59
|
});
|
|
49
60
|
}
|
|
50
61
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy96b2hvL2xpc3Qvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxrQkEyREM7QUFoRUQsZ0VBQW9FO0FBRXBFLG1FQUFzRTtBQUV0RSxzRUFBc0U7QUFDL0QsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sZUFBZSxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw0QkFBZ0IsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEgsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLGdDQUFnQztZQUN6QyxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVyRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN2RixJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2QsT0FBTyxFQUFFLEtBQUs7WUFDZCxPQUFPLEVBQUUsdURBQXVEO1lBQ2hFLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksNkJBQWdCLENBQy9CO1lBQ0UsU0FBUyxFQUFFLFFBQVEsQ0FBQyxjQUFjO1lBQ2xDLGFBQWEsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1lBQzFDLGFBQWEsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1lBQzFDLGVBQWUsRUFBRSxRQUFRLENBQUMsb0JBQW9CO1lBQzlDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLEtBQUs7U0FDdEMsRUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUN6RCxDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFlLElBQUksVUFBVSxDQUFDO1FBQ3RELElBQUksS0FBSyxHQUFVLEVBQUUsQ0FBQztRQUV0QixJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN6QixLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckMsQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQy9CLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2QsT0FBTyxFQUFFLElBQUk7WUFDYixJQUFJO1lBQ0osS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQztZQUNILEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsbURBQW1ELEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hJLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQztRQUNkLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLE9BQU8sRUFBRSxJQUFJO1lBQ2IsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3BCLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -1,48 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
|
-
const
|
|
4
|
+
const shortlink_resolver_1 = require("../../../../../../utils/shortlink-resolver");
|
|
5
5
|
// GET /api/store/documents/r/:code (Compatibility proxy endpoint)
|
|
6
6
|
async function GET(req, res) {
|
|
7
|
-
|
|
8
|
-
try {
|
|
9
|
-
let links = [];
|
|
10
|
-
try {
|
|
11
|
-
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE, { allowUnregistered: true });
|
|
12
|
-
if (documentService) {
|
|
13
|
-
links = await documentService.listDocumentLinks({ shortcode: code });
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
catch (e) { }
|
|
17
|
-
if (!links || links.length === 0) {
|
|
18
|
-
try {
|
|
19
|
-
const repairModule = req.scope.resolve("repair", { allowUnregistered: true });
|
|
20
|
-
if (repairModule) {
|
|
21
|
-
links = await repairModule.listRepairLinks({ shortcode: code });
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
catch (e) { }
|
|
25
|
-
}
|
|
26
|
-
if (links && links.length > 0) {
|
|
27
|
-
let targetUrl = links[0].url;
|
|
28
|
-
const host = req.get("host") || "localhost:9000";
|
|
29
|
-
const forwarded = typeof req.get === "function" ? req.get("x-forwarded-proto") : undefined;
|
|
30
|
-
const protocol = (forwarded === "http" || forwarded === "https") ? forwarded : (req.protocol || "http");
|
|
31
|
-
if (targetUrl.includes("/documents/")) {
|
|
32
|
-
const docSubpath = targetUrl.slice(targetUrl.indexOf("/documents/")).replace(/\/admin\/documents\//, "/documents/");
|
|
33
|
-
targetUrl = `${protocol}://${host}${docSubpath}`;
|
|
34
|
-
}
|
|
35
|
-
else if (targetUrl.startsWith("/")) {
|
|
36
|
-
targetUrl = `${protocol}://${host}${targetUrl}`;
|
|
37
|
-
}
|
|
38
|
-
res.setHeader("Location", targetUrl);
|
|
39
|
-
return res.status(302).send("Redirecting...");
|
|
40
|
-
}
|
|
41
|
-
return res.status(404).send("Document link not found or expired.");
|
|
42
|
-
}
|
|
43
|
-
catch (err) {
|
|
44
|
-
req.scope.resolve("logger")?.error?.(`[Documents-API] Error resolving shortlink ${code}: ${err.message}`);
|
|
45
|
-
return res.status(500).send("Error resolving document link");
|
|
46
|
-
}
|
|
7
|
+
return (0, shortlink_resolver_1.handleShortlinkRedirect)(req, res, "API-Store-Documents-Shortlink");
|
|
47
8
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FwaS9zdG9yZS9kb2N1bWVudHMvci9bY29kZV0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxrQkFFQztBQUxELG1GQUFxRjtBQUVyRixrRUFBa0U7QUFDM0QsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFvQyxFQUFFLEdBQW1CO0lBQ2pGLE9BQU8sSUFBQSw0Q0FBdUIsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLCtCQUErQixDQUFDLENBQUM7QUFDNUUsQ0FBQyJ9
|
|
@@ -1,43 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
|
-
const
|
|
4
|
+
const shortlink_resolver_1 = require("../../../../utils/shortlink-resolver");
|
|
5
5
|
// GET /documents/r/:code (Public shortlink redirect - no publishable API key or admin auth required)
|
|
6
6
|
async function GET(req, res) {
|
|
7
|
-
|
|
8
|
-
try {
|
|
9
|
-
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE);
|
|
10
|
-
let links = await documentService.listDocumentLinks({ shortcode: code });
|
|
11
|
-
if (!links || links.length === 0) {
|
|
12
|
-
try {
|
|
13
|
-
const repairModule = req.scope.resolve("repair", { allowUnregistered: true });
|
|
14
|
-
if (repairModule) {
|
|
15
|
-
links = await repairModule.listRepairLinks({ shortcode: code });
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
catch (e) { }
|
|
19
|
-
}
|
|
20
|
-
if (links && links.length > 0) {
|
|
21
|
-
let targetUrl = links[0].url;
|
|
22
|
-
const host = req.get("host") || "localhost:9000";
|
|
23
|
-
const forwarded = typeof req.get === "function" ? req.get("x-forwarded-proto") : undefined;
|
|
24
|
-
const protocol = (forwarded === "http" || forwarded === "https") ? forwarded : (req.protocol || "http");
|
|
25
|
-
// Normalize any document path pointing to admin or legacy routes
|
|
26
|
-
if (targetUrl.includes("/documents/")) {
|
|
27
|
-
const docSubpath = targetUrl.slice(targetUrl.indexOf("/documents/")).replace(/\/admin\/documents\//, "/documents/");
|
|
28
|
-
targetUrl = `${protocol}://${host}${docSubpath}`;
|
|
29
|
-
}
|
|
30
|
-
else if (targetUrl.startsWith("/")) {
|
|
31
|
-
targetUrl = `${protocol}://${host}${targetUrl}`;
|
|
32
|
-
}
|
|
33
|
-
res.setHeader("Location", targetUrl);
|
|
34
|
-
return res.status(302).send("Redirecting...");
|
|
35
|
-
}
|
|
36
|
-
return res.status(404).send("Document link not found or expired.");
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
req.scope.resolve("logger")?.error(`[Documents-Public] Error resolving shortlink ${code}: ${err.message}`);
|
|
40
|
-
return res.status(500).send("Error resolving document link");
|
|
41
|
-
}
|
|
7
|
+
return (0, shortlink_resolver_1.handleShortlinkRedirect)(req, res, "Documents-Public");
|
|
42
8
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2RvY3VtZW50cy9yL1tjb2RlXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLGtCQUVDO0FBTEQsNkVBQStFO0FBRS9FLHFHQUFxRztBQUM5RixLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQW9DLEVBQUUsR0FBbUI7SUFDakYsT0FBTyxJQUFBLDRDQUF1QixFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUMvRCxDQUFDIn0=
|
|
@@ -115,7 +115,7 @@ async function GET(req, res) {
|
|
|
115
115
|
tax_total: (isJobCard || isPackingSlip || isCustom) ? undefined : 24.9,
|
|
116
116
|
discount_total: (isJobCard || isPackingSlip || isCustom) ? undefined : 10.0,
|
|
117
117
|
total: (isJobCard || isPackingSlip || isCustom) ? 0 : 263.9,
|
|
118
|
-
currency_code: "
|
|
118
|
+
currency_code: "kes",
|
|
119
119
|
payment_status: isReceipt ? "paid" : "unpaid",
|
|
120
120
|
payment_link: (type === "invoice" || isEstimate) ? "https://store.urbandevicecare.co.uk/pay/sample-preview-token" : undefined,
|
|
121
121
|
qr_url: (type === "invoice" || isEstimate || isJobCard) ? "https://store.urbandevicecare.co.uk/track/JOB-1042" : undefined,
|
|
@@ -1,61 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
|
-
const
|
|
5
|
-
const service_1 = require("../../../modules/documents/service");
|
|
4
|
+
const shortlink_resolver_1 = require("../../../utils/shortlink-resolver");
|
|
6
5
|
// GET /r/:code (Universal public shortlink redirect)
|
|
7
6
|
async function GET(req, res) {
|
|
8
|
-
|
|
9
|
-
try {
|
|
10
|
-
let links = [];
|
|
11
|
-
try {
|
|
12
|
-
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE, { allowUnregistered: true });
|
|
13
|
-
if (documentService) {
|
|
14
|
-
links = await documentService.listDocumentLinks({ shortcode: code });
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
catch (e) { }
|
|
18
|
-
if (!links || links.length === 0) {
|
|
19
|
-
try {
|
|
20
|
-
const repairModule = req.scope.resolve("repair", { allowUnregistered: true });
|
|
21
|
-
if (repairModule) {
|
|
22
|
-
links = await repairModule.listRepairLinks({ shortcode: code });
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
catch (e) { }
|
|
26
|
-
}
|
|
27
|
-
if (!links || links.length === 0) {
|
|
28
|
-
const pg = (0, service_1.getDatabaseConnection)(req.scope);
|
|
29
|
-
if (pg) {
|
|
30
|
-
const row = await pg("document_link").whereNull("deleted_at").where({ shortcode: code }).first();
|
|
31
|
-
if (row)
|
|
32
|
-
links = [row];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (links && links.length > 0) {
|
|
36
|
-
let targetUrl = links[0].url;
|
|
37
|
-
const host = req.get("host") || "localhost:9000";
|
|
38
|
-
const forwarded = typeof req.get === "function" ? req.get("x-forwarded-proto") : undefined;
|
|
39
|
-
const protocol = (forwarded === "http" || forwarded === "https") ? forwarded : (req.protocol || "http");
|
|
40
|
-
// Normalize any document path pointing to admin or legacy routes
|
|
41
|
-
if (targetUrl.includes("/documents/")) {
|
|
42
|
-
const docSubpath = targetUrl.slice(targetUrl.indexOf("/documents/")).replace(/\/admin\/documents\//, "/documents/");
|
|
43
|
-
targetUrl = `${protocol}://${host}${docSubpath}`;
|
|
44
|
-
}
|
|
45
|
-
else if (targetUrl.startsWith("/")) {
|
|
46
|
-
targetUrl = `${protocol}://${host}${targetUrl}`;
|
|
47
|
-
}
|
|
48
|
-
res.setHeader("Location", targetUrl);
|
|
49
|
-
return res.status(302).send("Redirecting...");
|
|
50
|
-
}
|
|
51
|
-
return res.status(404).send("Link not found or expired.");
|
|
52
|
-
}
|
|
53
|
-
catch (err) {
|
|
54
|
-
try {
|
|
55
|
-
req.scope.resolve("logger", { allowUnregistered: true })?.error?.(`[Shortlink-Public] Error resolving /r/${code}: ${err.message}`);
|
|
56
|
-
}
|
|
57
|
-
catch (_) { }
|
|
58
|
-
return res.status(500).send("Error resolving link");
|
|
59
|
-
}
|
|
7
|
+
return (0, shortlink_resolver_1.handleShortlinkRedirect)(req, res, "Shortlink-Public");
|
|
60
8
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3IvW2NvZGVdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsa0JBRUM7QUFMRCwwRUFBNEU7QUFFNUUscURBQXFEO0FBQzlDLEtBQUssVUFBVSxHQUFHLENBQUMsR0FBb0MsRUFBRSxHQUFtQjtJQUNqRixPQUFPLElBQUEsNENBQXVCLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQy9ELENBQUMifQ==
|
|
@@ -1,36 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
|
-
const
|
|
5
|
-
// GET /store/documents/r/:code
|
|
4
|
+
const shortlink_resolver_1 = require("../../../../../utils/shortlink-resolver");
|
|
5
|
+
// GET /store/documents/r/:code (Public storefront shortlink redirect)
|
|
6
6
|
async function GET(req, res) {
|
|
7
|
-
|
|
8
|
-
const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE);
|
|
9
|
-
let links = await documentService.listDocumentLinks({ shortcode: code });
|
|
10
|
-
if (!links || links.length === 0) {
|
|
11
|
-
try {
|
|
12
|
-
const repairModule = req.scope.resolve("repair", { allowUnregistered: true });
|
|
13
|
-
if (repairModule) {
|
|
14
|
-
links = await repairModule.listRepairLinks({ shortcode: code });
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
catch (e) { }
|
|
18
|
-
}
|
|
19
|
-
if (links && links.length > 0) {
|
|
20
|
-
let targetUrl = links[0].url;
|
|
21
|
-
const host = req.get("host") || "localhost:9000";
|
|
22
|
-
const forwarded = typeof req.get === "function" ? req.get("x-forwarded-proto") : undefined;
|
|
23
|
-
const protocol = (forwarded === "http" || forwarded === "https") ? forwarded : (req.protocol || "http");
|
|
24
|
-
if (targetUrl.includes("/documents/")) {
|
|
25
|
-
const docSubpath = targetUrl.slice(targetUrl.indexOf("/documents/")).replace(/\/admin\/documents\//, "/documents/");
|
|
26
|
-
targetUrl = `${protocol}://${host}${docSubpath}`;
|
|
27
|
-
}
|
|
28
|
-
else if (targetUrl.startsWith("/")) {
|
|
29
|
-
targetUrl = `${protocol}://${host}${targetUrl}`;
|
|
30
|
-
}
|
|
31
|
-
res.setHeader("Location", targetUrl);
|
|
32
|
-
return res.status(302).send("Redirecting...");
|
|
33
|
-
}
|
|
34
|
-
return res.status(404).send("Document link not found or expired.");
|
|
7
|
+
return (0, shortlink_resolver_1.handleShortlinkRedirect)(req, res, "Store-Documents-Shortlink");
|
|
35
8
|
}
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2RvY3VtZW50cy9yL1tjb2RlXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLGtCQUVDO0FBTEQsZ0ZBQWtGO0FBRWxGLHNFQUFzRTtBQUMvRCxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQW9DLEVBQUUsR0FBbUI7SUFDakYsT0FBTyxJQUFBLDRDQUF1QixFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDIn0=
|