/** * Thêm BACKEND_URL vào đường dẫn hình ảnh * @param {Object} data - Dữ liệu cần xử lý * @returns {Object} - Dữ liệu đã được xử lý với đường dẫn hình ảnh đầy đủ */ function addBaseUrlToImages(data, baseUrl) { // Use passed baseUrl, then env var, then default to localhost:3001 const BACKEND_URL = (baseUrl ?? process.env.BACKEND_URL ?? "http://localhost:3001").replace(/\/$/, ""); // Tạo bản sao sâu để tránh thay đổi dữ liệu gốc const processedData = JSON.parse(JSON.stringify(data)); // Hàm đệ quy để xử lý tất cả các URL hình ảnh trong đối tượng const processObject = (obj) => { if (!obj || typeof obj !== "object") return; if (Array.isArray(obj)) { obj.forEach((item, index) => { if (typeof item === "string" && (item.startsWith("/uploads/") || item.startsWith("/assets/img/"))) { if (!item.startsWith("http")) { obj[index] = `${BACKEND_URL}${item}`; } } else if (typeof item === "object") { processObject(item); } }); return; } Object.keys(obj).forEach((key) => { const value = obj[key]; if (typeof value === "string" && (value.startsWith("/uploads/") || value.startsWith("/assets/img/"))) { if (!value.startsWith("http")) { obj[key] = `${BACKEND_URL}${value}`; } } else if (value && typeof value === "object") { processObject(value); } }); }; processObject(processedData); return processedData; } /** * Tạo full URL cho ảnh từ đường dẫn tương đối - dùng cho EJS templates * @param {string} imagePath - Đường dẫn ảnh * @param {string} backendUrl - Backend URL (optional, sẽ lấy từ env nếu không có) * @returns {string} - Full URL của ảnh */ function getFullImageUrl(imagePath, backendUrl = null) { if (!imagePath) return ""; // Nếu đã là full URL thì return luôn if (imagePath.startsWith("http")) { return imagePath; } // Lấy backend URL const baseUrl = ( backendUrl || process.env.BACKEND_URL || "http://localhost:3001" ).replace(/\/$/, ""); // Xử lý đường dẫn let imgSrc = imagePath; if (!imgSrc.startsWith("/")) { imgSrc = "/" + imgSrc; } return baseUrl + imgSrc; } module.exports = { addBaseUrlToImages, getFullImageUrl, };