2025-07-25 22:16:08 +01:00
|
|
|
var express = require("express");
|
2022-09-13 05:04:17 -04:00
|
|
|
var router = express.Router();
|
2025-07-25 22:16:08 +01:00
|
|
|
var path = require("path");
|
|
|
|
|
const fetch = require("node-fetch");
|
|
|
|
|
const fs = require("fs");
|
|
|
|
|
const airportData = JSON.parse(
|
|
|
|
|
fs.readFileSync(path.join(__dirname, "../airportdata.json"), "utf8")
|
|
|
|
|
);
|
|
|
|
|
const db = require("../models");
|
|
|
|
|
const { create } = require("xmlbuilder2");
|
2022-09-13 05:04:17 -04:00
|
|
|
|
|
|
|
|
/* GET home page. */
|
2025-07-25 22:16:08 +01:00
|
|
|
router.get("/", function (req, res, next) {
|
|
|
|
|
res.sendFile(path.join(__dirname, "../views/index.html"));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Weather API route
|
|
|
|
|
router.get("/api/weather", async function (req, res) {
|
|
|
|
|
try {
|
|
|
|
|
// Replace with your actual API key and city
|
|
|
|
|
const apiKey = process.env.WEATHER_API_KEY;
|
|
|
|
|
const city = "Toronto";
|
|
|
|
|
const url = `http://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${city}&aqi=no`;
|
|
|
|
|
const response = await fetch(url);
|
|
|
|
|
if (!response.ok) throw new Error("Weather API error");
|
|
|
|
|
const data = await response.json();
|
|
|
|
|
const temp_c = data.current.temp_c;
|
|
|
|
|
const text = data.current.condition.text.toLowerCase();
|
|
|
|
|
let condition = "sunny";
|
|
|
|
|
if (text.includes("rain")) condition = "rain";
|
|
|
|
|
else if (text.includes("snow")) condition = "snow";
|
|
|
|
|
res.json({ temp_c, condition });
|
|
|
|
|
} catch (err) {
|
|
|
|
|
res.status(500).json({ error: "Failed to fetch weather" });
|
|
|
|
|
console.error(err);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// UTC time API route
|
|
|
|
|
router.get("/api/utc", function (req, res) {
|
|
|
|
|
res.json({ utc: new Date().toISOString() });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Autocomplete airports
|
|
|
|
|
router.get("/airports", function (req, res) {
|
|
|
|
|
const search = (req.query.search || "").trim();
|
|
|
|
|
if (search.length < 3) {
|
|
|
|
|
return res
|
|
|
|
|
.status(400)
|
|
|
|
|
.json({ error: "Search term must be at least 3 characters" });
|
|
|
|
|
}
|
|
|
|
|
const term = search.toLowerCase();
|
|
|
|
|
const matches = airportData
|
|
|
|
|
.filter(
|
|
|
|
|
(a) =>
|
|
|
|
|
(a.name && a.name.toLowerCase().includes(term)) ||
|
|
|
|
|
(a.code && a.code.toLowerCase().includes(term))
|
|
|
|
|
)
|
|
|
|
|
.slice(0, 10);
|
|
|
|
|
res.json(matches);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Log analytic event
|
|
|
|
|
router.post("/analytic", async function (req, res) {
|
|
|
|
|
try {
|
|
|
|
|
const { widget_name, browser_type } = req.body;
|
|
|
|
|
if (!widget_name || !browser_type) {
|
|
|
|
|
return res
|
|
|
|
|
.status(400)
|
|
|
|
|
.json({ error: "widget_name and browser_type required" });
|
|
|
|
|
}
|
|
|
|
|
await db.analytic.create({ widget_name, browser_type });
|
|
|
|
|
res.json({ success: true });
|
|
|
|
|
} catch (err) {
|
|
|
|
|
res.status(500).json({ error: "Failed to log analytic" });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Count analytic rows
|
|
|
|
|
router.get("/analytic/count", async function (req, res) {
|
|
|
|
|
try {
|
|
|
|
|
const count = await db.analytic.count();
|
|
|
|
|
res.json({ count });
|
|
|
|
|
} catch (err) {
|
|
|
|
|
res.status(500).json({ error: "Failed to count analytics" });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Export analytic as XML
|
|
|
|
|
router.get("/analytic/export", async function (req, res) {
|
|
|
|
|
try {
|
|
|
|
|
const analytics = await db.analytic.findAll({ raw: true });
|
|
|
|
|
const root = create({ version: "1.0" }).ele("analytics");
|
|
|
|
|
analytics.forEach((a) => {
|
|
|
|
|
root
|
|
|
|
|
.ele("analytic")
|
|
|
|
|
.ele("id")
|
|
|
|
|
.txt(a.id)
|
|
|
|
|
.up()
|
|
|
|
|
.ele("create_at")
|
|
|
|
|
.txt(a.create_at)
|
|
|
|
|
.up()
|
|
|
|
|
.ele("widget_name")
|
|
|
|
|
.txt(a.widget_name)
|
|
|
|
|
.up()
|
|
|
|
|
.ele("browser_type")
|
|
|
|
|
.txt(a.browser_type)
|
|
|
|
|
.up()
|
|
|
|
|
.up();
|
|
|
|
|
});
|
|
|
|
|
const xml = root.end({ prettyPrint: true });
|
|
|
|
|
res.set("Content-Type", "application/xml");
|
|
|
|
|
res.set("Content-Disposition", 'attachment; filename="analytics.xml"');
|
|
|
|
|
res.send(xml);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
res.status(500).json({ error: "Failed to export analytics" });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Reddit widget route
|
|
|
|
|
router.get("/reddit", async function (req, res) {
|
|
|
|
|
try {
|
|
|
|
|
const response = await fetch("https://www.reddit.com/r/programming.json");
|
|
|
|
|
if (!response.ok) throw new Error("Reddit API error");
|
|
|
|
|
const data = await response.json();
|
|
|
|
|
const posts = (data.data.children || [])
|
|
|
|
|
.map((c) => c.data)
|
|
|
|
|
.filter((_, i) => i % 2 === 0)
|
|
|
|
|
.slice(0, 4)
|
|
|
|
|
.map((post) => ({
|
|
|
|
|
title: post.title,
|
|
|
|
|
url: "https://reddit.com" + post.permalink,
|
|
|
|
|
author: post.author,
|
|
|
|
|
}));
|
|
|
|
|
res.json(posts);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
res.status(500).json({ error: "Failed to fetch reddit posts" });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Coin calculator route
|
|
|
|
|
router.post("/coin-calc", function (req, res) {
|
|
|
|
|
try {
|
|
|
|
|
let { amount } = req.body;
|
|
|
|
|
amount = parseFloat(amount);
|
|
|
|
|
if (isNaN(amount) || amount < 0)
|
|
|
|
|
return res.status(400).json({ error: "Invalid amount" });
|
|
|
|
|
const denoms = [20, 10, 5, 1, 0.25, 0.1, 0.05, 0.01];
|
|
|
|
|
const result = [];
|
|
|
|
|
let remaining = Math.round(amount * 100); // work in cents
|
|
|
|
|
for (let d of denoms) {
|
|
|
|
|
let denomCents = Math.round(d * 100);
|
|
|
|
|
let count = Math.floor(remaining / denomCents);
|
|
|
|
|
if (count > 0) {
|
|
|
|
|
result.push({ denomination: d, count });
|
|
|
|
|
remaining -= count * denomCents;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
res.json(result);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
res.status(500).json({ error: "Failed to calculate coins" });
|
|
|
|
|
}
|
2022-09-13 05:04:17 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
module.exports = router;
|