From 0007582ab6112ffed1cbc57fee9b3b9e3b6952d6 Mon Sep 17 00:00:00 2001
From: adelysf <adelysf@outlook.fr>
Date: Tue, 7 Nov 2023 21:09:28 +0100
Subject: [PATCH] Add project files.

---
 Task.js              |   16 +
 app.js               |   26 +
 package-lock.json    | 1118 ++++++++++++++++++++++++++++++++++++++++++
 package.json         |   19 +
 public/logo.png      |  Bin 0 -> 18479 bytes
 routes/index.js      |   10 +
 routes/taskRoutes.js |   38 ++
 views/index.ejs      |  100 ++++
 8 files changed, 1327 insertions(+)
 create mode 100644 Task.js
 create mode 100644 app.js
 create mode 100644 package-lock.json
 create mode 100644 package.json
 create mode 100644 public/logo.png
 create mode 100644 routes/index.js
 create mode 100644 routes/taskRoutes.js
 create mode 100644 views/index.ejs

diff --git a/Task.js b/Task.js
new file mode 100644
index 0000000..dfc015e
--- /dev/null
+++ b/Task.js
@@ -0,0 +1,16 @@
+const mongoose = require("mongoose");
+
+const taskSchema = new mongoose.Schema({
+  task: {
+    type:String,
+    required:true
+  },
+  isCompleted: {
+    type:String,
+    required:true,
+    default:"0"
+  }
+
+});
+
+module.exports = new mongoose.model("Task", taskSchema);
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..723eca1
--- /dev/null
+++ b/app.js
@@ -0,0 +1,26 @@
+//importing modules
+const express = require("express");
+const mongoose = require("mongoose");
+const app = express();
+
+//connecting to the database
+mongoose.connect("mongodb://localhost/taskdb");
+
+//gather data from forms
+app.use(express.urlencoded({ extended: true }));
+
+//use public folder for static files (an image here)
+app.use(express.static("public"));
+
+// Logs details with morgan module
+const morgan = require("morgan");
+app.use(morgan("dev"));
+
+//the views is set by an ejs file
+app.set("view engine", "ejs");
+
+//routes are defining the differents features of the app
+app.use(require("./routes/index"))
+app.use(require("./routes/taskRoutes"))
+
+app.listen(3000, () => console.log("Server started listening on port: 3000"));
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..6cab0d8
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1118 @@
+{
+  "name": "tda",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "tda",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "ejs": "^3.1.9",
+        "express": "^4.18.2",
+        "method-override": "^3.0.0",
+        "mongoose": "^8.0.0",
+        "morgan": "^1.10.0"
+      }
+    },
+    "node_modules/@mongodb-js/saslprep": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz",
+      "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==",
+      "dependencies": {
+        "sparse-bitfield": "^3.0.3"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "20.8.10",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
+      "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/@types/webidl-conversions": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz",
+      "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ=="
+    },
+    "node_modules/@types/whatwg-url": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+      "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+      "dependencies": {
+        "@types/node": "*",
+        "@types/webidl-conversions": "*"
+      }
+    },
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+    },
+    "node_modules/async": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+      "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/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==",
+      "dependencies": {
+        "safe-buffer": "5.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/basic-auth/node_modules/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=="
+    },
+    "node_modules/body-parser": {
+      "version": "1.20.1",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "on-finished": "2.4.1",
+        "qs": "6.11.0",
+        "raw-body": "2.5.1",
+        "type-is": "~1.6.18",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/bson": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
+      "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
+      "engines": {
+        "node": ">=16.20.1"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+      "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.1",
+        "set-function-length": "^1.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+    },
+    "node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.1",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+    },
+    "node_modules/ejs": {
+      "version": "3.1.9",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+      "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+      "dependencies": {
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.18.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.1",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.11.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+      "dependencies": {
+        "minimatch": "^5.0.1"
+      }
+    },
+    "node_modules/filelist/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+      "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+      "dependencies": {
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+      "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "dependencies": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/jake": {
+      "version": "10.8.7",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+      "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+      "dependencies": {
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/kareem": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
+      "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/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=="
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+    },
+    "node_modules/method-override": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz",
+      "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==",
+      "dependencies": {
+        "debug": "3.1.0",
+        "methods": "~1.1.2",
+        "parseurl": "~1.3.2",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/method-override/node_modules/debug": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/mongodb": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
+      "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
+      "dependencies": {
+        "@mongodb-js/saslprep": "^1.1.0",
+        "bson": "^6.2.0",
+        "mongodb-connection-string-url": "^2.6.0"
+      },
+      "engines": {
+        "node": ">=16.20.1"
+      },
+      "peerDependencies": {
+        "@aws-sdk/credential-providers": "^3.188.0",
+        "@mongodb-js/zstd": "^1.1.0",
+        "gcp-metadata": "^5.2.0",
+        "kerberos": "^2.0.1",
+        "mongodb-client-encryption": ">=6.0.0 <7",
+        "snappy": "^7.2.2",
+        "socks": "^2.7.1"
+      },
+      "peerDependenciesMeta": {
+        "@aws-sdk/credential-providers": {
+          "optional": true
+        },
+        "@mongodb-js/zstd": {
+          "optional": true
+        },
+        "gcp-metadata": {
+          "optional": true
+        },
+        "kerberos": {
+          "optional": true
+        },
+        "mongodb-client-encryption": {
+          "optional": true
+        },
+        "snappy": {
+          "optional": true
+        },
+        "socks": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mongodb-connection-string-url": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+      "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+      "dependencies": {
+        "@types/whatwg-url": "^8.2.1",
+        "whatwg-url": "^11.0.0"
+      }
+    },
+    "node_modules/mongoose": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.0.tgz",
+      "integrity": "sha512-PzwkLgm1Jhj0NQdgGfnFsu0QP9V1sBFgbavEgh/IPAUzKAagzvEhuaBuAQOQGjczVWnpIU9tBqyd02cOTgsPlA==",
+      "dependencies": {
+        "bson": "^6.2.0",
+        "kareem": "2.5.1",
+        "mongodb": "6.2.0",
+        "mpath": "0.9.0",
+        "mquery": "5.0.0",
+        "ms": "2.1.3",
+        "sift": "16.0.1"
+      },
+      "engines": {
+        "node": ">=16.20.1"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mongoose"
+      }
+    },
+    "node_modules/mongoose/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/morgan": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+      "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+      "dependencies": {
+        "basic-auth": "~2.0.1",
+        "debug": "2.6.9",
+        "depd": "~2.0.0",
+        "on-finished": "~2.3.0",
+        "on-headers": "~1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/morgan/node_modules/on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/mpath": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
+      "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mquery": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
+      "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
+      "dependencies": {
+        "debug": "4.x"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/mquery/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mquery/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.11.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "node_modules/send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/set-function-length": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+      "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+      "dependencies": {
+        "define-data-property": "^1.1.1",
+        "get-intrinsic": "^1.2.1",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/sift": {
+      "version": "16.0.1",
+      "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
+      "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
+    },
+    "node_modules/sparse-bitfield": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+      "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+      "dependencies": {
+        "memory-pager": "^1.0.2"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tr46": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+      "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+      "dependencies": {
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/webidl-conversions": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/whatwg-url": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+      "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+      "dependencies": {
+        "tr46": "^3.0.0",
+        "webidl-conversions": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3089379
--- /dev/null
+++ b/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "tda",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "ejs": "^3.1.9",
+    "express": "^4.18.2",
+    "method-override": "^3.0.0",
+    "mongoose": "^8.0.0",
+    "morgan": "^1.10.0"
+  }
+}
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..72b7035a850fd1000eb1e6207c0fc0d2b0c866ed
GIT binary patch
literal 18479
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
Srkz{>0000<MNUMnLSTX|e&l2T

literal 0
HcmV?d00001

diff --git a/routes/index.js b/routes/index.js
new file mode 100644
index 0000000..0430ed0
--- /dev/null
+++ b/routes/index.js
@@ -0,0 +1,10 @@
+const router = require("express").Router()
+const Task = require("../Task");
+
+router.get("/", async(req, res) => {
+    const allTasks = await Task.find();
+    res.render("index", {task: allTasks})
+})
+
+
+module.exports = router;
\ No newline at end of file
diff --git a/routes/taskRoutes.js b/routes/taskRoutes.js
new file mode 100644
index 0000000..fe62447
--- /dev/null
+++ b/routes/taskRoutes.js
@@ -0,0 +1,38 @@
+// defining a router to organise routes
+const router = require("express").Router();
+const Task = require("../Task");
+
+// route to add a task
+router.post("/add/task", (req, res) => {
+  const { task } = req.body;
+  const newTask = new Task({ task });
+
+  newTask.save().then(() => {
+      console.log("The task has been added to the list.");
+      res.redirect("/");
+    })
+    .catch((err) => console.log(err));
+})
+
+
+// route to delete a task
+router.get("/delete/task/:_id", (req, res) => {
+  const { _id } = req.params;
+  Task.deleteOne({ _id }).then(() => {
+      console.log("The task has been deleted.");
+      res.redirect("/");
+    })
+    .catch((err) => console.log(err));
+})
+
+//route to update a task
+router.get("/update/task/:_id",(req,res)=>{
+    const {_id}=req.params;
+    Task.updateOne({_id}, { isCompleted:"1"}).then(()=>{
+        console.log("The task has been completed")
+        res.redirect('/')
+    })
+    .catch((err)=>console.log(err));
+});
+
+module.exports = router;
diff --git a/views/index.ejs b/views/index.ejs
new file mode 100644
index 0000000..d6d5c13
--- /dev/null
+++ b/views/index.ejs
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+
+<html lang="en">
+
+    <head>
+        <meta charset="UTF-8">
+        <title>ToDo App</title>
+        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
+        <style>
+            .hov:hover {
+                background-color: rgb(245, 245, 245);
+            }
+            .hov-completed:hover{
+                background-color: #90EE90;
+            }
+            .task-item {
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+            }
+            .completed-task {
+                background-color: #c0f7c0;
+            }
+            .hide-completed {
+                display: none;
+            }
+        </style>
+    </head>
+    <body>
+        <div class="container" style="margin-top: 50px;">
+                    <h3 style="text-align: center;"><img src="logo.png" width="100" height="100" style="margin-bottom: 10px;"/><br>ToDo App</h3>
+                    <div class="section">
+                        <p class="lead" style="text-align: center;">Organize your life with our ToDo App and stop forgetting things!</p>
+            </div>
+        </div>
+        <div class="container mt-5">
+            <form action="/add/task" class="d-flex" method="POST">
+                <input type="text" name="task" class="form-control" placeholder="Type a task to do">
+                <button type="submit" class="btn btn-outline-dark sm-">Add</button>
+            </form>
+            <ul class="list-group mt-3">
+                <% task.forEach(tasks => { %>
+                    <% if (tasks.isCompleted === '0') { %>
+                        <li class="list-group-item hov task-item">
+                            <%= tasks.task %>
+                            <span>
+                                <a href="/update/task/<%= tasks._id %>" class="btn btn-success btn-sm-">Task completed</a>
+                                <a href="/delete/task/<%= tasks._id %>" class="btn btn-dark btn-sm-">Delete the task</a>
+                            </span>
+                        </li>
+                    <% } %>
+                <% }) %>
+
+                <% task.forEach(tasks => { %>
+                    <% if (tasks.isCompleted === '1') { %>
+                        <li class="list-group-item hov-completed task-item completed-task">
+                            <%= tasks.task %>
+                            <span>
+                                <a href="/delete/task/<%= tasks._id %>" class="btn btn-dark btn-sm-">Delete the task</a>
+                            </span>
+                        </li>
+                    <% } %>
+                <% }) %>
+            </ul>
+            
+            <button id="showCompletedTasks" class="btn btn-outline-success sm- mt-3">Completed tasks</button>
+            
+            <script>
+                document.addEventListener("DOMContentLoaded", function () {
+                    const showCompletedButton = document.getElementById("showCompletedTasks");
+                    const completedTasks = document.querySelectorAll(".completed-task");
+                    const hideCompletedClass = "hide-completed";
+
+                    // Initially hide completed tasks
+                    completedTasks.forEach(function (task) {
+                        task.classList.add(hideCompletedClass);
+                    });
+
+                    // Verify if there are completed tasks to show (or not) the button
+                    const hasCompletedTasks = document.querySelector(".completed-task");
+                    if (!hasCompletedTasks) {
+                        showCompletedButton.style.display = "none";
+                    }
+
+                    showCompletedButton.addEventListener("click", function () {
+                        // Switch the visibility of hidden tasks
+                        completedTasks.forEach(function (task) {
+                            if (task.classList.contains(hideCompletedClass)) {
+                                task.classList.remove(hideCompletedClass);
+                            } else {
+                                task.classList.add(hideCompletedClass);
+                            }
+                        });
+                    });
+                });
+            </script>
+        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
+
+    </body>
+</html>
-- 
GitLab