#814 Services unified with karma & e2e tests working

This commit is contained in:
Juan Ferrer 2018-12-21 11:36:44 +01:00
parent 5d84e51639
commit 87dec5e8b2
53 changed files with 3397 additions and 3734 deletions

8
Dockerfile Normal file
View File

@ -0,0 +1,8 @@
FROM node:8-slim
COPY . /salix
COPY dist/webpack-assets.json /salix/client/
RUN npm -g install pm2
WORKDIR /salix
CMD ["pm2-docker", "./server/server.js"]

View File

@ -36,16 +36,18 @@ export default class Controller {
token: data.token, token: data.token,
continue: data.continue continue: data.continue
}; };
this.$window.location = `${data.loginUrl}?${this.encodeUri(params)}`; let loginUrl = data.loginUrl || '';
this.$window.location = `${loginUrl}?${this.encodeUri(params)}`;
} }
encodeUri(object) { encodeUri(object) {
let uri = ''; let uri = '';
for (var key in object) for (let key in object) {
if (object[key]) { if (object[key] !== undefined) {
if (uri.length > 0) if (uri.length > 0)
uri += '&'; uri += '&';
uri += encodeURIComponent(key) + '=' + encodeURIComponent(object[key]); uri += encodeURIComponent(key) + '=' + encodeURIComponent(object[key]);
} }
}
return uri; return uri;
} }
onLoginErr(json) { onLoginErr(json) {

View File

@ -20,15 +20,16 @@ export default class MainMenu {
this.modules = modulesFactory.getModules(); this.modules = modulesFactory.getModules();
this.langs = []; this.langs = [];
for (var code of $translate.getAvailableLanguageKeys()) for (let code of $translate.getAvailableLanguageKeys()) {
this.langs.push({ this.langs.push({
code: code, code: code,
name: languages[code] ? languages[code] : code name: languages[code] ? languages[code] : code
}); });
} }
}
getCurrentUserName() { getCurrentUserName() {
this.$http.get('/auth/api/Accounts/getCurrentUserName') this.$http.get('/api/Accounts/getCurrentUserName')
.then(json => { .then(json => {
this.$.currentUserName = json.data; this.$.currentUserName = json.data;
}); });

View File

@ -4,21 +4,18 @@ describe('Component vnMainMenu', () => {
let $httpBackend; let $httpBackend;
let controller; let controller;
beforeEach(() => { beforeEach(ngModule('salix'));
angular.mock.module('salix');
});
beforeEach(angular.mock.inject((_$componentController_, _$httpBackend_) => { beforeEach(angular.mock.inject((_$componentController_, _$httpBackend_) => {
let modulesFactory = {getModules: () => {}}; let modulesFactory = {getModules: () => {}};
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$httpBackend.when('GET', /\/locale\/\w+\/[a-z]{2}\.json/).respond({});
controller = _$componentController_('vnMainMenu', {modulesFactory: modulesFactory}); controller = _$componentController_('vnMainMenu', {modulesFactory: modulesFactory});
})); }));
describe('getCurrentUserName()', () => { describe('getCurrentUserName()', () => {
it(`should set the user name property in the controller`, () => { it(`should set the user name property in the controller`, () => {
$httpBackend.when('GET', `/auth/api/Accounts/getCurrentUserName`).respond('Batman'); $httpBackend.when('GET', `/api/Accounts/getCurrentUserName`).respond('Batman');
$httpBackend.expect('GET', `/auth/api/Accounts/getCurrentUserName`); $httpBackend.expect('GET', `/api/Accounts/getCurrentUserName`);
controller.getCurrentUserName(); controller.getCurrentUserName();
$httpBackend.flush(); $httpBackend.flush();

View File

@ -19,6 +19,7 @@ let env = process.env.NODE_ENV ? process.env.NODE_ENV : 'development';
let langs = ['es', 'en']; let langs = ['es', 'en'];
let srcDir = './client'; let srcDir = './client';
let servicesDir = './services'; let servicesDir = './services';
let services = require('./services/services.yml');
let wpConfig = require('./webpack.config.yml'); let wpConfig = require('./webpack.config.yml');
let buildDir = wpConfig.buildDir; let buildDir = wpConfig.buildDir;
@ -37,7 +38,7 @@ let defaultPort = proxyConf.defaultPort;
// Development // Development
gulp.task('default', () => { gulp.task('default', () => {
return gulp.start('services', 'client'); return gulp.start('client', 'services');
}); });
gulp.task('client', ['build-clean'], async () => { gulp.task('client', ['build-clean'], async () => {
@ -54,10 +55,10 @@ gulp.task('services', async () => {
/** /**
* Starts backend services. * Starts backend services.
*/ */
gulp.task('services-only', async () => { gulp.task('services-only', callback => {
const services = await getServices(); let app = require(`./services/loopback/server/server`);
for (let service of services) app.start(defaultPort);
require(service.index).start(service.port); app.on('started', callback);
}); });
/** /**
@ -148,7 +149,6 @@ gulp.task('docker-compose', async () => {
let compose = await fs.readFile('./docker-compose.tpl.yml', 'utf8'); let compose = await fs.readFile('./docker-compose.tpl.yml', 'utf8');
let composeYml = yaml.safeLoad(compose); let composeYml = yaml.safeLoad(compose);
let services = await getServices();
let imageTag = 'latest'; let imageTag = 'latest';
if (process.env.BUILD_NUMBER) if (process.env.BUILD_NUMBER)
@ -160,12 +160,12 @@ gulp.task('docker-compose', async () => {
for (let service of services) { for (let service of services) {
let dockerFile = `Dockerfile`; let dockerFile = `Dockerfile`;
let localDockerFile = `${__dirname}/services/${service.name}/Dockerfile`; let localDockerFile = `${__dirname}/services/${service}/Dockerfile`;
if (await fs.exists(localDockerFile)) if (await fs.exists(localDockerFile))
dockerFile = localDockerFile; dockerFile = localDockerFile;
composeYml.services[service.name] = { composeYml.services[service] = {
build: { build: {
context: `./services`, context: `./services`,
dockerfile: dockerFile dockerfile: dockerFile
@ -177,7 +177,7 @@ gulp.task('docker-compose', async () => {
}; };
composeYml.services.nginx.links.push( composeYml.services.nginx.links.push(
`${service.name}:${namePrefix}${service.name}` `${service}:${namePrefix}${service}`
); );
} }
@ -216,7 +216,7 @@ let nginxTemp = `${nginxDir}/temp`;
* Starts the nginx process, if it is started, restarts it. * Starts the nginx process, if it is started, restarts it.
*/ */
gulp.task('nginx', async () => { gulp.task('nginx', async () => {
await runSequenceP('nginx-stop', 'nginx-start'); await runSequenceP('nginx-start');
}); });
/** /**
@ -228,7 +228,7 @@ gulp.task('nginx-start', ['nginx-conf'], async () => {
if (isWindows) if (isWindows)
nginxBin = `start /B ${nginxBin}`; nginxBin = `start /B ${nginxBin}`;
log(`Application will be available at http://${proxyConf.host}:${proxyConf.port}/`); log(`Application available at http://${proxyConf.host}:${proxyConf.port}/`);
await execP(`${nginxBin} -c "${nginxConf}" -p "${nginxDir}"`); await execP(`${nginxBin} -c "${nginxConf}" -p "${nginxDir}"`);
}); });
@ -255,7 +255,7 @@ gulp.task('nginx-conf', ['nginx-stop'], async () => {
await fs.mkdir(nginxTemp); await fs.mkdir(nginxTemp);
let params = { let params = {
services: await getServices(), services: services,
defaultService: defaultService, defaultService: defaultService,
defaultPort: defaultPort, defaultPort: defaultPort,
devServerPort: devServerPort, devServerPort: devServerPort,
@ -294,29 +294,6 @@ async function nginxGetBin() {
} }
} }
async function getServices() {
let services;
let startPort = defaultPort + 1;
services = [];
const serviceDirs = await fs.readdir(servicesDir);
const exclude = ['loopback'];
for (let service of serviceDirs) {
let index = `${servicesDir}/${service}/server/server.js`;
if (!await fs.exists(index) || exclude.indexOf(service) !== -1) continue;
let port = service == defaultService ? defaultPort : startPort++;
services.push({
name: service,
index: index,
port: port
});
}
return services;
}
// Webpack // Webpack
gulp.task('webpack', function(callback) { gulp.task('webpack', function(callback) {
@ -562,9 +539,9 @@ function execP(command) {
* @param {String} args The list of gulp task names * @param {String} args The list of gulp task names
* @return {Promise} The promise * @return {Promise} The promise
*/ */
function runSequenceP() { function runSequenceP(...args) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let args = Array.prototype.slice.call(arguments); args = Array.prototype.slice.call(args);
args.push(err => { args.push(err => {
if (err) if (err)
reject(err); reject(err);

View File

@ -1,5 +0,0 @@
FROM vn-loopback:latest
COPY agency /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,18 +0,0 @@
{
"name": "vn-agency",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "vn-agency",
"dependencies": {
"vn-loopback": "file:../loopback"
}
}

View File

@ -1,5 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -1,7 +0,0 @@
FROM vn-loopback:latest
COPY auth /app
COPY nginx/static/webpack-assets.json /loopback/client/
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,19 +0,0 @@
{
"name": "vn-auth",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"dependencies": {
"md5": "^2.2.1",
"vn-loopback": "file:../loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "Authentication service"
}

View File

@ -1,6 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
app.set('applications', require('./application.json'));
vnLoopback.boot(app, __dirname, module);

View File

@ -1,5 +0,0 @@
FROM vn-loopback:latest
COPY claim /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,18 +0,0 @@
{
"name": "vn-claim",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "vn-claim"
}

View File

@ -1,5 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -1,6 +0,0 @@
FROM vn-loopback:latest
COPY client /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,19 +0,0 @@
{
"name": "vn-client",
"description": "Client service",
"version": "1.0.0",
"license": "GPL-3.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"dependencies": {
"request": "^2.83.0",
"vn-loopback": "file:../loopback"
}
}

View File

@ -1,5 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -1,6 +0,0 @@
FROM vn-loopback:latest
COPY item /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,13 +0,0 @@
{
"name": "vn-item",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"uuid": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
}
}
}

View File

@ -1,19 +0,0 @@
{
"name": "vn-item",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "vn-item",
"dependencies": {
"uuid": "^3.1.0",
"vn-loopback": "file:../loopback"
}
}

View File

@ -1,4 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -1,4 +0,0 @@
FROM node:8-slim
COPY . /loopback
RUN npm -g install pm2

View File

@ -6,7 +6,7 @@
</head> </head>
<body ng-app="vnAuth"> <body ng-app="vnAuth">
<vn-login></vn-login> <vn-login></vn-login>
<% for (let jsFile of assets('auth')) { %> <% for (let jsFile of assets) { %>
<script type="text/javascript" src="<%= jsFile %>"></script> <script type="text/javascript" src="<%= jsFile %>"></script>
<% } %> <% } %>
</body> </body>

View File

@ -10,7 +10,7 @@
<script type="text/javascript" <script type="text/javascript"
src="/static/routes.js?<%= version %>"> src="/static/routes.js?<%= version %>">
</script> </script>
<% for (let jsFile of assets('salix')) { %> <% for (let jsFile of assets) { %>
<script type="text/javascript" src="<%= jsFile %>"></script> <script type="text/javascript" src="<%= jsFile %>"></script>
<% } %> <% } %>
</body> </body>

View File

@ -22,5 +22,7 @@
"Cannot check Equalization Tax in this NIF/CIF": "Cannot check Equalization Tax in this NIF/CIF", "Cannot check Equalization Tax in this NIF/CIF": "Cannot check Equalization Tax in this NIF/CIF",
"You can't create an order for a frozen client": "You can't create an order for a frozen client", "You can't create an order for a frozen client": "You can't create an order for a frozen client",
"This address doesn't exist": "This address doesn't exist", "This address doesn't exist": "This address doesn't exist",
"NO_AGENCY_AVAILABLE": "NO_AGENCY_AVAILABLE" "NO_AGENCY_AVAILABLE": "NO_AGENCY_AVAILABLE",
"Warehouse cannot be blank": "Warehouse cannot be blank",
"Agency cannot be blank": "Agency cannot be blank"
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,27 +1,30 @@
{ {
"name": "vn-loopback", "name": "vn-loopback",
"version": "1.0.0", "version": "1.0.0",
"main": "server/server.js",
"scripts": { "scripts": {
"start": "node ." "start": "node ."
}, },
"dependencies": { "dependencies": {
"compression": "^1.0.3", "compression": "^1.0.3",
"cookie-parser": "^1.4.3",
"cors": "^2.5.2", "cors": "^2.5.2",
"fs-extra": "^5.0.0", "fs-extra": "^5.0.0",
"helmet": "^1.3.0", "helmet": "^1.3.0",
"i18n": "^0.8.3", "i18n": "^0.8.3",
"loopback": "^3.14.0", "loopback": "^3.24.0",
"loopback-boot": "^2.26.2", "loopback-boot": "^2.27.1",
"loopback-component-explorer": "^4.2.0", "loopback-component-explorer": "^6.3.1",
"loopback-connector-mysql": "^3.0.0", "loopback-connector-mysql": "^5.3.1",
"loopback-connector-remote": "^3.1.1", "loopback-connector-remote": "^3.4.0",
"loopback-context": "^3.3.0", "loopback-context": "^3.3.0",
"md5": "^2.2.1", "object-diff": "0.0.4",
"object.pick": "^1.3.0",
"request": "^2.83.0",
"require-yaml": "0.0.1", "require-yaml": "0.0.1",
"serve-favicon": "^2.0.1", "serve-favicon": "^2.0.1",
"strong-error-handler": "^2.1.0", "strong-error-handler": "^2.1.0",
"object-diff": "0.0.4", "uuid": "^3.1.0"
"object.pick": "^1.3.0"
}, },
"devDependencies": { "devDependencies": {
"nsp": "^2.1.0" "nsp": "^2.1.0"

View File

@ -1,15 +1,17 @@
var url = require('url'); let url = require('url');
var md5 = require('md5'); let md5 = require('md5');
module.exports = function(app) { module.exports = function(app) {
let User = app.models.User; let User = app.models.User;
let applications = app.get('applications'); let applications = app.get('applications');
app.get('/', function(req, res) { app.get('/auth/', function(req, res) {
app.renderIndex(res); res.render('auth.ejs', {
assets: app.getWpAssets('auth')
});
}); });
app.post('/login', function(req, res) { app.post('/auth/login', function(req, res) {
let body = req.body; let body = req.body;
let user = body.user; let user = body.user;
let password = body.password; let password = body.password;
@ -47,11 +49,11 @@ module.exports = function(app) {
apiKey = query.apiKey; apiKey = query.apiKey;
continueUrl = query.continue; continueUrl = query.continue;
} catch (e) { } catch (e) {
apiKey = 'default';
continueUrl = null; continueUrl = null;
} }
let loginUrl = applications[apiKey]; if (!apiKey) apiKey = 'default';
let loginUrl = applications[apiKey] || '/login';
res.json({ res.json({
token: token.id, token: token.id,
@ -84,7 +86,7 @@ module.exports = function(app) {
} }
}); });
app.get('/logout', function(req, res) { app.get('/auth/logout', function(req, res) {
User.logout(req.accessToken.id, () => { User.logout(req.accessToken.id, () => {
res.redirect('/'); res.redirect('/');
}); });

View File

@ -1,13 +1,19 @@
module.exports = function(app) { module.exports = function(app) {
let models = app.models; let models = app.models;
let bootTimestamp = new Date().getTime();
app.get('/', function(req, res) { app.get('/', function(req, res) {
let token = req.cookies.vnToken; let token = req.cookies.vnToken;
validateToken(token, function(isValid) { validateToken(token, function(isValid) {
if (isValid) if (!isValid) {
app.renderIndex(res);
else
redirectToAuth(res, req.get('origin')); redirectToAuth(res, req.get('origin'));
return;
}
res.render('index.ejs', {
assets: app.getWpAssets('salix'),
version: bootTimestamp
});
}); });
}); });
@ -45,9 +51,9 @@ module.exports = function(app) {
let token = req.headers.authorization; let token = req.headers.authorization;
validateToken(token, function(isValid) { validateToken(token, function(isValid) {
if (isValid) { if (isValid)
res.json(null); res.json(null);
} else { else {
res.status(401).json({ res.status(401).json({
message: 'Invalid token' message: 'Invalid token'
}); });
@ -82,7 +88,7 @@ module.exports = function(app) {
}; };
models.RoleMapping.find(query, function(_, roles) { models.RoleMapping.find(query, function(_, roles) {
if (roles) { if (roles) {
var acl = { let acl = {
userProfile: {}, userProfile: {},
roles: {} roles: {}
}; };
@ -99,9 +105,8 @@ module.exports = function(app) {
acl.userProfile.username = userProfile.username; acl.userProfile.username = userProfile.username;
acl.userProfile.warehouseId = 1; acl.userProfile.warehouseId = 1;
sendACL(res, acl); sendACL(res, acl);
} else { } else
sendACL(res, {}); sendACL(res, {});
}
}); });
} else } else
sendACL(res, {}); sendACL(res, {});
@ -129,12 +134,13 @@ module.exports = function(app) {
function encodeUri(object) { function encodeUri(object) {
let uri = ''; let uri = '';
for (var key in object) for (let key in object) {
if (object[key]) { if (object[key]) {
if (uri.length > 0) if (uri.length > 0)
uri += '&'; uri += '&';
uri += encodeURIComponent(key) + '='; uri += encodeURIComponent(key) + '=';
uri += encodeURIComponent(object[key]); uri += encodeURIComponent(object[key]);
} }
}
return uri; return uri;
} }

View File

@ -1,14 +1,16 @@
let loopback = require('loopback'); require('require-yaml');
let boot = require('loopback-boot'); const cookieParser = require('cookie-parser');
let DataSource = require('loopback-datasource-juggler').DataSource; const loopback = require('loopback');
let fs = require('fs-extra'); const boot = require('loopback-boot');
let i18n = require('i18n'); const DataSource = require('loopback-datasource-juggler').DataSource;
let path = require('path'); const fs = require('fs-extra');
const i18n = require('i18n');
const path = require('path');
const loopbackConnector = require('loopback-connector'); const loopbackConnector = require('loopback-connector');
let _resolveConnector = DataSource._resolveConnector; let _resolveConnector = DataSource._resolveConnector;
DataSource._resolveConnector = function(...args) {
DataSource._resolveConnector = function(name) { let name = args[0];
let testPath = `${__dirname}/connectors/${name}.js`; let testPath = `${__dirname}/connectors/${name}.js`;
if (fs.existsSync(testPath)) { if (fs.existsSync(testPath)) {
@ -18,16 +20,21 @@ DataSource._resolveConnector = function(name) {
}; };
} }
return _resolveConnector.apply(this, arguments); return _resolveConnector.apply(this, args);
}; };
module.exports = { let app = loopback();
loopback: loopback, let rootDir = __dirname;
loopbackConnector: loopbackConnector,
boot: vnBoot module.exports = app;
};
// TODO: It should be stored at some config file
app.set('api key', 'salix');
app.set('url auth', '/auth');
app.set('applications', require('./application.json'));
app.use(cookieParser());
function vnBoot(app, rootDir, rootModule) {
// Internationalization // Internationalization
let localeDir = `${__dirname}/../common/locale`; let localeDir = `${__dirname}/../common/locale`;
@ -43,7 +50,6 @@ function vnBoot(app, rootDir, rootModule) {
// View // View
let wpAssets;
let viewDir = `${rootDir}/../client`; let viewDir = `${rootDir}/../client`;
if (fs.existsSync(viewDir)) { if (fs.existsSync(viewDir)) {
@ -52,25 +58,27 @@ function vnBoot(app, rootDir, rootModule) {
app.use(loopback.static(path.resolve(rootDir, '../client'))); app.use(loopback.static(path.resolve(rootDir, '../client')));
} }
const buildVersion = new Date().getTime(); let assetsPath = [
viewDir,
`${__dirname}/../../../dist`
];
app.renderIndex = async res => { let wpAssets;
let assetsDirs = [viewDir, `${__dirname}/../../../dist`]; let wpAssetsFound = false;
for (let assetsDir of assetsDirs) { for (let assetsDir of assetsPath) {
let wpAssetsFile = `${assetsDir}/webpack-assets.json`; let wpAssetsFile = `${assetsDir}/webpack-assets.json`;
if (fs.existsSync(wpAssetsFile)) { wpAssetsFound = fs.existsSync(wpAssetsFile);
if (wpAssetsFound) {
wpAssets = require(wpAssetsFile); wpAssets = require(wpAssetsFile);
break; break;
} }
} }
res.render(`${viewDir}/index.ejs`, { app.getWpAssets = function(entryPoint) {
assets: assets, if (!wpAssetsFound)
version: buildVersion throw new Error('webpack-assets.json file not found');
});
function assets(entryPoint) {
let jsFiles = []; let jsFiles = [];
let regex = new RegExp(`(^|~)${entryPoint}($|~)`); let regex = new RegExp(`(^|~)${entryPoint}($|~)`);
@ -80,18 +88,16 @@ function vnBoot(app, rootDir, rootModule) {
} }
return jsFiles; return jsFiles;
}
}; };
// Initialization // Initialization
app.start = port => { app.start = function(port, callback) {
function onListen() { function onListen() {
app.emit('started');
let packageJson = require(`${rootDir}/../package.json`);
let appName = packageJson.name;
let baseUrl = app.get('url').replace(/\/$/, ''); let baseUrl = app.get('url').replace(/\/$/, '');
console.log(`Web server ${appName} listening at: %s`, `${baseUrl}/explorer`); let explorerPath = app.get('loopback-component-explorer').mountPath;
console.log(`Browse your REST API at: %s`, `${baseUrl}${explorerPath}`);
app.emit('started');
} }
let args = port ? [port, onListen] : [onListen]; let args = port ? [port, onListen] : [onListen];
@ -103,47 +109,55 @@ function vnBoot(app, rootDir, rootModule) {
for (let key in config) for (let key in config)
app.set(key, config[key]); app.set(key, config[key]);
let servicesDir = `${__dirname}/../..`;
let modelConfigFiles = [ let modelConfigFiles = [
`${__dirname}/model-config.json`, `${__dirname}/model-config.json`
`${rootDir}/model-config.json` ];
let modelSources = [
`loopback/common/models`,
`loopback/server/models`,
`${__dirname}/../common/models`
];
let mixinDirs = [
`loopback/common/mixins`,
`loopback/server/mixins`,
`${__dirname}/../common/mixins`
];
let bootDirs = [
`${__dirname}/boot`
]; ];
let modelConfig = {}; let services = require(`${servicesDir}/services.yml`);
for (let service of services) {
let baseDir = `${servicesDir}/${service}`;
modelConfigFiles.push(`${baseDir}/server/model-config.json`);
modelSources.push(`${baseDir}/common/models`);
mixinDirs.push(`${baseDir}/common/mixins`);
bootDirs.push(`${baseDir}/server/boot`);
}
let models = {};
for (file of modelConfigFiles) { for (file of modelConfigFiles) {
if (fs.existsSync(file)) if (fs.existsSync(file))
Object.assign(modelConfig, require(file)); Object.assign(models, require(file));
} }
let bootOptions = { let bootOptions = {
appRootDir: __dirname, appRootDir: __dirname,
appConfigRootDir: rootDir, appConfigRootDir: rootDir,
modelsRootDir: rootDir, modelsRootDir: rootDir,
models: modelConfig, models: models,
modelSources: [ modelSources: modelSources,
`loopback/common/models`, mixinDirs: mixinDirs,
`loopback/server/models`, bootDirs: bootDirs
`${__dirname}/../common/models`,
`${rootDir}/../common/models`
],
mixinDirs: [
`loopback/common/mixins`,
`loopback/server/mixins`,
`${__dirname}/../common/mixins`,
`${rootDir}/../common/mixins`
],
bootDirs: [
`${__dirname}/boot`,
`${rootDir}/boot`
]
}; };
if (fs.existsSync(`/config`)) if (fs.existsSync(`/etc/salix`))
bootOptions.dsRootDir = `/config`; bootOptions.dsRootDir = `/etc/salix`;
boot(app, bootOptions, function(err) { boot(app, bootOptions, function(err) {
if (err) throw err; if (err) throw err;
if (require.main === rootModule) if (require.main === module)
app.start(); app.start();
}); });
}

View File

@ -26,8 +26,8 @@ http {
autoindex off; autoindex off;
{{#services}} {{#services}}
location ~ ^/{{name}}(?:/(.*))?$ { location ~ ^/{{.}}(?:/(.*))?$ {
proxy_pass http://127.0.0.1:{{port}}/$1$is_args$args; proxy_pass http://127.0.0.1:{{defaultPort}}/$1$is_args$args;
} }
{{/services}} {{/services}}

View File

@ -1,6 +0,0 @@
FROM vn-loopback:latest
COPY order /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,19 +0,0 @@
{
"name": "vn-order",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "vn-order",
"dependencies": {
"uuid": "^3.1.0",
"vn-loopback": "file:../loopback"
}
}

View File

@ -1,4 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

File diff suppressed because it is too large Load Diff

14
services/package.json Normal file
View File

@ -0,0 +1,14 @@
{
"name": "vn-module",
"version": "1.0.0",
"dependencies": {
"md5": "^2.2.1",
"vn-loopback": "file:./loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "Loopback modules"
}

View File

@ -1,5 +0,0 @@
FROM vn-loopback:latest
COPY route /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,18 +0,0 @@
{
"name": "vn-route",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "Routes administration"
}

View File

@ -1,5 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -1,6 +0,0 @@
FROM vn-loopback:latest
COPY salix /app
COPY nginx/static/webpack-assets.json /loopback/client/
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,19 +0,0 @@
{
"name": "salix",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"dependencies": {
"cookie-parser": "^1.4.3",
"vn-loopback": "file:../loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "Salix application service"
}

View File

@ -1,13 +0,0 @@
var cookieParser = require('cookie-parser');
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
// TODO: ver donde se almacena
app.set('api key', 'salix');
app.set('url auth', '/auth');
app.use(cookieParser());
vnLoopback.boot(app, __dirname, module);

12
services/services.yml Normal file
View File

@ -0,0 +1,12 @@
[
client,
item,
ticket,
order,
claim,
route,
agency,
travel
# mailer
# print
]

View File

@ -1,5 +0,0 @@
FROM vn-loopback:latest
COPY ticket /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,18 +0,0 @@
{
"name": "vn-ticket",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "vn-ticket"
}

View File

@ -1,5 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -1,6 +0,0 @@
FROM vn-loopback:latest
COPY travel /app
WORKDIR /app
CMD ["pm2-docker", "./server/server.js"]

View File

@ -1,18 +0,0 @@
{
"name": "vn-travel",
"version": "1.0.0",
"main": "server/server.js",
"scripts": {
"start": "node .",
"posttest": "npm run lint && nsp check"
},
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": {
"type": "git",
"url": "https://git.verdnatura.es/salix"
},
"license": "GPL-3.0",
"description": "vn-travel"
}

View File

@ -1,4 +0,0 @@
var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module);

View File

@ -5,8 +5,8 @@ const merge = require('webpack-merge');
const AssetsWebpackPlugin = require('assets-webpack-plugin'); const AssetsWebpackPlugin = require('assets-webpack-plugin');
const wpConfig = require('./webpack.config.yml'); const wpConfig = require('./webpack.config.yml');
let mode = process.env.NODE_ENV; let env = process.env.NODE_ENV || 'development';
mode = mode == 'production' ? mode : 'development'; let mode = env == 'development' ? env : 'production';
let outputPath = path.join(__dirname, wpConfig.buildDir); let outputPath = path.join(__dirname, wpConfig.buildDir);
@ -56,10 +56,10 @@ let baseConfig = {
] ]
}, },
optimization: { optimization: {
runtimeChunk: true,
splitChunks: { splitChunks: {
chunks: 'all', chunks: 'all',
}, }
runtimeChunk: true
}, },
resolve: { resolve: {
modules: [ modules: [
@ -79,6 +79,7 @@ let baseConfig = {
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
modules: false, modules: false,
assets: false,
colors: true colors: true
} }
}; };
@ -103,7 +104,7 @@ let devConfig = {
chunkFilename: '[id].js' chunkFilename: '[id].js'
}, },
devServer: { devServer: {
host: '127.0.0.1', host: 'localhost',
port: wpConfig.devServerPort, port: wpConfig.devServerPort,
publicPath: '/', publicPath: '/',
contentBase: wpConfig.buildDir, contentBase: wpConfig.buildDir,
@ -114,5 +115,5 @@ let devConfig = {
} }
}; };
let mrgConfig = mode === 'production' ? prodConfig : devConfig; let mrgConfig = mode === 'development' ? devConfig : prodConfig;
module.exports = merge(baseConfig, mrgConfig); module.exports = merge(baseConfig, mrgConfig);