{"id":23679048,"url":"https://github.com/rawbitdev/task-time-tracking-app","last_synced_at":"2026-04-11T19:34:33.748Z","repository":{"id":205149442,"uuid":"335627305","full_name":"RawbitDev/Task-Time-Tracking-App","owner":"RawbitDev","description":"🎓 Task-Time Tracking App written in TypeScript. Based on Node.js using Express for the Backend and React + Material UI for the Frontend.","archived":false,"fork":false,"pushed_at":"2021-02-03T13:11:11.000Z","size":1398,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-03T18:47:39.602Z","etag":null,"topics":["api","bachelor","cypress","docker","hda","labels","material-ui","nodejs","react","rest-api","tasks","time","tracking","typescript","university","university-project"],"latest_commit_sha":null,"homepage":"https://h-da.de/","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/RawbitDev.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}},"created_at":"2021-02-03T13:06:24.000Z","updated_at":"2021-02-03T13:31:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"6def01fb-2e90-489b-ad86-b7afdc195a7e","html_url":"https://github.com/RawbitDev/Task-Time-Tracking-App","commit_stats":null,"previous_names":["rawbitdev/task-time-tracking-app"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RawbitDev/Task-Time-Tracking-App","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RawbitDev%2FTask-Time-Tracking-App","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RawbitDev%2FTask-Time-Tracking-App/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RawbitDev%2FTask-Time-Tracking-App/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RawbitDev%2FTask-Time-Tracking-App/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RawbitDev","download_url":"https://codeload.github.com/RawbitDev/Task-Time-Tracking-App/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RawbitDev%2FTask-Time-Tracking-App/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31693272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T13:07:20.380Z","status":"ssl_error","status_checked_at":"2026-04-11T13:06:47.903Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["api","bachelor","cypress","docker","hda","labels","material-ui","nodejs","react","rest-api","tasks","time","tracking","typescript","university","university-project"],"created_at":"2024-12-29T17:00:14.150Z","updated_at":"2026-04-11T19:34:33.726Z","avatar_url":"https://github.com/RawbitDev.png","language":"TypeScript","readme":"[\u003cimg src=\"https://authada.de/wp-content/uploads/2018/04/H_da_logo_fbi-1-1200x480.png\" alt=\"Hochschule Darmstadt\" width=\"350\"/\u003e](https://www.h-da.de/ \"Hochschule Darmstadt\")\n\n🏛 [Fachbereich Informatik](https://fbi.h-da.de/ \"Fachbereich Informatik\") - [Hochschule Darmstadt](https://www.h-da.de/ \"Hochschule Darmstadt\")\n\u003cbr\u003e\n\n\u003e :warning: **Note:** This project was developed in the course of a homework for the subject FWE (\"Fortgeschrittene Webentwicklung\"). This is just a export of the final version. The development took place on the GitLab servers of the Hochschule Darmstadt.\n\n# 🚩 Task-Time Tracking App\n\n![](https://img.shields.io/badge/build-passing-brightgreen?style=flat-square) ![](https://img.shields.io/badge/tests-104%20passed%2C%200%20failed-green?style=flat-square) ![](https://img.shields.io/badge/backend_coverage-100%25-brightgreen?style=flat-square) ![](https://img.shields.io/badge/framework-Material_UI-blue?style=flat-square) ![](https://img.shields.io/badge/license-MIT-blue?style=flat-square)\n\n## Table of content\n\n- [📋 About the project](#-about-the-project)\n  - [👥 Development](#-development)\n- [🛠 Setup the project](#-setup-the-project)\n- [🔍 Test the project](#-test-the-project)\n  - [Testing automatically](#1-testing-automatically)\n  - [Testing manually](#2-testing-manually)\n- [💡 Frontend Reference](#-frontend-reference)\n- [🖥️ API Reference](#%EF%B8%8F-api-reference)\n  - [Route `/label`](#route-label)\n    - [Route `/label/:label/task`](#route-labellabeltask)\n  - [Route `/task`](#route-task)\n    - [Route `/task/:taskId/label`](#route-tasktaskidlabel)\n    - [Route `/task/:taskId/tracking`](#route-tasktaskidtracking)\n  - [Route `/tracking`](#route-tracking)\n- [⚠ Status codes](#-status-codes)\n- [© License](#-license)\n\n# 📋 About the project\n\n**A pretty common problem:** Every single day we have so many things to do at work that it sometimes becomes a little confusing as to what we actually spend and how much time.\n\n\u003e Time equals money, but also quality of life.\n\n**Our solution:** Don't worry, we got something for you! So that we can solve this problem, we're creating a time tracker application that gives us a better overview of everyday tasks. **This second part now finally includes the cool modern looking frontend!**\n\nIn this stage of the devolvement, using the project, you're able to create tasks and add labels as well as time trackings to them. You can also get all tasks with an certain label. Or all existing tracking/labels. It's even possible to create a sample task activity, if you're unsure what to do today or you're just bored from programming all day long.\n\nWhatever brought you here, we wish you an awesome time playing around with our little project here and feel free to contact us whenever you got a question and/or encountering some difficulties or problems. You can also simple report errors on our \"Issues\" section of the GitLab project.\n\n## 👥 Development\n\nThe participants or contributors of this project include:\n\n🎓 **Walther, Ramon**\u003cbr\u003e\nGitLab: [@istrawalt](https://code.fbi.h-da.de/istrawalt \"@istrawalt\")\u003cbr\u003e\nMail: Ramon@BetaLabs.io\n\n_This project is kindly supervised by T. Sauer / D. Schulz / D. Wohlfarth._\n\n# 🛠 Setup the project\n\nThere is barley nothing easier than setting up this project. Just follow this 3 steps and you're ready to go:\n\n1. Move over to the `fwe-app/fwe-api/` folder and create a `.env` file based on the `.env.example`. For default values use the `.env.dist` as base. After that repeat this process for the `fwe-app/fwe-frontend/` folder.\n2. Now head back to the root folder and execute the following command:\n\n   ```\n   make start\n   ```\n\n   Alternatively if you can't use `make`, run:\n\n   ```\n   docker-compose up\n   ```\n\n   **Note:** In some cases, the creation of the DB docker is slower than the API docker. This is resulting in the API docker failing to connect to the DB and automatically synchronies the db schema. If this is the case, make sure to restart the project or execute the following command manually as soon as the db is up and running:\n\n   ```\n   make dbsync\n   ```\n\n   Alternatively if you can't use `make`, run:\n\n   ```\n   docker-compose exec fwe-api npm run typeorm schema:sync\n   ```\n\n3. Thats it, your done, it's as simple as that! Your servers should be running now and got a working connection to the DB. You can verify this by checking the console output, which should tell you something like this:\n\n   ```\n   You can now view fwe-frontend in the browser.\n\n      Local:            http://localhost:80\n      On Your Network:  http://172.18.0.3:80\n   ```\n\n   **Note:** The build process of the frontend could take a few minutes, so please be patient.\n\nOh and by the way, if you're willing to stop the running server ever again, try executing the following command at the root dir:\n\n```\nmake stop\n```\n\nAlternatively if you can't use `make`, run:\n\n```\ndocker-compose down\n```\n\n# 🔍 Test the project\n\nSo we included two separate options for you to test the project:\n\n## 1. Testing automatically\n\nThis project includes defined automated tests (using jest and cypress). This helps you testing the project easily without spending hours and hours to check every existing route and functionality manually. The already defined api tests are used to test **every single route** for a minimum of a good and bad path. The frontend tests include component as well as E2E tests.\n\nTo run all tests, you have to simply start the servers and execute the following command at the root dir:\n\n```\nmake test\n```\n\nAlternatively if you can't use `make`, run:\n\n```\ndocker-compose exec fwe-api npm run test\ndocker-compose exec fwe-frontend npm run test\n```\n\nDepending on the system you're running the tests on, this takes up to a couple of minutes. After that, you're ending up with a detailed overview of the code coverage (_which should be at 100%!_) and the result of the executed tests (_which should tell you that all 80 tests were passed successfully_) for the backend. Followed by the test results of the frontend jest tests.\n\n![](fwe-app/fwe-api/doc/test_result.png)\n\nTo start the cypress test environment execute the following command at the root dir:\n\n```\nmake cypress\n```\n\nAlternatively if you can't use `make`, move over to the `fwe-app/cypress/` folder and run:\n\n```\nnpm i\nnpm run cypress\n```\n\n### Specify what part to test:\n\nIf you just want to run the **frontend** tests, execute the following command at the root dir:\n\n```\nmake ftest\n```\n\nAlternatively if you can't use `make`, run:\n\n```\ndocker-compose exec fwe-frontend npm run test\n```\n\nAnd if you just wanna run the **backend** tests, execute the following command at the root dir:\n\n```\nmake btest\n```\n\nAlternatively if you can't use `make`, run:\n\n```\ndocker-compose exec fwe-api npm run test\n```\n\n## 2. Testing manually\n\nIf you willing to test the project, especially the backend, manually or wanna test a specific - not in the predefined test included - case, we recommend using the free and easy to use software [Postman](https://www.postman.com/). We also included all routes with a simple examples in our [Postman Collection](fwe-app/fwe-api/doc/postman/FWE-Backend.postman_collection.json) we're providing with this project. So feel free to test as much as you want, but keep in mind at some point you're going to run out of coffee!\n\nNote that the predefined postman collection is based on the fixtures also delivered with the project. To add this example fixtures to your database simple execute the following command at the root dir:\n\n```\nmake fixtures\n```\n\nAlternatively if you can't use `make`, run:\n\n```\ndocker-compose exec fwe-api npm run fixtures\n```\n\n# 💡 Frontend Reference\n\nThis is a short introduction to the essential functions as well as to some special features. But for most parts, the frontend is very user friendly and self-explanatory. So we keep this Reference kinda short by purpose. Well, then lets start already!\n\nTo open the \"Create a new task\" Modal, simply click the \"+\" Button in the lower right corner:\n\n![](fwe-app/fwe-frontend/doc/screenshots/AddTaskButton.png)\n\nTo apply a filter, the Filter Icon (left one) at the top right of the page:\n\n![](fwe-app/fwe-frontend/doc/screenshots/AppBar.png)\n\nThis will open the following \"Apply a filter\" dialog:\n\n![](fwe-app/fwe-frontend/doc/screenshots/FilterSettingsModal.png)\n\nHere you can filter for the name, the description, or multiple labels.\n\n**Note:** All applied filters add up to a single filter! So for example if you set two labels, only the tasks that include both will be visible.\n\n![](fwe-app/fwe-frontend/doc/screenshots/AppBar.png)\n\nTo other Settings icon (right one) at the top right of the page, will open a simple menu:\n\n![](fwe-app/fwe-frontend/doc/screenshots/Menu.png)\n\nHere you got the opportunity to switch between a dark and a light theme.\n\nYou can also run the \"Clean labels\" procedure. This will automatically remove all unused labels, that doesn't belong to a single task right now, from the database.\n\n**Note:** This routine is executed automatically every time the user refreshes the page. Watch the bottom left corner for a message telling you, that labels were removed :)\n\nSo and last but not least you also got the opportunity to use the built in \"Clear local storage\" functionality. This is going to clear all data of this page from your local storage. This Site uses the local storage to save couple of information's to save to state of the page, if the user for example refreshes or expediently closes the browser tab.\n\nNext we got a example task view and some explanations to the marked (green numbers) parts:\n\n![](fwe-app/fwe-frontend/doc/screenshots/ExampleTask.png)\n\n1. This button will start a timer. You can stop or pause the timer as you wish. To stop the timer you have to provide a description of what you did. You can also cancel the timer at any time.\n\n2. Here you can open up a overview of all tracking belonging to the task. You can also add trackings manually or edit the already tracked ones. Or if you wish to, you can delete trackings as well.\n\n3. Click this little button, to delete the task and its trackings etc.\n\n4. Switch into the edit mode of this task. You can change for example the name or description. You can also add or remove labels. You can even create new labels, just add them to the task and the app will create them when you save your edit. You can then pick your new labels on every other part of the page as well!\n\n5. This indication shows how many trackings this task has. If the task got none, the indicator is hidden.\n\nOkay, so that should be enough for now. As we said, the rest is super easy to understand and shouldn't pose any major difficulties. But If it does, feel free to contact us!\n\n# 🖥️ API Reference\n\nThis is a simple overview of all routes provided by the API, grouped by their routers and sorted alphabetically. The reference also includes a special \"bonus\" method `Get example task` which wasn't planned at the beginning of the project. Check out its [details page](fwe-app/fwe-api/doc/api_reference/task/task/getExampleTask.md) to find out more about how to use it and whats up with this special feature!\n\n**Note:** For further information's including examples on each route, just click their method descriptions.\n\n## Route `/label`\n\n| Method                                                                             | URL                          |\n| ---------------------------------------------------------------------------------- | ---------------------------- |\n| [Create label](fwe-app/fwe-api/doc/api_reference/label/label/createLabel.md)       | `POST /api/label/`           |\n| [Delete label by id](fwe-app/fwe-api/doc/api_reference/label/label/deleteLabel.md) | `DELETE /api/label/:labelId` |\n| [Get label by id](fwe-app/fwe-api/doc/api_reference/label/label/getLabel.md)       | `GET /api/label/:labelId`    |\n| [Get labels](fwe-app/fwe-api/doc/api_reference/label/label/getLabels.md)           | `GET /api/label/`            |\n| [Patch label by id](fwe-app/fwe-api/doc/api_reference/label/label/patchLabel.md)   | `PATCH /api/label/:labelId`  |\n\n### Route `/label/:label/task`\n\n| Method                                                                                      | URL                             |\n| ------------------------------------------------------------------------------------------- | ------------------------------- |\n| [Get tasks with label](fwe-app/fwe-api/doc/api_reference/label/label.task/getLabelTasks.md) | `GET /api/label/:labelId/task/` |\n\n## Route `/task`\n\n| Method                                                                                        | URL                        |\n| --------------------------------------------------------------------------------------------- | -------------------------- |\n| [Create task](fwe-app/fwe-api/doc/api_reference/task/task/createTask.md)                      | `POST /api/task/`          |\n| [Delete task by id](fwe-app/fwe-api/doc/api_reference/task/task/deleteTask.md)                | `DELETE /api/task/:taskId` |\n| [Get example task](fwe-app/fwe-api/doc/api_reference/task/task/getExampleTask.md) **[BONUS]** | `POST /api/task/example`   |\n| [Get task by id](fwe-app/fwe-api/doc/api_reference/task/task/getTask.md)                      | `GET /api/task/:taskId`    |\n| [Get tasks](fwe-app/fwe-api/doc/api_reference/task/task/getTasks.md)                          | `GET /api/task/`           |\n| [Patch task by id](fwe-app/fwe-api/doc/api_reference/task/task/patchTask.md)                  | `PATCH /api/task/:taskId`  |\n\n### Route `/task/:taskId/label`\n\n| Method                                                                                           | URL                                       |\n| ------------------------------------------------------------------------------------------------ | ----------------------------------------- |\n| [Add label to task](fwe-app/fwe-api/doc/api_reference/task/task.label/addTaskLabel.md)           | `POST /api/task/:taskId/label/:labelId`   |\n| [Add labels to task](fwe-app/fwe-api/doc/api_reference/task/task.label/addTaskLabels.md)         | `POST /api/task/:taskId/label/`           |\n| [Get labels of task](fwe-app/fwe-api/doc/api_reference/task/task.label/getTaskLabels.md)         | `GET /api/task/:taskId/label/`            |\n| [Remove label from task](fwe-app/fwe-api/doc/api_reference/task/task.label/removeTaskLabel.md)   | `DELETE /api/task/:taskId/label/:labelId` |\n| [Remove labels from task](fwe-app/fwe-api/doc/api_reference/task/task.label/removeTaskLabels.md) | `DELETE /api/task/:taskId/label/`         |\n| [Update labels of task](fwe-app/fwe-api/doc/api_reference/task/task.label/updateTaskLabels.md)   | `PATCH /api/task/:taskId/label/`          |\n\n### Route `/task/:taskId/tracking`\n\n| Method                                                                                                    | URL                                             |\n| --------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |\n| [Add tracking to task](fwe-app/fwe-api/doc/api_reference/task/task.tracking/addTaskTracking.md)           | `POST /api/task/:taskId/tracking/:trackingId`   |\n| [Add trackings to task](fwe-app/fwe-api/doc/api_reference/task/task.tracking/addTaskTrackings.md)         | `POST /api/task/:taskId/tracking/`              |\n| [Get trackings of task](fwe-app/fwe-api/doc/api_reference/task/task.tracking/getTaskTrackings.md)         | `GET /api/task/:taskId/tracking/`               |\n| [Remove tracking from task](fwe-app/fwe-api/doc/api_reference/task/task.tracking/removeTaskTracking.md)   | `DELETE /api/task/:taskId/tracking/:trackingId` |\n| [Remove trackings from task](fwe-app/fwe-api/doc/api_reference/task/task.tracking/removeTaskTrackings.md) | `DELETE /api/task/:taskId/tracking/`            |\n| [Update trackings of task](fwe-app/fwe-api/doc/api_reference/task/task.tracking/updateTaskTrackings.md)   | `PATCH /api/task/:taskId/tracking/`             |\n\n## Route `/tracking`\n\n| Method                                                                                | URL                                |\n| ------------------------------------------------------------------------------------- | ---------------------------------- |\n| [Create tracking](fwe-app/fwe-api/doc/api_reference/tracking/createTracking.md)       | `POST /api/tracking/`              |\n| [Delete tracking by id](fwe-app/fwe-api/doc/api_reference/tracking/deleteTracking.md) | `DELETE /api/tracking/:trackingId` |\n| [Get tracking by id](fwe-app/fwe-api/doc/api_reference/tracking/getTracking.md)       | `GET /api/tracking/:trackingId`    |\n| [Get trackings](fwe-app/fwe-api/doc/api_reference/tracking/getTrackings.md)           | `GET /api/tracking/`               |\n| [Patch tracking by id](fwe-app/fwe-api/doc/api_reference/tracking/patchTracking.md)   | `PATCH /api/tracking/:trackingId`  |\n\n# ⚠ Status codes\n\nThe following table gives you a simple overview of the used http status codes used by the project and its respective meaning:\n\n| STATUS CODE                 | Description                                                                                                                                   |\n| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| `200 OK`                    | Indicates that the request has succeeded.                                                                                                     |\n| `201 Created`               | Indicates that the request has succeeded and a new resource has been created as a result.                                                     |\n| `204 No Content`            | The server has fulfilled the request but doesn't need to return a response body.                                                              |\n|                             |\n| `400 Bad Request`           | The request couldn't be understood by the server due to incorrect syntax. The client **SHOULD NOT** repeat the request without modifications. |\n| `404 Not Found`             | The server cannot find the requested resource.                                                                                                |\n|                             |\n| `500 Internal Server Error` | The server encountered an unexpected condition which prevented it from fulfilling the request.                                                |\n\n# © License\n\n**[MIT license](https://opensource.org/licenses/MIT)**\n\nCopyright 2020 - Ramon Walther \u003c\u003cRamon@BetaLabs.io\u003e\u003e\n\n\u003e Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\u003e\n\u003e The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\u003e\n\u003e THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n_This file was last edited by Ramon Walther on 2020-12-13._\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frawbitdev%2Ftask-time-tracking-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frawbitdev%2Ftask-time-tracking-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frawbitdev%2Ftask-time-tracking-app/lists"}