added models for comment and user; added .eslintrc and .prettierrc
This commit is contained in:
parent
10091f28ff
commit
284be0ecdd
20
.eslintrc
Normal file
20
.eslintrc
Normal 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
6
.prettierrc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"tabWidth": 4,
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true
|
||||||
|
}
|
19
db/db.js
19
db/db.js
@ -1,8 +1,7 @@
|
|||||||
const Sequelize = require('sequelize');
|
const Sequelize = require('sequelize')
|
||||||
const pkg = require('../package.json');
|
const pkg = require('../package.json')
|
||||||
|
|
||||||
const databaseName =
|
const databaseName = pkg.name + (process.env.NODE_ENV === 'test' ? '-test' : '')
|
||||||
pkg.name + (process.env.NODE_ENV === 'test' ? '-test' : '');
|
|
||||||
|
|
||||||
const createDB = () => {
|
const createDB = () => {
|
||||||
const db = new Sequelize(
|
const db = new Sequelize(
|
||||||
@ -11,16 +10,16 @@ const createDB = () => {
|
|||||||
logging: false,
|
logging: false,
|
||||||
operatorsAliases: 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.
|
// This is a global Mocha hook used for resource cleanup.
|
||||||
// Otherwise, Mocha v4+ does not exit after tests.
|
// Otherwise, Mocha v4+ does not exit after tests.
|
||||||
if (process.env.NODE_ENV === 'test') {
|
if (process.env.NODE_ENV === 'test') {
|
||||||
after('close database connection', () => db.close());
|
after('close database connection', () => db.close())
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
const db = require('./db');
|
const db = require('./db')
|
||||||
|
|
||||||
// register models
|
// register models
|
||||||
require('./models');
|
require('./models')
|
||||||
|
|
||||||
module.exports = db;
|
module.exports = db
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
const Sequelize = require('sequelize');
|
const Sequelize = require('sequelize')
|
||||||
const db = require('../db');
|
const db = require('../db')
|
||||||
|
|
||||||
const Article = db.define('articles', {
|
const Article = db.define('articles', {
|
||||||
title: {
|
title: {
|
||||||
@ -9,6 +9,6 @@ const Article = db.define('articles', {
|
|||||||
link: {
|
link: {
|
||||||
type: Sequelize.STRING
|
type: Sequelize.STRING
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
module.exports = Article;
|
module.exports = Article
|
||||||
|
15
db/models/comment.js
Normal file
15
db/models/comment.js
Normal 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
|
@ -1,4 +1,19 @@
|
|||||||
const Item = require('./item');
|
const Item = require('./item')
|
||||||
const Article = require('./article');
|
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 }
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
const Sequelize = require('sequelize');
|
const Sequelize = require('sequelize')
|
||||||
const db = require('../db');
|
const db = require('../db')
|
||||||
|
|
||||||
const Item = db.define('items', {
|
const Item = db.define('items', {
|
||||||
name: {
|
name: {
|
||||||
type: Sequelize.STRING,
|
type: Sequelize.STRING,
|
||||||
allowNull: false
|
allowNull: false
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
module.exports = Item;
|
module.exports = Item
|
||||||
|
88
db/models/user.js
Normal file
88
db/models/user.js
Normal 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)
|
30
db/seed.js
30
db/seed.js
@ -1,27 +1,27 @@
|
|||||||
const db = require('../db');
|
const db = require('../db')
|
||||||
const { Article } = require('./models');
|
const { Article } = require('./models')
|
||||||
|
|
||||||
const testArticle = {
|
const testArticle = {
|
||||||
title: 'read desert',
|
title: 'read desert',
|
||||||
link: 'https://readdesert.org'
|
link: 'https://readdesert.org'
|
||||||
};
|
}
|
||||||
|
|
||||||
console.log(Article);
|
console.log(Article)
|
||||||
async function runSeed() {
|
async function runSeed() {
|
||||||
await db.sync({ force: true });
|
await db.sync({ force: true })
|
||||||
console.log('db synced!');
|
console.log('db synced!')
|
||||||
console.log('seeding...');
|
console.log('seeding...')
|
||||||
try {
|
try {
|
||||||
await Article.create(testArticle);
|
await Article.create(testArticle)
|
||||||
console.log('seeded successfully');
|
console.log('seeded successfully')
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err)
|
||||||
process.exitCode = 1;
|
process.exitCode = 1
|
||||||
} finally {
|
} finally {
|
||||||
console.log('closing db connection');
|
console.log('closing db connection')
|
||||||
await db.close();
|
await db.close()
|
||||||
console.log('db connection closed');
|
console.log('db connection closed')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
runSeed();
|
runSeed()
|
||||||
|
Loading…
Reference in New Issue
Block a user