{"id":26689408,"url":"https://github.com/muellerconstantin/taskcare-api","last_synced_at":"2026-04-08T23:34:51.371Z","repository":{"id":171321933,"uuid":"507948250","full_name":"MuellerConstantin/taskcare-api","owner":"MuellerConstantin","description":"Backend of the TaskCare collaboration platform for managing tasks in a team.","archived":false,"fork":false,"pushed_at":"2025-03-18T20:27:11.000Z","size":824,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-05T21:38:33.366Z","etag":null,"topics":["hexagonal-architecture","hibernate","java","jpa","mysql","openapi","ports-and-adapters","rabbitmq","redis","rest","spring-boot","spring-data-jpa","spring-mvc","spring-security","stomp","websocket","websockets"],"latest_commit_sha":null,"homepage":"","language":"Java","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/MuellerConstantin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-06-27T14:44:44.000Z","updated_at":"2025-03-18T20:27:15.000Z","dependencies_parsed_at":"2024-08-05T09:17:51.057Z","dependency_job_id":"a9bc46a7-55c1-4c94-a896-cc8170c8aef8","html_url":"https://github.com/MuellerConstantin/taskcare-api","commit_stats":null,"previous_names":["0x1c1b/taskcare-service","muellerconstantin/taskcare-service","muellerconstantin/taskcare-api"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/MuellerConstantin/taskcare-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuellerConstantin%2Ftaskcare-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuellerConstantin%2Ftaskcare-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuellerConstantin%2Ftaskcare-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuellerConstantin%2Ftaskcare-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MuellerConstantin","download_url":"https://codeload.github.com/MuellerConstantin/taskcare-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MuellerConstantin%2Ftaskcare-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31579056,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","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":["hexagonal-architecture","hibernate","java","jpa","mysql","openapi","ports-and-adapters","rabbitmq","redis","rest","spring-boot","spring-data-jpa","spring-mvc","spring-security","stomp","websocket","websockets"],"created_at":"2025-03-26T14:35:34.255Z","updated_at":"2026-04-08T23:34:51.354Z","avatar_url":"https://github.com/MuellerConstantin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TaskCare API\n\n\u003e Collaboration platform for managing tasks in a team.\n\n![](https://img.shields.io/badge/Java-17-red?logo=openjdk)\n![](https://img.shields.io/badge/Spring%20Boot-3.4.0-green?logo=springboot)\n![](https://img.shields.io/badge/Database-MySQL-blue?logo=mysql)\n![](https://img.shields.io/badge/Database-Redis-red?logo=redis)\n![](https://img.shields.io/badge/Object%20Storage-MinIO-pink?logo=minio)\n![](https://img.shields.io/badge/OpenAPI-3.0.3-green?logo=openapi-initiative)\n\n## Table of contents\n\n- [Introduction](#introduction)\n- [Getting Started](#getting-started)\n- [Architecture](#architecture)\n- [License](#license)\n  - [Forbidden](#forbidden)\n\n## Introduction\n\nThis is the backend of the TaskCare platform. TaskCare is a platform, developed from a teaching project, for managing\ntasks within a team. The collaboration platform enables the joint definition of tasks to be completed and the\ncontinuous monitoring of the processing status, transparently visible to everyone. The architecture and design of the\nplatform enables the user to access TaskCare from any device.\n\n## Getting Started\n\nTaskCare is generally operated on-premise. There are a few steps to follow for installation: Firstly, the\nappropriate system environment with its third-party services must be set up (See [Operation](docs/operation.md))\nand secondly, the application must be correctly configured (See [Configuration](docs/configuration.md)). After that,\nTaskCare can then be started and operated on-premise, optionally scaled horizontally.\n\n## Architecture\n\nTaskCare API is a Kanban board application built as a highly scalable web service, providing a well-structured and\nefficient RESTful interface for seamless interaction. The application architecture is based on the principles of\nHexagonal Architecture, also known as Ports and Adapters, ensuring a clear separation of concerns and promoting\nflexibility in system design. Additionally, it incorporates concepts from Domain-Driven Design (DDD) to maintain\na strong alignment between the application's structure and its business logic. The infrastructure layer is designed\nto leverage several third-party services to optimize data storage, caching, and file management. MySQL serves as\nthe primary database, responsible for persisting all application-related data, including both event-sourced and\nread-model information. Redis is utilized as an in-memory data store, significantly improving performance by\ncaching frequently accessed data and reducing latency in data retrieval. MinIO acts as an object storage solution,\nmanaging file attachments, binary data, and user-uploaded content efficiently, ensuring scalable and reliable\nhandling of media files.\n\n\u003cdiv style=\"text-align: center;\" align=\"center\"\u003e\n  \u003cimg src=\"docs/images/architecture.png\" alt=\"Architecture\" style=\"width: 250px; height: auto;\" /\u003e\n\u003c/div\u003e\n\nThe system employs Event Sourcing for the write model, where all changes to the application state are stored as\ndiscrete events. This approach ensures a complete history of all modifications, allowing the system state to be\nreconstructed at any point in time. For the read model, a traditional CRUD (Create, Read, Update, Delete) approach\nis used, enabling direct and efficient data retrieval, modification, and management within a structured database.\nThis combination ensures a robust and efficient data flow by leveraging the immutability of event logs while\nmaintaining fast and straightforward access to data. Additionally, the system follows the CQRS (Command Query\nResponsibility Segregation) pattern, where the Query (Read) Service and Command (Write) Service are strictly\nseparated. This separation enhances scalability by optimizing query processing and command execution independently\nfor each domain. MySQL serves a dual purpose in this architecture: it acts as the event store for the write model,\npersistently logging all domain events, while simultaneously functioning as the relational database for the read\nmodel, storing structured and query-optimized data.\n\n\u003cdiv style=\"text-align: center;\" align=\"center\"\u003e\n  \u003cimg src=\"docs/images/dataflow.png\" alt=\"Dataflow\" style=\"width: 500px; height: auto;\" /\u003e\n\u003c/div\u003e\n\n## License\n\nCopyright (c) 2024 Constantin Müller\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n[MIT License](https://opensource.org/licenses/MIT) or [LICENSE](LICENSE) for\nmore details.\n\n### Forbidden\n\n**Hold Liable**: Software is provided without warranty and the software\nauthor/license owner cannot be held liable for damages.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuellerconstantin%2Ftaskcare-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuellerconstantin%2Ftaskcare-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuellerconstantin%2Ftaskcare-api/lists"}