diff --git a/server/.gitignore b/server/.gitignore index 4d29575de80483b005c29bfcac5061cd2f45313e..3c3629e647f5ddf82548912e337bea9826b434af 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,23 +1 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* +node_modules diff --git a/server/app.js b/server/app.js index e034e585787b6e93f3f33a135cc45d1817289de1..aa2d94696306e903930c99581de8f4f98726d628 100644 --- a/server/app.js +++ b/server/app.js @@ -8,6 +8,9 @@ require('dotenv').config(); const indexRouter = require('./routes/index'); const usersRouter = require('./routes/users'); +const loginRouter = require('./routes/login'); +const reservesRouter = require('./routes/reserves'); +const noticeRouter = require('./routes/notices'); const connect = require('./schemas'); const app = express(); @@ -24,7 +27,10 @@ app.use(cookieParser(process.env.JWT_SECRET)); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); -app.use('/users', usersRouter); +app.use('/users', usersRouter, reservesRouter); +app.use('/login', loginRouter); +app.use('/reserves', reservesRouter); +app.use('/notices', noticeRouter); app.listen(port, () => console.log(port)); @@ -44,4 +50,4 @@ app.use(function(err, req, res, next) { // res.render('error'); }); -module.exports = app; +module.exports = app; \ No newline at end of file diff --git a/server/client/package-lock.json b/server/client/package-lock.json index 051e6a6cb90446ce00a535c6e5c4c610d344434c..7f6576e8126e2e0ec2670a951586ca24d13ca158 100644 --- a/server/client/package-lock.json +++ b/server/client/package-lock.json @@ -2146,6 +2146,11 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, + "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.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -2320,6 +2325,39 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3066,6 +3104,15 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, + "bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg==", + "requires": { + "node-addon-api": "^3.0.0", + "node-pre-gyp": "0.15.0" + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -3084,6 +3131,39 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3320,6 +3400,11 @@ "node-int64": "^0.4.0" } }, + "bson": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -3700,6 +3785,11 @@ "q": "^1.1.2" } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3873,6 +3963,11 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4417,6 +4512,11 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -4536,6 +4636,16 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4555,6 +4665,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -6204,6 +6319,54 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -6405,6 +6568,11 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6738,6 +6906,14 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, "immer": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", @@ -7959,6 +8135,11 @@ "object.assign": "^4.1.0" } }, + "kareem": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -8297,6 +8478,12 @@ } } }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-deep": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", @@ -8490,6 +8677,30 @@ "minipass": "^3.0.0" } }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -8568,6 +8779,43 @@ "run-queue": "^1.0.3" } }, + "mpath": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", + "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" + }, + "mquery": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8622,6 +8870,26 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "needle": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", + "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8651,6 +8919,11 @@ "tslib": "^1.10.0" } }, + "node-addon-api": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", + "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" + }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -8761,11 +9034,44 @@ } } }, + "node-pre-gyp": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", + "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.3", + "needle": "^2.5.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "node-releases": { "version": "1.1.61", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==" }, + "nopt": { + "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" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -8808,6 +9114,29 @@ "sort-keys": "^1.0.0" } }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -8816,6 +9145,17 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -8829,6 +9169,11 @@ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, + "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=" + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -9157,11 +9502,25 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -10655,6 +11014,24 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, "react": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", @@ -11113,6 +11490,11 @@ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -11307,6 +11689,27 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -11540,6 +11943,15 @@ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sass-loader": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", @@ -11851,6 +12263,11 @@ "object-inspect": "^1.8.0" } }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -11898,6 +12315,11 @@ } } }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -12095,6 +12517,15 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -12668,6 +13099,44 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "terser": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", @@ -13907,6 +14376,43 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/server/client/package.json b/server/client/package.json index a36fcee34f4605fe0ba88dc1ae72d273dfb3b01c..2babfd03bb96b884004b565d56ecab590c80218a 100644 --- a/server/client/package.json +++ b/server/client/package.json @@ -8,6 +8,7 @@ "@testing-library/user-event": "^7.2.1", "@toast-ui/react-calendar": "^1.0.5", "axios": "^0.20.0", + "bcrypt": "^5.0.0", "bootstrap": "^4.5.2", "formik": "^2.1.5", "jquery": "^3.5.1", @@ -27,7 +28,6 @@ "eject": "react-scripts eject", "proxy": "http://localhost:3030" }, - "proxy": "http://localhost:3030", "eslintConfig": { "extends": "react-app" }, @@ -42,5 +42,6 @@ "last 1 firefox version", "last 1 safari version" ] - } + }, + "proxy": "http://localhost:3030" } diff --git a/server/client/src/App.css b/server/client/src/App.css deleted file mode 100644 index 74b5e053450a48a6bdb4d71aad648e7af821975c..0000000000000000000000000000000000000000 --- a/server/client/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/server/client/src/App.js b/server/client/src/App.js deleted file mode 100644 index ce9cbd2946d6962cfc19d65c8cb91757d8f4d4c6..0000000000000000000000000000000000000000 --- a/server/client/src/App.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import logo from './logo.svg'; -import './App.css'; - -function App() { - return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
-
- ); -} - -export default App; diff --git a/server/client/src/Components/Menu.js b/server/client/src/Components/Menu.js index 0c86c6b364938171723cbbadd6c66796029f08fc..91d7007ce611fa54ba735b814d3975d24d1e9316 100644 --- a/server/client/src/Components/Menu.js +++ b/server/client/src/Components/Menu.js @@ -1,34 +1,75 @@ import React, { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; +import { Link, Redirect } from 'react-router-dom'; import styled from 'styled-components'; const Nav = styled.nav` - background-color: #981e1e; + background-color: #7B031D; + height: 6vh; + + a { + color: #ffffff; + } + + & .logoutBtn:hover { + text-decoration: underline; + } ` function Menu() { + const [state, setState] = useState() + const name = localStorage.getItem('name'); + + if (state) return ; + + function logout() { + localStorage.clear(); + alert("로그아웃 되었습니다."); + setState(true); + } + return ( ) diff --git a/server/client/src/Components/PrivateRoute.js b/server/client/src/Components/PrivateRoute.js new file mode 100644 index 0000000000000000000000000000000000000000..c5d8624a06e482b54abe786c7fdbd7778eb07458 --- /dev/null +++ b/server/client/src/Components/PrivateRoute.js @@ -0,0 +1,18 @@ +import React from 'react'; +import { Redirect, Route } from "react-router-dom"; + +export const PrivateRoute = ({ component: Component, ...rest }) => ( + + (localStorage.getItem("token") !==null) ? ( + + ) : ( + + ) + } + /> +) \ No newline at end of file diff --git a/server/client/src/Pages/ACheckPage.js b/server/client/src/Pages/ACheckPage.js new file mode 100644 index 0000000000000000000000000000000000000000..aac64d51a9a9064d082102974696538323a5a161 --- /dev/null +++ b/server/client/src/Pages/ACheckPage.js @@ -0,0 +1,99 @@ +import React, { useState, useEffect } from 'react'; +import Menu from '../Components/Menu'; +import axios from 'axios'; +import { Link, Redirect } from 'react-router-dom'; +import 'bootstrap/dist/css/bootstrap.css'; + +function ACheck(props) { + const [state, setState] = useState() + const [reserve, setReserve] = useState([]); + useEffect(() => { + getReserve(); + }, []) + + function getReserve() { + axios.get(`/users/admin/${props.match.params.id}`, { + headers: { authorization: localStorage.getItem('token') }, + }) + .then(res => { + if (res.status === 404) { + alert(res.data.error) + setState(true); + } + console.log(res.data); + setReserve(res.data); + }) + .catch(err => { + alert(err.error) + }); + } + if (state) return ; + + function remove(index) { + axios.delete(`/reserves/${reserve[index]._id}`) + .then(res => { + if (res.status === 404) return alert(res.data.error) + alert("삭제되었습니다!"); + getReserve(); + }) + .catch(err => { + alert(err.error) + }); + }; + + function admit(index) { + axios.put(`/reserves/${reserve[index]._id}`) + .then(res => { + if (res.status === 404) return alert(res.data.error) + alert("승인되었습니다!"); + getReserve(); + }) + .catch(err => { + alert(err.error) + }); + }; + + return ( +
+ +
+ + + + + + + + + + + + + {reserve.map((reserve, index) => { + return ( + + + + + + + + + ) + })} + +
대표자날짜시간강의실사용인원승인여부
{reserve.user.name}{reserve.date}{reserve.time}{reserve.room}{reserve.num} + + +
+ +
+
+ ) +} + +export default ACheck \ No newline at end of file diff --git a/server/client/src/Pages/ApplyPage.js b/server/client/src/Pages/ApplyPage.js index 2fca62572ec06db7f2ab8d0ac5a3ff068eac5f77..e5f9e374d3641891f31ed01b2497d375c12e578a 100644 --- a/server/client/src/Pages/ApplyPage.js +++ b/server/client/src/Pages/ApplyPage.js @@ -1,12 +1,235 @@ import React, { useState, useEffect } from 'react'; +import { Formik, Field, ErrorMessage, FieldArray } from 'formik'; import Menu from '../Components/Menu'; +import axios from 'axios'; +import 'bootstrap/dist/css/bootstrap.css'; +import * as Yup from 'yup'; +import { Redirect } from 'react-router-dom'; + +function Apply(props) { + const [state, setState] = useState(); + const [user, setUser] = useState({ name: "" }); + + useEffect(() => { + getUser(); + }, []) + + if (state) { + return ; + } + + function time(starttime) { + console.log(starttime) + if (starttime == 21) { + return ( + + + ) + } + if (starttime == 20) { + return ( + + + + ) + } + return ( + + + + + ) + + } + + function getUser() { + axios.get(`/users/${props.match.params.id}`, { + headers: { authorization: localStorage.getItem('token') }, + }) + .then(res => { + if (res.status !== 201) { + alert(res.data.error); + } + console.log(res.data); + setUser(res.data); + }) + .catch(err => { + alert(err.error) + }); + } -function Apply() { return (
-
apply -
+ { + console.log(values) + axios({ + method: 'post', + url: '/reserves', + data: values + }).then(res => { + if (res.status === 404) return alert(res.data.error) + alert("신청이 완료되었습니다!"); + setState(true); + }) + .catch(err => { + alert(err.error) + }); + + // setTimeout(() => { + // setSubmitting(false); + // }, 400); // finish the cycle in handler + }} + > + {({ + errors, + touched, + values, + handleSubmit, + getFieldProps, + isSubmitting, + }) => ( +
+
+
+ +
{user.name}
+
+
+ + + {touched.date && errors.date ? ( +
{errors.date}
+ ) : null} +
+
+ + + + + + + + + + + + + + + + + +
+
+ + {time(values.starttime)} +
+
+ + + {touched.room && errors.room ? ( +
{errors.room}
+ ) : null} +
+
+ + + {touched.reason && errors.reason ? ( +
{errors.reason}
+ ) : null} +
+
+ + {({ insert, remove, push }) => ( +
+ + { + values.students.map((student, index) => ( +
+
+ + + + +
+
+ ))} + +
+ )} +
+
+ +
+
+ )} +
) } diff --git a/server/client/src/Pages/ChangePage.js b/server/client/src/Pages/ChangePage.js new file mode 100644 index 0000000000000000000000000000000000000000..7c29d3b69db4e319171b7c763f37c14b3c28e712 --- /dev/null +++ b/server/client/src/Pages/ChangePage.js @@ -0,0 +1,90 @@ +import React, { useState } from 'react'; +import { Formik } from 'formik'; +import * as Yup from 'yup'; +import axios from 'axios'; +import 'bootstrap/dist/css/bootstrap.css'; +import { Link, Redirect } from 'react-router-dom'; + +function Change(props) { + const [state, setState] = useState(); + if (state) { + return ; + } + console.log(props) + + return ( +
+ { + axios.put(`/users/change/${props.location.state.id}`, { ...values }, + ) + .then(res => { + console.log(res.data); + if (res.status === 404) return alert(res.data.error) + alert("회원정보가 수정되었습니다!") + setState(true); + }) + .catch(err => { + alert(err.error) + }); + + + setTimeout(() => { + setSubmitting(false); + }, 400); // finish the cycle in handler + }} + > + {({ + errors, + touched, + handleSubmit, + getFieldProps, // contain values, handleChange, handleBlur + isSubmitting, + }) => ( +
+
+
+ + {touched.password && errors.password ? ( +
{errors.password} + ) : null} +
+
+ + {touched.password2 && errors.password2 ? ( +
{errors.password2}
+ ) : null} +
+ + +
+ )} + +
+ ); +} + + +export default Change; diff --git a/server/client/src/Pages/CheckPage.js b/server/client/src/Pages/CheckPage.js index 719eff27ce1c21b157be0929f7ae7662c6c7d578..2b6dfef61467fe50e94b281cf3d3a2c4ace7e019 100644 --- a/server/client/src/Pages/CheckPage.js +++ b/server/client/src/Pages/CheckPage.js @@ -1,14 +1,79 @@ import React, { useState, useEffect } from 'react'; import Menu from '../Components/Menu'; +import axios from 'axios'; +import 'bootstrap/dist/css/bootstrap.css'; + +function Check(props) { + const [reserve, setReserve] = useState([]); + useEffect(() => { + getReserve(); + }, []) + + function getReserve() { + axios.get(`/reserves/${props.match.params.id}`, { + headers: { authorization: localStorage.getItem('token') }, + }) + .then(res => { + if (res.status !== 201) { + alert(res.data.error); + } + console.log(res.data); + setReserve(res.data); + }) + .catch(err => { + alert(err.error) + }); + } + function remove(index) { + axios.delete(`/reserves/${reserve[index]._id}`) + .then(res => { + if (res.status === 404) return alert(res.data.error) + alert("삭제되었습니다!"); + getReserve(); + }) + .catch(err => { + alert(err.error) + }); + }; -function Check() { return (
-
check +
+ + + + + + + + + + + + + {reserve.map((reserve, index) => { + return ( + + + + + + + + + ) + })} + +
날짜시간강의실사용인원승인여부예약취소
{reserve.date}{reserve.starttime}시~{(Number(reserve.starttime) + reserve.usetime)}시{reserve.room}{reserve.num}{reserve.approve ? "승인" : "미승인"} + +
+
) } -export default Check \ No newline at end of file +export default Check diff --git a/server/client/src/Pages/FindPage.js b/server/client/src/Pages/FindPage.js new file mode 100644 index 0000000000000000000000000000000000000000..de4e6c1f6c16a1f2f3298919b449e890bb3f9342 --- /dev/null +++ b/server/client/src/Pages/FindPage.js @@ -0,0 +1,103 @@ +import React, { useState } from 'react'; +import { Field, Formik } from 'formik'; +import * as Yup from 'yup'; +import axios from 'axios'; +import 'bootstrap/dist/css/bootstrap.css'; +import { Link, Redirect } from 'react-router-dom'; + +function Find() { + const [state, setState] = useState(); + + if (state) { + return ; + } + + return ( +
+ { + axios({ + method: 'post', + url: '/login/find', + data: values, + }).then(res => { + if (res.status === 404) return alert(res.data.error) + localStorage.setItem('_id', res.data.users._id) + setState(true); + }) + .catch(err => { + alert(err.error) + }); + + console.log(values); + setTimeout(() => { + setSubmitting(false); + }, 400); // finish the cycle in handler + }} + > + {({ + errors, + touched, + handleSubmit, + getFieldProps, // contain values, handleChange, handleBlur + isSubmitting, + }) => ( +
+
+
+ + {touched.id && errors.id ? ( +
{errors.id}
+ ) : null} +
+
+ + + + + + + +
+
+ + {touched.answer && errors.answer ? ( +
{errors.answer}
+ ) : null} +
+ + + +
+
+ )} +
+
+ ); +} + + +export default Find; diff --git a/server/client/src/Pages/LoginPage.js b/server/client/src/Pages/LoginPage.js index 83d29d87e5364d9ff37452f65e31c7ab0c07d1de..794e875b43e75ebdb0a516989bf8cb54f38869d2 100644 --- a/server/client/src/Pages/LoginPage.js +++ b/server/client/src/Pages/LoginPage.js @@ -1,79 +1,170 @@ -import React, { } from 'react'; +import React, { useState, useEffect } from 'react'; import styled from 'styled-components'; -import { Link } from 'react-router-dom'; +import { Link, Redirect } from 'react-router-dom'; import { Formik } from 'formik'; import * as Yup from 'yup'; +import axios from 'axios'; +import 'bootstrap/dist/css/bootstrap.css'; +import Logo from '../icon.png'; -const Log = styled.div` +const Asd = styled.div` background-color: #7B031D; + + &.web { + display : flex; + align-items: center; + } + + &.mobile { + height : 20vh; + display : flex; + padding:0; + } + + & .mob-head { + display: flex; + flex-direction: row; + height : 100%; + width: 100%; + justify-content: space-evenly; + + } + + & .mob-img { + max-width: 30vw; + } ` -const Logo = styled.div` + +const Asdf = styled.div` background-color: rgb(239, 218, 200); + a { + color : #7B031D; + } + + &.mob-formik { + height : 80vh; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + &.web-formik { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + + & .mobb { + height: 35vh; + display: flex; + flex-direction: column; + justify-content: space-around; + } + + & .webb { + flex-direction: column; + } + + & .qwer { + display: flex; + justify-content: space-between; + height: 12vh; + width: 30vw; + margin-bottom: 25px; + } + + & .web-input-form { + width: 80%; + justify-content: space-between; + align-content: space-around; + flex-direction: column; + display: flex; + } + + & .mob-input-form { + + } ` function Login() { + const [state, setState] = useState(false); + const [mobile, setMobile] = useState(false); + + useEffect(() => { + if (window.innerWidth < 960) { + setMobile(true) + } else { + setMobile(false) + } + }, []); + + if (state) { + return ; + } return ( -
-
- -

고려대학교

-

대관 시스템

-
- - { - // axios({ - // method: 'post', - // url: '/login', - // data: values, - // }).then(res => { - // if (res.status === 404) return alert(res.data.error) - alert("로그인이 완료되었습니다!") - - // localStorage.setItem('token', res.data.token); - // localStorage.setItem('id', res.data.users._id); - // setState(true); - // }) - // .catch(err => { - // alert(err.error) - // }); - - setTimeout(() => { - setSubmitting(false); - }, 400); // finish the cycle in handler - }} - > - {({ - errors, - touched, - handleSubmit, - getFieldProps, // contain values, handleChange, handleBlur - isSubmitting, - }) => ( -
-
-
+
+ +
+ +
+

고려대학교
대관 서비스

+
+
+
+ + { + axios({ + method: 'post', + url: '/login', + data: values, + }).then(res => { + if (res.status === 404) return alert(res.data.error) + + localStorage.setItem('token', res.data.token); + localStorage.setItem('_id', res.data.users._id); + localStorage.setItem('name', res.data.users.name); + setState(true); + }) + .catch(err => { + alert(err.error) + }); + + setTimeout(() => { + setSubmitting(false); + }, 400); // finish the cycle in handler + }} + > + {({ + errors, + touched, + handleSubmit, + getFieldProps, // contain values, handleChange, handleBlur + isSubmitting, + }) => ( + +
+
+
- {touched.email && errors.email ? ( -
{errors.email}
- ) : null}
-
+
- {touched.password && errors.password ? ( -
{errors.password}
- ) : null}
- - - 비밀번호를 잊으셨나요? -
- 회원이 아니신가요? - +
+
- )} - - -
-
+
비밀번호를 잊으셨나요?
+
회원이 아니신가요?
+ + + )} + + + +
) } diff --git a/server/client/src/Pages/NoticePage.js b/server/client/src/Pages/NoticePage.js index 09d3b2dc733adc4f2ee3a72341e101a891f5116a..306cc6039ba0f134e28de4fc0b6a45b8671d264a 100644 --- a/server/client/src/Pages/NoticePage.js +++ b/server/client/src/Pages/NoticePage.js @@ -1,12 +1,70 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import Menu from '../Components/Menu'; +import axios from 'axios'; +import styled from 'styled-components'; function Notice() { + const [notices, setNotices] = useState([]); + + useEffect(() => { + getNotice(); + }, []); + + function dateForm(day) { + const post_day = new Date(day); + let year = post_day.getFullYear(); + let month = post_day.getMonth() + 1; + let date = post_day.getDate(); + + month = month < 10 ? '0' + month : month; + date = date < 10 ? '0' + date : date; + + const new_date = year + "-" + month + "-" + date; + return new_date + } + + function getNotice() { + axios.get(`/notices`) + .then(res => { + if (res.status !== 201) { + alert(res.data.error); + } + console.log(res.data); + setNotices(res.data); + }) + .catch(err => { + alert(err.error) + }); + } return (
-
notice -
+
+
+
+ +

공지사항

+ +
+ {notices.map((notice, index) => +
+
+
+
{notice.notice_title}
+
{notice.notice_author}
+
{dateForm(notice.post_date)}
+
+
+
+
{notice.notice_content}
+
+
+ )} +
+ +
+
+
) } diff --git a/server/client/src/Pages/SignupPage.js b/server/client/src/Pages/SignupPage.js index c682e9a3ce36a17733559e6553fb2bdc5bf55c49..4fe43b292f3747f9863d56e521870fa26b184064 100644 --- a/server/client/src/Pages/SignupPage.js +++ b/server/client/src/Pages/SignupPage.js @@ -1,134 +1,186 @@ import React, { useState } from 'react'; -import { Formik } from 'formik'; +import { Field, Formik } from 'formik'; import * as Yup from 'yup'; import axios from 'axios'; import 'bootstrap/dist/css/bootstrap.css'; import { Link, Redirect } from 'react-router-dom'; +import styled from 'styled-components'; + +const Nav = styled.nav` + background-color: #7B031D; + height: 10vh; + + a { + color: #ffffff; + } +` + +const Wow = styled.div` + height: 90vh; + + & #reCheck::after { + content: '비밀번호를 다시 입력하세요'; + } + + & #reCheck:not(.right) { + content: '비밀번호가 다릅니다.'; + color: red; + } + + & .asd { + display: flex; + flex-direction: column; + } +` function Signup() { - // const [state, setState] = useState(false); + const [state, setState] = useState(false); + const [checkPw, setCheckPw] = useState(true); - // if (state) { - // return ; - // } + if (state) { + return ; + } return ( -
- { - // axios({ - // method: 'post', - // url: '/users', - // data: values, - // }).then(res => { - // if (res.status === 404) return alert(res.data.error) - alert("회원가입이 완료되었습니다!") - - // setState(true); - // }) - // .catch(err => { - // alert(err.error) - // }); - - setTimeout(() => { - setSubmitting(false); - }, 400); // finish the cycle in handler - }} - > - {({ - errors, - touched, - handleSubmit, - getFieldProps, // contain values, handleChange, handleBlur - isSubmitting, - }) => ( -
-
-
- - {touched.name && errors.name ? ( -
{errors.name}
- ) : null} -
-
- - {touched.email && errors.email ? ( -
{errors.email}
- ) : null} -
-
- - {touched.address && errors.address ? ( -
{errors.address}
- ) : null} -
-
- - {touched.password && errors.password ? ( -
{errors.password}
- ) : null} -
-
- - {touched.password2 && errors.password2 ? ( -
{errors.password2}
- ) : null} -
- - -
-
- )} -
-
+
+ +
+ +
+ { + axios({ + method: 'post', + url: '/users', + data: values, + }).then(res => { + if (res.status === 404) return alert(res.data.error) + alert("회원가입이 완료되었습니다!") + + setState(true); + }) + .catch(err => { + alert(err.error) + }); + + setTimeout(() => { + setSubmitting(false); + }, 400); // finish the cycle in handler + }} + > + {({ + errors, + touched, + handleSubmit, + getFieldProps, // contain values, handleChange, handleBlur + isSubmitting, + }) => ( + < form onSubmit={handleSubmit} className="asd"> + {/* col-sm-3 */} + +
+ {/* mb-4 */} +
이름을 입력하세요
+ +
+
+ {/* mb-4 */} +
학번을 입력하세요
+ + + {/* {touched.id && errors.id ? ( +
{errors.id}
+ ) : null} */} +
+
+ {/* mb-4 */} +
비밀번호를 입력하세요(8자리 이상)
+ + + {/* {touched.password && errors.password ? ( +
{errors.password}
+ ) : null} */} +
+
+ {/* mb-4 */} + {touched.password2 && errors.password2 ? setCheckPw(false) : null} +
+ + +
+
+ {/* mb-4 */} + + + + + + + +
+
+ {/* mb-4 */} +
답변을 입력해주세요.
+ + +
+ + + + + )} +
+
+
+
+
+ ); } diff --git a/server/client/src/icon.png b/server/client/src/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8da78a17c172838fba97d61f3eead753e60f1449 Binary files /dev/null and b/server/client/src/icon.png differ diff --git a/server/client/src/index.css b/server/client/src/index.css deleted file mode 100644 index 3e3b6a19055b9e2e2b359f9d955cff970c3cce9d..0000000000000000000000000000000000000000 --- a/server/client/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} \ No newline at end of file diff --git a/server/client/src/index.js b/server/client/src/index.js index f79d47013ab44fcbdef7d6d30a8d3d2f79fb2dd0..18b205e81c3318617c33023cbc3f70fa1cb60d75 100644 --- a/server/client/src/index.js +++ b/server/client/src/index.js @@ -4,23 +4,39 @@ import { BrowserRouter as Router, Route, Redirect, Switch } from 'react-router-d import * as serviceWorker from './serviceWorker'; import 'bootstrap'; import 'bootstrap/dist/css/bootstrap.css'; +import axios from 'axios'; +import { PrivateRoute } from './Components/PrivateRoute'; import Login from './Pages/LoginPage'; import Home from './Pages/HomePage'; import Signup from './Pages/SignupPage'; +import Find from './Pages/FindPage'; +import Change from './Pages/ChangePage'; import Apply from './Pages/ApplyPage'; import Check from './Pages/CheckPage'; import Notice from './Pages/NoticePage'; +import ACheck from './Pages/ACheckPage'; + +axios.defaults.validateStatus = function (status) { + return status < 500; // default +} ReactDOM.render( - + + - - + + + + + + + + , document.getElementById('root') diff --git a/server/client/src/logo.svg b/server/client/src/logo.svg deleted file mode 100644 index 6b60c1042f58d9fabb75485aa3624dddcf633b5c..0000000000000000000000000000000000000000 --- a/server/client/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/server/package-lock.json b/server/package-lock.json index e247a28c906f5b5556bf0e6c114129868f5dc5ed..49fce3f94670dbeb3aa2311a97eb8faad717c400 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -4,19 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { -<<<<<<< HEAD - "@types/babel-types": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz", - "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA==" - }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", - "requires": { - "@types/babel-types": "*" -======= "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", @@ -35,7 +22,6 @@ "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" ->>>>>>> origin/kimpen } }, "abbrev": { @@ -53,43 +39,10 @@ } }, "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - }, -<<<<<<< HEAD - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, -======= ->>>>>>> origin/kimpen "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -119,34 +72,19 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "@babel/types": "^7.9.6" } }, -<<<<<<< HEAD - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, -======= ->>>>>>> origin/kimpen "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -191,29 +129,48 @@ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, "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" }, "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "http-errors": { + "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": { - "safer-buffer": ">= 2.1.2 < 3" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, @@ -237,23 +194,9 @@ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "character-parser": { "version": "2.2.0", @@ -268,44 +211,11 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, -<<<<<<< HEAD - "clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", - "requires": { - "commander": "2.8.x", - "source-map": "0.4.x" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, -======= ->>>>>>> origin/kimpen "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, -<<<<<<< HEAD - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, -======= ->>>>>>> origin/kimpen "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -317,20 +227,28 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" } }, "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" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } }, "content-type": { "version": "1.0.4", @@ -356,14 +274,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, -<<<<<<< HEAD - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, -======= ->>>>>>> origin/kimpen "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -384,14 +294,6 @@ } } }, -<<<<<<< HEAD - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, -======= ->>>>>>> origin/kimpen "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -455,77 +357,84 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "esutils": { - "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", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "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": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://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": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } } }, "forwarded": { @@ -579,14 +488,6 @@ "path-is-absolute": "^1.0.0" } }, -<<<<<<< HEAD - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, -======= ->>>>>>> origin/kimpen "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", @@ -655,25 +556,13 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } + "acorn": "^7.1.1", + "object-assign": "^4.1.1" } }, "is-fullwidth-code-point": { @@ -757,22 +646,6 @@ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" }, -<<<<<<< HEAD - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, -======= ->>>>>>> origin/kimpen "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -813,11 +686,6 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -840,9 +708,9 @@ "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.44.0", @@ -909,9 +777,9 @@ } }, "mongoose": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.5.tgz", - "integrity": "sha512-BOQZsZn9Y79f3rWZFLD1gvOLNN5gOiGvGr5raqQ5v/T4fdAmnjXGCVynpW4SRnQLtrcCeLXyaaXVRT75863Q0w==", + "version": "5.10.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.6.tgz", + "integrity": "sha512-p32oja2ydzFMS0K4P7G408Kagju6Qz/LmiAFAcP6BqnIi1McLTd6VZ3+ZQtQmaHM7w8iNupLLambCrsPKNJpYw==", "requires": { "bson": "^1.1.4", "kareem": "2.3.1", @@ -1011,9 +879,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "node-addon-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", - "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", + "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" }, "node-pre-gyp": { "version": "0.15.0", @@ -1168,123 +1036,121 @@ } }, "pug": { - "version": "2.0.0-beta11", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-beta11.tgz", - "integrity": "sha1-Favmr1AEx+LPRhPksnRlyVRrXwE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz", + "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==", "requires": { - "pug-code-gen": "^1.1.1", - "pug-filters": "^2.1.1", - "pug-lexer": "^3.0.0", - "pug-linker": "^2.0.2", - "pug-load": "^2.0.5", - "pug-parser": "^2.0.2", - "pug-runtime": "^2.0.3", - "pug-strip-comments": "^1.0.2" + "pug-code-gen": "^3.0.0", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.0", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.0", + "pug-strip-comments": "^2.0.0" } }, "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" } }, "pug-code-gen": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-1.1.1.tgz", - "integrity": "sha1-HPcnRO8qA56uajNAyqoRBYcSWOg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz", + "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==", "requires": { - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.2", - "pug-error": "^1.3.2", - "pug-runtime": "^2.0.3", - "void-elements": "^2.0.1", - "with": "^5.0.0" + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" } }, "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" }, "pug-filters": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", - "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "requires": { - "clean-css": "^3.3.0", - "constantinople": "^3.0.1", + "constantinople": "^4.0.1", "jstransformer": "1.0.0", - "pug-error": "^1.3.2", - "pug-walk": "^1.1.5", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" } }, "pug-lexer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", - "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz", + "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==", "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.2" + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" } }, "pug-linker": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-2.0.3.tgz", - "integrity": "sha1-szH/olc33eacEntWwQ/xf652bco=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "requires": { - "pug-error": "^1.3.2", - "pug-walk": "^1.1.2" + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" } }, "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, "pug-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-2.0.2.tgz", - "integrity": "sha1-U6aAz9BQOdywwn0CkJS8SnkmibA=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "requires": { - "pug-error": "^1.3.2", - "token-stream": "0.0.1" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz", + "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA==" }, "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "requires": { - "pug-error": "^1.3.3" + "pug-error": "^2.0.0" } }, "pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, "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.1", @@ -1292,23 +1158,42 @@ "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" }, "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "http-errors": { + "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": { - "safer-buffer": ">= 2.1.2 < 3" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, @@ -1344,27 +1229,11 @@ } } }, -<<<<<<< HEAD - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, -======= ->>>>>>> origin/kimpen "regexp-clone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, -<<<<<<< HEAD - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, -======= ->>>>>>> origin/kimpen "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -1387,17 +1256,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, -<<<<<<< HEAD - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, -======= ->>>>>>> origin/kimpen "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -1436,9 +1294,9 @@ "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", @@ -1447,30 +1305,52 @@ "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": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, "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" } }, "set-blocking": { @@ -1498,17 +1378,6 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, -<<<<<<< HEAD - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - }, -======= ->>>>>>> origin/kimpen "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -1576,14 +1445,19 @@ } }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" }, "type-is": { "version": "1.6.18", @@ -1594,29 +1468,6 @@ "mime-types": "~2.1.24" } }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1638,9 +1489,9 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" }, "wide-align": { "version": "1.1.3", @@ -1650,31 +1501,17 @@ "string-width": "^1.0.2 || 2" } }, -<<<<<<< HEAD - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, -======= ->>>>>>> origin/kimpen "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" } }, -<<<<<<< HEAD - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, -======= ->>>>>>> origin/kimpen "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -1684,20 +1521,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" -<<<<<<< HEAD - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } -======= ->>>>>>> origin/kimpen } } -} +} \ No newline at end of file diff --git a/server/package.json b/server/package.json index 7ab083d2fcdb0dbda6a7b6822c6c8901cd113762..fd906af68cfef771fc29c3e15425fe9b2d29e87a 100644 --- a/server/package.json +++ b/server/package.json @@ -10,11 +10,11 @@ "cookie-parser": "~1.4.4", "debug": "~2.6.9", "dotenv": "^8.2.0", - "express": "~4.16.1", - "http-errors": "~1.6.3", + "express": "^4.17.1", + "http-errors": "^1.6.3", "jsonwebtoken": "^8.5.1", - "mongoose": "^5.10.5", + "mongoose": "^5.10.6", "morgan": "~1.9.1", - "pug": "2.0.0-beta11" + "pug": "^3.0.0" } } diff --git a/server/routes/index.js b/server/routes/index.js index ecca96a56b309a315ddf6399155fd2f953031d3b..c1b8c3e03fe77e455e6d7aaefc1658be362b9cce 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,9 +1,11 @@ -var express = require('express'); -var router = express.Router(); +const express = require('express'); +const User = require('../schemas/user'); + +const router = express.Router(); /* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); -}); +// router.get('/', function(req, res, next) { +// res.render('index', { title: 'Express' }); +// }); module.exports = router; diff --git a/server/routes/login.js b/server/routes/login.js new file mode 100644 index 0000000000000000000000000000000000000000..9dfe2d75f0d81ac4ff930aeef622fa8bed160934 --- /dev/null +++ b/server/routes/login.js @@ -0,0 +1,69 @@ +const express = require('express'); +const User = require('../schemas/user'); +const bcrypt = require("bcrypt"); +const jwt = require('jsonwebtoken'); +const user = require('../schemas/user'); + +const router = express.Router(); + +router.get('/', function (req, res, next) { + console.log('/login get request', req.body) + User.find({}) + .then((signups) => { + res.json(signups); + }) + .catch((err) => { + console.error(err); + next(err); + }); +}); + +router.post('/', function (req, res, next) { + console.log('/login post request', req.body) + User.findOne({ id: req.body.id }, 'id password name', function (err, users) { + if (err) return res.status(500).json({ error: err }); + + if (!users) { + return res.status(404).json({ error: '해당 학번이 존재하지 않습니다.' }); + } + + bcrypt.compare(req.body.password, users.password, function (err, result) { + if (err) { + console.log(err) + return res.status(500).json({ error: err }); + } + + if (result) { + const token = jwt.sign({ + id: users.id, + }, process.env.JWT_SECRET, { + expiresIn: '1m', + }); + return res.status(201).json({ + token, + users, + }); + } + res.status(404).json({ error: '비밀번호를 다시 입력해주세요.' }); + }); + + }) +}); + +router.post('/find', function (req, res, next) { + console.log('/find post request', req.body) + User.findOne({ id: req.body.id }, 'id question answer', function (err, users) { + if (err) return res.status(500).json({ error: err }); + + if (!users) return res.status(404).json({ error: '해당 학번이 존재하지 않습니다.' }); + + if (users.question === req.body.question) { + if (users.answer === req.body.answer) { + return res.status(201).json({users}); + } + return res.status(404).json({ error: '답변이 일치하지 않습니다.'}); + } + return res.status(404).json({error: '질문을 다시 선택해주세요.'}); + }) +}); +module.exports = router; diff --git a/server/routes/middlewares.js b/server/routes/middlewares.js new file mode 100644 index 0000000000000000000000000000000000000000..81c6dc1bd22f6ac4f546d140d8740644be26d6b1 --- /dev/null +++ b/server/routes/middlewares.js @@ -0,0 +1,36 @@ +const jwt = require('jsonwebtoken'); + +exports.isLoggedIn = (req, res, next) => { + if (req.isAuthenticated()) { + next(); + } else { + res.status(403).send('로그인 필요'); + } +}; + +exports.isNotLoggedIn = (req, res, next) => { + if (!req.isAuthenticated()) { + next(); + } else { + res.redirect('/'); + } +}; + +exports.verifyToken = (req, res, next) => { + try { + req.decoded = jwt.verify(req.headers.authorization, process.env.JWT_SECRET); + console.log('decode', req.decoded) + return next(); + } catch (error) { + if (error.name === 'TokenExpiredError') { // 유효기간 초과 + return res.status(419).json({ + code: 419, + error: '토큰이 만료되었습니다. 다시 로그인 해주세요.', + }); + } + return res.status(401).json({ + code: 401, + error: '유효하지 않은 토큰입니다. 다시 로그인 해주세요.', + }); + } +}; diff --git a/server/routes/notices.js b/server/routes/notices.js new file mode 100644 index 0000000000000000000000000000000000000000..5a489324e7abe82d5ff62e3f398d46ebbf53646a --- /dev/null +++ b/server/routes/notices.js @@ -0,0 +1,17 @@ +const express = require('express'); +const Notice = require('../schemas/notice'); + +const router = express.Router(); + +router.get('/', function (req, res, next) { + Notice.find({}).sort({ post_date: -1 }) + .then((notices) => { + res.json(notices); + }) + .catch((err) => { + console.error(err); + next(err); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/server/routes/reserves.js b/server/routes/reserves.js new file mode 100644 index 0000000000000000000000000000000000000000..00cb740c76b2ad6952960fdbf551370ee0903484 --- /dev/null +++ b/server/routes/reserves.js @@ -0,0 +1,91 @@ +const express = require('express'); +const User = require('../schemas/user'); +const Reserve = require('../schemas/reserve'); +const { verifyToken } = require('./middlewares'); + +const router = express.Router(); + +router.post('/', function (req, res, next) { + console.log('/reserve post req.body', req.body) + + const reserve = new Reserve({ + user: req.body._id, + date: req.body.date, + starttime: Number(req.body.starttime), + usetime: Number(req.body.usetime), + start: `${req.body.date}T`+`${req.body.starttime}:00:00`, + end: `${req.body.date}T`+`${Number(req.body.starttime)+Number(req.body.usetime)}:00:00`, + room: req.body.room, + reason: req.body.reason, + students: req.body.students, + approve: req.body.approve, + num: req.body.students.length + 1, + }); + + reserve.save() + .then((result) => { + console.log(result); + res.status(201).json(result); + }) + .catch((err) => { + console.error(err); + next(err); + }); +}); + +// router.get('/:_id', verifyToken, function (req, res, next) { +router.get('/:_id', function (req, res, next) { + console.log('/reserves get req.params', req.params) + Reserve.find({ user: req.params._id }, function (err, reserve) { + console.log('id.name',reserve) + if (err) return res.status(500).json({ error: err }); + console.log('reserve list', reserve) + res.status(201).json(reserve); + + }) +}); + +router.get('/admin/:_id', function (req, res, next) { + console.log('/reserves/admin get req.params', req.params) + Reserve.find({ approve: false }).populate('user').exec(function (err, reserve) { + if (err) return res.status(500).json({ error: err }); + console.log('reserve list', reserve) + res.status(201).json(reserve); + }) +}); + +router.delete('/:_id', function (req, res, next) { + console.log('/reserves delete req.params', req.params) + Reserve.findOne({ _id: req.params._id }, function (err, reserve) { + if (err) return res.status(500).json({ error: err }); + + reserve.remove() + .then(() => { + console.log(); + res.status(201).json(); + }) + .catch((err) => { + console.error(err); + next(err); + }); + }) +}); + +router.put('/:id', function (req, res, next) { + console.log('/reserves put req.body', req.params) + Reserve.findOne({ _id: req.params.id }, 'approve', function (err, reserve) { + if (err) return res.status(500).json({ error: err }); + reserve.approve = true; + reserve.save() + .then((result) => { + console.log(result); + res.status(201).json(result); + }) + .catch((err) => { + console.error(err); + next(err); + }); + }); +}); + +module.exports = router; diff --git a/server/routes/users.js b/server/routes/users.js index 623e4302bee32ccc080d1c83ee2e55a426c9bac8..36828d94a3be9b66226d18000fda5ff2f1803e10 100644 --- a/server/routes/users.js +++ b/server/routes/users.js @@ -1,9 +1,83 @@ -var express = require('express'); -var router = express.Router(); +const express = require('express'); +const User = require('../schemas/user'); +const bcrypt = require("bcrypt"); +const { verifyToken } = require('./middlewares'); -/* GET users listing. */ -router.get('/', function(req, res, next) { - res.send('respond with a resource'); +const router = express.Router(); + +router.post('/', function (req, res, next) { + console.log('/users post req.body', req.body) + User.findOne({ id: req.body.id }, function (err, users) { + if (err) return res.status(500).json({ error: err }); + + if (users) { + return res.status(404).json({ error: '이미 존재하는 학번입니다.' }) + }; + + const user = new User({ + name: req.body.name, + id: req.body.id, + password: req.body.password, + question: req.body.question, + answer: req.body.answer, + }); + + user.save() + .then((result) => { + console.log(result); + res.status(201).json(result); + }) + .catch((err) => { + console.error(err); + next(err); + }); + }) +}); + +router.get('/:_id', function (req, res, next) { + console.log('/users get req.params', req.params) + User.findOne({ _id: req.params._id }, function (err, user) { + if (err) return res.status(500).json({ error: err }); + res.status(201).json(user); + }) +}); + +router.get('/admin/:_id', function (req, res, next) { + console.log('/admin get req.params', req.params) + User.findOne({ _id: req.params._id }, 'role', function (err, user) { + if (err) return res.status(500).json({ error: err }); + if (user.role == 'admin') { + next(); + } + else return res.status(404).json({ error: '권한이 없습니다.' }) + }) +}); + +router.put('/change/:id', function (req, res, next) { + console.log('/change put req.body', req.params) + User.findOne({ _id: req.params.id }, 'password', function (err, user) { + if (err) return res.status(500).json({ error: err }); + bcrypt.compare(req.body.password, user.password, function (err, result) { + if (err) { + console.log(err) + return res.status(500).json({ error: err }); + } + if (result) { + return res.status(404).json({ error: '새로운 비밀번호를 입력해주세요.' }) + } + }); + + user.password = req.body.password; + user.save() + .then((result) => { + console.log(result); + res.status(201).json(result); + }) + .catch((err) => { + console.error(err); + next(err); + }); + }) }); module.exports = router; diff --git a/server/schemas/index.js b/server/schemas/index.js index 6f6cfd8128f6515482cda3fd34f72dab79bf31b3..6c82386c64cfe4af2f9a4bc649bcd1df8ff96ad0 100644 --- a/server/schemas/index.js +++ b/server/schemas/index.js @@ -5,8 +5,8 @@ module.exports = () => { if (process.env.NODE_ENV !== 'production') { mongoose.set('debug', true); } - mongoose.connect('mongodb://hijinju:highlight@localhost:27017/admin', { - dbName: 'ku_rental', + mongoose.connect('mongodb://kimpen:kim65811025@localhost:27017/admin', { + dbName: 'ku_rental', useNewUrlParser: true, useUnifiedTopology: true, }, (error) => { if (error) { console.log('몽고디비 연결 에러', error); diff --git a/server/schemas/notice.js b/server/schemas/notice.js new file mode 100644 index 0000000000000000000000000000000000000000..a1df94407587e503368a56519e1a7764c5ed5065 --- /dev/null +++ b/server/schemas/notice.js @@ -0,0 +1,28 @@ +const mongoose = require('mongoose'); + +const { Schema } = mongoose; +const noticeSchema = new Schema({ + notice_img: { + type: Array, + }, + notice_title: { + type: String, + required: true, + }, + notice_author: { + type: String, + // default: "나야나" + required: true, + }, + post_date: { + type: Date, + default: Date.now, + required: true, + }, + notice_content: { + type: String, + required: true, + }, +}); + +module.exports = mongoose.model('Notice', noticeSchema); diff --git a/server/schemas/reserve.js b/server/schemas/reserve.js index c7fec22ed1cf11602849ec0a91ec91785df6b56f..fa3cda86eead5b360ed6802da79c2e647a4d5c5d 100644 --- a/server/schemas/reserve.js +++ b/server/schemas/reserve.js @@ -1,34 +1,49 @@ const mongoose = require('mongoose'); const { Schema } = mongoose; +const { Types: { ObjectId } } = Schema; const reserveSchema = new Schema({ - date: { - type: String, - }, - time: { - type: String, - }, - room:{ - type: String, - }, - name: { //대표자 이름 - type: String, - }, - id:{ - type: Number, - }, - reason: { - type: String, - }, - member: { - type: String, - }, - approve: { - type: Boolean, - }, - num: { - type: Number, - } + user: { + type: ObjectId, + required: true, + ref: 'User', + }, + date: { + type: String, + }, + starttime: { + type: Number, + }, + usetime: { + type: Number, + }, + start: { + type: String, + }, + end: { + type: String, + + }, + room: { + type: String, + + }, + reason: { + type: String, + + }, + students: { + type: Array, + + }, + approve: { + type: Boolean, + default: false, + + }, + num: { + type: Number, + }, }); -module.exports = mongoose.model('Reserve', reserveSchema); +module.exports = mongoose.model('Reserve', reserveSchema); \ No newline at end of file diff --git a/server/schemas/user.js b/server/schemas/user.js index c569e67b2f1c07854df417b5c9a64aada0154b8b..734809bf961c36fbfedec228f78b6f99c84a9538 100644 --- a/server/schemas/user.js +++ b/server/schemas/user.js @@ -12,6 +12,17 @@ const userSchema = new Schema({ type: String, }, + role: { + type: String, + default:'user', + }, + answer:{ + type: String, + }, + question: { + type: String, + }, + id: { type: Number, required: true, @@ -20,22 +31,22 @@ const userSchema = new Schema({ }); userSchema.pre("save", function (next) { - let user = this; //User모델 자체를 가르킴. - - //model 안의 paswsword가 변경 또는 생성될 때 암호화 - if (user.isModified("password")) { - bcrypt.genSalt(saltRounds, function (err, salt) { + let user = this; //User모델 자체를 가르킴. + + //model 안의 paswsword가 변경 또는 생성될 때 암호화 + if (user.isModified("password")) { + bcrypt.genSalt(saltRounds, function (err, salt) { + if (err) return next(err); + bcrypt.hash(user.password, salt, function (err, hash) { if (err) return next(err); - bcrypt.hash(user.password, salt, function (err, hash) { - if (err) return next(err); - user.password = hash; - next(); - }); + user.password = hash; + next(); }); - } else { - next(); - } - }); + }); + } else { + next(); + } +}); module.exports = mongoose.model('User', userSchema); \ No newline at end of file diff --git a/server/views/error.pug b/server/views/error.pug deleted file mode 100644 index 51ec12c6a26323d9f5bc51fb98cb1324a739ea4c..0000000000000000000000000000000000000000 --- a/server/views/error.pug +++ /dev/null @@ -1,6 +0,0 @@ -extends layout - -block content - h1= message - h2= error.status - pre #{error.stack} diff --git a/server/views/index.pug b/server/views/index.pug deleted file mode 100644 index 3d63b9a044a859b59259d5e23dd4e68ec8e1f2be..0000000000000000000000000000000000000000 --- a/server/views/index.pug +++ /dev/null @@ -1,5 +0,0 @@ -extends layout - -block content - h1= title - p Welcome to #{title} diff --git a/server/views/layout.pug b/server/views/layout.pug deleted file mode 100644 index 15af079bf7c34e638ba14844efd979ac9111628b..0000000000000000000000000000000000000000 --- a/server/views/layout.pug +++ /dev/null @@ -1,7 +0,0 @@ -doctype html -html - head - title= title - link(rel='stylesheet', href='/stylesheets/style.css') - body - block content