From c440919e567912b0f6c4fef6078757bf5a79f4a7 Mon Sep 17 00:00:00 2001 From: dannst Date: Thu, 23 Apr 2020 09:58:47 +0800 Subject: [PATCH 1/4] added login, register, and tweet functionalities --- controllers/pokemon.js | 25 -- controllers/tweedr_controllers.js | 126 +++++++ db.js | 11 +- models/pokemon.js | 38 -- models/tweedr_models.js | 87 +++++ package-lock.json | 606 +++++++++++++++++------------- package.json | 23 +- routes.js | 20 +- tables.sql | 18 + views/index.jsx | 35 ++ views/login.jsx | 22 ++ views/pokemon/index.jsx | 17 - views/register.jsx | 22 ++ 13 files changed, 689 insertions(+), 361 deletions(-) delete mode 100644 controllers/pokemon.js create mode 100644 controllers/tweedr_controllers.js delete mode 100644 models/pokemon.js create mode 100644 models/tweedr_models.js create mode 100644 views/index.jsx create mode 100644 views/login.jsx delete mode 100644 views/pokemon/index.jsx create mode 100644 views/register.jsx diff --git a/controllers/pokemon.js b/controllers/pokemon.js deleted file mode 100644 index fcd9fac..0000000 --- a/controllers/pokemon.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = (db) => { - - /** - * =========================================== - * Controller logic - * =========================================== - */ - - let indexControllerCallback = (request, response) => { - db.pokemon.getAll((error, allPokemon) => { - response.render('pokemon/index', { allPokemon }); - }); - }; - - - /** - * =========================================== - * Export controller functions as a module - * =========================================== - */ - return { - index: indexControllerCallback, - }; - -} diff --git a/controllers/tweedr_controllers.js b/controllers/tweedr_controllers.js new file mode 100644 index 0000000..08bcae2 --- /dev/null +++ b/controllers/tweedr_controllers.js @@ -0,0 +1,126 @@ +const sha256 = require('js-sha256'); + +module.exports = (db) => { + + /** + * =========================================== + * Controller logic + * =========================================== + */ + + ////////////////////////// + //GET request callbacks/// + ////////////////////////// + + const indexGetController = (req, res) => { + res.render('index'); + } + + const registerGetController = (req, res) => { + if (req.cookies['login_status'] === sha256('yes_true')){ + return res.redirect('/'); + } + res.render('register'); + } + + const loginGetController = (req, res) => { + if (req.cookies['login_status'] === sha256('yes_true')){ + return res.redirect('/'); + } + res.render('login'); + } + + ////////////////////////// + //POST request callbacks// + ////////////////////////// + + const registerPostController = (req, res) => { + + const name = req.body.name; + const password = sha256(req.body.password); + + db.tweedrModels.register(name, password, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else { + if (queryResult) { + res.cookie('username', name); + res.cookie('login_status', sha256('yes_true')); + res.redirect('/') + } else { + res.send('user already in database'); + } + } + }) + } + + const loginPostController = (req, res) => { + const name = req.body.name; + const password = sha256(req.body.password); + db.tweedrModels.login(name, password, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else { + if (queryResult) { + res.cookie('username', name); + res.cookie('login_status', sha256('yes_true')); + res.redirect('/'); + } else { + res.send('wrong user or password'); + } + } + }) + } + + const createPostController = (req, res) => { + const name = req.cookies['username']; + const tweed_content = req.body.content; + + db.tweedrModels.createTweed(name, tweed_content, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else { + data = {'content': queryResult[0].content} + res.render('index', data); + } + }) + } + + const getAllPostController = (req, res) => { + const name = req.cookies['username']; + + db.tweedrModels.getAllTweed(name, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else { + console.log(queryResult) + res.render('index'); + } + }) + } + + + /** + * =========================================== + * Export controller functions as a module + * =========================================== + */ + return { + //GET request callbacks + indexGet: indexGetController, + registerGet: registerGetController, + loginGet: loginGetController, + + //POST request callbacks + registerPost: registerPostController, + loginPost: loginPostController, + createPost: createPostController, + getAllPost: getAllPostController + + }; + +} diff --git a/db.js b/db.js index 7b48a9e..0ffaf4e 100644 --- a/db.js +++ b/db.js @@ -15,6 +15,7 @@ const pg = require('pg'); const url = require('url'); + var configs; if( process.env.DATABASE_URL ){ @@ -33,9 +34,9 @@ if( process.env.DATABASE_URL ){ }else{ configs = { - user: 'akira', + user: 'Mac', host: '127.0.0.1', - database: 'testdb', + database: 'tweedr', port: 5432 }; } @@ -62,9 +63,9 @@ pool.on('error', function (err) { */ -const allPokemonModelsFunction = require('./models/pokemon'); +const allTweedrModelsFunction = require('./models/tweedr_models'); -const pokemonModelsObject = allPokemonModelsFunction( pool ); +const tweedrModelsObject = allTweedrModelsFunction( pool ); @@ -95,5 +96,5 @@ module.exports = { */ // users: userModelsObject, - pokemon: pokemonModelsObject + tweedrModels: tweedrModelsObject }; diff --git a/models/pokemon.js b/models/pokemon.js deleted file mode 100644 index 766cf1b..0000000 --- a/models/pokemon.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * =========================================== - * Export model functions as a module - * =========================================== - */ -module.exports = (dbPoolInstance) => { - - // `dbPoolInstance` is accessible within this function scope - - let getAll = (callback) => { - - let query = 'SELECT * FROM pokemons'; - - dbPoolInstance.query(query, (error, queryResult) => { - if( error ){ - - // invoke callback function with results after query has executed - callback(error, null); - - }else{ - - // invoke callback function with results after query has executed - - if( queryResult.rows.length > 0 ){ - callback(null, queryResult.rows); - - }else{ - callback(null, null); - - } - } - }); - }; - - return { - getAll, - }; -}; diff --git a/models/tweedr_models.js b/models/tweedr_models.js new file mode 100644 index 0000000..0e6797a --- /dev/null +++ b/models/tweedr_models.js @@ -0,0 +1,87 @@ +/** + * =========================================== + * Export model functions as a module + * =========================================== + */ +module.exports = (dbPoolInstance) => { + // `dbPoolInstance` is accessible within this function scope + +// model functions to do SQL queries + const registerModel = (name, password, callbackFunc) => { + const query = 'INSERT INTO users (name, password) SELECT $1, $2 WHERE NOT EXISTS (SELECT 1 FROM users WHERE name=$1) RETURNING *;'; + const values = [name, password]; + + dbPoolInstance.query(query, values, (err, result) => { + if (err) { + callbackFunc(err, null); + } else { + if (result.rows.length > 0){ + callbackFunc(null, result.rows); + } else { + callbackFunc(null, null); + } + } + + }) + } + + const loginModel = (name, password, callbackFunc) => { + const query = 'SELECT 1 FROM users WHERE name=$1 AND password=$2;'; + const values = [name, password]; + + dbPoolInstance.query(query, values, (err, result) => { + if (err) { + callbackFunc(err, null); + } else { + if (result.rows.length > 0){ + callbackFunc(null, result.rows); + } else { + callbackFunc(null, null); + } + } + }) + } + + const createTweedModel = (name, content, callbackFunc) => { + const query = 'INSERT INTO tweeds (content, user_id) SELECT $2, users.id FROM users WHERE users.name =$1 RETURNING content;' + const values = [name, content]; + + dbPoolInstance.query(query, values, (err, result) => { + if (err) { + callbackFunc(err, null); + } else { + if (result.rows.length > 0){ + callbackFunc(null, result.rows); + } else { + callbackFunc(null, null); + } + } + }) + } + + const getAllTweedModel = (name, content, callbackFunc) => { + const query = 'INSERT INTO tweeds (content, user_id) SELECT $2, users.id FROM users WHERE users.name =$1 RETURNING content;' + const values = [name, content]; + + dbPoolInstance.query(query, values, (err, result) => { + if (err) { + callbackFunc(err, null); + } else { + if (result.rows.length > 0){ + callbackFunc(null, result.rows); + } else { + callbackFunc(null, null); + } + } + }) + } + + + return { + register: registerModel, + login: loginModel, + createTweed: createTweedModel, + getAllTweed: getAllTweedModel + + }; +}; diff --git a/package-lock.json b/package-lock.json index abf70d8..7cca39b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,28 +4,18 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/node": { - "version": "10.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.7.tgz", - "integrity": "sha512-yOxFfkN9xUFLyvWaeYj90mlqTJ41CsQzWKS3gXdOMOyPVacUsymejKxJ4/pMW7exouubuEeZLJawGgcNGYlTeg==" - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "ansi-regex": { @@ -77,13 +67,6 @@ "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } } }, "babel-generator": { @@ -105,11 +88,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -266,22 +244,22 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-trailing-function-commas": { @@ -714,20 +692,20 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" } }, "brace-expansion": { @@ -749,23 +727,23 @@ } }, "buffer-writer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", - "integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "caniuse-lite": { - "version": "1.0.30000890", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000890.tgz", - "integrity": "sha512-4NI3s4Y6ROm+SgZN5sLUG4k7nVWQnedis3c/RWkynV5G6cHSY7+a8fwFyn2yoBDE3E6VswhTNNwR3PvzGqlTkg==" + "version": "1.0.30001045", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001045.tgz", + "integrity": "sha512-Y8o2Iz1KPcD6FjySbk1sPpvJqchgxk/iow0DABpGyzA1UeQAuxh63Xh0Enj5/BrsYbXtCN32JmR4ZxQTCQ6E6A==" }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -775,6 +753,11 @@ "supports-color": "^2.0.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -790,9 +773,12 @@ } }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -800,24 +786,24 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", "requires": { - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6" } }, @@ -827,9 +813,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "debug": { "version": "2.6.9", @@ -858,23 +844,14 @@ } }, "editorconfig": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.2.tgz", - "integrity": "sha512-GWjSI19PVJAM9IZRGOS+YKI8LN+/sjkSjNyvxL5ucqP9/IqtYNXBaQ/6c/hkPNYQHyOHra2KoXZI/JVpuqwmcQ==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", "requires": { - "@types/node": "^10.11.7", - "@types/semver": "^5.5.0", "commander": "^2.19.0", - "lru-cache": "^4.1.3", + "lru-cache": "^4.1.5", "semver": "^5.6.0", "sigmund": "^1.0.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - } } }, "ee-first": { @@ -883,9 +860,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.79", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.79.tgz", - "integrity": "sha512-LQdY3j4PxuUl6xfxiFruTSlCniTrTrzAd8/HfsLEMi0PUpaQ0Iy+Pr4N4VllDYjs0Hyu2lkTbvzqlG+PX9NsNw==" + "version": "1.3.414", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.414.tgz", + "integrity": "sha512-UfxhIvED++qLwWrAq9uYVcqF8FdeV9sU2S7qhiHYFODxzXRrd1GZRl/PjITHsTEejgibcWDraD8TQqoHb1aCBQ==" }, "encodeurl": { "version": "1.0.2", @@ -903,9 +880,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -913,40 +890,47 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "express-react-views": { @@ -963,17 +947,24 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "forwarded": { @@ -986,6 +977,24 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -1009,24 +1018,34 @@ } }, "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -1046,29 +1065,39 @@ } }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "js-beautify": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.8.7.tgz", - "integrity": "sha512-yhAMCTv0L9GNg6Gql7i+g4C1z9rQhfHXy4J0TGYFoBzzHR4reWYS573gkRrPuE58dYOH451LmBeAb8L1pLEfdA==", - "requires": { - "config-chain": "~1.1.5", - "editorconfig": "^0.15.0", - "mkdirp": "~0.5.0", - "nopt": "~4.0.1" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz", + "integrity": "sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==", + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "~1.0.3", + "nopt": "^4.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } } }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -1081,13 +1110,13 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.escaperegexp": { "version": "4.1.2", @@ -1103,9 +1132,9 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -1138,21 +1167,21 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.43.0" } }, "minimatch": { @@ -1164,16 +1193,16 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -1182,24 +1211,19 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "requires": { "abbrev": "1", "osenv": "^0.1.4" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1213,6 +1237,14 @@ "ee-first": "1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -1233,9 +1265,9 @@ } }, "packet-reader": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz", - "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, "parseurl": { "version": "1.3.2", @@ -1253,22 +1285,23 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "pg": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.5.0.tgz", - "integrity": "sha512-VFyAnp8xsMZp8nwZnMp7lmU5QcWDOZSI3IDNcWv6pblsiOXis5o7lD7/zzVK1Z1JTBiIDDGQAMbFMkiUzCL59A==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz", + "integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==", "requires": { - "buffer-writer": "1.0.1", - "packet-reader": "0.3.1", + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", "pg-connection-string": "0.1.3", - "pg-pool": "~2.0.3", - "pg-types": "~1.12.1", + "pg-packet-stream": "^1.1.0", + "pg-pool": "^2.0.10", + "pg-types": "^2.1.0", "pgpass": "1.x", "semver": "4.3.2" }, "dependencies": { "semver": { "version": "4.3.2", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" } } @@ -1278,19 +1311,30 @@ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-packet-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", + "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" + }, "pg-pool": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.3.tgz", - "integrity": "sha1-wCIDLIlJ8xKk+R+2QJzgQHa+Mlc=" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz", + "integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==" }, "pg-types": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.1.tgz", - "integrity": "sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "requires": { - "postgres-array": "~1.0.0", + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.0", + "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, @@ -1303,9 +1347,9 @@ } }, "postgres-array": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.3.tgz", - "integrity": "sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" }, "postgres-bytea": { "version": "1.0.0", @@ -1313,14 +1357,14 @@ "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" }, "postgres-date": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.3.tgz", - "integrity": "sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.5.tgz", + "integrity": "sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==" }, "postgres-interval": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.2.tgz", - "integrity": "sha512-fC3xNHeTskCxL1dC8KOtxXt7YeFmlbTYtn7ul8MkVERuTmf7pI4DrkAxcw3kh1fQ9uz4wQmd03a1mRiXUZChfQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "requires": { "xtend": "^4.0.0" } @@ -1331,12 +1375,13 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, "proto-list": { @@ -1345,12 +1390,12 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.1" } }, "pseudomap": { @@ -1359,48 +1404,52 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "react": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", - "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "schedule": "^0.5.0" + "prop-types": "^15.6.2" } }, "react-dom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.2.tgz", - "integrity": "sha512-RC8LDw8feuZOHVgzEf7f+cxBr/DnKdqp56VU0lAs1f4UfKc4cU8wU4fTq/mgnvynLQo8OtlPC19NUFh/zjZPuA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "schedule": "^0.5.0" + "scheduler": "^0.19.1" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -1462,23 +1511,24 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "schedule": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", - "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { + "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -1487,29 +1537,43 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } } }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sigmund": { "version": "1.0.1", @@ -1521,19 +1585,17 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } } }, "split": { @@ -1545,13 +1607,13 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -1564,7 +1626,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "to-fast-properties": { @@ -1572,18 +1634,23 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "unpipe": { @@ -1601,10 +1668,15 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "yallist": { "version": "2.1.2", diff --git a/package.json b/package.json index 3d96687..d62ace1 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,23 @@ "start": "node index.js" }, "dependencies": { - "cookie-parser": "^1.4.3", - "express": "^4.16.3", + "cookie-parser": "^1.4.5", + "express": "^4.17.1", "express-react-views": "^0.10.5", + "js-sha256": "^0.9.0", "method-override": "^2.3.10", - "pg": "^7.4.3", - "react": "^16.3.2", - "react-dom": "^16.3.2" - } + "pg": "^7.18.2", + "react": "^16.13.1", + "react-dom": "^16.13.1" + }, + "description": "Let's make a cool new app called TWEEDR!! Not Twitter, geez...", + "repository": { + "type": "git", + "url": "git+https://github.com/wdi-sg/mvc-tweedr.git" + }, + "author": "", + "bugs": { + "url": "https://github.com/wdi-sg/mvc-tweedr/issues" + }, + "homepage": "https://github.com/wdi-sg/mvc-tweedr#readme" } diff --git a/routes.js b/routes.js index efdee08..8e34365 100644 --- a/routes.js +++ b/routes.js @@ -13,8 +13,22 @@ module.exports = (app, allModels) => { */ // require the controller - const pokemonControllerCallbacks = require('./controllers/pokemon')(allModels); + const tweedrAllControllers = require('./controllers/tweedr_controllers')(allModels); + + // GET requests + app.get('/', tweedrAllControllers.indexGet); + + app.get('/register', tweedrAllControllers.registerGet); + + app.get('/login', tweedrAllControllers.loginGet); + + //POST requests + app.post('/register', tweedrAllControllers.registerPost); + + app.post('/login', tweedrAllControllers.loginPost) + + app.post('/create', tweedrAllControllers.createPost) + + app.post('/getall', tweedrAllControllers.getAllPost) - app.get('/pokemons', pokemonControllerCallbacks.index); - //app.get('/pokemons/:id', pokemons.getPokemon); }; diff --git a/tables.sql b/tables.sql index e69de29..efa6648 100644 --- a/tables.sql +++ b/tables.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + name TEXT, + password TEXT +); + +CREATE TABLE IF NOT EXISTS tweeds ( + id SERIAL PRIMARY KEY, + content TEXT, + user_id INTEGER REFERENCES users +); + +CREATE TABLE IF NOT EXISTS followers ( + id SERIAL PRIMARY KEY, + user_1_id INTEGER REFERENCES users, + user_2_id INTEGER REFERENCES users +); + diff --git a/views/index.jsx b/views/index.jsx new file mode 100644 index 0000000..a794cbf --- /dev/null +++ b/views/index.jsx @@ -0,0 +1,35 @@ +const React = require("react"); + +class Index extends React.Component { + render() { + + return ( + + + + +

Tweedr Homepage

+

+ Make a Tweed: +

+ + +
+

+

New Tweed:

+

+ {this.props.content} +

+

+

Past Tweeds:

+
+ +
+

+ + + ); + } +} + +module.exports = Index; diff --git a/views/login.jsx b/views/login.jsx new file mode 100644 index 0000000..d87cc32 --- /dev/null +++ b/views/login.jsx @@ -0,0 +1,22 @@ +const React = require("react"); + +class Login extends React.Component { + render() { + + return ( + + + + +
+

Name

+

Password

+ +
+ + + ); + } +} + +module.exports = Login; diff --git a/views/pokemon/index.jsx b/views/pokemon/index.jsx deleted file mode 100644 index b0c8382..0000000 --- a/views/pokemon/index.jsx +++ /dev/null @@ -1,17 +0,0 @@ -var React = require("react"); - -class Home extends React.Component { - render() { - console.log(this.props.types); - return ( - - - -

Hello

- - - ); - } -} - -module.exports = Home; diff --git a/views/register.jsx b/views/register.jsx new file mode 100644 index 0000000..8fd9d18 --- /dev/null +++ b/views/register.jsx @@ -0,0 +1,22 @@ +const React = require("react"); + +class Register extends React.Component { + render() { + + return ( + + + + +
+

Name

+

Password

+ +
+ + + ); + } +} + +module.exports = Register; From 6c9575cb39dbbeb4b707e5dfa056b7bcab2ba2d6 Mon Sep 17 00:00:00 2001 From: dannst Date: Thu, 23 Apr 2020 21:43:59 +0800 Subject: [PATCH 2/4] fixed bugs and added basic bootstrap --- controllers/tweedr_controllers.js | 36 ++++++++--------- models/tweedr_models.js | 6 +-- routes.js | 1 - views/index.jsx | 64 +++++++++++++++++++++---------- 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/controllers/tweedr_controllers.js b/controllers/tweedr_controllers.js index 08bcae2..9102a25 100644 --- a/controllers/tweedr_controllers.js +++ b/controllers/tweedr_controllers.js @@ -13,7 +13,20 @@ module.exports = (db) => { ////////////////////////// const indexGetController = (req, res) => { - res.render('index'); + const name = req.cookies['username']; + console.log('running indexGetController') + + //show all tweets + db.tweedrModels.getAllTweed(name, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else { + console.log('testet', queryResult) + const data = {'tweeds': queryResult} + res.render('index', data); + } + }) } const registerGetController = (req, res) => { @@ -83,22 +96,8 @@ module.exports = (db) => { console.error('query error:', err.stack); res.send('query error'); } else { - data = {'content': queryResult[0].content} - res.render('index', data); - } - }) - } - - const getAllPostController = (req, res) => { - const name = req.cookies['username']; - - db.tweedrModels.getAllTweed(name, (err, queryResult) => { - if (err) { - console.error('query error:', err.stack); - res.send('query error'); - } else { - console.log(queryResult) - res.render('index'); + console.log('redirecting to /') + res.redirect('/') } }) } @@ -118,8 +117,7 @@ module.exports = (db) => { //POST request callbacks registerPost: registerPostController, loginPost: loginPostController, - createPost: createPostController, - getAllPost: getAllPostController + createPost: createPostController }; diff --git a/models/tweedr_models.js b/models/tweedr_models.js index 0e6797a..abd270e 100644 --- a/models/tweedr_models.js +++ b/models/tweedr_models.js @@ -59,9 +59,9 @@ module.exports = (dbPoolInstance) => { }) } - const getAllTweedModel = (name, content, callbackFunc) => { - const query = 'INSERT INTO tweeds (content, user_id) SELECT $2, users.id FROM users WHERE users.name =$1 RETURNING content;' - const values = [name, content]; + const getAllTweedModel = (name, callbackFunc) => { + const query = 'SELECT content FROM tweeds INNER JOIN users ON tweeds.user_id = users.id WHERE users.name = $1;' + const values = [name]; dbPoolInstance.query(query, values, (err, result) => { if (err) { diff --git a/routes.js b/routes.js index 8e34365..7a629dd 100644 --- a/routes.js +++ b/routes.js @@ -29,6 +29,5 @@ module.exports = (app, allModels) => { app.post('/create', tweedrAllControllers.createPost) - app.post('/getall', tweedrAllControllers.getAllPost) }; diff --git a/views/index.jsx b/views/index.jsx index a794cbf..27799d4 100644 --- a/views/index.jsx +++ b/views/index.jsx @@ -1,31 +1,53 @@ + const React = require("react"); class Index extends React.Component { render() { + const tweeds_list = this.props.tweeds; + + + const pastTweedsLst = tweeds_list.map(obj => { + return
  • {obj.content}
  • + }) + + const latestTweeds = function(tweeds_list){ + if (tweeds_list){ + return
  • {tweeds_list[tweeds_list.length-1].content}
  • + } else { + return
  • No Tweets
  • + } + } + + const latestTweedsLst = latestTweeds(tweeds_list); + return ( - - - -

    Tweedr Homepage

    -

    - Make a Tweed: -

    - - -
    -

    -

    New Tweed:

    -

    - {this.props.content} -

    -

    -

    Past Tweeds:

    -
    - -
    -

    + + + + + +

    Tweedr

    +
    +

    + Make a Tweed: +

    + + +
    +

    +

    Latest Tweed:

    +
      + {latestTweedsLst} +
    +

    +

    Past Tweeds:

    +
      + {pastTweedsLst} +
    +

    +
    ); From 1a553040a3c970076a2c83e659a235072077cdbb Mon Sep 17 00:00:00 2001 From: dannst Date: Fri, 24 Apr 2020 10:02:39 +0800 Subject: [PATCH 3/4] added hashtag interface --- controllers/tweedr_controllers.js | 28 +++++++++++++++++------ models/tweedr_models.js | 36 +++++++++++++++++++++++++----- routes.js | 2 +- seed.sql | 1 + tables.sql | 17 +++++++++++--- views/index.jsx | 37 ++++++++++++++++++++++++------- 6 files changed, 97 insertions(+), 24 deletions(-) diff --git a/controllers/tweedr_controllers.js b/controllers/tweedr_controllers.js index 9102a25..2b7ef2c 100644 --- a/controllers/tweedr_controllers.js +++ b/controllers/tweedr_controllers.js @@ -14,21 +14,20 @@ module.exports = (db) => { const indexGetController = (req, res) => { const name = req.cookies['username']; - console.log('running indexGetController') //show all tweets - db.tweedrModels.getAllTweed(name, (err, queryResult) => { + db.tweedrModels.getAll(name, (err, tweedResult, hashtagResult) => { if (err) { console.error('query error:', err.stack); res.send('query error'); } else { - console.log('testet', queryResult) - const data = {'tweeds': queryResult} + const data = {'tweeds': tweedResult, 'hashtags': hashtagResult} res.render('index', data); } }) } + // register page const registerGetController = (req, res) => { if (req.cookies['login_status'] === sha256('yes_true')){ return res.redirect('/'); @@ -36,6 +35,7 @@ module.exports = (db) => { res.render('register'); } + // login page const loginGetController = (req, res) => { if (req.cookies['login_status'] === sha256('yes_true')){ return res.redirect('/'); @@ -52,7 +52,7 @@ module.exports = (db) => { const name = req.body.name; const password = sha256(req.body.password); - db.tweedrModels.register(name, password, (err, queryResult) => { + db.tweedrModels.register(name, password, (err, tweedResult) => { if (err) { console.error('query error:', err.stack); res.send('query error'); @@ -90,18 +90,31 @@ module.exports = (db) => { const createPostController = (req, res) => { const name = req.cookies['username']; const tweed_content = req.body.content; + const hashtag_lst = req.body.hashtag; db.tweedrModels.createTweed(name, tweed_content, (err, queryResult) => { if (err) { console.error('query error:', err.stack); res.send('query error'); } else { - console.log('redirecting to /') res.redirect('/') } }) } + const hashtagPostController = (req, res) => { + const name = req.cookies['username']; + const hashtag = req.body.hashtag; + + db.tweedrModels.createHashtag(hashtag, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else { + res.redirect('/') + } + }) + } /** * =========================================== @@ -117,7 +130,8 @@ module.exports = (db) => { //POST request callbacks registerPost: registerPostController, loginPost: loginPostController, - createPost: createPostController + createPost: createPostController, + hashtagPost: hashtagPostController }; diff --git a/models/tweedr_models.js b/models/tweedr_models.js index abd270e..4cd168e 100644 --- a/models/tweedr_models.js +++ b/models/tweedr_models.js @@ -42,6 +42,31 @@ module.exports = (dbPoolInstance) => { }) } + const getAllModel = (name, callbackFunc) => { + const first_query = 'SELECT content FROM tweeds INNER JOIN users ON tweeds.user_id = users.id WHERE users.name = $1;' + const first_values = [name]; + + dbPoolInstance.query(first_query, first_values, (err, first_result) => { + if (err) { + callbackFunc(err, null, null); + } else { + if (first_result.rows.length > 0){ + const second_query = 'SELECT * FROM hashtags;' + + dbPoolInstance.query(second_query, (err, second_result) => { + if (err) { + callbackFunc(err, first_result, null); + } else if (second_result.rows.length > 0){ + callbackFunc(null, first_result.rows, second_result.rows) + } else { + callbackFunc(null, null, null) + } + }) + } + } + }) + } + const createTweedModel = (name, content, callbackFunc) => { const query = 'INSERT INTO tweeds (content, user_id) SELECT $2, users.id FROM users WHERE users.name =$1 RETURNING content;' const values = [name, content]; @@ -59,9 +84,9 @@ module.exports = (dbPoolInstance) => { }) } - const getAllTweedModel = (name, callbackFunc) => { - const query = 'SELECT content FROM tweeds INNER JOIN users ON tweeds.user_id = users.id WHERE users.name = $1;' - const values = [name]; + const createHashtagModel = (hashtag, callbackFunc) => { + const query = 'INSERT INTO hashtags (hashtag) VALUES ($1);' + const values = [hashtag]; dbPoolInstance.query(query, values, (err, result) => { if (err) { @@ -73,7 +98,7 @@ module.exports = (dbPoolInstance) => { callbackFunc(null, null); } } - }) + }) } @@ -81,7 +106,8 @@ module.exports = (dbPoolInstance) => { register: registerModel, login: loginModel, createTweed: createTweedModel, - getAllTweed: getAllTweedModel + getAll: getAllModel, + createHashtag: createHashtagModel }; }; diff --git a/routes.js b/routes.js index 7a629dd..4d6d76d 100644 --- a/routes.js +++ b/routes.js @@ -29,5 +29,5 @@ module.exports = (app, allModels) => { app.post('/create', tweedrAllControllers.createPost) - + app.post('/hashtag', tweedrAllControllers.hashtagPost) }; diff --git a/seed.sql b/seed.sql index e69de29..31d467d 100644 --- a/seed.sql +++ b/seed.sql @@ -0,0 +1 @@ +INSERT INTO tweeds (content, user_id) VALUES ('', 1); diff --git a/tables.sql b/tables.sql index efa6648..d33ac41 100644 --- a/tables.sql +++ b/tables.sql @@ -7,12 +7,23 @@ CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS tweeds ( id SERIAL PRIMARY KEY, content TEXT, - user_id INTEGER REFERENCES users + user_id INTEGER, + hashtag_id INTEGER ); CREATE TABLE IF NOT EXISTS followers ( id SERIAL PRIMARY KEY, - user_1_id INTEGER REFERENCES users, - user_2_id INTEGER REFERENCES users + user_1_id INTEGER, + user_2_id INTEGER ); +CREATE TABLE IF NOT EXISTS hashtags ( + id SERIAL PRIMARY KEY, + hashtag TEXT +); + +CREATE TABLE IF NOT EXISTS tweed_hashtag ( + id SERIAL PRIMARY KEY, + tweed_id INTEGER, + hashtag_id INTEGER +) \ No newline at end of file diff --git a/views/index.jsx b/views/index.jsx index 27799d4..494d9e1 100644 --- a/views/index.jsx +++ b/views/index.jsx @@ -3,29 +3,42 @@ const React = require("react"); class Index extends React.Component { render() { - const tweeds_list = this.props.tweeds; + const tweeds_lst = this.props.tweeds; + const hashtag_lst = this.props.hashtags; - - const pastTweedsLst = tweeds_list.map(obj => { + const pastTweedsLst = tweeds_lst.map(obj => { return
  • {obj.content}
  • }) - const latestTweeds = function(tweeds_list){ - if (tweeds_list){ - return
  • {tweeds_list[tweeds_list.length-1].content}
  • + const latestTweeds = function(tweeds_lst){ + if (tweeds_lst){ + return
  • {tweeds_lst[tweeds_lst.length-1].content}
  • } else { return
  • No Tweets
  • } } - const latestTweedsLst = latestTweeds(tweeds_list); + const allHashtags = hashtag_lst.map(obj => { + return ( + + + + ) + + }) + + const latestTweedsLst = latestTweeds(tweeds_lst); + + + + return ( - +

    Tweedr

    @@ -35,6 +48,14 @@ class Index extends React.Component {
    +
    {allHashtags}
    +
    +

    +

    + Add a hashtag or select from checkerboxes: +

    + +

    Latest Tweed:

    From ba6f80232c60293623778efc6defedf41e84a1af Mon Sep 17 00:00:00 2001 From: dannst Date: Mon, 27 Apr 2020 09:47:51 +0800 Subject: [PATCH 4/4] added ajax request and favorites --- controllers/tweedr_controllers.js | 21 +++++++++-- models/tweedr_models.js | 58 ++++++++++++++++++++++--------- public/script.js | 37 ++++++++++++++++++++ routes.js | 14 +++++--- tables.sql | 12 +++++-- views/index.jsx | 3 +- 6 files changed, 119 insertions(+), 26 deletions(-) create mode 100644 public/script.js diff --git a/controllers/tweedr_controllers.js b/controllers/tweedr_controllers.js index 2b7ef2c..ae264aa 100644 --- a/controllers/tweedr_controllers.js +++ b/controllers/tweedr_controllers.js @@ -8,6 +8,7 @@ module.exports = (db) => { * =========================================== */ + ////////////////////////// //GET request callbacks/// ////////////////////////// @@ -92,7 +93,7 @@ module.exports = (db) => { const tweed_content = req.body.content; const hashtag_lst = req.body.hashtag; - db.tweedrModels.createTweed(name, tweed_content, (err, queryResult) => { + db.tweedrModels.createTweed(name, tweed_content, hashtag_lst, (err, queryResult) => { if (err) { console.error('query error:', err.stack); res.send('query error'); @@ -116,6 +117,21 @@ module.exports = (db) => { }) } + const favoritePostController = (req, res) => { + const tweedContent = req.body.tweed; + + db.tweedrModels.insertFav(tweedContent, (err, queryResult) => { + if (err) { + console.error('query error:', err.stack); + res.send('query error'); + } else if (queryResult){ + console.log(queryResult) + res.send('TWEED IS ADDED TO FAVORITES!!!') + } + }) + + } + /** * =========================================== * Export controller functions as a module @@ -131,7 +147,8 @@ module.exports = (db) => { registerPost: registerPostController, loginPost: loginPostController, createPost: createPostController, - hashtagPost: hashtagPostController + hashtagPost: hashtagPostController, + favoritePost: favoritePostController }; diff --git a/models/tweedr_models.js b/models/tweedr_models.js index 4cd168e..fe63df8 100644 --- a/models/tweedr_models.js +++ b/models/tweedr_models.js @@ -8,7 +8,9 @@ module.exports = (dbPoolInstance) => { // model functions to do SQL queries const registerModel = (name, password, callbackFunc) => { - const query = 'INSERT INTO users (name, password) SELECT $1, $2 WHERE NOT EXISTS (SELECT 1 FROM users WHERE name=$1) RETURNING *;'; + const query = 'INSERT INTO users (name, password)' + + 'SELECT $1, $2 WHERE NOT EXISTS (SELECT 1 FROM users WHERE name=$1) ' + + 'RETURNING *;'; const values = [name, password]; dbPoolInstance.query(query, values, (err, result) => { @@ -43,7 +45,8 @@ module.exports = (dbPoolInstance) => { } const getAllModel = (name, callbackFunc) => { - const first_query = 'SELECT content FROM tweeds INNER JOIN users ON tweeds.user_id = users.id WHERE users.name = $1;' + const first_query = 'SELECT content FROM tweeds INNER JOIN users ' + + 'ON tweeds.user_id = users.id WHERE users.name = $1;' const first_values = [name]; dbPoolInstance.query(first_query, first_values, (err, first_result) => { @@ -67,21 +70,26 @@ module.exports = (dbPoolInstance) => { }) } - const createTweedModel = (name, content, callbackFunc) => { - const query = 'INSERT INTO tweeds (content, user_id) SELECT $2, users.id FROM users WHERE users.name =$1 RETURNING content;' - const values = [name, content]; + const createTweedModel = (name, content, hashtag_lst, callbackFunc) => { + const query = 'INSERT INTO tweeds (content, user_id, hashtag_id) ' + + 'SELECT $2, users.id FROM users WHERE users.name =$1 RETURNING content;' + let hashtags_added = 0; - dbPoolInstance.query(query, values, (err, result) => { - if (err) { - callbackFunc(err, null); - } else { - if (result.rows.length > 0){ - callbackFunc(null, result.rows); - } else { - callbackFunc(null, null); + hashtag_lst.forEach(hashtag => { + const values = [name, content, hashtag]; + dbPoolInstance.query(query, values, (err, result) => { + hashtags_added += 1; + if (err) { + callbackFunc(err, null); + } else { + if (hashtags_added === hashtag_lst.length && result.rows.length > 0 ){ + callbackFunc(null, result.rows); + } else { + callbackFunc(null, null); + } } - } - }) + }) + }) } const createHashtagModel = (hashtag, callbackFunc) => { @@ -101,13 +109,31 @@ module.exports = (dbPoolInstance) => { }) } + const insertFavModel = (tweedContent, callbackFunc) => { + const query = 'INSERT INTO favorites (user_id, tweed_id) SELECT user_id, tweeds.id FROM users '+ + 'INNER JOIN tweeds ON (users.id = tweeds.user_id) WHERE tweeds.content = $1 RETURNING *;' + const values = [tweedContent]; + + dbPoolInstance.query(query, values, (err, result) => { + if (err) { + callbackFunc(err, null); + } else { + if (result.rows.length > 0){ + callbackFunc(null, result.rows); + } else { + callbackFunc(null, null); + } + } + }) +} return { register: registerModel, login: loginModel, createTweed: createTweedModel, getAll: getAllModel, - createHashtag: createHashtagModel + createHashtag: createHashtagModel, + insertFav: insertFavModel }; }; diff --git a/public/script.js b/public/script.js new file mode 100644 index 0000000..c960bc1 --- /dev/null +++ b/public/script.js @@ -0,0 +1,37 @@ +console.log('script is running from public folder'); + +// make a new request +const request = new XMLHttpRequest(); + + +const buttonList = document.querySelectorAll('#fav') + +buttonList.forEach(button => button.addEventListener('click', () => { + + // what to do when we recieve the request + var responseHandler = function() { + console.log("response text", this.responseText); + console.log("status text", this.statusText); + console.log("status code", this.status); + }; + request.addEventListener("load", responseHandler) + + //prepare data for post request + const data = {'tweed': button.value} + + // ready the system by calling open, and specifying the url + const url = "http://localhost:3000/favorite"; + request.open("POST", url); + request.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + + request.send(JSON.stringify(data)); + + }) +) + + + + + + + diff --git a/routes.js b/routes.js index 4d6d76d..0fdf87b 100644 --- a/routes.js +++ b/routes.js @@ -13,7 +13,8 @@ module.exports = (app, allModels) => { */ // require the controller - const tweedrAllControllers = require('./controllers/tweedr_controllers')(allModels); + const tweedrAllControllers = + require('./controllers/tweedr_controllers')(allModels); // GET requests app.get('/', tweedrAllControllers.indexGet); @@ -25,9 +26,14 @@ module.exports = (app, allModels) => { //POST requests app.post('/register', tweedrAllControllers.registerPost); - app.post('/login', tweedrAllControllers.loginPost) + app.post('/login', tweedrAllControllers.loginPost); + + app.post('/create', tweedrAllControllers.createPost); + + app.post('/hashtag', tweedrAllControllers.hashtagPost); + + app.post('/favorite', tweedrAllControllers.favoritePost); + - app.post('/create', tweedrAllControllers.createPost) - app.post('/hashtag', tweedrAllControllers.hashtagPost) }; diff --git a/tables.sql b/tables.sql index d33ac41..a0d86a5 100644 --- a/tables.sql +++ b/tables.sql @@ -7,8 +7,7 @@ CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS tweeds ( id SERIAL PRIMARY KEY, content TEXT, - user_id INTEGER, - hashtag_id INTEGER + user_id INTEGER ); CREATE TABLE IF NOT EXISTS followers ( @@ -26,4 +25,11 @@ CREATE TABLE IF NOT EXISTS tweed_hashtag ( id SERIAL PRIMARY KEY, tweed_id INTEGER, hashtag_id INTEGER -) \ No newline at end of file +); + +CREATE TABLE IF NOT EXISTS favorites ( + id SERIAL PRIMARY KEY, + user_id INTEGER, + tweed_id INTEGER +); + diff --git a/views/index.jsx b/views/index.jsx index 494d9e1..08624e4 100644 --- a/views/index.jsx +++ b/views/index.jsx @@ -7,7 +7,7 @@ class Index extends React.Component { const hashtag_lst = this.props.hashtags; const pastTweedsLst = tweeds_lst.map(obj => { - return
  • {obj.content}
  • + return
  • {obj.content}
  • }) const latestTweeds = function(tweeds_lst){ @@ -69,6 +69,7 @@ class Index extends React.Component {

    + );