Loading http-bridge/controllers/generalControllers.js +28 −16 Original line number Diff line number Diff line Loading @@ -55,9 +55,8 @@ const fetchEntities = async (type, attrs, fetcher, additionalParams, res) => { } const apiResponse = await fetcher(type, measurementTypes, additionalParams); if (!apiResponse || apiResponse.data.length === 0) { return res.status(500).json({ error: "Failed to retrieve data from API." }); return res.status(500).json({ error: "Failed to retrieve data from API. See http-bridge logs for info." }); } const ngsiData = NGSITranslator.toNGSI(apiResponse.data, type); Loading @@ -83,14 +82,14 @@ const fetchTemporalData = async (type, measurementTypes, params) => { const response = await axios.get(`${process.env.API_URL}/device_measurement`, { params: { measurement_type: `in.(${measurementTypes.join(",")})`, ts: params.time, // TODO: Implement proper time handling according to postgres timestamp format limit: params.limit, ts: params.ts, // Pass as an array to avoid encoding issues limit: params.limit || 100, } }); return response; } catch (error) { console.error("Error fetching temporal data:", error.message); console.error(`Error fetching temporal data: ${JSON.stringify(error.response.data)}\npath: ${error.request.path}`); return { data: [] }; } Loading Loading @@ -120,7 +119,7 @@ const fetchRealTimeData = async (type, measurementTypes, params) => { return response; } catch (error) { console.error("Error fetching real-time data:", error.message); console.error(`Error fetching temporal data: ${JSON.stringify(error.response.data)}\npath: ${error.request.path}`); return { data: [] }; } Loading @@ -141,20 +140,33 @@ const fetchRealTimeData = async (type, measurementTypes, params) => { */ const getTemporalEntities = async (req, res) => { console.log("Incoming temporal request:", req.query); const { type, timerel, time, endTime, attrs, limit } = req.query; let { type, timerel, time, endTime, attrs, limit } = req.query; let tsParams = []; switch (timerel) { case "after": tsParams.push(`gte.${time}`); break; let adjustedEndTime = endTime; const now = new Date().toISOString(); case "before": const adjustedStartTime = new Date(new Date(time).setDate(new Date(time).getDate() - 30)).toISOString(); tsParams.push(`gte.${adjustedStartTime}`, `lt.${time}`); break; // TODO: Implement "between" timerel and fix temporal queries not working at all. if (timerel === "after") { adjustedEndTime = now; } else if (timerel === "before") { adjustedEndTime = time; time = new Date(new Date(adjustedEndTime).setDate(new Date(adjustedEndTime).getDate() - 30)).toISOString(); case "between": if (!endTime) { return res.status(400).json({ error: "endTime is required for 'between' queries" }); } tsParams.push(`gte.${time}`, `lt.${endTime}`); break; default: return res.status(400).json({ error: "Invalid timerel value" }); } await fetchEntities(type, attrs, fetchTemporalData, { time, endTime: adjustedEndTime, limit }, res); // console.log("Final timestamp:", finalTimestamp); await fetchEntities(type, attrs, fetchTemporalData, { ts: tsParams, limit }, res); }; /** Loading Loading
http-bridge/controllers/generalControllers.js +28 −16 Original line number Diff line number Diff line Loading @@ -55,9 +55,8 @@ const fetchEntities = async (type, attrs, fetcher, additionalParams, res) => { } const apiResponse = await fetcher(type, measurementTypes, additionalParams); if (!apiResponse || apiResponse.data.length === 0) { return res.status(500).json({ error: "Failed to retrieve data from API." }); return res.status(500).json({ error: "Failed to retrieve data from API. See http-bridge logs for info." }); } const ngsiData = NGSITranslator.toNGSI(apiResponse.data, type); Loading @@ -83,14 +82,14 @@ const fetchTemporalData = async (type, measurementTypes, params) => { const response = await axios.get(`${process.env.API_URL}/device_measurement`, { params: { measurement_type: `in.(${measurementTypes.join(",")})`, ts: params.time, // TODO: Implement proper time handling according to postgres timestamp format limit: params.limit, ts: params.ts, // Pass as an array to avoid encoding issues limit: params.limit || 100, } }); return response; } catch (error) { console.error("Error fetching temporal data:", error.message); console.error(`Error fetching temporal data: ${JSON.stringify(error.response.data)}\npath: ${error.request.path}`); return { data: [] }; } Loading Loading @@ -120,7 +119,7 @@ const fetchRealTimeData = async (type, measurementTypes, params) => { return response; } catch (error) { console.error("Error fetching real-time data:", error.message); console.error(`Error fetching temporal data: ${JSON.stringify(error.response.data)}\npath: ${error.request.path}`); return { data: [] }; } Loading @@ -141,20 +140,33 @@ const fetchRealTimeData = async (type, measurementTypes, params) => { */ const getTemporalEntities = async (req, res) => { console.log("Incoming temporal request:", req.query); const { type, timerel, time, endTime, attrs, limit } = req.query; let { type, timerel, time, endTime, attrs, limit } = req.query; let tsParams = []; switch (timerel) { case "after": tsParams.push(`gte.${time}`); break; let adjustedEndTime = endTime; const now = new Date().toISOString(); case "before": const adjustedStartTime = new Date(new Date(time).setDate(new Date(time).getDate() - 30)).toISOString(); tsParams.push(`gte.${adjustedStartTime}`, `lt.${time}`); break; // TODO: Implement "between" timerel and fix temporal queries not working at all. if (timerel === "after") { adjustedEndTime = now; } else if (timerel === "before") { adjustedEndTime = time; time = new Date(new Date(adjustedEndTime).setDate(new Date(adjustedEndTime).getDate() - 30)).toISOString(); case "between": if (!endTime) { return res.status(400).json({ error: "endTime is required for 'between' queries" }); } tsParams.push(`gte.${time}`, `lt.${endTime}`); break; default: return res.status(400).json({ error: "Invalid timerel value" }); } await fetchEntities(type, attrs, fetchTemporalData, { time, endTime: adjustedEndTime, limit }, res); // console.log("Final timestamp:", finalTimestamp); await fetchEntities(type, attrs, fetchTemporalData, { ts: tsParams, limit }, res); }; /** Loading