{"id":19925507,"url":"https://github.com/fernandod1/fitness-tracker","last_synced_at":"2025-06-14T05:39:28.887Z","repository":{"id":245768844,"uuid":"819174297","full_name":"fernandod1/fitness-tracker","owner":"fernandod1","description":null,"archived":false,"fork":false,"pushed_at":"2024-07-25T16:48:55.000Z","size":319,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-12T00:28:40.017Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","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/fernandod1.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":"2024-06-24T01:28:52.000Z","updated_at":"2024-07-25T16:48:59.000Z","dependencies_parsed_at":"2024-06-24T02:37:56.580Z","dependency_job_id":"9e9537f6-eaab-45ca-888d-428340fe4681","html_url":"https://github.com/fernandod1/fitness-tracker","commit_stats":null,"previous_names":["fernandod1/fitness-tracker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandod1%2Ffitness-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandod1%2Ffitness-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandod1%2Ffitness-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandod1%2Ffitness-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fernandod1","download_url":"https://codeload.github.com/fernandod1/fitness-tracker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241352761,"owners_count":19948911,"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":[],"created_at":"2024-11-12T22:22:56.027Z","updated_at":"2025-03-01T10:29:32.430Z","avatar_url":"https://github.com/fernandod1.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Fitness activities tracker\n\nSmall Laravel web project to track daily users fitness activities. Features:\n \n- User registration and login.\n- General listing of all activities.\n- Filter by type option (cycling, running, swimming...).\n- Online form to add new activities.\n\n## Tech features\n\n- Request form data validation on new activity.\n- Data cache system on public dashboard.\n- Observer to trigger update cache on new fitness activity.\n- Event and Listener on new fitness activity and email feature.\n- Email report of personal goals.\n- Policy for specify resources by rol (Example: only admin can delete records).\n- Broadcast (pusher) new activity added to rest of online users (php artisan queue:work)\n\n## API features\n\nCreated API Rest with 3 endpoints:\n\n- List activities.\n- Add new activity.\n- Filter by category activities (including total goals: distance and time elapsed).\n\n## API Tech features\n\n- Api Token authentication via Sanctum.\n- Rate limiting feature enabled to prevent abuse (60 requests/minute).\n- Block IPs feature enabled.\n\n### Endpoint generates token to connect\n\nEndpoint: /api/v1/token\n\nMethod: POST\n\n\u003e __Example payload__:\n```json\n{\n    \"email\": \"your@email.com\",\n    \"password\": \"yourpassword\"\n}\n```\n\u003e __Example response__:\n\n```json\n{\n    \"success\": true,\n    \"access_token\": \"2|swsa4he55HzcLl3SsGiT45mxdNlKSJS1kT4Z740H3b2fc47b\"\n}\n```\n\nNow, you must use generated access token in all your calls to API endpoints.\n\n__To use token, just add it as Bearer token format in ```Headers``` of requests__ like:\n\n```Authorization: Bearer 2|swsa4he55HzcLl3SsGiT45mxdNlKSJS1kT4Z740H3b2fc47b```\n\n### Endpoint list activities\n\nEndpoint: /api/v1/activities\n\nMethod: GET\n\n\u003e __Example response__:\n```json\n{\n    \"activities\": {\n        \"data\": [\n            {\n                \"id\": 2,\n                \"user_id\": 1,\n                \"activity_type_id\": 2,\n                \"activity_date\": \"07-06-2024 10:15\",\n                \"name\": \"Roundtrip in mountain\",\n                \"distance\": 7,\n                \"distance_unit\": \"kilometers\",\n                \"elapsed_time\": 650,\n                \"activity_type\": {\n                    \"id\": 2,\n                    \"name\": \"Cycling\"\n                },\n                \"user\": {\n                    \"id\": 1,\n                    \"name\": \"Admin\"\n                }\n            },\n            {\n                \"id\": 4,\n                \"user_id\": 1,\n                \"activity_type_id\": 1,\n                \"activity_date\": \"05-06-2024 09:17\",\n                \"name\": \"Running with Matt\",\n                \"distance\": 10000,\n                \"distance_unit\": \"meters\",\n                \"elapsed_time\": 3000,\n                \"activity_type\": {\n                    \"id\": 1,\n                    \"name\": \"Running\"\n                },\n                \"user\": {\n                    \"id\": 1,\n                    \"name\": \"Admin\"\n                }\n            }\n        ],\n        \"path\": \"http://localhost/fitness-tracker/public/api/v1/activities\",\n        \"per_page\": 10,\n        \"next_cursor\": null,\n        \"next_page_url\": null,\n        \"prev_cursor\": null,\n        \"prev_page_url\": null\n    },\n    \"success\": true\n}\n```\n\n### Endpoint add new activity\n\nEndpoint: /api/v1/activities\n\nMethod: POST\n\n\u003e __Example payload__:\n```json\n{\n    \"activity_type_id\": 1,\n    \"activity_date\": \"2022-02-03 10:11\",\n    \"name\": \"Cycling to oldtown\",\n    \"distance\": 22,\n    \"distance_unit\": \"kilometers\",\n    \"elapsed_time\": \"150\"\n}\n```\n\n\n\u003e __Example response__:\n```json\n{\n    \"activities\": {\n        \"activity_type_id\": 1,\n        \"activity_date\": \"03-02-2022 10:11\",\n        \"name\": \"Cycling to oldtown\",\n        \"distance\": 22,\n        \"distance_unit\": \"kilometers\",\n        \"elapsed_time\": \"150\",\n        \"id\": 37\n    },\n    \"success\": true\n}\n```\n\n\n### Endpoint filter by category and calculate total goals\n\nEndpoint Example: /api/v1/activities/types/2\n\n**(Note: number 2 in endpoint represents activity type ID field of ***activity_types*** table in database).**\n\nMethod: GET\n\n\u003e __Example response__:\n```json\n{\n    \"activities\": {\n        \"data\": [\n            {\n                \"id\": 2,\n                \"user_id\": 1,\n                \"activity_type_id\": 2,\n                \"activity_date\": \"07-06-2024 10:15\",\n                \"name\": \"Roundtrip in mountain\",\n                \"distance\": 7,\n                \"distance_unit\": \"kilometers\",\n                \"elapsed_time\": 650,\n                \"activity_type\": {\n                    \"id\": 2,\n                    \"name\": \"Cycling\"\n                }\n            },\n            {\n                \"id\": 3,\n                \"user_id\": 1,\n                \"activity_type_id\": 2,\n                \"activity_date\": \"04-06-2024 12:00\",\n                \"name\": \"Central Park round\",\n                \"distance\": 3,\n                \"distance_unit\": \"kilometers\",\n                \"elapsed_time\": 400,\n                \"activity_type\": {\n                    \"id\": 2,\n                    \"name\": \"Cycling\"\n                }\n            },\n            {\n                \"id\": 1,\n                \"user_id\": 1,\n                \"activity_type_id\": 2,\n                \"activity_date\": \"01-06-2024 12:00\",\n                \"name\": \"Cycling around lake\",\n                \"distance\": 4,\n                \"distance_unit\": \"kilometers\",\n                \"elapsed_time\": 500,\n                \"activity_type\": {\n                    \"id\": 2,\n                    \"name\": \"Cycling\"\n                }\n            }\n        ],\n        \"path\": \"http://localhost/fitness-tracker/public/api/v1/activities/types/2\",\n        \"per_page\": 10,\n        \"next_cursor\": null,\n        \"next_page_url\": null,\n        \"prev_cursor\": null,\n        \"prev_page_url\": null\n    },\n    \"total_goals\": {\n        \"distanceMeters\": 14000,\n        \"elapsedTimeSeconds\": 1550\n    },\n    \"success\": true\n}\n```\n\nJson key ***total_goals*** represents total distance and total elapsed time by category.\n\n## PHPUnit tests\n\nIncludes some tests done to web service and API service.\n\n# How to install project\n\n1. ) Clone GitHub project and access to directory.\n2. ) Install depedences writing ***compose install***\n3. ) Copy ***.env.example*** file, rename to ***.env*** and configure database credentials.\n4. ) Generate encryption key executing command: ***php artisan key:generate***\n5. ) Configure desired admin email in: /config/admin.php\n6. ) Configure desired API parameters in: /config/api.php\n7. ) Execute migration of database ***php artisan migrate***\n8. ) Execute seeders of database ***php artisan db:seed***\n9. ) Execute command ***npm run dev***\n10. ) Activate queue service ***php artisan queue:work***\n11. ) Load project in http://localhost/fitness-tracker/public/\n\n## Screenshots\n\nMain page displaying fitness activities cached pag for guests:\n\n\u003cimg src=SCREENSHOTS/01.png width=600\u003e\n\nFitness login page to personal statistics:\n\n\u003cimg src=SCREENSHOTS/02.png width=300\u003e\n\nFitness user activities:\n\n\u003cimg src=SCREENSHOTS/03.png width=600\u003e\n\nFitness user activities filtered by type:\n\n\u003cimg src=SCREENSHOTS/04.png width=600\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandod1%2Ffitness-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffernandod1%2Ffitness-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandod1%2Ffitness-tracker/lists"}