apxtrib/apxtrib.js

135 lines
5.5 KiB
JavaScript
Raw Normal View History

2023-01-22 09:53:09 +00:00
const fs = require( 'fs-extra' );
const bodyParser = require( 'body-parser' );
2023-04-27 04:17:20 +00:00
const glob = require( 'glob' );
const path = require( 'path' );
2023-01-22 09:53:09 +00:00
const cors = require( 'cors' );
const express = require( 'express' );
2023-04-27 04:17:20 +00:00
const process = require('process');
2023-01-22 09:53:09 +00:00
/*******************************************
2023-03-27 05:52:21 +00:00
SEE https://gitea.ndda.fr/apxtrib/apxtrib/wiki/Devrules
To have a quick understanding and convention before doing deeply in source code
2023-01-22 09:53:09 +00:00
2023-04-27 04:17:20 +00:00
*/
2023-03-27 05:52:21 +00:00
// to make absolute path with `${__base}relativepath`
global.__base = __dirname +'/';
2023-01-22 09:53:09 +00:00
// check setup
if( !fs.existsSync( '/etc/nginx/nginx.conf' ) ) {
console.log( '\x1b[31m Check documentation, nginx have to be installed on this server first, no /etc/nginx/nginx.conf available, install then rerun yarn command.' );
process.exit();
}
2023-04-27 04:17:20 +00:00
if( !fs.existsSync( './nationchains/tribes/conf.json' ) ) {
2023-04-17 10:03:56 +00:00
// this town is not set
console.log( `\x1b[42m############################################################################################\x1b[0m\n\x1b[42mWellcome into apxtrib, you must first init your town and tribes by a 'yarn setup'. \x1b[0m \n\x1b[42mThen 'yarn dev' or 'yarn startpm2' or 'yarn unittest'. Check README's project to learn more.\x1b[0m\n\x1b[42m############################################################################################\x1b[0m` );
process.exit();
2023-01-22 09:53:09 +00:00
}
2023-04-27 04:17:20 +00:00
const config = require( './nationchains/tribes/conf.json' );
2023-03-27 05:52:21 +00:00
// Tribes allow to get local apxtrib instance context
2023-01-22 09:53:09 +00:00
// dataclient .tribeids [] .DOMs [] .routes (plugins {url:name route:path}) .appname {tribeid:[website]}
2023-04-27 04:17:20 +00:00
//const dataclient = require( './api/models/Tribes' ).init();
const tribelist=fs.readJsonSync(`./nationchains/tribes/idx/tribeId_all.json`);
let doms=config.dns
let tribeIds=[]
let routes = glob.sync( './api/routes/*.js' )
.map( f => {
return { url: `/${path.basename(f,'.js')}`, route: f }
} );
//routes={url,route} check how to add plugin tribe route
Object.keys(tribelist).forEach(t=>{
tribelist[t].dns.forEach(d=>{
const dm=d.split('.').slice(-2).join('.')
if (!doms.includes(dm)) doms.push(dm)
})
tribeIds.push(t)
})
console.log('Allowed DOMs to access to this apxtrib server: ', doms )
2023-04-13 05:46:35 +00:00
2023-04-27 04:17:20 +00:00
const app = express();
Object.keys(config.api.appset).forEach(p=>{
app.set(p,config.api.appset[p])
2023-03-27 05:52:21 +00:00
})
2023-01-22 09:53:09 +00:00
// To set depending of data form or get size to send
2023-04-27 04:17:20 +00:00
app.use( bodyParser.urlencoded( config.api.bodyparse.urlencoded ) );
2023-01-22 09:53:09 +00:00
// To set depending of post put json data size to send
app.use( express.json() )
2023-04-27 04:17:20 +00:00
app.use( bodyParser.json( config.api.bodyparse.json ) );
app.locals.tribeids = tribeIds;
2023-01-22 09:53:09 +00:00
console.log( 'app.locals.tribeids', app.locals.tribeids );
2023-04-27 04:17:20 +00:00
// token will be store in /tmp/token/pseudo_token to check if isauthenticated
2023-01-22 09:53:09 +00:00
// User token authentification and user init user search
2023-04-27 04:17:20 +00:00
/*const datauser = require( './api/models/Pagans' )
2023-01-22 09:53:09 +00:00
.init( dataclient.tribeids );
app.locals.tokens = datauser.tokens;
console.log( 'app.locals.tokens key ', Object.keys( app.locals.tokens ) )
2023-04-27 04:17:20 +00:00
*/
2023-01-22 09:53:09 +00:00
// Cors management
const corsOptions = {
origin: ( origin, callback ) => {
if( origin === undefined ) {
callback( null, true );
} else if( origin.indexOf( 'chrome-extension' ) > -1 ) {
callback( null, true );
} else {
//console.log( 'origin', origin )
//marchais avant modif eslint const rematch = ( /^https?\:\/\/(.*)\:.*/g ).exec( origin )
const rematch = ( /^https?:\/\/(.*):.*/g )
.exec( origin )
//console.log( rematch )
let tmp = origin.replace( /http.?:\/\//g, '' )
.split( '.' )
if( rematch && rematch.length > 1 ) tmp = rematch[ 1 ].split( '.' );
//console.log( 'tmp', tmp )
let dom = tmp[ tmp.length - 1 ];
if( tmp.length > 1 ) {
dom = `${tmp[tmp.length-2]}.${tmp[tmp.length-1]}`
}
console.log( `origin: ${origin}, dom:${dom}, CORS allowed? : ${dataclient.DOMs.includes( dom )}` );
if( dataclient.DOMs.includes( dom ) ) {
callback( null, true )
} else {
console.log( `Origin is not allowed by CORS` );
callback( new Error( 'Not allowed by CORS' ) );
}
}
},
2023-04-27 04:17:20 +00:00
exposedHeaders: Object.keys( config.api.exposedHeaders )
2023-01-22 09:53:09 +00:00
};
// CORS
app.use( cors( corsOptions ) );
// Static Routes
2023-04-27 04:17:20 +00:00
/*app.use( express.static( `${__dirname}/nationchains/tribes/${config.mayorId}/www/cdn/public`, {
2023-01-22 09:53:09 +00:00
dotfiles: 'allow'
} ) );
2023-04-27 04:17:20 +00:00
*/
2023-03-27 05:52:21 +00:00
//Allow to public access a space dev delivered by apxtrib
2023-01-22 09:53:09 +00:00
// this is just a static open route for dev purpose,
// for production, we'll use a nginx static set to /www/app/appname
2023-03-27 05:52:21 +00:00
/*console.log( `${config.dnsapxtrib}/space/tribeid/website`, dataclient.appname );
2023-01-22 09:53:09 +00:00
Object.keys( dataclient.appname )
.forEach( cid => {
dataclient.appname[ cid ].forEach( website => {
app.use( `/space/${cid}/${website}`, express.static( `${config.tribes}/${cid}/spacedev/${website}` ) );
} )
} );
*/
// Routers add any routes from /routes and /plugins
2023-03-27 05:52:21 +00:00
console.log( 'Routes available on this apxtrib instance' );
2023-04-27 04:17:20 +00:00
console.log( routes );
2023-03-27 05:52:21 +00:00
// prefix only use for dev purpose in production a proxy nginx redirect /app/ to node apxtrib
2023-01-22 09:53:09 +00:00
2023-04-27 04:17:20 +00:00
routes.forEach( r => {
2023-01-22 09:53:09 +00:00
try {
app.use( r.url, require( r.route ) );
} catch ( err ) {
console.log( `\x1b[31m!!! WARNING issue with route ${r.route} from ${r.url} check err if route is key then solve err, if not just be aware that this route won't work on your server. If you are not the maintainer and no turn around please contact the email maintainer.\x1b[0m` )
console.log( 'raise err-:', err );
}
} )
2023-04-27 04:17:20 +00:00
app.listen( config.api.port, () => {
console.log( `check in your browser that api works http://${config.dns}:${config.api.port}` );
2023-01-22 09:53:09 +00:00
} );
console.log( "\x1b[42m\x1b[37m", "Made with love for people's freedom, enjoy !!!", "\x1b[0m" );