move SQLite to MongoDB

This commit is contained in:
Sukchan Lee 2017-06-11 00:01:40 +09:00
parent 6531fd4761
commit 798ec79bac
9 changed files with 74 additions and 270 deletions

View File

@ -25,6 +25,7 @@
"open-color": "^1.5.1",
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"passport-local-mongoose": "^4.0.0",
"prop-types": "^15.5.10",
"react": "^15.5.4",
"react-dom": "^15.5.4",
@ -37,8 +38,6 @@
"redux": "^3.6.0",
"redux-actions": "^2.0.3",
"redux-saga": "^0.15.3",
"sequelize": "^3.30.4",
"sqlite3": "^3.1.8",
"styled-components": "2.0.0-19",
"yarn": "^0.24.5"
},

View File

@ -15,45 +15,44 @@ const mongoose = require('mongoose');
const MongoStore = require('connect-mongo')(session);
const passport = require('passport');
require('./passport');
const LocalStrategy = require('passport-local').Strategy;
const csrf = require('lusca').csrf();
const secret = process.env.SECRET_KEY || 'change-me';
const models = require('./models');
const api = require('./routes');
Promise.all([
app.prepare(),
models.sequelize.sync()
])
const Account = require('./models/account2.js');
mongoose.Promise = global.Promise;
const db = mongoose.connection;
if (dev) {
mongoose.set('debug', true);
}
mongoose.connect(process.env.DB_URI)
.then(() => {
mongoose.Promise = global.Promise;
const db = mongoose.connection;
db.on('error', err => { throw err });
db.once('open', () => {
console.log('Connected to mongod server');
});
if (dev) {
mongoose.set('debug', true);
}
mongoose.connect(process.env.DB_URI);
// FIXME : we need to implement landing page for adding admin account
models.AccountRole.count().then(c => {
if (c == 0) {
models.AccountRole.create({
role: 'admin',
Accounts: [{
username: 'admin',
password: '1423'
}]
}, {
include: [ models.AccountRole.Account ]
});
return app.prepare();
})
.then(() => {
// FIXME : we need to implement landing page for inserting admin account
Account.findByUsername('admin', true, (err, account) => {
if (err) {
console.error(err);
throw err;
}
});
if (!account) {
const newAccount = new Account();
newAccount.username = 'admin';
newAccount.roles = [ 'admin' ];
Account.register(newAccount, '1423', err => {
if (err) {
console.error(err);
throw err;
}
})
}
})
const server = express();
@ -82,6 +81,10 @@ Promise.all([
server.use(passport.initialize());
server.use(passport.session());
passport.use(new LocalStrategy(Account.authenticate()));
passport.serializeUser(Account.serializeUser());
passport.deserializeUser(Account.deserializeUser());
server.use('/api', api);
server.get('*', (req, res) => {

View File

@ -1,30 +0,0 @@
module.exports = (sequelize, DataTypes) => {
const Account = sequelize.define('Account', {
username: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isAlpha: true,
notEmpty: true
}
},
password: {
type: DataTypes.STRING,
allowNull: false
}
}, {
classMethods: {
associate: models => {
Account.AccountRole = Account.belongsTo(models.AccountRole, {
onDelete: 'CASCADE',
foreignKey: {
allowNull: false
}
});
}
},
freezeTableName: true
});
return Account;
};

View File

@ -1,21 +0,0 @@
module.exports = (sequelize, DataTypes) => {
const AccountRole = sequelize.define('AccountRole', {
role: {
type: DataTypes.STRING,
allowNull: false,
validate: {
isAlpha: true,
notEmpty: true
}
}
}, {
classMethods: {
associate: models => {
AccountRole.Account = AccountRole.hasMany(models.Account);
}
},
freezeTableName: true
});
return AccountRole;
};

View File

@ -1,15 +0,0 @@
module.exports = (sequelize, DataTypes) => {
const Session = sequelize.define('Session', {
sid: {
type: DataTypes.STRING,
primaryKey: true,
},
userId: DataTypes.STRING,
expires: DataTypes.DATE,
data: DataTypes.STRING(50000)
}, {
freezeTableName: true
});
return Session;
};

View File

@ -0,0 +1,11 @@
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const passportLocalMongoose = require('passport-local-mongoose');
const Account = new Schema({
roles: [String]
});
Account.plugin(passportLocalMongoose);
module.exports = mongoose.model('Account', Account);

View File

@ -1,31 +0,0 @@
process.env.DB_STORAGE = process.env.DB_STORAGE || '/tmp/nextepc.db';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const sequelize = new Sequelize(null, null, null, {
'dialect': 'sqlite',
'storage': process.env.DB_STORAGE,
'logging': false
});
var db = {};
fs
.readdirSync(__dirname)
.filter(file => {
return file.indexOf('.') !== 0 && file !== 'index.js';
})
.forEach(file => {
const model = sequelize.import(path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if ('associate' in db[modelName]) db[modelName].associate(db);
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;

View File

@ -1,32 +0,0 @@
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const models = require('../models');
passport.use(new LocalStrategy((username, password, done) => {
models.Account.findOne({ where: {username: username} }).then(account => {
if (!account) {
return done(null);
}
if (account.password != password) {
return done(null);
}
return done(null, account);
});
}));
passport.serializeUser((account, done) => {
done(null, account.id);
})
passport.deserializeUser((id, done) => {
models.Account.findOne({
where: { id: id },
include: [{ model: models.AccountRole }]
}).then(account => {
done(null, {
username: account.username,
role: account.AccountRole.role
});
})
});

View File

@ -2,10 +2,6 @@
# yarn lockfile v1
"@types/geojson@^1.0.0":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.2.tgz#b02d10ab028e2928ac592a051aaa4981a1941d03"
abbrev@1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
@ -988,7 +984,7 @@ bluebird@2.10.2:
version "2.10.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.10.2.tgz#024a5517295308857f14f91f1106fc3b555f446b"
bluebird@^3.0, bluebird@^3.3.4, bluebird@^3.4.6:
bluebird@^3.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
@ -1368,14 +1364,7 @@ create-react-class@^15.5.3, create-react-class@^15.5.x:
loose-envify "^1.3.1"
object-assign "^4.1.1"
cross-env@^3.1.2:
version "3.2.4"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-3.2.4.tgz#9e0585f277864ed421ce756f81a980ff0d698aba"
dependencies:
cross-spawn "^5.1.0"
is-windows "^1.0.0"
cross-spawn@5.1.0, cross-spawn@^5.1.0:
cross-spawn@5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
dependencies:
@ -1489,7 +1478,7 @@ delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
depd@1.1.0, depd@^1.1.0, depd@~1.1.0:
depd@1.1.0, depd@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
@ -1534,10 +1523,6 @@ domain-browser@^1.1.1:
version "1.1.7"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
dottie@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/dottie/-/dottie-1.1.1.tgz#45c2a3f48bd6528eeed267a69a848eaaca6faa6a"
duplexify@^3.1.2, duplexify@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604"
@ -1923,9 +1908,9 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
generic-pool@2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.2.tgz#886bc5bf0beb7db96e81bcbba078818de5a62683"
generaterr@^1.2.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/generaterr/-/generaterr-1.5.0.tgz#b0ceb6cc5164df2a061338cc340a8615395c52fc"
get-caller-file@^1.0.1:
version "1.0.2"
@ -2163,10 +2148,6 @@ indexof@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
inflection@^1.6.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -2381,10 +2362,6 @@ is-windows-bash@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-windows-bash/-/is-windows-bash-1.0.3.tgz#00132a47dcdacb00a9d68f3408a4d01d76215e88"
is-windows@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9"
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@ -2545,14 +2522,14 @@ lodash-es@^4.17.4, lodash-es@^4.2.0, lodash-es@^4.2.1:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7"
lodash@4.12.0, lodash@^4.2.0, lodash@^4.2.1:
version "4.12.0"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.12.0.tgz#2bd6dc46a040f59e686c972ed21d93dc59053258"
lodash@^4.13.1, lodash@^4.14.0, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
lodash@^4.2.0, lodash@^4.2.1:
version "4.12.0"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.12.0.tgz#2bd6dc46a040f59e686c972ed21d93dc59053258"
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@ -2694,13 +2671,7 @@ mkdirp-then@1.2.0:
dependencies:
minimist "0.0.8"
moment-timezone@^0.5.4:
version "0.5.13"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90"
dependencies:
moment ">= 2.9.0"
"moment@>= 2.9.0", moment@^2.11.2, moment@^2.13.0:
moment@^2.11.2:
version "2.18.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f"
@ -2799,7 +2770,7 @@ mz@2.6.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
nan@^2.3.0, nan@~2.4.0:
nan@^2.3.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
@ -2911,7 +2882,7 @@ node-libs-browser@^2.0.0:
util "^0.10.3"
vm-browserify "0.0.4"
node-pre-gyp@^0.6.29, node-pre-gyp@~0.6.31:
node-pre-gyp@^0.6.29:
version "0.6.36"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
dependencies:
@ -3102,6 +3073,15 @@ parseurl@~1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
passport-local-mongoose@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/passport-local-mongoose/-/passport-local-mongoose-4.0.0.tgz#10fee927eaf9785bb2e10e2a8c446a0ff1fa0107"
dependencies:
generaterr "^1.2.0"
passport-local "^1.0.0"
scmp "^1.0.0"
semver "^5.1.0"
passport-local@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee"
@ -3664,14 +3644,6 @@ restore-cursor@^2.0.0:
onetime "^2.0.0"
signal-exit "^3.0.2"
retry-as-promised@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.2.0.tgz#b0463d7fd3cf5b2fed64500ab6e8b8a49c5b8e6c"
dependencies:
bluebird "^3.4.6"
cross-env "^3.1.2"
debug "^2.2.0"
retry@^0.10.0:
version "0.10.1"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
@ -3715,7 +3687,11 @@ safe-buffer@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.1.0, semver@^5.3.0:
scmp@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/scmp/-/scmp-1.0.2.tgz#bc4e4e2713252b04210cdff9cef3ade2c8fa7370"
"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@ -3755,27 +3731,6 @@ send@0.15.3:
range-parser "~1.2.0"
statuses "~1.3.1"
sequelize@^3.30.4:
version "3.30.4"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-3.30.4.tgz#bda2df1e31854b099e4149a111e9fc0a5ca1d1a4"
dependencies:
bluebird "^3.3.4"
depd "^1.1.0"
dottie "^1.0.0"
generic-pool "2.4.2"
inflection "^1.6.0"
lodash "4.12.0"
moment "^2.13.0"
moment-timezone "^0.5.4"
retry-as-promised "^2.0.0"
semver "^5.0.1"
shimmer "1.1.0"
terraformer-wkt-parser "^1.1.0"
toposort-class "^1.0.1"
uuid "^3.0.0"
validator "^5.2.0"
wkx "0.2.0"
serve-static@1.12.3:
version "1.12.3"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2"
@ -3817,10 +3772,6 @@ shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
shimmer@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.1.0.tgz#97d7377137ffbbab425522e429fe0aa89a488b35"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -3877,13 +3828,6 @@ spdx-license-ids@^1.0.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
sqlite3@^3.1.8:
version "3.1.8"
resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-3.1.8.tgz#4cbcf965d8b901d1b1015cbc7fc415aae157dfaa"
dependencies:
nan "~2.4.0"
node-pre-gyp "~0.6.31"
sshpk@^1.7.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
@ -4084,18 +4028,6 @@ tar@^2.2.1:
fstream "^1.0.2"
inherits "2"
terraformer-wkt-parser@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.2.tgz#336a0c8fc82094a5aff83288f69aedecd369bf0c"
dependencies:
terraformer "~1.0.5"
terraformer@~1.0.5:
version "1.0.8"
resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.8.tgz#51e0ad89746fcf2161dc6f65aa70e42377c8b593"
dependencies:
"@types/geojson" "^1.0.0"
thenify-all@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
@ -4139,10 +4071,6 @@ to-fast-properties@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
toposort-class@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
touch@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de"
@ -4251,10 +4179,6 @@ validate-npm-package-license@^3.0.1:
spdx-correct "~1.0.0"
spdx-expression-parse "~1.0.0"
validator@^5.2.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-5.7.0.tgz#7a87a58146b695ac486071141c0c49d67da05e5c"
vary@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37"
@ -4360,10 +4284,6 @@ window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
wkx@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.2.0.tgz#76c24f16acd0cd8f93cd34aa331e0f7961256e84"
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"