From e380744a53cae908116c6c2cefeaf1cf7648b09c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 24 Jun 2021 21:52:08 +0700 Subject: [PATCH] remaining task: documentation --- .env | 2 +- controllers/taskController.js | 16 +- controllers/userController.js | 12 +- middlewares/auth.js | 4 + migrations/20210611131608-create-user.js | 3 + migrations/20210611133056-create-task.js | 7 +- models/task.js | 18 +- models/user.js | 4 + package-lock.json | 209 ++++++++++++++++++++++- package.json | 1 + routes/index.js | 1 + 11 files changed, 245 insertions(+), 32 deletions(-) diff --git a/.env b/.env index 5fd9c55..7d61ea2 100644 --- a/.env +++ b/.env @@ -5,4 +5,4 @@ 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-5msqv561q4b1jj1je93dvrs5dcseu1b2.apps.googleusercontent.com \ No newline at end of file diff --git a/controllers/taskController.js b/controllers/taskController.js index a0c8d49..fd9e3a9 100644 --- a/controllers/taskController.js +++ b/controllers/taskController.js @@ -1,9 +1,10 @@ -const {Task} = require('../models/index') +const {Task, User} = require('../models/index') const {jwtEncrypt, jwtDecrypt} = require('../helpers/jwt') const {compareHash} = require('../helpers/brcypt') class Controller{ static postTask(req, res, next){ + console.log('posting task') let task = req.body console.log(task) console.log(req.currentUser) @@ -17,8 +18,16 @@ class Controller{ } static getTask(req, res, next){ - Task.findAll() + Task.findAll({include:[{ + model: User, + attributes: ["alias", "id"] + }] + }) .then(taskData => { + // console.log(taskData) + taskData.forEach(el => { + if(el.User.id == req.currentUser.id) {el.dataValues.editable = true} + }) res.status(200).json(taskData) }) .catch(err => {next(err)}) @@ -33,8 +42,9 @@ class Controller{ } static putTask(req, res, next){ + console.log('putting task') let data = req.body - data.deadline = new Date() + console.log(req.body) Task.update(data, {where: {id:req.params.id}, returning:true}) .then(results =>{ res.status(200).json(results[1]) diff --git a/controllers/userController.js b/controllers/userController.js index d801bef..cc88b83 100644 --- a/controllers/userController.js +++ b/controllers/userController.js @@ -1,13 +1,14 @@ const { User} = require('../models/index') const {jwtEncrypt, jwtDecrypt} = require('../helpers/jwt') const {compareHash} = require('../helpers/brcypt') -const {OAuth2Client} = require('google-auth-library'); -const CLIENT_ID = 'temp' -const client = new OAuth2Client(CLIENT_ID); +const {OAuth2Client} = require('google-auth-library') +const GCLIENT_ID = process.env.GCLIENT_ID +const client = new OAuth2Client(GCLIENT_ID); class Controller{ static postRegister(req, res, next){ + console.log('test') if (!req.body.email || !req.body.password) throw {name: "FillEmailPassword"} User.create(req.body) .then(() => { @@ -35,14 +36,15 @@ class Controller{ } static gLogin(req, res, next){ + let gmail = "" client.verifyIdToken({ idToken: req.body.idToken, audience: GCLIENT_ID, }) .then(ticket =>{ const payload = ticket.getPayload(); - const gmail = payload['email']; - return User.findOne({where:{email:gmail}}) + gmail = payload['email']; + return User.findOne({where:{email: gmail}}) }) .then(user => { if (!user){ diff --git a/middlewares/auth.js b/middlewares/auth.js index 8892e66..cfb0490 100644 --- a/middlewares/auth.js +++ b/middlewares/auth.js @@ -4,6 +4,8 @@ const {User, Task} = require("../models") const authentication = (req, res, next) =>{ try{ const {access_token} = req.headers + console.log(req.header) + console.log(access_token) const dataDecoded = jwtDecrypt(access_token) User.findByPk(dataDecoded.id) .then(user => { @@ -24,8 +26,10 @@ const authentication = (req, res, next) =>{ const authorization = (req, res, next) => { let id = req.params.id + console.log('authorization') Task.findOne({where:{id:id}}) .then(task =>{ + console.log('auth') if (!task) { throw { name: "TaskNotFound", diff --git a/migrations/20210611131608-create-user.js b/migrations/20210611131608-create-user.js index 0bc1d15..df96ed1 100644 --- a/migrations/20210611131608-create-user.js +++ b/migrations/20210611131608-create-user.js @@ -17,6 +17,9 @@ module.exports = { type: Sequelize.STRING, allowNull: false }, + alias: { + type: Sequelize.STRING, + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/migrations/20210611133056-create-task.js b/migrations/20210611133056-create-task.js index 6296df8..2a3a0bd 100644 --- a/migrations/20210611133056-create-task.js +++ b/migrations/20210611133056-create-task.js @@ -12,15 +12,12 @@ module.exports = { allowNull: false, type: Sequelize.STRING }, - description: { - type: Sequelize.STRING - }, deadline: { type: Sequelize.DATE }, category: { - allowNull: false, - type: Sequelize.STRING + type: Sequelize.STRING, + allowNull: false }, UserId: { type: Sequelize.INTEGER, diff --git a/models/task.js b/models/task.js index 44d306b..d0b9e6d 100644 --- a/models/task.js +++ b/models/task.js @@ -23,27 +23,11 @@ module.exports = (sequelize, DataTypes) => { notEmpty: {msg: "Task name may not be empty"} } }, - description: DataTypes.STRING, deadline: { type: DataTypes.DATE, - validate:{ - dateCheck(taskDate) { - if (taskDate) { - let taskDate = taskDate.getTime() - let date = new Date() - date = new Date(date.toISOString().slice(0,10).getTime()) - if (taskDate < date) throw {msg: "Deadline must be after today"} - } - } - } }, category: { type: DataTypes.STRING, - validate: { - categories(cat){ - if (cat != "backlog" && cat != "todo" && cat != "doing" && cat != "done") throw {msg: "Invalid Category"} - } - } }, UserId: DataTypes.INTEGER }, { @@ -51,7 +35,7 @@ module.exports = (sequelize, DataTypes) => { beforeValidate: task => { if (!task.deadline) {task.deadline = null} if (!task.deadline) {task.deadline = null} - + console.log(task.deadline) } }, sequelize, diff --git a/models/user.js b/models/user.js index 525cabd..31c1a05 100644 --- a/models/user.js +++ b/models/user.js @@ -36,11 +36,15 @@ module.exports = (sequelize, DataTypes) => { } } }, + alias: { + type: DataTypes.STRING + } }, { hooks:{ beforeCreate: user =>{ user.password = hash(user.password) user.email = user.email.toLowerCase() + if (!user.alias) {user.alias = user.email} } }, sequelize, diff --git a/package-lock.json b/package-lock.json index b0cb37a..c916ea0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,22 @@ { - "requires": true, + "name": "kanban-server", + "version": "1.0.0", "lockfileVersion": 1, + "requires": true, "dependencies": { "@types/node": { "version": "15.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -16,6 +26,29 @@ "negotiator": "0.6.2" } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -26,11 +59,26 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -151,6 +199,11 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -188,6 +241,16 @@ "vary": "~1.1.2" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -212,6 +275,103 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "gaxios": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.0.tgz", + "integrity": "sha512-pHplNbslpwCLMyII/lHPWFQbJWOX0B3R1hwBEOvzYi1GmdKZruuEHK4N9V6f7tf1EaPYyF80mui1+344p6SmLg==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.0.tgz", + "integrity": "sha512-L9XQUpvKJCM76YRSmcxrR4mFPzPGsgZUH+GgHMxAET8qc6+BhRJq63RLhWakgEO2KKVgeSDVfyiNjkGSADwNTA==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, + "google-auth-library": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.1.2.tgz", + "integrity": "sha512-FMipHgfe2u1LzWsf2n9zEB9KsJ8M3n8OYTHbHtlkzPCyo7IknXQR5X99nfvwUHGuX+iEpihUZxDuPm7+qBYeXg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "google-p12-pem": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.0.tgz", + "integrity": "sha512-JUtEHXL4DY/N+xhlm7TC3qL797RPAtk0ZGXNs3/gWyiDHYoA/8Rjes0pztkda+sZv4ej1EoO2KhWgW5V9KTrSQ==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "gtoken": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.0.tgz", + "integrity": "sha512-mCcISYiaRZrJpfqOs0QWa6lfEM/C1V9ASkzFmuz43XBb5s1Vynh+CZy1ECeeJXVGx2PRByjYzb4Y4/zr1byr0w==", + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -224,6 +384,30 @@ "toidentifier": "1.0.0" } }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -247,6 +431,19 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -394,6 +591,16 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", diff --git a/package.json b/package.json index a35532b..3141603 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "cors": "^2.8.5", "dotenv": "^10.0.0", "express": "^4.17.1", + "google-auth-library": "^7.1.2", "jsonwebtoken": "^8.5.1", "pg": "^8.6.0", "sequelize": "^6.6.2" diff --git a/routes/index.js b/routes/index.js index 758a05c..0f1a366 100644 --- a/routes/index.js +++ b/routes/index.js @@ -6,6 +6,7 @@ const userC = require('../controllers/userController') router.post('/register', userC.postRegister) router.post('/login', userC.postLogin) +router.post('/glogin', userC.gLogin) router.use('/tasks', authentication, taskRoute) module.exports = router; \ No newline at end of file