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 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())
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
const db = require('./db');
|
||||
const db = require('./db')
|
||||
|
||||
// register models
|
||||
require('./models');
|
||||
require('./models')
|
||||
|
||||
module.exports = db;
|
||||
module.exports = db
|
||||
|
@ -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
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 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 }
|
||||
|
@ -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
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 { 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()
|
||||
|
Loading…
Reference in New Issue
Block a user