1
0
forked from apxtri/apxtri
apxtri/apxtri.js

149 lines
5.3 KiB
JavaScript
Raw Normal View History

2024-03-23 16:52:39 +01:00
//const { argv } = require("process");
2023-12-07 12:04:19 +01:00
const fs = require("fs-extra");
2024-03-23 16:52:39 +01:00
//const mustache = require("mustache");
2023-12-07 12:04:19 +01:00
const bodyParser = require("body-parser");
const glob = require("glob");
const path = require("path");
const cors = require("cors");
const express = require("express");
const process = require("process");
/*******************************************
2024-03-23 16:52:39 +01:00
SEE README.md to have a quick start
********************************************/
2023-12-07 12:04:19 +01:00
2024-03-23 16:52:39 +01:00
if (!fs.existsSync("/etc/nginx/nginx.conf")) {
2024-03-23 09:24:01 +01:00
setupdone=false;
console.log(
2024-03-23 16:52:39 +01:00
"\x1b[31m Check documentation, nginx have to be installed on this server first, no /etc/nginx/nginx.conf available, install then rerun yarn command.");
2024-03-23 09:24:01 +01:00
}
2024-03-20 11:24:03 +01:00
if (!fs.existsSync("../../conf.json")) {
2024-03-23 16:52:39 +01:00
console.log("Warning, this is a first install you must run 'node setup.js dns=domainename user=sudoerlinux'")
process.exit();
2023-12-07 12:04:19 +01:00
}
2024-03-21 08:33:31 +01:00
2024-03-20 11:24:03 +01:00
const conf = require(path.resolve(`../../conf.json`));
2024-03-15 08:49:23 +01:00
let doms = conf.dns; // only dns of town during the init process
const currentmod = "apxtri";
const log = conf.api.activelog.includes(currentmod);
2024-02-16 07:55:29 +01:00
2023-12-07 12:04:19 +01:00
let tribelist = {};
2024-03-15 08:49:23 +01:00
if (fs.existsSync(`../../idx/tribeId_all.json`)) {
tribelist = fs.readJsonSync(`../../idx/tribeId_all.json`);
2023-12-07 12:04:19 +01:00
}
2024-03-15 08:49:23 +01:00
let tribeIds = Object.keys(tribelist);
2024-03-23 16:52:39 +01:00
// context is store in /itm/tribename.json ={contexte:{routes:[],models:[{model:,tplstringslg:[]}]}
// routes={url,route} check how to add plugin tribe route later
2023-12-07 12:04:19 +01:00
// keep only the 2 last part (.) of domain name to validate cors with it (generic domain)
2024-03-15 08:49:23 +01:00
let routes=[]
tribeIds.forEach((t) => {
2023-12-07 12:04:19 +01:00
tribelist[t].dns.forEach((d) => {
const dm = d.split(".").slice(-2).join(".");
if (!doms.includes(dm)) doms.push(dm);
});
2024-03-15 08:49:23 +01:00
const context={};
const pathtr=path.resolve(`../../${t}`);
context.routes=[]
tribroutes=glob.sync(`${pathtr}/ap*/routes/*.js`).map(f=>{
const rt=`/${t}/${path.basename(f, ".js")}`
context.routes.push(rt)
return { url: rt, route: f };
});
context.models=glob.sync(`${pathtr}/ap*/models/*.js`).map(f=>{
const modname=`${path.basename(f, ".js")}`
return {
model: modname,
tplstrings:glob.sync(`${pathtr}/objects/tplstrings/${modname}_*.json`).map(l=>path.basename(l,'.json').split("_")[1] )
}
})
const conft=`../../itm/${t}.json`
const ctx=fs.readJsonSync(conft)
ctx.context=context
fs.outputJSONSync(conft,ctx,{spaces:2});
routes=routes.concat(tribroutes);
2023-12-07 12:04:19 +01:00
});
const app = express();
// load express parameter from conf
Object.keys(conf.api.appset).forEach((p) => {
app.set(p, conf.api.appset[p]);
});
// To set depending of data form or get size to send
app.use(bodyParser.urlencoded(conf.api.bodyparse.urlencoded));
// To set depending of post put json data size to send
app.use(express.json());
app.use(bodyParser.json(conf.api.bodyparse.json));
app.disable("x-powered-by"); // for security
2023-12-07 12:04:19 +01:00
app.locals.tribeids = tribeIds;
2024-03-15 08:49:23 +01:00
if (log){
console.log(
currentmod,
" Allowed DOMs to access to this apxtri server:",
JSON.stringify(doms)
);
console.log(currentmod, " app.locals.tribeids", app.locals.tribeids);
}
// Cors management
2024-02-27 12:36:31 +01:00
let originlst = "test";
doms.forEach((d) => {
2024-02-27 12:36:31 +01:00
originlst += `|${d.replace(/\./g, "\\.")}`;
});
const regtxt = `^http.?:\/\/(${originlst})`;
let cor = false;
const regorigin = new RegExp(regtxt);
app.use((req, res, next) => {
if (req.headers.origin == undefined) {
cor = true;
} else {
cor = regorigin.test(req.headers.origin);
}
if (log)
console.log(
currentmod,
"request origin:",
req.headers.origin,
"testcors:",
2024-02-27 12:37:56 +01:00
cor, "headers allowed: [", conf.api.exposedHeaders.join(','),"] match with reg:", regtxt
2024-02-27 12:36:31 +01:00
);
cors({
origin: cor,
allowedHeaders: conf.api.exposedHeaders,
exposedHeaders: conf.api.exposedHeaders,
credentials: true,
preflightContinue: false,
optionsSuccessStatus: 204
});
next();
});
2024-02-16 07:55:29 +01:00
2023-12-07 12:04:19 +01:00
// Routers add any routes from /routes and /plugins
2024-02-16 07:55:29 +01:00
let logroute = "Routes available on this apxtri instance: \n";
2023-12-07 12:04:19 +01:00
routes.forEach((r) => {
try {
logroute += r.url.padEnd(30, " ") + r.route + "\n";
2023-12-07 12:04:19 +01:00
app.use(r.url, require(r.route));
} catch (err) {
logroute += " (err check it module.exports=router;? or ...)\n======\n ";
2024-02-16 07:55:29 +01:00
console.log("raise err-:", err);
2023-12-07 12:04:19 +01:00
}
});
if (log) {
console.log(currentmod, logroute);
if (process.env.NODE_MODE == "dev")
console.log(
`\x1b[42m############################################################################################\x1b[0m\n\x1b[42mThis is dev conf accessible in http://dev-ants to switch this as production, you must run:\n 1 - 'yarn dev nationId:ants townId:dev dns:dev-ants' to conf your town and check it.\n 2 - 'yarn startpm2'\n Where:\n\x1b[42m * nationId have to exist in the nationchains\n * townId new or if exist must have the same current dns,\n * dns domaine that has to redirect 80/443 into this server.\n Check README's project to learn more.\x1b[0m\n To work with apxweb for the front use http://dev-ants/apxwebapp/www/websitename/src/index.html to use the api during dev process\n\x1b[42m############################################################################################\x1b[0m`
);
2023-12-07 12:04:19 +01:00
}
2023-12-29 13:38:47 +01:00
2023-12-07 12:04:19 +01:00
app.listen(conf.api.port, () => {
2024-02-27 12:36:31 +01:00
let webaccess = `api waits request on port:${conf.api.port} for`;
2023-12-07 12:04:19 +01:00
conf.dns.forEach((u) => {
2024-02-27 12:36:31 +01:00
webaccess += `${u}/api/ `;
2023-12-07 12:04:19 +01:00
});
if (log) console.log(currentmod, webaccess);
2023-12-07 12:04:19 +01:00
});
console.log(
"\x1b[42m\x1b[37m",
"Made with love for people's freedom, enjoy !!!",
"\x1b[0m"
);