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
2024-02-19 17:55:06 +01:00
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
2024-06-10 08:26:45 +02:00
app . use ( express . json ( { limit : '10mb' , type : 'application/json' , rawBody : true } ) ) ;
2023-12-07 12:04:19 +01:00
app . use ( bodyParser . json ( conf . api . bodyparse . json ) ) ;
2024-02-19 17:55:06 +01:00
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" ;
2024-02-19 17:55:06 +01:00
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-19 17:55:06 +01:00
} ) ;
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 {
2024-02-19 17:55:06 +01:00
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
}
} ) ;
2024-02-19 17:55:06 +01:00
if ( log ) {
console . log ( currentmod , logroute ) ;
if ( process . env . NODE _MODE == "dev" )
console . log (
` \x 1b[42m############################################################################################ \x 1b[0m \n \x 1b[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 \x 1b[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. \x 1b[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 \x 1b[42m############################################################################################ \x 1b[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
} ) ;
2024-02-19 17:55:06 +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"
) ;