From 13bd07e810b2e889d539840e8c0c3d337b3dfb0f Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Sun, 9 Sep 2018 18:30:25 -0700 Subject: [PATCH] Configure sequelize and generate the first (and likely only) model: Event --- .sequelizerc | 8 +++++ config/database.js | 25 +++++++++++++++ migrations/.gitignore | 0 migrations/20180910012924-create-event.js | 34 ++++++++++++++++++++ package-lock.json | 39 +++++++++++++++++++++++ package.json | 1 + seeders/.gitignore | 0 src/models/event.ts | 11 +++++++ src/models/index.ts | 34 ++++++++++++++++++++ 9 files changed, 152 insertions(+) create mode 100644 .sequelizerc create mode 100644 config/database.js create mode 100644 migrations/.gitignore create mode 100644 migrations/20180910012924-create-event.js create mode 100644 seeders/.gitignore create mode 100644 src/models/event.ts create mode 100644 src/models/index.ts diff --git a/.sequelizerc b/.sequelizerc new file mode 100644 index 0000000..e4c4ffd --- /dev/null +++ b/.sequelizerc @@ -0,0 +1,8 @@ +const path = require('path') + +module.exports = { + 'config': path.resolve('config', 'database.js'), + 'models-path': path.resolve('src', 'models') +} + +// vim: ft=javascript diff --git a/config/database.js b/config/database.js new file mode 100644 index 0000000..e83b052 --- /dev/null +++ b/config/database.js @@ -0,0 +1,25 @@ +/* + * This module exists to dynamically construct the right configuration for the + * sequelize command line tool for migrations. + */ + +const fs = require('fs'); +const path = require('path'); + +const nodeEnv = process.env.NODE_ENV || 'development'; + +let connectorConfig = null; +let connectorConfigFile = path.join(__dirname, `${nodeEnv}.json`); + +if (fs.existsSync(connectorConfigFile)) { + connectorConfig = JSON.parse(fs.readFileSync(connectorConfigFile)); +} +else { + connectorConfig = JSON.parse(fs.readFileSync(path.join(__dirname, 'default.json'))); +} + +module.exports = {}; +module.exports[nodeEnv] = { + 'url' : process.env.DB_CONNECTION_STRING || connectorConfig['postgres'], + 'dialect' : 'postgresql', +}; diff --git a/migrations/.gitignore b/migrations/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/migrations/20180910012924-create-event.js b/migrations/20180910012924-create-event.js new file mode 100644 index 0000000..d319fb0 --- /dev/null +++ b/migrations/20180910012924-create-event.js @@ -0,0 +1,34 @@ +'use strict'; +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('Events', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + type: { + allowNull: false, + type: Sequelize.STRING + }, + payload: { + allowNull: false, + type: Sequelize.JSON + }, + createdAt: { + allowNull: false, + defaultValue: Sequelize.literal('NOW()'), + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + defaultValue: Sequelize.literal('NOW()'), + type: Sequelize.DATE + } + }); + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('Events'); + } +}; diff --git a/package-lock.json b/package-lock.json index 338f79c..566e534 100644 --- a/package-lock.json +++ b/package-lock.json @@ -274,6 +274,12 @@ "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==", "dev": true }, + "@types/bluebird": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.24.tgz", + "integrity": "sha512-YeQoDpq4Lm8ppSBqAnAeF/xy1cYp/dMTif2JFcvmAbETMRlvKHT2iLcWu+WyYiJO3b3Ivokwo7EQca/xfLVJmg==", + "dev": true + }, "@types/body-parser": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", @@ -302,6 +308,15 @@ "@types/node": "*" } }, + "@types/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/events": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", @@ -366,6 +381,12 @@ "integrity": "sha512-D1xlXHZpDonVX+VJ28XtcD5xlu8ex6Fc4cQNnrm2wJvlQnbec9RedhCrhQr6kRAE9XWHSec+JPuTmqJ9jC0qsA==", "dev": true }, + "@types/lodash": { + "version": "4.14.116", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", + "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==", + "dev": true + }, "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", @@ -389,6 +410,18 @@ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", "dev": true }, + "@types/sequelize": { + "version": "4.27.25", + "resolved": "https://registry.npmjs.org/@types/sequelize/-/sequelize-4.27.25.tgz", + "integrity": "sha512-wAoS4tz8MIS+4QfNWZKvO8gXBbwDhrI5PEpTUyTgwnR74M36/rGEVyugdK8KFj5IqamUJfFbAgnJ2Tw/16hKqw==", + "dev": true, + "requires": { + "@types/bluebird": "*", + "@types/continuation-local-storage": "*", + "@types/lodash": "*", + "@types/validator": "*" + } + }, "@types/serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", @@ -399,6 +432,12 @@ "@types/mime": "*" } }, + "@types/validator": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-9.4.1.tgz", + "integrity": "sha512-Y8UyLZvBPgckGhEIFCGBPj1tsRbpcZn4rbAp7lUxC3EW/nDR2V6t9LltE+mvDJxQQ+Bg3saE3UAwn6lsG5O1yQ==", + "dev": true + }, "@types/winston": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", diff --git a/package.json b/package.json index 465616c..063fd17 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@types/feathersjs__express": "^1.1.4", "@types/feathersjs__feathers": "^3.0.4", "@types/jest": "^23.3.2", + "@types/sequelize": "^4.27.25", "@types/winston": "^2.4.4", "jest": "^23.5.0", "nodemon": "^1.18.4", diff --git a/seeders/.gitignore b/seeders/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/src/models/event.ts b/src/models/event.ts new file mode 100644 index 0000000..c87bf59 --- /dev/null +++ b/src/models/event.ts @@ -0,0 +1,11 @@ +'use strict'; + +export default (sequelize, DataTypes) => { + const Event = sequelize.define('Event', { + type: DataTypes.STRING, + payload: DataTypes.JSON + }, {}); + Event.associate = function(models) { + }; + return Event; +}; diff --git a/src/models/index.ts b/src/models/index.ts new file mode 100644 index 0000000..f359149 --- /dev/null +++ b/src/models/index.ts @@ -0,0 +1,34 @@ +'use strict'; + +import fs from 'fs'; +import path from 'path'; +import Sequelize from 'sequelize'; + +const basename = path.basename(__filename); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/database')[env]; + + +const db : any = {}; +const sequelize = new Sequelize(config.database, config.username, config.password, config); + +fs + .readdirSync(__dirname) + .filter(file => { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + }) + .forEach(file => { + const model = sequelize['import'](path.join(__dirname, file)); + db[model.name] = model; + }); + +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +export default db;