Skip to content
This repository was archived by the owner on Mar 23, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions api/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const express = require('express');
const helmet = require('helmet');
const usersRouter = require('./users/usersRouter');

const server = express();

server.use(express.json());
server.use(helmet());
server.use('/api', usersRouter);

module.exports = server;
19 changes: 19 additions & 0 deletions api/users/usersModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const db = require('../../data/dbConfig');

module.exports = {
find,
findBy,
insert
}

function find() {
return db('users').select('id', 'username', 'department');
}

function findBy(user) {
return db('users').where(user).first();
}

function insert(user) {
return db('users').insert(user).then(([id]) => findBy({ id }).first());
}
55 changes: 55 additions & 0 deletions api/users/usersRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
const router = require('express').Router();

const Users = require('./usersModel.js');
const bcrypt = require('bcryptjs');
const genToken = require('../../utils/generateToken.js');
const restricted = require('../../utils/restricted.js');

// REGISTER A USER
router.post('/register', async (req, res) => {
const user = req.body;
if (!user.username && !user.password && !user.department)
return res.status(401).json({ message: "Provide a username, password, and a department." });
user.password = bcrypt.hashSync(user.password);

try {
const _user = await Users.insert(user);
res.status(201).json(_user);

} catch(error) {
res.status(400).json({ message: "This user already exists.", error });
}
});

// USER LOGIN
router.post('/login', async (req, res) => {
const { username, password } = req.body;
try {
const _user = await Users.findBy({ username });
if (_user && bcrypt.compareSync(password, _user.password)) {
const user = {
id: _user.id,
username: _user.username,
department: _user.department,
token: genToken(_user)
}
res.status(200).json(user);
} else {
res.status(401).json({ message: "Try again!" });
}
} catch(error) {
res.status(401).json({ message: "Try again!" });
}
});

// GET USERS
router.get('/users', restricted, async (req, res) => {
try {
const users = await Users.find();
res.status(200).json(users);
} catch(error) {
res.status(500).json({ message: "Error retrieving users" })
}
});

module.exports = router;
3 changes: 3 additions & 0 deletions data/dbConfig.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const environment = process.env.ENVIRONMENT || 'development';
const config = require('../knexfile.js')[environment];
module.exports = require('knex')(config);
20 changes: 20 additions & 0 deletions data/migrations/20200319201349_user-table.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
exports.up = function(knex) {
return (
knex.schema
.createTable('users', tbl => {
tbl.increments()
tbl.text('username')
.notNullable()
.unique();
tbl.string('password').notNullable();
tbl.text('department').notNullable();
})
);
};

exports.down = function(knex) {
return (
knex.schema
.dropTableIfExists('users')
);
};
7 changes: 7 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require('dotenv').config();
const server = require('./api/server.js');
const PORT = process.env.PORT || 3000;

server.listen(PORT, () => {
console.log(`Sever Listening On Port ${PORT}`);
});
14 changes: 14 additions & 0 deletions knexfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module.exports = {

development: {
client: 'sqlite3',
connection: {
filename: './data/users.db3'
},
migrations: {
directory: './data/migrations'
},
useNullAsDefault: true
}

};
Loading