{"id":20457802,"url":"https://github.com/rinaldilucas/mean-task-manager","last_synced_at":"2025-04-13T05:27:34.488Z","repository":{"id":45690462,"uuid":"511983596","full_name":"rinaldilucas/mean-task-manager","owner":"rinaldilucas","description":"An app built using MEAN stack.","archived":false,"fork":false,"pushed_at":"2025-01-09T23:49:38.000Z","size":173286,"stargazers_count":30,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-26T22:11:20.682Z","etag":null,"topics":["angular","expressjs","mongodb","nodejs","swagger","typescript"],"latest_commit_sha":null,"homepage":"https://rinaldilucas.github.io/mean-task-manager/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rinaldilucas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-07-08T17:59:03.000Z","updated_at":"2025-01-09T23:49:42.000Z","dependencies_parsed_at":"2023-10-12T04:01:36.572Z","dependency_job_id":"912116ea-052c-40c6-b855-dad5aabc35a5","html_url":"https://github.com/rinaldilucas/mean-task-manager","commit_stats":null,"previous_names":["rinaldilucas/angular14-task-crud-mean","rinaldilucas/mean-task-manager"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinaldilucas%2Fmean-task-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinaldilucas%2Fmean-task-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinaldilucas%2Fmean-task-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rinaldilucas%2Fmean-task-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rinaldilucas","download_url":"https://codeload.github.com/rinaldilucas/mean-task-manager/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248667754,"owners_count":21142508,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","expressjs","mongodb","nodejs","swagger","typescript"],"created_at":"2024-11-15T12:09:13.412Z","updated_at":"2025-04-13T05:27:34.462Z","avatar_url":"https://github.com/rinaldilucas.png","language":"TypeScript","readme":"\u003cdiv id=\"top\"\u003e\u003c/div\u003e\n\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![MIT License][license-shield]][license-url]\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/rinaldilucas/mean-task-manager\"\u003e\n    \u003cimg src=\"./frontend/assets/images/_readme/logo.png\" alt=\"Logo\"\u003e\n  \u003c/a\u003e\n\n  \u003ch3 align=\"center\"\u003eMEAN Stack Task Manager\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    A project built using Angular, NodeJS, Express.j, and MongoDB\u003cbr\u003e with Angular Material to jump-start your studies!\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/rinaldilucas/mean-task-manager\"\u003e\u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://rinaldilucas.github.io/mean-task-manager/\"\u003eView App*\u003c/a\u003e\n    ·\n    \u003ca href=\"https://mean-task-manager.onrender.com/api-docs\"\u003eAPI Docs*\u003c/a\u003e\n    ·\n    \u003ca href=\"#donations\"\u003eDonate\u003c/a\u003e       \n  \u003c/p\u003e\n  \u003csmall\u003e\n    * hosted on render.com free tier, so API needs a little time to start after accessing\n  \u003c/small\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n\u003c/div\u003e\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#backend\"\u003eBackend\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#frontend\"\u003eFrontend\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#hosting\"\u003eHosting\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#donations\"\u003eDonations\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n\n## About The Project\n\n\u003cdiv align=\"center\"\u003e\n\n[![Project Screenshot][project-screenshot]](https://rinaldilucas.github.io/mean-task-manager)\n\n\u003c/div\u003e\n\nI built this project to make a cool template for those who want to learn the MEAN stack. If this repository helped you, don't hesitate to leave a star!\n\nHere are some of the features:\n\n### Backend\n\n- Node.js API written with TypeScript\n- Search, ordering, and pagination integrate with frontend to shorten response sizes\n- JWT implementation with refresh token using Redis and cookies on strict mode\n- Blacklist of access/refresh token\n- Password encryption using bcrypt with salt rounds\n- Authentication with brute force prevention using ExpressBrute\n- Error handling to maintain error readability\n- Backend (API) validation on controllers and routes using express-validator, which improves error readability using third-party software such as Insomnia and Postman\n- Database and model validation using Mongoose\n- API documentation using Swagger\n- ESlint rules focused on the backend\n- Multiple scripts to facilitate development, builds, and deployment\n- Scripts to format, lint, debug, develop, build and deploy\n- And more\n\n### Frontend\n\n- Multilingual features implemented in both the client-side and API responses\n- Examples of autocomplete, mat-chips, calendars, dialogs, bottom sheet and more\n- Routed bottom sheet example implemented using only one component\n- Virtual scrolling with pagination, ordering, and search integrated with API to shorten response sizes\n- Charts using chart.js library\n- Angular routing animations using dynamic params\n- Authentication and role guard\n- Deactivate the guard to prevent the user from discarding changes\n- Multiple examples of synchronous custom validators\n- Multiple handlers to ease the use of dialogs, bottom sheets, snack bars and more\n- Custom async validator to check already registered user\n- Registering using password techniques\n- Example using functional resolvers with loading on routes\n- Interceptor modules added to verify bearer tokens, errors, and headers language\n- Front-end validation on requests and inputs\n- Handler of promises and errors using destructuring\n- Improved HTTP security using HttpParams\n- Unsubscriber component with sub sink to facilitate the maneuvering of unsubscribes\n- CRUD operations built using POO paradigms, allowing services to inherit its operations\n- Example of custom pipes to convert date to selected language\n- Example of custom directive to prevent form autofill\n- Dark mode using browser cookies\n- SCSS algorithm which uses rem unit to maintain aspect ratio\n- Stylesheets written using BEM methodology\n- Custom SCSS structure to improve reusability\n- Material components are overwritten to support the rem unit and improve mobile/table compatibility coding less\n- Improved readability on media queries using include-media library\n- ESlint rules focused on the frontend, like keyboard accessibility, ARIA, focus and accessible HTML\n- Input validators with multilingual features added\n- Implementation of sass-lint which guarantees the order of CSS properties, maintaining the writing pattern and avoiding unnecessary code revisions\n- Prettier rules implemented to improve code readability\n- Multiple scripts to facilitate development builds and deployment\n- Custom folder structure organized by responsibility\n- Scripts to format, lint, debug, develop, build and deploy\n- And more\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Built With\n\nThis section shows what technologies are used in this particular project.\n\n- [Angular](https://angular.io/)\n- [NodeJS](https://nodejs.org/en/)\n- [MongoDB](https://www.mongodb.com/)\n- [Express.js](https://expressjs.com/)\n- [Angular Material](https://material.angular.io/)\n- [Redis](https://redis.io/)\n- [Swagger](https://swagger.io/)\n- [Chart.js](https://www.chartjs.org/)\n- [Yarn](https://www.yarnpkg.com/)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Hosting\n\nThis section shows what technologies are used in this particular project.\n\n- \u003cstrong\u003eMongoDB\u003c/strong\u003e hosted on \u003ca href=\"https://www.mongodb.com/pricing\"\u003eMongoDB\u003c/a\u003e shared cluster\n- \u003cstrong\u003eRedis\u003c/strong\u003e hosted on \u003ca href=\"https://render.com/pricing\"\u003eRedis\u003c/a\u003e free tier\n- \u003cstrong\u003eNodeJS\u003c/strong\u003e hosted on \u003ca href=\"https://render.com/pricing\"\u003eNodeJS\u003c/a\u003e free tier\n- \u003cstrong\u003eAngular\u003c/strong\u003e hosted on \u003ca href=\"https://pages.github.com/\"\u003eGithub Pages\u003c/a\u003e\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- GETTING STARTED --\u003e\n\n## Getting Started\n\nAfter cloning the project, you need to do a few things to be able to run it.\n\n### Prerequisites\n\nYou need to have the following requirements:\n\n- mongodb \u003ca target=\"_blank\" href=\"https://www.mongodb.com/try/download/community/\"\u003e(download here)\u003c/a\u003e\n- node 16.20.1 \u003ca target=\"_blank\" href=\"https://nodejs.org/en/download/\"\u003e(download here)\u003c/a\u003e\n- redis \u003ca target=\"_blank\" href=\"https://redis.io/download/\"\u003e(download here for Linux)\u003c/a\u003e or \u003ca target=\"_blank\" href=\"https://github.com/tporadowski/redis/releases\"\u003e(download here for windows)\u003c/a\u003e\n- yarn\n\n  ```sh\n  npm install -g yarn\n  ```\n\n- angular cli 14\n\n  ```sh\n  npm install -g @angular/cli@14\n  ```\n\n### Installation\n\n_Below is an example of how you can run the project._\u003cbr\u003e\n_More scripts at package.json_\n\n1. Clone the repo\n   ```sh\n   git clone https://github.com/rinaldilucas/mean-task-manager.git\n   ```\n2. Install NPM packages via yarn\n   ```sh\n   yarn install\n   ```\n3. If running for the first time, run the following command to answer angular cli questions\n   ```js\n   ng serve\n   ```\n4. Run angular, express, and MongoDB in development mode\n   ```js\n   yarn dev\n   ```\n5. Deploy to GitHub pages\n   ```js\n   yarn deploy\n   ```\n   If needed, you can debug express using `yarn api-debug`. \u003cbr\u003eMore builds scripts at `./package.json`. \u003cbr\u003e\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- USAGE EXAMPLES --\u003e\n\n## Usage\n\nYou can import the Insomnia routes via file `./backend/db/routes-collection.json` and import the MongoDB collections via file `./backend/db/routes-collection`. \u003cbr\u003eBelow are the implemented routes: you also can view them inside `./backend/routes` folder or through the Swagger documentation at `http://localhost:3000/api-docs/`.\n\n```js\n-------------------------------\n-------- [USER ROUTES] --------\n-------------------------------\n[GET] localhost:3000/api/users -\u003e 'getAll'\n[GET] localhost:3000/api/users/{id} -\u003e 'getOne'\n[POST] localhost:3000/api/users -\u003e 'create'\n[PUT] localhost:3000/api/users/{id} -\u003e 'update'\n[DELETE] localhost:3000/api/users/{id}-\u003e 'remove'\n[POST] localhost:3000/api/users/authenticate -\u003e 'authenticate'\n[GET] localhost:3000/api/user/exists/{email}/ -\u003e 'checkIfEmailExists'\n[PUT] localhost:3000/api/users/changePassword/{id} -\u003e 'changePassword'\n[POST] localhost:3000/api/users/refreshToken -\u003e 'refreshToken'\n[POST] localhost:3000/api/users/logout -\u003e 'logout'\n\n-------------------------------\n-------- [TASK ROUTES] --------\n-------------------------------\n[GET] localhost:3000/api/tasks?pageSize\u0026searchTerm\u0026pageIndex\u0026sortFilter\u0026sortDirection\u0026startDate\u0026finalDate -\u003e 'getAll'\n[GET] localhost:3000/api/tasks/{id} -\u003e 'getOne'\n[POST] localhost:3000/api/tasks -\u003e 'create'\n[PUT] localhost:3000/api/tasks/{id} -\u003e 'update'\n[DELETE] localhost:3000/api/tasks/{id}-\u003e 'remove'\n\n-------------------------------\n------ [CATEGORY ROUTES] ------\n-------------------------------\n[GET] localhost:3000/api/categories?onlyMine -\u003e 'getAll'\n[POST] localhost:3000/api/categories -\u003e 'create'\n[DELETE] localhost:3000/api/categories/{id} -\u003e 'remove'\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- CONTRIBUTING --\u003e\n\n## Contributing\n\nContributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag \"enhancement\".\nDon't forget to give the project a star! Thanks again!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/amazing-feature`)\n3. Commit your Changes (`git commit -m 'feat: add some amazing feature'`)\n4. Push to the Branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- LICENSE --\u003e\n\n## License\n\nDistributed under the MIT License. See [LICENSE](./LICENSE) for more information.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- CONTACT --\u003e\n\n## Contact\n\n[![Website](https://img.shields.io/badge/-Website-0078D4?style=flat-square\u0026logo=html5\u0026logoColor=white\u0026link=https://lucasreinaldi.com.br)](https://rinaldilucas.com)\n[![Github](https://img.shields.io/badge/-Github-967bb5?style=flat-square\u0026labelColor=967bb5\u0026logo=github\u0026logoColor=white\u0026link=https://github.com/rinaldilucas)](https://github.com/rinaldilucas)\n[![Gmail Badge](https://img.shields.io/badge/-Gmail-c14438?style=flat-square\u0026logo=Gmail\u0026logoColor=white\u0026link=mailto:lucasreinaldi@gmail.com)](mailto:lucasreinaldi@gmail.com)\n[![Hotmail Badge](https://img.shields.io/badge/-Hotmail-0078D4?style=flat-square\u0026logo=microsoft-outlook\u0026logoColor=white\u0026link=mailto:lucasreinaldi@hotmail.com)](mailto:lucasreinaldi@hotmail.com)\n[![Linkedin Badge](https://img.shields.io/badge/-LinkedIn-blue?style=flat-square\u0026logo=Linkedin\u0026logoColor=white\u0026link=https://www.linkedin.com/in/rinaldilucas/)](https://www.linkedin.com/in/rinaldilucas/)\n[![Telegram Badge](https://img.shields.io/badge/-Telegram-1ca0f1?style=flat-square\u0026labelColor=1ca0f1\u0026logo=telegram\u0026logoColor=white\u0026link=https://t.me/rinaldilucas)](https://t.me/rinaldilucas)\n\nProject Link: [https://github.com/rinaldilucas/mean-task-manager](https://github.com/rinaldilucas/mean-task-manager)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- ACKNOWLEDGMENTS --\u003e\n\n## Donations\n\nIf you feel that this project has helped you in any way, whether it's attracting clients or teaching you about the technologies used, feel free to make a donation.\nIt helps me a lot to continue developing open-source codes.\n\n- Metamask (USDT):\n  ```sh\n  0xA0410641515F06fF6a9AdAFf1c3e90a3905ba271\n  ```\n- PIX (BRL):\n  ```sh\n  72140bc8-fadc-42f5-abb6-9c13cc80a59f\n  ```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[contributors-shield]: https://img.shields.io/github/contributors/rinaldilucas/mean-task-manager.svg?style=for-the-badge\n[contributors-url]: https://github.com/rinaldilucas/mean-task-manager/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/rinaldilucas/mean-task-manager.svg?style=for-the-badge\n[forks-url]: https://github.com/rinaldilucas/mean-task-manager/network/members\n[stars-shield]: https://img.shields.io/github/stars/rinaldilucas/mean-task-manager.svg?style=for-the-badge\n[stars-url]: https://github.com/rinaldilucas/mean-task-manager/stargazers\n[license-shield]: https://img.shields.io/github/license/rinaldilucas/mean-task-manager.svg?style=for-the-badge\n[license-url]: https://github.com/rinaldilucas/mean-task-manager/blob/master/LICENSE.txt\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge\u0026logo=linkedin\u0026colorB=555\n[linkedin-url]: https://www.linkedin.com/in/rinaldilucas/\n[project-screenshot]: ./frontend/assets/images/_readme/screenshot.gif\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frinaldilucas%2Fmean-task-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frinaldilucas%2Fmean-task-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frinaldilucas%2Fmean-task-manager/lists"}