Skip to content

Commit

Permalink
feat(userModel): set-up the user model
Browse files Browse the repository at this point in the history
- add the database name, password,port and localhost to the .env file
- run the sequelize model on the terminal to populate the user model and
  migrations
- run the migrations on the terminal to populate the database
- install uuidv4 dependency
- add a .env-example sample

[Delivers #168001215]
  • Loading branch information
Funmi Olaiya committed Aug 21, 2019
1 parent d198096 commit 07f5dbc
Show file tree
Hide file tree
Showing 10 changed files with 166 additions and 91 deletions.
9 changes: 6 additions & 3 deletions .env-example
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
DATABASE_URL=
DEV_DATABASE_URL=postgres://<db_user>:<db_password>@127.0.0.1:5432/dev_db
TEST_DATABASE_URL=postgres://<db_user>:<db_password>@127.0.0.1:5432/test_db
TEST_DB_NAME=<dummy-database-name>
DEV_DB_NAME=user_db=<real-database-name>
DB_USER=<databse-username>
DB_PASS=<database-password>
DB_PORT=<postgres-port>
DB_HOST=<localhost-ip-address>
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,4 +176,7 @@ typings/
.fusebox/

# DynamoDB Local files
.dynamodb/
.dynamodb/

# package-lock.json
package-lock.json
4 changes: 3 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ before_script:
script:
- npm run test
after_script:
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
after_success:
- npm run coverage
30 changes: 18 additions & 12 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,15 @@
"@babel/register": "^7.5.5",
"chai": "^4.2.0",
"chai-http": "^4.3.0",
"cross-env": "^5.2.0",
"coveralls": "^3.0.6",
"cross-env": "^5.2.0",
"eslint": "^5.16.0",
"eslint-config-airbnb-base": "^13.2.0",
"eslint-plugin-import": "^2.18.2",
"mocha": "^6.2.0",
"mocha-lcov-reporter": "^1.3.0",
"nodemon": "^1.19.1",
"nyc": "^14.1.1"
"nyc": "^14.1.1",
"sequelize-test-helpers": "^1.1.2"
}
}
}
12 changes: 6 additions & 6 deletions src/database/config/config.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
require('dotenv').config()
require('dotenv').config();

module.exports = {
module.exports = {
development: {
url: process.env.DEV_DATABASE_URL,
dialect: "postgres",
dialect: 'postgres',
},
test: {
url: process.env.TEST_DATABASE_URL,
dialect: "postgres",
dialect: 'postgres',
},
production: {
url: process.env.DATABASE_URL,
dialect: "postgres"
dialect: 'postgres'
},
}
};
98 changes: 56 additions & 42 deletions src/database/migrations/create-user.js
Original file line number Diff line number Diff line change
@@ -1,44 +1,58 @@
export default {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
first_name: {
type: Sequelize.STRING,
allowNull: false,
},
last_name: {
type: Sequelize.STRING,
allowNull: false
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true
},
password: {
type: Sequelize.STRING,
allowNull: false
},
is_admin: {
type: Sequelize.BOOLEAN,
defaultValue: false
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
up(queryInterface, Sequelize) {
return queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";')
.then(() => queryInterface.createTable('users', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.literal('uuid_generate_v4()'),
},
firstName: {
type: Sequelize.STRING,
allowNull: false,
},
lastName: {
type: Sequelize.STRING,
allowNull: false,
},
email: {
type: Sequelize.STRING,
allowNull: false,
},
password: {
type: Sequelize.STRING,
allowNull: false,
},
isAdmin: {
type: Sequelize.BOOLEAN,
allowNull: false,
},
phoneNumber: {
type: Sequelize.STRING,
allowNull: false,
},
department: {
type: Sequelize.ENUM('admin', 'staff', 'manager'),
allowNull: true,
},
office: {
type: Sequelize.STRING,
allowNull: true
},
imageUrl: {
type: Sequelize.STRING,
allowNull: true,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
},
}));
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('Users');
}
};
down: (queryInterface, Sequelize) => queryInterface.dropTable('users')
};
36 changes: 36 additions & 0 deletions src/database/seeders/users.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
export default {
up: (queryInterface, Sequelize) => queryInterface.bulkInsert(
'users',
[
{
firstName: 'funmi',
lastName: 'Olaiya',
email: 'funmi@yahoo.com',
password: 'funmi',
isAdmin: 'true',
phoneNumber: '66666666666',
department: 'staff',
office: 'software developer',
imageUrl: 'http://www.tco-team.com/blog/become-a-good-developer/',
createdAt: new Date(),
updatedAt: new Date()
},
{
firstName: 'kelechi',
lastName: 'oliver',
email: 'kelechi@yahoo.com',
password: 'kelechi',
isAdmin: 'true',
phoneNumber: '8888888888',
department: 'admin',
office: '',
imageUrl: '',
createdAt: new Date(),
updatedAt: new Date()
},
],
{}
),

down: (queryInterface, Sequelize) => queryInterface.bulkDelete('users', null, {})
};
44 changes: 28 additions & 16 deletions src/models/User.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,42 @@
export default (sequelize, DataTypes) => {
const User = sequelize.define('User', {
first_name: {
firstName: {
type: DataTypes.STRING,
allowNull: false
allowNull: false,
},
last_name: {
lastName: {
type: DataTypes.STRING,
allowNull: false
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
},
is_admin: {
type: DataTypes.BOOLEAN,
defaultValue: false,

}
}, {});
User.associate = (models) => {
// associations can be defined here
};
allowNull: false,
},
isAdmin: {
type: DataTypes.STRING,
allowNull: false,
},
phoneNumber: {
type: DataTypes.STRING,
allowNull: false,
},
department: {
type: DataTypes.ENUM,
values: ['admin', 'staff', 'manager'],
allowNull: true,
},
office: {
type: DataTypes.STRING,
allowNull: true,
},
imageUrl: {
type: DataTypes.STRING,
allowNull: true,
},
});
return User;
};
12 changes: 5 additions & 7 deletions src/models/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,13 @@ if (config.url) {

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));
.filter(file => (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 => {
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
Expand All @@ -34,4 +32,4 @@ Object.keys(db).forEach(modelName => {
db.sequelize = sequelize;
db.Sequelize = Sequelize;

export default db;
export default db;

0 comments on commit 07f5dbc

Please sign in to comment.