From eddfa544a4bb5c166e442ee9a3e92d1d0654c437 Mon Sep 17 00:00:00 2001 From: "j.mei7" Date: Sun, 3 Apr 2022 16:38:57 +0200 Subject: [PATCH] saving --- express_backend/database.db | Bin 16384 -> 212992 bytes express_backend/package-lock.json | 412 ++++++++++++++++++++++++++++-- express_backend/package.json | 1 + express_backend/server.js | 17 ++ react_frontend/src/Idea.js | 32 ++- react_frontend/src/IdeaContent.js | 46 +++- react_frontend/src/IdeaList.js | 2 +- 7 files changed, 478 insertions(+), 32 deletions(-) diff --git a/express_backend/database.db b/express_backend/database.db index b0a14b8545c64f93c05fd6f8acf687593d4f3e3d..57d94fc3bc00baf92bcca2af31767df915018bbc 100644 GIT binary patch literal 212992 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 delta 116 zcmZo@;B9DNoFK)=z{J47zyiczFj2#d4Je`)ZMZRIE= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } @@ -99,6 +168,18 @@ "node": ">= 0.8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -270,6 +351,40 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -316,6 +431,11 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "node_modules/gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -331,6 +451,19 @@ "wide-align": "^1.1.0" } }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -350,6 +483,28 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -674,6 +829,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -776,12 +939,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -789,6 +952,37 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -922,6 +1116,19 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -1103,20 +1310,67 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } } }, "brace-expansion": { @@ -1133,6 +1387,15 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -1269,6 +1532,36 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + } + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } } }, "finalhandler": { @@ -1308,6 +1601,11 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -1323,6 +1621,16 @@ "wide-align": "^1.1.0" } }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -1336,6 +1644,19 @@ "path-is-absolute": "^1.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1603,6 +1924,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1678,14 +2004,38 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } } }, "rc": { @@ -1796,6 +2146,16 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", diff --git a/express_backend/package.json b/express_backend/package.json index 9548a22..a0c83fa 100644 --- a/express_backend/package.json +++ b/express_backend/package.json @@ -9,6 +9,7 @@ "author": "", "license": "ISC", "dependencies": { + "body-parser": "^1.20.0", "express": "^4.17.3", "sqlite3": "^4.2.0" } diff --git a/express_backend/server.js b/express_backend/server.js index 1dd7926..3d3702d 100644 --- a/express_backend/server.js +++ b/express_backend/server.js @@ -5,6 +5,12 @@ const sqlite3 = require('sqlite3'); const db = new sqlite3.Database("database.db") const port = process.env.PORT || 5000; +// body parser +const bodyParser = require('body-parser'); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); + + app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods","POST","GET") @@ -39,4 +45,15 @@ app.get('/ideas', (req, res) => { res.json(rows); } }); +}); + + +app.post('/idea/update/:id', (req, res) => { + db.run(`UPDATE ideas SET title = '${req.body.title}', content = '${req.body.content}' WHERE id = ${req.params.id}`, (err) => { + if (err) { + res.send({title: "Error", content: "Error updating idea"}); + }else{ + res.send({title: "Success", content: "Idea updated"}); + } + }); }); \ No newline at end of file diff --git a/react_frontend/src/Idea.js b/react_frontend/src/Idea.js index 9967d3a..42114cf 100644 --- a/react_frontend/src/Idea.js +++ b/react_frontend/src/Idea.js @@ -1,14 +1,40 @@ -import React from "react"; +import React, {useState, useEffect} from "react"; import { Link, useParams} from 'react-router-dom' function Idea({ideaId, title, description, timestamp}){ let params = useParams(); + let [t, setT] = useState(title); + let [d, setD] = useState(description); + + const fetchIdea = async () => { + const data = await fetch( + 'http://localhost:5000/idea/' + params.ideaId + ); + + const idea = await data.json(); + + setT(idea.title); + setD(idea.content); + } + + + + useEffect(() => { + const interval = setInterval(() => { + if(parseInt(params.ideaId) === ideaId){ + fetchIdea(); + } + }, 3000); + + return () => clearInterval(interval); + }, []); + return(
-

{title}

-

{description}

+

{t}

+

{d}

{timestamp}

diff --git a/react_frontend/src/IdeaContent.js b/react_frontend/src/IdeaContent.js index 207a9af..c6ea322 100644 --- a/react_frontend/src/IdeaContent.js +++ b/react_frontend/src/IdeaContent.js @@ -6,10 +6,51 @@ function IdeaContent(){ let params = useParams(); let [title, setTitle] = useState(""); let [content, setContent] = useState("") + let [saved , setSaved] = useState(false); + let [seconds, setSeconds] = useState(0); + let secondsSaveInterval = 3; + + // TIMER + useEffect(() => { + const interval = setInterval(() => { + setSeconds(seconds => seconds + 1); + + if(seconds > secondsSaveInterval){ // save every > secondsSaveInterval seconds + saveData(); + setSeconds(0); + } + + }, 1000); + + return () => clearInterval(interval); + }); + const saveData = async () => { + let ideaData = { + title: title, + content: content + } + let data = await fetch('http://localhost:5000/idea/update/' + params.ideaId, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(ideaData) + }); + + let res = await data.json(); + + if(res.title === "Success"){ + setSaved(true); + } else { + setSaved(false); + } + } + const fetchIdea = async () => { + // fetch and check for error const data = await fetch( 'http://localhost:5000/idea/' + params.ideaId ); @@ -30,11 +71,12 @@ function IdeaContent(){
{ setTitle(e.target.value) }} + onChange={(e) => { setTitle(e.target.value); setSaved(false) }} placeholder="Insert a title"/> + {saved ? "Saved!": "Saving..."}
- +
) diff --git a/react_frontend/src/IdeaList.js b/react_frontend/src/IdeaList.js index 0307dba..1488a9e 100644 --- a/react_frontend/src/IdeaList.js +++ b/react_frontend/src/IdeaList.js @@ -22,7 +22,7 @@ function IdeaList() { useEffect(() => { fetchIdeas(); }, []); - + return (