diff --git a/README.md b/README.md index e69de29..5e24eee 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,18 @@ +you need postgres! + +- localhost needs to be trusted + +``` +local all all trust +host all all 127.0.0.1/32 trust +host all all ::1/128 trust +``` + +- create a user + `sudo -u postgres createuser --interactive` + +- database: tasks-mockup + `createdb tasks-backend` + +- seed database + `npm run seed` diff --git a/package-lock.json b/package-lock.json index 5c9e655..1338478 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1586,6 +1586,11 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" }, + "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", @@ -1655,6 +1660,14 @@ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.0.0" + } + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -1683,6 +1696,11 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -2312,6 +2330,14 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -2410,6 +2436,27 @@ "resolved": "https://registry.npmjs.org/bootstrap-imageupload/-/bootstrap-imageupload-1.1.3.tgz", "integrity": "sha1-qe48TOjc3zigGfchDloerb1jr44=" }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2574,6 +2621,11 @@ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -2690,6 +2742,11 @@ "rsvp": "^4.8.4" } }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + }, "case-sensitive-paths-webpack-plugin": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", @@ -3290,6 +3347,11 @@ } } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -3325,6 +3387,15 @@ "shallow-clone": "^0.1.2" } }, + "cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "requires": { + "is-bluebird": "^1.0.2", + "shimmer": "^1.1.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3471,6 +3542,70 @@ "typedarray": "^0.0.6" } }, + "concurrently": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.1.tgz", + "integrity": "sha512-48+FE5RJ0qc8azwKv4keVQWlni1hZeSjcWr8shBelOBtBHcKj1aJFM9lHRiSc1x7lq416pkvsqfBMhSRja+Lhw==", + "requires": { + "chalk": "^2.4.1", + "date-fns": "^1.23.0", + "lodash": "^4.17.10", + "read-pkg": "^4.0.1", + "rxjs": "^6.3.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.1.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + } + } + }, "confusing-browser-globals": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz", @@ -3580,6 +3715,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -3600,6 +3744,14 @@ "elliptic": "^6.0.0" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -3662,6 +3814,11 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -3936,6 +4093,11 @@ } } }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -3964,6 +4126,11 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, + "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", @@ -4244,11 +4411,21 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" }, + "dottie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", + "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -5490,6 +5667,14 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -5546,6 +5731,31 @@ } } }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } + }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -5952,6 +6162,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, "immer": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", @@ -5982,6 +6197,11 @@ "resolve-from": "^3.0.0" } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -6001,6 +6221,11 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6118,6 +6343,11 @@ "binary-extensions": "^1.0.0" } }, + "is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" + }, "is-buffer": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", @@ -6212,6 +6442,20 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -6264,6 +6508,11 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -6282,6 +6531,11 @@ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, "is-root": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", @@ -7629,6 +7883,14 @@ "webpack-sources": "^1.1.0" } }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "^4.0.0" + } + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -7822,6 +8084,11 @@ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8128,6 +8395,46 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", + "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8310,6 +8617,46 @@ } } }, + "nodemon": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.1.tgz", + "integrity": "sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg==", + "requires": { + "chokidar": "^2.1.5", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.6", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "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" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -8642,6 +8989,29 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", @@ -8782,6 +9152,62 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "pg": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.12.0.tgz", + "integrity": "sha512-q54Ic0oBXfDZMwheP8ALeUX32TUXvF7SNgAlZjyhkDuFCJkQCgcLBz0Be5uOrAj3ljSok/CI9lRbYzEko0z1Zw==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "0.1.3", + "pg-pool": "^2.0.4", + "pg-types": "~2.0.0", + "pgpass": "1.x", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } + } + }, + "pg-connection-string": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", + "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==" + }, + "pg-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.0.1.tgz", + "integrity": "sha512-b7y6QM1VF5nOeX9ukMQ0h8a9z89mojrBHXfJeSug4mhL0YpxNBm83ot2TROyoAmX/ZOX3UbwVO4EbH7i1ZZNiw==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", + "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", + "requires": { + "split": "^1.0.0" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -9729,11 +10155,39 @@ "uniq": "^1.0.1" } }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz", + "integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, "pretty-bytes": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz", @@ -9840,11 +10294,21 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, "psl": { "version": "1.1.33", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -9966,6 +10430,17 @@ } } }, + "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" + } + }, "react": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", @@ -10265,6 +10740,23 @@ "unicode-match-property-value-ecmascript": "^1.1.0" } }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, "regjsgen": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", @@ -10488,6 +10980,14 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "^1.3.0" + } + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -10689,6 +11189,21 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -10736,6 +11251,40 @@ } } }, + "sequelize": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.12.2.tgz", + "integrity": "sha512-SUFm5q998PR4MUruxlnkJW8wjDQgpEr7PBnGwPxWdl7n5P0tNVuabu+LW8u8yzn1/jVuyR+7MI0G6jR0l7fu+Q==", + "requires": { + "bluebird": "^3.5.0", + "cls-bluebird": "^2.1.0", + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.12.0", + "lodash": "^4.17.11", + "moment": "^2.24.0", + "moment-timezone": "^0.5.21", + "retry-as-promised": "^3.1.0", + "semver": "^6.1.1", + "sequelize-pool": "^2.3.0", + "toposort-class": "^1.0.1", + "uuid": "^3.2.1", + "validator": "^10.11.0", + "wkx": "^0.4.6" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "sequelize-pool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" + }, "serialize-javascript": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", @@ -10907,6 +11456,11 @@ "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -11142,6 +11696,11 @@ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -11207,6 +11766,14 @@ } } }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -11492,6 +12059,59 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, "terser": { "version": "3.17.0", "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", @@ -11571,6 +12191,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", @@ -11640,6 +12265,19 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -11657,6 +12295,11 @@ "punycode": "^2.1.0" } }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -11746,6 +12389,29 @@ } } }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -11856,6 +12522,14 @@ "imurmurhash": "^0.1.4" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "unist-util-stringify-position": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", @@ -11912,11 +12586,48 @@ } } }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, "upath": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "requires": { + "ci-info": "^1.5.0" + } + } + } + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -11970,6 +12681,14 @@ "requires-port": "^1.0.0" } }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -12028,6 +12747,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -12389,6 +13113,22 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + } + }, + "wkx": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "requires": { + "@types/node": "*" + } + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -12649,6 +13389,11 @@ "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/package.json b/package.json index 1f050ea..d31fdac 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,16 @@ { - "name": "my-app", + "name": "tasks-mockup", "version": "0.1.0", "private": true, "dependencies": { "axios": "^0.19.0", + "concurrently": "^4.0.1", + "cors": "^2.8.5", + "express": "^4.17.1", + "morgan": "^1.9.1", + "nodemon": "^1.19.1", + "pg": "^7.11.0", + "sequelize": "^5.8.11", "bootstrap-imageupload": "^1.1.3", "http-proxy-middleware": "^0.19.1", "react": "^16.8.6", @@ -12,7 +19,8 @@ "uuid": "^3.3.2" }, "scripts": { - "start": "react-scripts start", + "start": "concurrently \"react-scripts start\" \"nodemon server\"", + "seed": "node server/db/seed.js", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" diff --git a/server/api/articles.js b/server/api/articles.js new file mode 100644 index 0000000..4639564 --- /dev/null +++ b/server/api/articles.js @@ -0,0 +1,56 @@ +const router = require('express').Router() +const { Project, Task, Article, Tag } = require('../db/models') +module.exports = router + +/* CREATE */ +router.post('/', async (req, res, next) => { + try { + const article = await Article.create(req.body) + res.json(article) + } catch (err) { + next(err) + } +}) + +/* READ */ +router.get('/', async (req, res, next) => { + try { + const articles = await Article.findAll({ + include: { model: Tag }, + }) + res.send(articles) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const article = await Article.findByPk(req.params.id) + res.json(article) + } catch (err) { + next(err) + } +}) + +/* UPDATE */ +router.put('/:id', async (req, res, next) => { + try { + const article = await Article.findByPk(req.params.id) + await article.update(req.body) + res.json(article) + } catch (err) { + next(err) + } +}) + +/* DELETE */ +router.post('/:id/delete', async (req, res, next) => { + try { + const article = await Article.findByPk(req.params.id) + await article.destroy({ force: true }) + res.json(article) + } catch (err) { + next(err) + } +}) diff --git a/server/api/comments.js b/server/api/comments.js new file mode 100644 index 0000000..d7964c7 --- /dev/null +++ b/server/api/comments.js @@ -0,0 +1,35 @@ +const router = require('express').Router() +const { Comment, User, Vote } = require('../db/models') + +module.exports = router + +router.get('/', async (req, res, next) => { + try { + const comments = await Comment.findAll({ + include: ['replies', 'user'], + }) + res.send(comments) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const comment = await Comment.findByPk(req.params.id, { + attributes: ['id', 'text'], + }) + res.json(comment) + } catch (err) { + next(err) + } +}) + +router.post('/', async (req, res, next) => { + try { + const comment = await Comment.create(req.body) + res.json(comment) + } catch (err) { + next(err) + } +}) diff --git a/server/api/index.js b/server/api/index.js new file mode 100755 index 0000000..7e842a5 --- /dev/null +++ b/server/api/index.js @@ -0,0 +1,27 @@ +const router = require('express').Router() +module.exports = router +const ascii = require('../ascii') + +router.use('/tasks', require('./tasks')) +router.use('/projects', require('./projects')) +router.use('/articles', require('./articles')) +router.use('/tags', require('./tags')) +router.use('/comments', require('./comments')) +router.use('/votes', require('./votes')) +router.use('/users', require('./users')) + +router.get('/', async (req, res, next) => { + try { + res.json({ ascii }) + } catch (err) { + console.log(err) + next() + } +}) + +router.use((req, res, next) => { + const error = new Error(`Not Found: ${req.url}`) + console.log(error.message) + error.status = 404 + next() +}) diff --git a/server/api/projects.js b/server/api/projects.js new file mode 100644 index 0000000..05f7be6 --- /dev/null +++ b/server/api/projects.js @@ -0,0 +1,59 @@ +const router = require('express').Router() +const { Project, Task, Article, Tag } = require('../db/models') +module.exports = router + +/* CREATE */ +router.post('/', async (req, res, next) => { + try { + const project = await Project.create(req.body) + res.json(project) + } catch (err) { + next(err) + } +}) + +/* READ */ +router.get('/', async (req, res, next) => { + try { + const projects = await Project.findAll() + res.send(projects) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const project = await Project.findByPk(req.params.id) + res.json(project) + } catch (err) { + next(err) + } +}) + +/* UPDATE */ +router.put('/:id', async (req, res, next) => { + try { + const project = await Project.findByPk(req.params.id) + await project.update(req.body) + res.json(project) + } catch (err) { + next(err) + } +}) + +/* DELETE */ +router.post('/:id/delete', async (req, res, next) => { + try { + const project = await Project.findByPk(req.params.id) + await project.destroy({ force: true }) + await Task.destroy({ + where: { + projectId: req.params.id, + }, + }) + res.json(project) + } catch (err) { + next(err) + } +}) diff --git a/server/api/tags.js b/server/api/tags.js new file mode 100644 index 0000000..ba873ea --- /dev/null +++ b/server/api/tags.js @@ -0,0 +1,100 @@ +const router = require('express').Router() +const { Project, Task, Article, Tag } = require('../db/models') +module.exports = router + +/* CREATE */ +router.post('/', async (req, res, next) => { + try { + // find or create tag and add article relation + var tag = await Tag.findOne({ + where: { name: req.body.name }, + include: { model: Article }, + }) + if (!tag) { + const newTag = { name: req.body.name } + tag = await Tag.create(newTag, { include: { model: Article } }) + } + tag.addArticle(req.body.articleId) + + // find selected article and add tag relation + var article = await Article.findByPk(req.body.articleId, { + include: { model: Tag }, + }) + article.addTag(tag.id) + + // update article and tag after adding the relation + article = await Article.findByPk(req.body.articleId, { + include: { model: Tag }, + }) + tag = await Tag.findOne({ + where: { name: req.body.name }, + include: { model: Article }, + }) + res.json({ tag: tag, article: article }) + } catch (err) { + next(err) + } +}) + +/* READ */ +router.get('/', async (req, res, next) => { + try { + const tags = await Tag.findAll({ + include: { model: Article }, + }) + res.send(tags) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const tag = await Tag.findByPk(req.params.id) + res.json(tag) + } catch (err) { + next(err) + } +}) // remove tag from article + +/* UPDATE */ router.put('/:id', async (req, res, next) => { + try { + //const tag = await Tag.findByPk(req.params.id) + //await tag.update(req.body) + //res.json(tag) + + // find or create tag and add article relation + var tag = await Tag.findByPk(req.body.id, { + include: { model: Article }, + }) + tag.removeArticle(req.body.articleId) + + // find selected article and add tag relation + var article = await Article.findByPk(req.body.articleId, { + include: { model: Tag }, + }) + article.removeTag(tag.id) + + // update article and tag after adding the relation + article = await Article.findByPk(req.body.articleId, { + include: { model: Tag }, + }) + tag = await Tag.findByPk(req.body.id, { + include: { model: Article }, + }) + res.json({ tag: tag, article: article }) + } catch (err) { + next(err) + } +}) + +/* DELETE */ +router.post('/:id/delete', async (req, res, next) => { + try { + const tag = await Tag.findByPk(req.params.id) + await tag.destroy({ force: true }) + res.json(tag) + } catch (err) { + next(err) + } +}) diff --git a/server/api/tasks.js b/server/api/tasks.js new file mode 100755 index 0000000..70ca882 --- /dev/null +++ b/server/api/tasks.js @@ -0,0 +1,61 @@ +const router = require('express').Router() +const { Project, Task, Article, Tag } = require('../db/models') +module.exports = router + +/* CREATE */ +router.post('/', async (req, res, next) => { + try { + const task = await Task.create(req.body) + + if (req.body.projectId) { + const project = await Project.findOne({ + where: { id: req.body.projectId }, + }) + await task.setProject(project.id) + } + res.json(task) + } catch (err) { + next(err) + } +}) + +/* READ */ +router.get('/', async (req, res, next) => { + try { + const tasks = await Task.findAll() + res.send(tasks) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const task = await Task.findByPk(req.params.id) + res.json(task) + } catch (err) { + next(err) + } +}) + +/* UPDATE */ +router.put('/:id', async (req, res, next) => { + try { + const task = await Task.findByPk(req.params.id) + await task.update(req.body) + res.json(task) + } catch (err) { + next(err) + } +}) + +/* DELETE */ +router.post('/:id/delete', async (req, res, next) => { + try { + const task = await Task.findByPk(req.params.id) + await task.destroy({ force: true }) + res.json(task) + } catch (err) { + next(err) + } +}) diff --git a/server/api/users.js b/server/api/users.js new file mode 100644 index 0000000..1eaa7a5 --- /dev/null +++ b/server/api/users.js @@ -0,0 +1,54 @@ +const router = require('express').Router() +const { User } = require('../db/models') +module.exports = router + +/* CREATE */ +router.post('/', async (req, res, next) => { + try { + const task = await User.create(req.body) + res.json(task) + } catch (err) { + next(err) + } +}) + +/* READ */ +router.get('/', async (req, res, next) => { + try { + const tasks = await User.findAll() + res.send(tasks) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const task = await User.findByPk(req.params.id) + res.json(task) + } catch (err) { + next(err) + } +}) + +/* UPDATE */ +router.put('/:id', async (req, res, next) => { + try { + const task = await User.findByPk(req.params.id) + await task.update(req.body) + res.json(task) + } catch (err) { + next(err) + } +}) + +/* DELETE */ +router.post('/:id/delete', async (req, res, next) => { + try { + const task = await User.findByPk(req.params.id) + task.destroy({ force: true }) + res.json(task) + } catch (err) { + next(err) + } +}) diff --git a/server/api/votes.js b/server/api/votes.js new file mode 100644 index 0000000..ad522de --- /dev/null +++ b/server/api/votes.js @@ -0,0 +1,53 @@ +const router = require('express').Router() +const { Comment, User, Vote } = require('../db/models') +module.exports = router + +router.get('/', async (req, res, next) => { + try { + const votes = await Vote.findAll() + res.send(votes) + } catch (err) { + next(err) + } +}) + +router.post('/', async (req, res, next) => { + const {userId, commentId, upvote, downvote} = req.body + try { + const votes = await Vote.create({userId, commentId, upvote, downvote}) + res.send(votes) + } catch (err) { + next(err) + } +}) + +router.get('/:id', async (req, res, next) => { + try { + const vote = await Vote.findByPk(+req.params.id) + res.json(vote) + } catch (err) { + next(err) + } +}) + +router.post('/:id/delete', async (req, res, next) => { + try { + const vote = await Vote.findByPk(+req.params.id) + await vote.destroy() + res.json(vote) + } catch (err) { + next(err) + } +}) + +router.put('/:id/update', async (req, res, next) => { + const upvote = req.body.downvote + const downvote = req.body.upvote + try { + const vote = await Vote.findByPk(+req.params.id) + await vote.update({upvote, downvote}) + res.json(vote) + } catch (err) { + next(err) + } +}) diff --git a/server/ascii.js b/server/ascii.js new file mode 100644 index 0000000..d169208 --- /dev/null +++ b/server/ascii.js @@ -0,0 +1,26 @@ +const ascii = String.raw` + +. . + * . . . . * +. . . . . . + o . . +. . . . + 0 . + . . , , , +. \ . . + . . \ , + . o . . . +. . . \ , . + #\##\# . . + # #O##\### . + . . #*# #\##\### . + . ##*# #\##\## . + . . ##*# #o##\# . +. *# #\# . . + \ . . +____^/\___^--____/\____O______________/\/\---/\___________-- +/\^ ^ ^ ^ ^^ ^ '\ ^ ^ +-- - -- - - --- __ ^ +-- __ ___-- ^ ^` + +module.exports = ascii diff --git a/server/db/db.js b/server/db/db.js new file mode 100755 index 0000000..faf03b1 --- /dev/null +++ b/server/db/db.js @@ -0,0 +1,18 @@ +const Sequelize = require('sequelize') +const pkg = require('../../package.json') + +const databaseName = pkg.name + +const createDB = () => { + const db = new Sequelize( + process.env.DATABASE_URL || `postgres://localhost:5432/${databaseName}`, + { + logging: false, + }, + ) + return db +} + +const db = createDB() + +module.exports = db diff --git a/server/db/index.js b/server/db/index.js new file mode 100755 index 0000000..36b5ca0 --- /dev/null +++ b/server/db/index.js @@ -0,0 +1,6 @@ +const db = require('./db') + +// register models +require('./models') + +module.exports = db diff --git a/server/db/models/article.js b/server/db/models/article.js new file mode 100644 index 0000000..13a2267 --- /dev/null +++ b/server/db/models/article.js @@ -0,0 +1,15 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const Article = db.define('articles', { + title: { + type: Sequelize.STRING, + allowNull: false, + }, + text: { + type: Sequelize.TEXT, + allowNull: true, + }, +}) + +module.exports = Article diff --git a/server/db/models/comment.js b/server/db/models/comment.js new file mode 100644 index 0000000..2cc827f --- /dev/null +++ b/server/db/models/comment.js @@ -0,0 +1,11 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const Comment = db.define('comments', { + text: { + type: Sequelize.TEXT, + allowNull: false, + }, +}) + +module.exports = Comment diff --git a/server/db/models/index.js b/server/db/models/index.js new file mode 100755 index 0000000..8cb8486 --- /dev/null +++ b/server/db/models/index.js @@ -0,0 +1,43 @@ +const Task = require('./task') +const Project = require('./project') +const User = require('./user') +const Article = require('./article') +const Tag = require('./tag') +const Comment = require('./comment') +const Vote = require('./vote') + +User.hasMany(Article) +User.hasMany(Comment) +User.hasMany(Vote) +Project.hasMany(Task) +Task.belongsTo(Project) +Article.hasMany(Comment) +Article.belongsToMany(Tag, { through: 'articleTags' }) +Article.belongsTo(User) +Tag.belongsToMany(Article, { through: 'articleTags' }) +Comment.belongsTo(Article) +Comment.belongsTo(User) +Comment.hasMany(Vote) +Comment.belongsTo(Comment, { as: 'parent' }) +Comment.hasMany(Comment, { + as: { singular: 'reply', plural: 'replies' }, + foreignKey: 'parentId', +}) +Vote.belongsTo(Comment) +Vote.belongsTo(User) + +User.belongsToMany(Project, { through: 'projectUser' }) +Project.hasMany(User) + +Task.belongsToMany(User, { through: 'userTask' }) +User.hasMany(Task) + +module.exports = { + Task, + Project, + User, + Article, + Tag, + Comment, + Vote, +} diff --git a/server/db/models/project.js b/server/db/models/project.js new file mode 100644 index 0000000..c25b1e5 --- /dev/null +++ b/server/db/models/project.js @@ -0,0 +1,11 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const Project = db.define('projects', { + name: { + type: Sequelize.STRING, + allowNull: false, + }, +}) + +module.exports = Project diff --git a/server/db/models/tag.js b/server/db/models/tag.js new file mode 100644 index 0000000..bd3338a --- /dev/null +++ b/server/db/models/tag.js @@ -0,0 +1,11 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const Tag = db.define('tags', { + name: { + type: Sequelize.STRING, + allowNull: false, + }, +}) + +module.exports = Tag diff --git a/server/db/models/task.js b/server/db/models/task.js new file mode 100755 index 0000000..94cf123 --- /dev/null +++ b/server/db/models/task.js @@ -0,0 +1,16 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const Task = db.define('tasks', { + desc: { + type: Sequelize.STRING, + allowNull: false, + }, + + completed: { + type: Sequelize.BOOLEAN, + defaultValue: false, + }, +}) + +module.exports = Task diff --git a/server/db/models/user.js b/server/db/models/user.js new file mode 100644 index 0000000..0555b69 --- /dev/null +++ b/server/db/models/user.js @@ -0,0 +1,20 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const User = db.define('users', { + name: { + type: Sequelize.STRING, + allowNull: false, + }, + + email: { + type: Sequelize.STRING, + }, + + avatar: { + type: Sequelize.STRING, + defaultValue: 'default-user-img.png', + }, +}) + +module.exports = User diff --git a/server/db/models/vote.js b/server/db/models/vote.js new file mode 100644 index 0000000..820b8e9 --- /dev/null +++ b/server/db/models/vote.js @@ -0,0 +1,9 @@ +const Sequelize = require('sequelize') +const db = require('../db') + +const Vote = db.define('votes', { + upvote: Sequelize.INTEGER, + downvote: Sequelize.INTEGER, +}) + +module.exports = Vote diff --git a/server/db/seed.js b/server/db/seed.js new file mode 100755 index 0000000..0d1f755 --- /dev/null +++ b/server/db/seed.js @@ -0,0 +1,102 @@ +const db = require('../db') +const { Task, Project, User, Article, Tag, Comment, Vote } = require('./models') + +const testTasks = [ + { + desc: 'make app', + completed: false, + projectId: 1, + }, + { + desc: 'update backend', + completed: false, + projectId: 1, + }, + { + desc: 'eat dinner', + completed: false, + projectId: 1, + }, +] + +const testProjects = [{ name: 'Anarchy Planet' }, { name: 'Tilde' }] + +const testUsers = [ + { name: 'nn', email: 'nn@ap.org' }, + { name: 'dn', email: 'dn@ap.org' }, +] + +const testArticles = [{ title: 'latest news', text: 'waddup?!' }] + +const testTags = [{ name: 'dox' }] + +const tc1 = { text: 'pretty good' } +const tc2 = { text: 'yeah!' } +const tc3 = { text: 'could be more detailed tho' } +const tc4 = { text: 'BUT THE INSECTS' } +const tc5 = { text: 'HAHAHAHAHA' } +const tc6 = { text: 'oh shut up' } + +const testVotes = [{ upvote: 0, downvote: 1 }] + +async function runSeed() { + await db.sync({ force: true }) + console.log('db synced!') + console.log('seeding...') + try { + const p1 = await Project.create(testProjects[0]) + const p2 = await Project.create(testProjects[1]) + + const u1 = await User.create(testUsers[0]) + const u2 = await User.create(testUsers[1]) + + const t1 = await Task.create(testTasks[0]) + const t2 = await Task.create(testTasks[1]) + const t3 = await Task.create(testTasks[2]) + + await p1.addTask(t1) + await p1.addTask(t2) + await p2.addTask(t3) + + await u1.addTasks([t1, t2]) + await u2.addTask(t3) + + const a1 = await Article.create(testArticles[0]) + const t4 = await Tag.create(testTags[0]) + const c1 = await Comment.create(tc1) + const c2 = await Comment.create(tc2) + const c3 = await Comment.create(tc3) + const c4 = await Comment.create(tc4) + const c5 = await Comment.create(tc5) + const c6 = await Comment.create(tc6) + const v1 = await Vote.create(testVotes[0]) + + await a1.setUser(u1) + await a1.addTag(t4) + await a1.addComments(c1, c2, c3, c4, c5, c6) + + await c1.setUser(u2) + await c2.setUser(u1) + await c3.setUser(u2) + await c4.setUser(u1) + await c5.setUser(u1) + await c6.setUser(u2) + + await c1.addVote(v1) + await c1.addReply(2) + await c2.addReplies([c3, c4]) + await c5.setParent(c4) + await c6.setParent(c1) + + console.log('seeded successfully') + } catch (err) { + console.error(err) + process.exitCode = 1 + } finally { + console.log('closing db connection') + await db.close() + console.log('db connection closed') + } +} + +runSeed() diff --git a/server/index.js b/server/index.js new file mode 100755 index 0000000..a8a9002 --- /dev/null +++ b/server/index.js @@ -0,0 +1,34 @@ +const express = require('express') +const path = require('path') +const app = express() +const morgan = require('morgan') +const ascii = require('./ascii') +const cors = require('cors') +const port = process.env.PORT || 1337 + +app.use(morgan('tiny')) +app.use(cors()) +// body parsing middleware +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) +app.use(require('body-parser').text()) +app.use('/api', require('./api')) + +if (process.env.NODE_ENV === 'production') { + // Express will serve up production assets + app.use(express.static(path.join(__dirname, 'dist'))) +} +app.use('/', express.static(path.resolve(__dirname, '..', 'build'))) + +// error handling endware +app.use((err, req, res, next) => { + console.error(err) + console.error(err.stack) + res.status(err.status || 500).send(err.message || 'Internal server error.') + next() +}) + +app.listen(port, () => { + console.log('\n' + ascii + '\n') + console.log(`Doin' haxor stuff on port ${port}`) +})