From e47b7ce99de2502c927d963526381888f411ee95 Mon Sep 17 00:00:00 2001 From: Edward Kim Date: Mon, 18 Mar 2019 16:14:50 -1000 Subject: [PATCH] Added db decorator and migration in docker deployment --- Dockerfile | 2 +- deploy-dev.js | 47 ++++++++++++++++++++++++++++++++++++ deploy-prod.js | 31 ++++++++++++++++++++++++ docker-compose.override.yml | 2 +- package.json | 1 - server/database/decorator.js | 6 +++++ server/knexfile.js | 4 +-- server/routes/users/index.js | 27 +++++++++++++++++++++ server/server.js | 30 +++++------------------ 9 files changed, 121 insertions(+), 29 deletions(-) create mode 100644 deploy-dev.js create mode 100644 deploy-prod.js create mode 100644 server/database/decorator.js create mode 100644 server/routes/users/index.js diff --git a/Dockerfile b/Dockerfile index dc909d7..3b813a9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,4 +33,4 @@ COPY . . EXPOSE 8080 # Start the Express server -CMD ["node", "./server/server.js"] +CMD ["node", "./deploy-prod.js"] diff --git a/deploy-dev.js b/deploy-dev.js new file mode 100644 index 0000000..4fe407c --- /dev/null +++ b/deploy-dev.js @@ -0,0 +1,47 @@ +const nodemon = require('nodemon'); +const knex = require('./server/database/knex'); + +const DELAY = 3000; + +function testConnection() { + return new Promise((resolve) => { + setTimeout(() => { + console.log('Polling for DB Connection...'); + knex.migrate.latest() + .then(resolve) + .catch((err) => { + console.log(err); + resolve(testConnection()); + }); + }, DELAY); + }) +} + +// migrate db +testConnection() +// run seeds +.then(() => { knex.seed.run(); }) +// print status +.then(() => { + console.log('Migration and Seeds Finished'); +}) +// run server using nodemon +.then(() => { + nodemon({ + script: './server/server.js', + ext: 'js json' + }); + + nodemon.on('start', function () { + console.log('App has started'); + }).on('quit', function () { + console.log('App has quit'); + process.exit(); + }).on('restart', function (files) { + console.log('App restarted due to: ', files); + }); +}) +.catch((err) => { + console.log(err); + process.exit(1); +}); diff --git a/deploy-prod.js b/deploy-prod.js new file mode 100644 index 0000000..58ab09a --- /dev/null +++ b/deploy-prod.js @@ -0,0 +1,31 @@ +const knex = require('./server/database/knex'); + +const DELAY = 3000; + +function testConnection() { + return new Promise((resolve) => { + setTimeout(() => { + console.log('Polling for DB Connection...'); + knex.migrate.latest() + .then(resolve) + .catch(() => { resolve(testConnection()); }); + }, DELAY); + }) +} + +// migrate db +testConnection() +// run seeds +.then(() => { knex.seed.run(); }) +// print status +.then(() => { + console.log('Migration and Seeds Finished'); +}) +// run server +.then(() => { + require('./server/server'); +}) +.catch((err) => { + console.log(err); + process.exit(1); +}); diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 9229266..4006262 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -4,7 +4,7 @@ services: image: ${DOCKERHUB_NAME}/${IMAGE_NAME}:${IMAGE_VERSION} depends_on: - postgres-primary-db - command: ["npm", "run", "dev"] + command: ["node", "deploy-dev.js"] container_name: ${IMAGE_NAME} volumes: - ".:/src/app" diff --git a/package.json b/package.json index 7bf5985..6586b59 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "react-scripts": "2.1.2" }, "scripts": { - "dev": "./node_modules/nodemon/bin/nodemon.js ./server/server.js", "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", diff --git a/server/database/decorator.js b/server/database/decorator.js new file mode 100644 index 0000000..5811829 --- /dev/null +++ b/server/database/decorator.js @@ -0,0 +1,6 @@ +const User = require('./models/User'); + +module.exports = function(req, res, next) { + req.database = { User }; + next(); +} diff --git a/server/knexfile.js b/server/knexfile.js index 0fe4aeb..cae44c9 100644 --- a/server/knexfile.js +++ b/server/knexfile.js @@ -16,9 +16,9 @@ module.exports = { }, migrations: { tableName: 'knex_migrations', - directory: './database/migrations' + directory: './server/database/migrations' }, seeds: { - directory: './database/seeds' + directory: './server/database/seeds' } }; diff --git a/server/routes/users/index.js b/server/routes/users/index.js new file mode 100644 index 0000000..b28275e --- /dev/null +++ b/server/routes/users/index.js @@ -0,0 +1,27 @@ +const express = require('express'); +const router = express.Router(); + +router.route('/users') +.get((req, res) => { + return new req.database.User().fetchAll() + .then((users) => { + return res.json(users); + }) + .catch((err) => { + console.log(err); + res.sendStatus(500); + }); +}) +.post((req, res) => { + const username = req.body.username; + return new req.database.User({ username }).save() + .then((user) => { + return res.json({ success: true }); + }) + .catch((err) => { + console.log(err); + res.sendStatus(500); + }); +}); + +module.exports = router; diff --git a/server/server.js b/server/server.js index 2b54b81..fce572e 100644 --- a/server/server.js +++ b/server/server.js @@ -1,6 +1,7 @@ const express = require('express'); const bodyParser = require('body-parser'); -const User = require('./database/models/User'); +const userRoutes = require('./routes/users'); +const decorator = require('./database/decorator'); // data vars const PORT = process.env.PORT; @@ -16,34 +17,15 @@ if (!PORT || !SESSION_SECRET || !REDIS_HOSTNAME) { return process.exit(1); } const app = express(); app.use(bodyParser.json({ extended: true })); +// decorate request with database +app.use(decorator); + // routes +app.use('/api', userRoutes); app.get('/api/smoke', (req, res) => { res.json({ smoke: 'test' }); }); -app.get('/api/users', (req, res) => { - return new User().fetchAll() - .then((users) => { - return res.json(users); - }) - .catch((err) => { - console.log(err); - res.sendStatus(500); - }); -}); - -app.post('/api/users', (req, res) => { - const username = req.body.username; - return new User({ username }).save() - .then((user) => { - return res.json({ success: true }); - }) - .catch((err) => { - console.log(err); - res.sendStatus(500); - }); -}) - // start server app.listen(PORT, () => { console.log(`Server stated on port: ${PORT}`);