From 214b32080097f7695abbf9db2f978ca159bad98c Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 11 Jun 2021 21:33:43 +0700 Subject: [PATCH] first day --- .env | 12 ++--- .env template | 8 +++ app.js | 4 -- config/config.js | 1 + controllers/taskController.js | 45 +++++++++++++++++ controllers/userController.js | 34 +++++++++++++ middlewares/auth.js | 23 ++++++++- ...users.js => 20210611131608-create-user.js} | 0 migrations/20210611133056-create-task.js | 46 +++++++++++++++++ models/index.js | 2 +- models/{users.js => task.js} | 15 +++--- models/user.js | 49 +++++++++++++++++++ routes/index.js | 11 +++-- routes/tasks-route.js | 12 +++++ routes/todos-route.js | 13 ----- routes/users-route.js | 9 ---- 16 files changed, 238 insertions(+), 46 deletions(-) create mode 100644 .env template create mode 100644 controllers/taskController.js create mode 100644 controllers/userController.js rename migrations/{20210611124853-create-users.js => 20210611131608-create-user.js} (100%) create mode 100644 migrations/20210611133056-create-task.js rename models/{users.js => task.js} (62%) create mode 100644 models/user.js create mode 100644 routes/tasks-route.js delete mode 100644 routes/todos-route.js delete mode 100644 routes/users-route.js diff --git a/.env b/.env index 5f3fedd..5fd9c55 100644 --- a/.env +++ b/.env @@ -1,8 +1,8 @@ -SECRET_KEY_JWT="BluePeriod" +SECRET_KEY_JWT=BluePeriod -DEV_USERNAME = "postgres" -DEV_PASSWORD = -DEV_SERVER = "localhost" -DEV_DB = "kanban_db" +DEV_USERNAME=postgres +DEV_PASSWORD= +DEV_SERVER=localhost +DEV_DB=kanban_db -DEV_G_CLIENT_ID = 982085477024-6n2tpq82aracq5krun8e705oj863h0q2.apps.googleusercontent.com \ No newline at end of file +DEV_G_CLIENT_ID=982085477024-6n2tpq82aracq5krun8e705oj863h0q2.apps.googleusercontent.com \ No newline at end of file diff --git a/.env template b/.env template new file mode 100644 index 0000000..c549741 --- /dev/null +++ b/.env template @@ -0,0 +1,8 @@ +SECRET_KEY_JWT= + +DEV_USERNAME= +DEV_PASSWORD= +DEV_SERVER= +DEV_DB= + +DEV_G_CLIENT_ID= \ No newline at end of file diff --git a/app.js b/app.js index 43d1449..d439fb8 100644 --- a/app.js +++ b/app.js @@ -4,12 +4,8 @@ const app = express() const port = 3000 const routes = require('./routes') const cors = require('cors') -const { hash, compareHash } = require('./helpers/brcypt') const errorHandler = require('./middlewares/error-handler') -app.locals.hash = hash -app.locals.compareHash = compareHash - app.use(cors()) app.use(express.urlencoded({extended:true})) app.use(express.json()) diff --git a/config/config.js b/config/config.js index 0d103c1..d17e1de 100644 --- a/config/config.js +++ b/config/config.js @@ -1,3 +1,4 @@ +require("dotenv").config(); module.exports = { "development": { "username": process.env.DEV_USERNAME, diff --git a/controllers/taskController.js b/controllers/taskController.js new file mode 100644 index 0000000..52e2595 --- /dev/null +++ b/controllers/taskController.js @@ -0,0 +1,45 @@ +const {Task} = require('../models/index') +const {jwtEncrypt, jwtDecrypt} = require('../helpers/jwt') +const {compareHash} = require('../helpers/brcypt') + +class Controller{ + static postTask(req, res, next){ + let task = req.body + task.UserId = req.currentUser.id + task.deadline = new Date() + task.deadline = task.deadline.toISOString() + Task.create(task, {returning: true}) + .then(r => { + console.log(r) + res.status(201).json({r}) + }) + .catch(err => {next(err)}) + } + + static getTask(req, res, next){ + Task.findAll() + .then(taskData => { + res.status(200).json(taskData) + }) + .catch(err => {next(err)}) + } + + static deleteTask(req, res, next){ + Task.destroy({where: {id:req.params.id}, returning:true}) + .then(taskData => { + res.status(200).json("delete success") + }) + .catch(err => {next(err)}) + } + + static putTask(req, res, next){ + + } + + static patchTask(req, res, next){ + + } + +} + +module.exports = Controller \ No newline at end of file diff --git a/controllers/userController.js b/controllers/userController.js new file mode 100644 index 0000000..4be5e5e --- /dev/null +++ b/controllers/userController.js @@ -0,0 +1,34 @@ +const { User} = require('../models/index') +const {jwtEncrypt, jwtDecrypt} = require('../helpers/jwt') +const {compareHash} = require('../helpers/brcypt') + +class Controller{ + static postRegister(req, res, next){ + if (!req.body.email || !req.body.password) throw {name: "FillEmailPassword"} + User.create(req.body) + .then(() => { + res.status(200).json({message: "User Registered", email:req.body.email}) + }) + .catch((err) => { + next(err) + }) + } + + static postLogin(req, res, next){ + if (!req.body.email || !req.body.password) throw {name: "FillEmailPassword"} + User.findOne({where:{email: req.body.email.toLowerCase()}}) + .then(user => { + if (!user) throw {name: "noEmail"} + if(compareHash(req.body.password, user.password)){ + const token = jwtEncrypt({id: user.id, email: user.email}) + res.status(200).json({message: "login successful", access_token: token}) + } + else throw {name: "wrongPassword"} + }) + .catch((err) =>{ + next(err) + }) + } +} + +module.exports = Controller \ No newline at end of file diff --git a/middlewares/auth.js b/middlewares/auth.js index e4f488b..6e2621d 100644 --- a/middlewares/auth.js +++ b/middlewares/auth.js @@ -1,5 +1,5 @@ const {jwtDecrypt} = require("../helpers/jwt") -const {User, Todo} = require("../models") +const {User, Task} = require("../models") const authentication = (req, res, next) =>{ try{ @@ -10,6 +10,7 @@ const authentication = (req, res, next) =>{ if (!user){ throw {name: "AuthenticationError", message:"User not Found"} } else { + console.log('a') req.currentUser = {id: user.id} next() } @@ -21,4 +22,22 @@ const authentication = (req, res, next) =>{ } } -module.exports = {authentication, todoAuth} \ No newline at end of file +const authorization = (req, res, next) => { + Task.findOne({where:{id:id}}) + .then(task =>{ + if (!task) { + throw { + name: "TaskNotFound", + message: `task with id ${id} not found`, + } + } + if (todo.user_id == req.currentUser.id) { + req.target = todo + next() + } + else throw {name:"AuthorizationError"} + }) .catch(err =>{ + next(err) + }) +} +module.exports = {authentication, authorization} \ No newline at end of file diff --git a/migrations/20210611124853-create-users.js b/migrations/20210611131608-create-user.js similarity index 100% rename from migrations/20210611124853-create-users.js rename to migrations/20210611131608-create-user.js diff --git a/migrations/20210611133056-create-task.js b/migrations/20210611133056-create-task.js new file mode 100644 index 0000000..6296df8 --- /dev/null +++ b/migrations/20210611133056-create-task.js @@ -0,0 +1,46 @@ +'use strict'; +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.createTable('Tasks', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + allowNull: false, + type: Sequelize.STRING + }, + description: { + type: Sequelize.STRING + }, + deadline: { + type: Sequelize.DATE + }, + category: { + allowNull: false, + type: Sequelize.STRING + }, + UserId: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'Users', + Key: 'id' + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + down: async (queryInterface, Sequelize) => { + await queryInterface.dropTable('Tasks'); + } +}; \ No newline at end of file diff --git a/models/index.js b/models/index.js index 33f09e7..d2c6918 100644 --- a/models/index.js +++ b/models/index.js @@ -5,7 +5,7 @@ const path = require('path'); const Sequelize = require('sequelize'); const basename = path.basename(__filename); const env = process.env.NODE_ENV || 'development'; -const config = require(__dirname + '/../config/config.json')[env]; +const config = require(__dirname + '/../config/config.js')[env]; const db = {}; let sequelize; diff --git a/models/users.js b/models/task.js similarity index 62% rename from models/users.js rename to models/task.js index a279589..694ee5b 100644 --- a/models/users.js +++ b/models/task.js @@ -3,7 +3,7 @@ const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { - class Users extends Model { + class Task extends Model { /** * Helper method for defining associations. * This method is not a part of Sequelize lifecycle. @@ -13,12 +13,15 @@ module.exports = (sequelize, DataTypes) => { // define association here } }; - Users.init({ - email: DataTypes.STRING, - password: DataTypes.STRING + Task.init({ + name: DataTypes.STRING, + description: DataTypes.STRING, + deadline: DataTypes.DATE, + category: DataTypes.STRING, + UserId: DataTypes.INTEGER }, { sequelize, - modelName: 'Users', + modelName: 'Task', }); - return Users; + return Task; }; \ No newline at end of file diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..0832a79 --- /dev/null +++ b/models/user.js @@ -0,0 +1,49 @@ +'use strict'; +const {hash} = require('../helpers/brcypt') +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class User extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + }; + User.init({ + email: { + type: DataTypes.STRING, + unique: { + msg: 'email is already taken' + }, + validate: { + notEmpty: {msg: "Email cannot be empty"}, + isEmail: {msg: "Please use proper email format"} + }, + }, + password: { + type: DataTypes.STRING, + validate: { + notEmpty: {msg: "Password cannot be empty"}, + len: { + args: [4, 32], + msg: "Password must be between 4 to 32 characters" + } + } + }, + }, { + hooks:{ + beforeCreate: user =>{ + user.password = hash(user.password) + user.email = user.email.toLowerCase() + } + }, + sequelize, + modelName: 'User', + }); + return User; +}; \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index bedbbc7..bca53e8 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,10 +1,11 @@ const express = require('express'); const router = express.Router(); -const todoRoute = require('./todos-route') -const userRoute = require('./users-route') -const {authentication} = require('../middlewares/auth') +const taskRoute = require('./tasks-route') +const {authentication, authorization} = require('../middlewares/auth') +const userC = require('../controllers/userController') -router.use('/todos', authentication, todoRoute) -router.use('/users', userRoute) +router.post('/register', userC.postRegister) +router.post('/login', userC.postLogin) +router.use('/tasks', authentication, authorization, taskRoute) module.exports = router; \ No newline at end of file diff --git a/routes/tasks-route.js b/routes/tasks-route.js new file mode 100644 index 0000000..0ccdf3d --- /dev/null +++ b/routes/tasks-route.js @@ -0,0 +1,12 @@ +const express = require('express'); +const router = express.Router(); +const taskC = require('../controllers/taskController') +const {authorization} = require('../middlewares/auth') + +router.put('/', taskC.putTask) +router.post('/', taskC.postTask) +router.get('/', taskC.getTask) +router.delete('/', taskC.deleteTask) +router.patch('/', taskC.patchTask) + +module.exports = router; \ No newline at end of file diff --git a/routes/todos-route.js b/routes/todos-route.js deleted file mode 100644 index 20c7453..0000000 --- a/routes/todos-route.js +++ /dev/null @@ -1,13 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const todoC = require('../controllers/todo-controller') -const {authentication, todoAuth} = require('../middlewares/auth') - -router.get('/:id', todoAuth, todoC.getById) -router.get('/', todoC.getTodo) -router.patch('/:id', todoAuth, todoC.patchTodo) -router.put('/:id', todoAuth, todoC.putTodo) -router.delete('/:id', todoAuth, todoC.deleteTodo) -router.post('/', todoC.postTodo) - -module.exports = router; \ No newline at end of file diff --git a/routes/users-route.js b/routes/users-route.js deleted file mode 100644 index b1d94ba..0000000 --- a/routes/users-route.js +++ /dev/null @@ -1,9 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const userC = require('../controllers/user-controller') - -router.post('/register', userC.postRegister) -router.post('/login', userC.postLogin) -router.post('/gauth', userC.postGAuth) - -module.exports = router; \ No newline at end of file