added models for comment and user; added .eslintrc and .prettierrc

This commit is contained in:
notnull 2019-02-13 11:07:11 -05:00
parent 10091f28ff
commit 284be0ecdd
10 changed files with 182 additions and 39 deletions

20
.eslintrc Normal file
View File

@ -0,0 +1,20 @@
{
"extends": ["eslint:recommended"],
"parserOptions": {
"ecmaVersion": 8
},
"env": {
"es6": true,
"node": true
},
"rules": {
"quotes": ["warn", "single"],
"semi": ["warn", "never"],
"indent": ["warn", 2],
"no-unused-vars": ["warn"],
"no-console": 0
}
}

6
.prettierrc Normal file
View File

@ -0,0 +1,6 @@
{
"trailingComma": "es5",
"tabWidth": 4,
"semi": false,
"singleQuote": true
}

View File

@ -1,8 +1,7 @@
const Sequelize = require('sequelize');
const pkg = require('../package.json');
const Sequelize = require('sequelize')
const pkg = require('../package.json')
const databaseName =
pkg.name + (process.env.NODE_ENV === 'test' ? '-test' : '');
const databaseName = pkg.name + (process.env.NODE_ENV === 'test' ? '-test' : '')
const createDB = () => {
const db = new Sequelize(
@ -11,16 +10,16 @@ const createDB = () => {
logging: false,
operatorsAliases: false
}
);
return db;
};
)
return db
}
const db = createDB();
const db = createDB()
module.exports = db;
module.exports = db
// This is a global Mocha hook used for resource cleanup.
// Otherwise, Mocha v4+ does not exit after tests.
if (process.env.NODE_ENV === 'test') {
after('close database connection', () => db.close());
after('close database connection', () => db.close())
}

View File

@ -1,6 +1,6 @@
const db = require('./db');
const db = require('./db')
// register models
require('./models');
require('./models')
module.exports = db;
module.exports = db

View File

@ -1,5 +1,5 @@
const Sequelize = require('sequelize');
const db = require('../db');
const Sequelize = require('sequelize')
const db = require('../db')
const Article = db.define('articles', {
title: {
@ -9,6 +9,6 @@ const Article = db.define('articles', {
link: {
type: Sequelize.STRING
}
});
})
module.exports = Article;
module.exports = Article

15
db/models/comment.js Normal file
View File

@ -0,0 +1,15 @@
const Sequelize = require('sequelize')
const db = require('../db')
const Comment = db.define('comment', {
title: {
type: Sequelize.STRING
},
content: {
type: Sequelize.TEXT,
allowNull: false
}
})
module.exports = Comment

View File

@ -1,4 +1,19 @@
const Item = require('./item');
const Article = require('./article');
const Item = require('./item')
const Article = require('./article')
const Comment = require('./comment')
//const User = require('./user')
module.exports = { Item, Article };
Article.hasMany(Comment) //puts postId on Comment
Comment.belongsTo(Article)
//User.hasMany(Article) //puts userId on Post, creates instance method 'user.getPosts()'
//Article.belongsTo(User) // creates instance method 'post.getUser()''
//User.hasMany(Comment) //puts userId on Comment
//Comment.belongsTo(User) //puts userId on Comment
// TODO
//Comment.belongsTo(Comment, { as: 'parent' })
//Comment.hasMany(Comment, { as: { singular: 'reply', plural: 'replies' } })
module.exports = { Item, Article, Comment }

View File

@ -1,11 +1,11 @@
const Sequelize = require('sequelize');
const db = require('../db');
const Sequelize = require('sequelize')
const db = require('../db')
const Item = db.define('items', {
name: {
type: Sequelize.STRING,
allowNull: false
}
});
})
module.exports = Item;
module.exports = Item

88
db/models/user.js Normal file
View File

@ -0,0 +1,88 @@
/*
note: this currently isn't exported because I will
have to investigate the salting etc.
*/
const crypto = require('crypto')
const Sequelize = require('sequelize')
const db = require('../db')
const User = db.define('user', {
email: {
type: Sequelize.STRING,
unique: true,
allowNull: false
},
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
},
username: {
type: Sequelize.STRING,
unique: true,
allowNull: false
},
imageUrl: {
type: Sequelize.STRING,
defaultValue: 'novatore.jpg'
},
password: {
type: Sequelize.STRING,
// Making `.password` act like a func hides it when serializing to JSON.
// This is a hack to get around Sequelize's lack of a "private" option.
get() {
return () => this.getDataValue('password')
}
},
salt: {
type: Sequelize.STRING,
// Making `.salt` act like a function hides it when serializing to JSON.
// This is a hack to get around Sequelize's lack of a "private" option.
get() {
return () => this.getDataValue('salt')
}
},
googleId: {
type: Sequelize.STRING
}
})
module.exports = User
/**
* instanceMethods
*/
User.prototype.correctPassword = function(candidatePwd) {
return User.encryptPassword(candidatePwd, this.salt()) === this.password()
}
/**
* classMethods
*/
User.generateSalt = function() {
return crypto.randomBytes(16).toString('base64')
}
User.encryptPassword = function(plainText, salt) {
return crypto
.createHash('RSA-SHA256')
.update(plainText)
.update(salt)
.digest('hex')
}
/**
* hooks
*/
const setSaltAndPassword = user => {
if (user.changed('password')) {
user.salt = User.generateSalt()
user.password = User.encryptPassword(user.password(), user.salt())
}
}
User.beforeCreate(setSaltAndPassword)
User.beforeUpdate(setSaltAndPassword)

View File

@ -1,27 +1,27 @@
const db = require('../db');
const { Article } = require('./models');
const db = require('../db')
const { Article } = require('./models')
const testArticle = {
title: 'read desert',
link: 'https://readdesert.org'
};
}
console.log(Article);
console.log(Article)
async function runSeed() {
await db.sync({ force: true });
console.log('db synced!');
console.log('seeding...');
await db.sync({ force: true })
console.log('db synced!')
console.log('seeding...')
try {
await Article.create(testArticle);
console.log('seeded successfully');
await Article.create(testArticle)
console.log('seeded successfully')
} catch (err) {
console.error(err);
process.exitCode = 1;
console.error(err)
process.exitCode = 1
} finally {
console.log('closing db connection');
await db.close();
console.log('db connection closed');
console.log('closing db connection')
await db.close()
console.log('db connection closed')
}
}
runSeed();
runSeed()