From b4d787e9fa26eda3a55b5077c45597a540ed1ced Mon Sep 17 00:00:00 2001 From: nshutijonathan Date: Fri, 16 Aug 2019 15:41:47 +0200 Subject: [PATCH] feature(commentes):added comment controllers-167313407 --- package-lock.json | 152 ++++++++++-------- package.json | 1 + src/controllers/comments.controller.js | 152 ++++++++++++++++++ src/middlewares/validators/comments.body.js | 11 ++ .../20190816101310-create-comment.js | 41 +++++ src/models/comment.js | 28 ++++ src/models/index.js | 2 + src/routes/api/article/article.routes.js | 4 +- src/routes/api/comment/comments.route.js | 11 ++ src/routes/api/index.route.js | 2 + src/services/comments.service.js | 67 ++++++++ 11 files changed, 400 insertions(+), 71 deletions(-) create mode 100644 src/controllers/comments.controller.js create mode 100644 src/middlewares/validators/comments.body.js create mode 100644 src/migrations/20190816101310-create-comment.js create mode 100644 src/models/comment.js create mode 100644 src/routes/api/comment/comments.route.js create mode 100644 src/services/comments.service.js diff --git a/package-lock.json b/package-lock.json index 7516d81..f98a175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3220,25 +3220,25 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "resolved": false, "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": false, "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "resolved": false, "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "optional": true }, "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", + "resolved": false, "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "optional": true, "requires": { @@ -3248,13 +3248,13 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "optional": true, "requires": { @@ -3264,37 +3264,37 @@ }, "chownr": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "resolved": false, "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "resolved": false, "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": false, "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "resolved": false, "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "optional": true }, "debug": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "resolved": false, "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "optional": true, "requires": { @@ -3303,25 +3303,25 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "resolved": false, "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "resolved": false, "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "resolved": false, "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "optional": true }, "fs-minipass": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "resolved": false, "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { @@ -3330,13 +3330,13 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": false, "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { @@ -3352,7 +3352,7 @@ }, "glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "resolved": false, "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "optional": true, "requires": { @@ -3366,13 +3366,13 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "resolved": false, "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "resolved": false, "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "optional": true, "requires": { @@ -3381,7 +3381,7 @@ }, "ignore-walk": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "resolved": false, "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { @@ -3390,7 +3390,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { @@ -3400,19 +3400,19 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "optional": true }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "resolved": false, "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "optional": true }, "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", + "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "optional": true, "requires": { @@ -3421,13 +3421,13 @@ }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "optional": true, "requires": { @@ -3436,13 +3436,13 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": false, "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "optional": true }, "minipass": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "resolved": false, "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "optional": true, "requires": { @@ -3452,7 +3452,7 @@ }, "minizlib": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "resolved": false, "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "optional": true, "requires": { @@ -3461,7 +3461,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": false, "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "optional": true, "requires": { @@ -3470,13 +3470,13 @@ }, "ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "resolved": false, "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "optional": true }, "needle": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", + "resolved": false, "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "optional": true, "requires": { @@ -3487,7 +3487,7 @@ }, "node-pre-gyp": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "resolved": false, "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "optional": true, "requires": { @@ -3505,7 +3505,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { @@ -3515,13 +3515,13 @@ }, "npm-bundled": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "resolved": false, "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "optional": true }, "npm-packlist": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "resolved": false, "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "optional": true, "requires": { @@ -3531,7 +3531,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { @@ -3543,19 +3543,19 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": false, "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": false, "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "optional": true, "requires": { @@ -3564,19 +3564,19 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": false, "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { @@ -3586,19 +3586,19 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": false, "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "optional": true }, "process-nextick-args": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "resolved": false, "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "optional": true }, "rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "resolved": false, "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "optional": true, "requires": { @@ -3610,7 +3610,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } @@ -3618,7 +3618,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": false, "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { @@ -3633,7 +3633,7 @@ }, "rimraf": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "resolved": false, "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "optional": true, "requires": { @@ -3642,43 +3642,43 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "resolved": false, "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "resolved": false, "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "optional": true }, "sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "resolved": false, "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "optional": true }, "semver": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "resolved": false, "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "optional": true, "requires": { @@ -3689,7 +3689,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": false, "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { @@ -3698,7 +3698,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": false, "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "optional": true, "requires": { @@ -3707,13 +3707,13 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "resolved": false, "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "resolved": false, "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "optional": true, "requires": { @@ -3728,13 +3728,13 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": false, "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "resolved": false, "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "optional": true, "requires": { @@ -3743,13 +3743,13 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "optional": true }, "yallist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "resolved": false, "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "optional": true } @@ -6727,6 +6727,13 @@ "uuid": "^3.2.1", "validator": "^10.11.0", "wkx": "^0.4.6" + }, + "dependencies": { + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + } } }, "sequelize-cli": { @@ -7953,9 +7960,9 @@ } }, "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" }, "vary": { "version": "1.1.2", @@ -8360,6 +8367,13 @@ "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", "validator": "^10.11.0" + }, + "dependencies": { + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + } } } } diff --git a/package.json b/package.json index 2b81f10..e4073a5 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "swagger-jsdoc": "^3.3.0", "swagger-ui-express": "^4.0.7", "uniqid": "^5.0.3", + "validator": "^11.1.0", "winston": "^3.2.1" }, "devDependencies": { diff --git a/src/controllers/comments.controller.js b/src/controllers/comments.controller.js new file mode 100644 index 0000000..bbd03ab --- /dev/null +++ b/src/controllers/comments.controller.js @@ -0,0 +1,152 @@ +import Sequelize from 'sequelize'; +import commentsService from '../services/comments.service'; +import UserService from '../services/user.service'; +import models from '../models'; +const CommentsDb = models.Comment; +const database = models.Article; +/** + * + * + * @class Comments + */ +class Comments { + /** + * + * + * @static + * @param {*} req + * @param {*} res + * @returns {object} data + * @memberof Comments + */ + static async createComment(req, res) { + const userId = req.auth.id; + const getUser = await UserService.getOneUser(userId); + const getArticle = await database.findOne({ + where: { slug: req.params.slug } + }); + if (!getUser) return res.status(404).send({ message: `User with id ${req.auth.id} not found` }); + if (!getArticle) return res.status(404).send({ message: `Article with slug ${req.params.slug} not found` }); + try { + const comment = { + articleSlug: getArticle.slug, + userId: req.auth.id, + body: req.body.body, + parentCommentId: req.body.parentCommentId, + }; + const createdComment = await commentsService.addComment(comment); + return res.status(201).send({ + status: 201, + message: 'Comment successfully created', + comment: createdComment + }); + } catch (error) { + return res.send({ + message: error.message + }); + } + } + + /** + * + * + * @static + * @param {*} req + * @param {*} res + * @returns {object} data + * @memberof Comments + */ + static async deleteComment(req, res) { + const userId = req.auth.id; + const getUser = await CommentsDb.findOne({ where: { userId } }); + const commentAuthor = getUser && getUser.get().userId; + const { id } = req.params; + + if (!Number(id)) { + return res.status(400).send({ + status: 400, + message: 'Please provide numeric value' + }); + } + if (!(req.auth.id === commentAuthor)) { + return res.status(403).send({ + status: 403, + message: 'comment is not yours' + }); + } + try { + const CommentTODelete = await commentsService.deleteComment(id); + if (CommentTODelete) { + return res.status(200).send({ + status: 200, + message: `Comment with id ${id} is successfully deleted` + }); + } + + return res.status(404).send({ + status: 404, + message: `Comment with id ${id} is not found` + }); + } catch (error) { + return res.send({ + message: error.message + }); + } + } + + /** + * + * + * @static + * @param {*} req + * @param {*} res + * @returns {object} data + * @memberof Comments + */ + static async getComments(req, res) { + const comments = await CommentsDb.findAll(); + if (!comments) { + return res.status(200).send({ + message: 'No comments found' + }); + } + return res.status(200).send({ + status: 200, + message: 'All comments successfully retrieved', + comments + }); + } + + /** + * + * + * @static + * @param {*} req + * @param {*} res + * @returns {Object} return comment updation message + * @memberof UserController + */ + static async updateComment(req, res) { + const getComment = await CommentsDb.findOne({ where: { id: req.params.id } }); + const gottenComent = getComment && getComment.get().id; + const { id } = req.params; + if (!id) { + return res.status(400).send({ + status: 400, + message: 'Please provide valid numeric value' + }); + } + if (!gottenComent) { + return res.status(200).json({ status: 200, message: 'That comment does not exist' }); + } + + const { body } = req.body; + const updateComment = await commentsService.updateComment(req.params.id, { body }); + return res.status(200).send({ + status: 200, + message: 'Updation is successfully', + updateComment + }); + } +} +export default Comments; diff --git a/src/middlewares/validators/comments.body.js b/src/middlewares/validators/comments.body.js new file mode 100644 index 0000000..f5d54cb --- /dev/null +++ b/src/middlewares/validators/comments.body.js @@ -0,0 +1,11 @@ +import validator from 'validator'; + +const CommentValidation = (req, res, next) => { + if (validator.isEmpty(req.body.body)) { + return res.status(400).send({ + message: 'Comment body is required' + }); + } + next(); +}; +export default CommentValidation; diff --git a/src/migrations/20190816101310-create-comment.js b/src/migrations/20190816101310-create-comment.js new file mode 100644 index 0000000..b825bbe --- /dev/null +++ b/src/migrations/20190816101310-create-comment.js @@ -0,0 +1,41 @@ +import { sequelize } from '../models'; + +'use strict'; +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('Comments', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + userId: { + type: Sequelize.INTEGER + }, + articleSlug: { + type: Sequelize.STRING + }, + body: { + type: Sequelize.STRING + }, + parentCommentId: { + type: Sequelize.INTEGER, + allowNull: true + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }) .then(() => sequelize.query(`ALTER TABLE "Comments" + ADD CONSTRAINT fk_parentReference FOREIGN KEY ("parentCommentId") + REFERENCES "Comments" (id) ON DELETE CASCADE`)); + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('Comments'); + } +}; \ No newline at end of file diff --git a/src/models/comment.js b/src/models/comment.js new file mode 100644 index 0000000..79da1d7 --- /dev/null +++ b/src/models/comment.js @@ -0,0 +1,28 @@ +'use strict'; +module.exports = (sequelize, DataTypes) => { + const Comment = sequelize.define('Comment', { + userId: DataTypes.INTEGER, + articleSlug: { + type: DataTypes.STRING, + allowNull: false, + references: { + model: 'Articles', + key: 'slug' + }, + onUpdate: 'CASCADE', + onDelete: 'CASCADE' + }, + parentCommentId: { + type: DataTypes.INTEGER, + allowNull: true + }, + body: DataTypes.STRING + }, {}); + Comment.associate = function(models) { + // associations can be defined here + Comment.belongsTo(models.user,{ + foreignKey:'id',as:'commentAuthor' + }); + }; + return Comment; +}; \ No newline at end of file diff --git a/src/models/index.js b/src/models/index.js index 81f0bfa..5361164 100644 --- a/src/models/index.js +++ b/src/models/index.js @@ -33,4 +33,6 @@ Object.keys(db).forEach((modelName) => { db.sequelize = sequelize; db.Sequelize = Sequelize; +export { sequelize }; + module.exports = db; diff --git a/src/routes/api/article/article.routes.js b/src/routes/api/article/article.routes.js index a21b853..2eebc1a 100644 --- a/src/routes/api/article/article.routes.js +++ b/src/routes/api/article/article.routes.js @@ -15,6 +15,6 @@ router.post('/fake', auth, fakeCloud, validate(schema.articleSchema), articleCon router.post('/articles', [auth, confirmEmailAuth], imageUpload.array('images', 10), validate(schema.articleSchema), articleController.createArticles); router.get('/articles', [auth, confirmEmailAuth], articleController.getAllArticles); router.get('/articles/:slug', [auth, confirmEmailAuth], articleController.getOneArticle); -router.delete('/articles/:slug', [auth, confirmEmailAuth], articleController.deleteArticle); -router.patch('/articles/:slug', [auth, confirmEmailAuth], imageUpload.array('images', 10), articleController.UpdateArticle); +router.delete('articles/:slug', [auth, confirmEmailAuth], articleController.deleteArticle); +router.patch('articles/:slug', [auth, confirmEmailAuth], imageUpload.array('images', 10), articleController.UpdateArticle); export default router; diff --git a/src/routes/api/comment/comments.route.js b/src/routes/api/comment/comments.route.js new file mode 100644 index 0000000..fef422d --- /dev/null +++ b/src/routes/api/comment/comments.route.js @@ -0,0 +1,11 @@ +import express from 'express'; +import Comments from '../../../controllers/comments.controller'; +import auth from '../../../middlewares/auth'; +import CommentsValidation from '../../../middlewares/validators/comments.body'; + +const router = express.Router(); +router.post('/:slug', [auth, CommentsValidation], Comments.createComment); +router.get('/', [auth], Comments.getComments); +router.delete('/:id', [auth], Comments.deleteComment); +router.put('/:id', [auth, CommentsValidation], Comments.updateComment); +export default router; diff --git a/src/routes/api/index.route.js b/src/routes/api/index.route.js index eee8499..a2a5a9b 100644 --- a/src/routes/api/index.route.js +++ b/src/routes/api/index.route.js @@ -8,10 +8,12 @@ import user from './user/user.route'; import article from './article/article.routes'; import profile from './profile/profile.route'; import rate from './rate/rate.route'; +import Comments from './comment/comments.route'; const router = express.Router(); router.use('/images', express.static(path.join(__dirname, 'images'))); +router.use('/comments', Comments); router.use(oauth); router.use('/profile', profile); router.use('/users', user); diff --git a/src/services/comments.service.js b/src/services/comments.service.js new file mode 100644 index 0000000..86f3ad5 --- /dev/null +++ b/src/services/comments.service.js @@ -0,0 +1,67 @@ +import models from '../models'; + +const database = models.Comment; +/** + * + * + * @class commentsService + */ +class commentsService { + /** + * + * + * @static + * @param {*} comment + * @returns {object} data + * @memberof commentsService + */ + static async addComment(comment) { + try { + return await database.create(comment); + } catch (error) { + throw error; + } + } + + /** + * + * + * @static + * @param {*} id + * @returns {object} data + * @memberof commentsService + */ + static async deleteComment(id) { + try { + const CommentToDelete = await database.findOne({ where: { id: Number(id) } }); + if (CommentToDelete) { + const deletedComment = await database.destroy({ + where: { id: Number(id) } + }); + return deletedComment; + } + return null; + } catch (error) { + throw error; + } + } + + /** + * + * + * @static + * @param {*} id + * @param {*} updateComments + * @returns {object} data + * @memberof commentsService + */ + static async updateComment(id, updateComments) { + try { + const results = await database.update(updateComments, { where: { id }, returning: true }); + return results; + } catch (error) { + throw error; + } + } +} +export default commentsService;