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 (
+
+
+
+
+
+
+ );
+ }
+}
+
+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 (
+
+
+
+
+
+
+ );
+ }
+}
+
+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:
+
+
+
Past Tweeds:
+
+
+
);
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 {
+
+
+ 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 {
+
);