{"id":16179387,"url":"https://github.com/valb3r/time-tracker","last_synced_at":"2026-03-14T18:03:09.846Z","repository":{"id":38481125,"uuid":"229727101","full_name":"valb3r/time-tracker","owner":"valb3r","description":"Time tracker and corporate authorization portal example for groups and users with role inheritance and batch reporting. Backed by graph database, reactive endpoints and spring batch on Neo4j for reporting","archived":false,"fork":false,"pushed_at":"2024-03-29T15:53:55.000Z","size":5579,"stargazers_count":15,"open_issues_count":24,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-28T13:48:20.825Z","etag":null,"topics":["authorization","graph","java","neo4j","spring-batch","spring-batch-neo4j","time-tracker","time-tracking-app","timetracker","webflux"],"latest_commit_sha":null,"homepage":"https://valb3r.github.io/time-tracker/","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/valb3r.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}},"created_at":"2019-12-23T10:11:47.000Z","updated_at":"2023-12-04T14:53:52.000Z","dependencies_parsed_at":"2024-03-29T16:44:54.120Z","dependency_job_id":"8643e70d-370e-4c7c-ace3-12271b6f7b86","html_url":"https://github.com/valb3r/time-tracker","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/valb3r%2Ftime-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valb3r%2Ftime-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valb3r%2Ftime-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valb3r%2Ftime-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/valb3r","download_url":"https://codeload.github.com/valb3r/time-tracker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243960361,"owners_count":20375102,"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":["authorization","graph","java","neo4j","spring-batch","spring-batch-neo4j","time-tracker","time-tracking-app","timetracker","webflux"],"created_at":"2024-10-10T05:27:39.793Z","updated_at":"2026-03-14T18:03:09.769Z","avatar_url":"https://github.com/valb3r.png","language":"Java","funding_links":[],"categories":["Team \u0026 Project Time Tracking"],"sub_categories":[],"readme":"# About the project\n\nTypically, authorization applications include some form of group and user relationships. In particular, lots of organizations do use ActiveDirectory to protect resources like code repositories, virtual machines, etc.\nSuch resource management, in essence, is backed by a user-group-resource relationship. This project aims to demonstrate the simplicity and cleanliness of the corporate authorization solution if it would be implemented using\ngraphs and Neo4j in particular. \n\n\n# Desktop tracker\n\nDesktop tracker is [available at **releases page**](https://github.com/valb3r/time-tracker/releases/download/v0.2.0/time-tracker.zip),\n**requires** Java 8+\n\n\n# Tech stack:\n\n1. Spring Boot 2 with reactive WebFlux REST endpoints and security.\n1. Neo4j database with SDN-RX (endpoints) and OGM (reporting) access layers.\n1. Spring Batch with metadata persistence on Neo4j\n1. Angular / Angular material/flex for UI\n1. Gradle as build system.\n1. Dockerized deployment via docker-compose.\n\n\n# Demo environment\n\nDemo environment to play with project is [located here - https://demo.timetracker.tk](https://demo.timetracker.tk)\n\n## Demo users\n\nAdmin user at https://demo.timetracker.tk has `admin/admin` credentials. You can see an organization tree with this user.\nTypically, all other users have a password that is equal to the  username - you can try `petya/petya` for\nexample.\n\n\n# Why graph database?\n\nGroup and users' owned resources are clear: \n\n![Ownership diagram](role_group_arch.png)\n\nAlso, code that fetches those resources is simple too, exactly one query to read all owned groups:\n\n```\nMATCH (m:User)-[:IN_GROUP]-\u003e(g:Group)-[:HAS_CHILD*]-\u003e(r:Group) WHERE id(m) = $ownerId RETURN id(r) \nUNION MATCH (m:Group)-[:HAS_CHILD*]-\u003e(r:Group) WHERE id(m) = $ownerId RETURN id(r) \nUNION MATCH (m)-[role:MANAGER*]-\u003e(r:Group) WHERE id(m) = $ownerId AND (m:Group OR m:User) \n    AND NONE(\n        dated in role WHERE (type(dated) IN ['MANAGER', 'DEVELOPER']) \n        AND (localdatetime() \u003c= dated.from OR localdatetime() \u003e= dated.to)\n    )\nRETURN id(r)\n```\n\n# UI / Application look\n\n- [User/group management UI look](manage-and-record.gif)\n- [Reporting UI look](report.gif)\n\n\n# Features:\n\n1. Complex user-group relations management including date based role validity \n(i.e. developer in project from 2019-01-01 to 2020-01-01).\n1. Simple to use time card entry and modification.\n1. Template-based report generation in xlsx format (using [jxls templates](http://jxls.sourceforge.net/)).\n1. Reactive endpoints.\n\n\n**Report templates can be found here:**\n1. [By developer](worker/src/main/resources/by-developer.xlsx)\n1. [By project](worker/src/main/resources/by-developer.xlsx)\n\n# Architecture\n\n![Architecture diagram](http://www.plantuml.com/plantuml/proxy?src=https://raw.githubusercontent.com/valb3r/time-tracker/master/architecture.puml\u0026fmt=svg\u0026vvv=2\u0026sanitize=true)\n\n\n# Build and run\n\nRoot project dir, execute these:\n\n```sh\n./gradlew clean buildImage\nexport TIMETRACKER_VERSION=`git rev-parse --verify --short HEAD`\ndocker-compose up \n# OR 'sudo -E docker-compose up' if you need sudo to run docker\n```\n\nCommands above spin up everything needed. UI will be at localhost:6500\n\n# Run from IDE\n\n1. Start the database using \n`docker run --rm -d --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data -e NEO4J_AUTH=neo4j/docker neo4j/neo4j-experimental:4.0.0-rc01`\n\n1. Start [administration module](administration/src/main/java/ua/timetracker/administration/AdministrationServer.java)\n1. Start [time-tracking-server](time-tracking-server/src/main/java/ua/timetracker/timetrackingserver/TimeTrackingServer.java)\n1. Start [worker](worker/src/main/java/ua/timetracker/reportgenerator/Worker.java) (only needed if you want reports)\n1. Install and run UI:\n    1. Install dependencies\n        - cd [time-tracker-ui](time-tracker-ui)\n        - npm install\n    1. Install angular-cli: `npm install -g @angular/cli`\n    1. Run UI: `ng serve --port 6500 --proxy-config proxy.conf.json`\n1. Open http://localhost:6500 - there you can play with user `admin/admin`\n     \n\n# JWT token key generation\n\n1. `openssl genrsa -out key_priv 2048`\n2. `openssl rsa -in key_priv -pubout -outform PEM -out key.pem`\n3. `openssl pkcs8 -topk8 -inform PEM -in key_priv -out key -nocrypt`\n4. `rm -f key_priv`\n\n\n# Stub data\n\nTo create stub data:\n1. Ensure you have removed `neo-db` docker volume if it is not first start.\n1. `docker-compose up`\n1. run `administration/src/main/resources/init.sh`.\n\nImportant note - `init.sh` assumes that it is executed on clean database which was touched by administration \napplication - that means clean neo4j started and administration app started but no users were added through UI.  \nTest users all have same password as their login. I.e. `admin/admin`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalb3r%2Ftime-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvalb3r%2Ftime-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalb3r%2Ftime-tracker/lists"}