Kekkai/server/main.js

102 lines
3 KiB
JavaScript
Raw Permalink Normal View History

const logger = require("../shared/logger/src/main.js");
const config = require("../shared/config/src/main.js")();
const fs = require("fs");
const axios = require("axios");
const UAParser = require("ua-parser-js");
require("../shared/database/src/create_table.js")();
const fastify = require("fastify")({
2024-12-23 18:53:56 +03:00
logger: config["server"]["log"]["print"] ? logger : false,
...(config["server"]["ssl"]["work"]
? {
https: {
key: fs.readFileSync(config["server"]["ssl"]["private_key"], "utf8"),
cert: fs.readFileSync(config["server"]["ssl"]["cert"], "utf8"),
},
}
: false),
});
const getRateRoute = require("./routes/getRate.js");
const HomeRoute = require("./routes/home.js");
fastify.register(getRateRoute);
fastify.register(HomeRoute);
fastify.setNotFoundHandler(function (res, reply) {
2024-12-23 18:53:56 +03:00
return reply.status(404).send({
status: 404,
message: "Page not found!",
documentation: "https://kekkai-docs.redume.su/",
});
});
fastify.addHook("onResponse", async (request, reply) => {
2024-12-23 18:53:56 +03:00
const routePart = request.raw.url.split("/");
const routePartFiltered = routePart
.filter((part) => part !== "")
.map((part) => `${part}/`);
2024-12-23 18:53:56 +03:00
routePartFiltered.unshift("/");
2024-12-23 18:53:56 +03:00
if (!config?.["analytics"]["work"] ? config?.["analytics"]["work"] : false)
return;
else if (!fastify.printRoutes().includes(routePartFiltered.at(-1))) return;
2024-12-23 18:53:56 +03:00
const userAgent = request.headers["user-agent"];
const parser = new UAParser(userAgent);
const browser = parser.getBrowser();
const os = parser.getOS();
2024-12-23 18:53:56 +03:00
const formattedOS =
os.name && os.version ? `${os.name} ${os.version}` : "N/A";
const formattedBrowser =
browser.name && browser.version
? `${browser.name} ${browser.version}`
: "N/A";
2024-12-23 18:53:56 +03:00
const event = {
domain: config["analytics"]["plausible_domain"],
name: request.routeOptions.url
? request.routeOptions.url
: "404 - Not Found",
url: request.raw.url,
props: {
method: request.method,
statusCode: reply.statusCode,
browser: formattedBrowser,
os: formattedOS,
source: request.headers["referer"]
? request.headers["referer"]
: "direct",
},
};
2024-12-23 18:53:56 +03:00
try {
await axios.post(config["analytics"]["plausible_api"], event, {
headers: {
Authorization: `Bearer ${config["analytics"]["plausible_token"]}`,
"Content-Type": "application/json",
"User-Agent": userAgent,
},
});
} catch (error) {
fastify.log.error("Error sending event to Plausible:", error.message);
}
});
2024-08-17 16:40:20 +03:00
fastify.listen(
2024-12-23 18:53:56 +03:00
{
port: 3000,
host: config["server"]["host"] ? config["server"]["host"] : "localhost",
},
(err) => {
if (err) {
fastify.log.error(err);
process.exit(1);
}
},
2024-08-17 16:40:20 +03:00
);