{"id":16081918,"url":"https://github.com/andrescosta/todo-spring-react","last_synced_at":"2026-04-08T23:31:46.693Z","repository":{"id":158252474,"uuid":"612386130","full_name":"andrescosta/todo-spring-react","owner":"andrescosta","description":"An educational TODO application with a full-stack setup featuring React for the frontend, Java 21 and Spring Boot for the backend, Kubernetes for orchestration, PostgreSQL as the database, the Grafana observability stack, and KeyCloak for authentication and authorization.","archived":false,"fork":false,"pushed_at":"2024-03-07T15:41:43.000Z","size":2064,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-10T22:46:46.557Z","etag":null,"topics":["docker","grafana","grafana-loki","grafana-prometheus","grafana-tempo","java","keycloak","kubernetes","openid-connect","postgresql","react","spring","spring-boot","spring-rest-docs","testcontainers"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrescosta.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2023-03-10T20:43:00.000Z","updated_at":"2024-08-02T12:15:05.000Z","dependencies_parsed_at":"2023-10-13T12:15:09.357Z","dependency_job_id":"c22e6137-ca27-4756-9109-6344500cdd9e","html_url":"https://github.com/andrescosta/todo-spring-react","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrescosta%2Ftodo-spring-react","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrescosta%2Ftodo-spring-react/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrescosta%2Ftodo-spring-react/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrescosta%2Ftodo-spring-react/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrescosta","download_url":"https://codeload.github.com/andrescosta/todo-spring-react/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247332525,"owners_count":20921852,"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":["docker","grafana","grafana-loki","grafana-prometheus","grafana-tempo","java","keycloak","kubernetes","openid-connect","postgresql","react","spring","spring-boot","spring-rest-docs","testcontainers"],"created_at":"2024-10-09T11:24:35.391Z","updated_at":"2026-04-08T23:31:46.635Z","avatar_url":"https://github.com/andrescosta.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Project: TODO App\n\n## High level architecture\n![Alt](docs/arch-k8s.svg)\n\n## Data Model\n```mermaid\nerDiagram\n  MUser ||--o{ Activity : creates\n  Activity ||--o{ Media : associates\n  Activity ||--o{ Label_Activity : associates\n  MUser ||--o{ Label: owns\n  Label ||--o{ Label_Activity : associates\n\n  MUser {\n      bigint id PK\n      uuid public_id UK\n      text full_name\n      text mail\n      timestamptz created_at\n      timestamptz updated_at\n  }\n  Activity {\n    bigint id PK\n    uuid public_id UK\n    text name\n    text description\n    text type\n    text status\n    text state\n    text[] tags\n    jsonb extra_data\n    bigint muser_id FK\n    timestamptz created_at\n    timestamptz updated_at\n  }\n  \n  Label {\n    bigint id PK\n    uuid public_id UK\n    text name\n    text description\n    bigint muser_id FK\n    timestamptz created_at\n    timestamptz updated_at\n  }\n\n  Media {\n    bigint id PK\n    uuid public_id UK\n    bigint activity_id FK\n    text name\n    text type\n    text uri\n    text description\n    json extra_data\n    timestamptz created_at\n    timestamptz updated_at\n  }\n  Label_Activity {\n    bigint id PK\n    bigint label_id FK\n    bigint activity_id FK\n    timestamptz created_at\n    timestamptz updated_at\n  }\n```\n\n## Stack\n\n### Activity Service\n* Java 19\n* Go (Improver job service)\n* Spring Boot\n* Spring RestDocs\n* Micrometer\n* Zipkin\n* Loki4j\n* Pyroscope\n* Slf4j \n* Maven\n* GSon\n* JJWT\n\n\n### Identity Management\n* KeyCloak (SSO)\n  * OpenID Connect\n\n### Database\n* Postgress\n\n### API Documentation\n* Asciidoctor\n\n### Infra\n* Nginx\n* Docker\n\n### Testing\n* Junit 5 (Unit)\n* TestContainers (Integration) \n* Gatling (Performance)\n\n### Observability\n\u003e (metrics, logs, traces, continuous profiling)\n* Prometheus\n* Grafana \n* Loki  \n* Tempo \n* Pyroscope\n* Postgres-exporter\n\n### Web Client\n* React\n* W3.CSS\n* Babel\n* Webpack\n* Axios\n\n## Deployment\n\n### Requirements\n\n- Kubernetes\n- Skaffold\n\n### Steps\n\n* Building \n``` bash\ncd manifests\nskaffold build\n```\n\n* Starting the enviroment \n```  bash\ncd manifests\nskaffold run\n```\n\n* Runing integration tests\n\n```  bash\ncd test\n.\\mvnw surefire:test\n```\n\n* Runing performance tests\n\n```  bash\ncd .\\performance\\gatling\\\n.\\mvnw gatling:test \n```\n\n* Generating the API Documentation\n```  bash\ncd .\\todo-svc\n.\\mvnw package\n```\n\n## Local environment information\n\n* Home: http://localhost:3000/ \n  * User: test/123\n* Grafana: http://localhost:3030/\n  * User: admin/admin\n  * Dashboards:\n    * JVM (Micrometer)\n    * Logs, Traces, Metrics\n    * PostgreSQL Database\n* Keycloak: http://localhost:8282/admin/\n  * User: admin/admin\n* PosgresSQL: localhost:5432\n  * Database: todo\n* API Docs\n  * todo-svc\\target\\generated-docs\\api-guide.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrescosta%2Ftodo-spring-react","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrescosta%2Ftodo-spring-react","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrescosta%2Ftodo-spring-react/lists"}