{"id":19999295,"url":"https://github.com/lostclus/weatherapp","last_synced_at":"2026-04-05T23:03:57.490Z","repository":{"id":257915402,"uuid":"869515882","full_name":"lostclus/WeatherApp","owner":"lostclus","description":"My pet project","archived":false,"fork":false,"pushed_at":"2025-02-02T13:35:07.000Z","size":2729,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-01T23:29:22.042Z","etag":null,"topics":["demo","django","fastapi","kafka","micorservices","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lostclus.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-08T12:32:07.000Z","updated_at":"2025-02-02T13:35:11.000Z","dependencies_parsed_at":"2024-11-13T05:11:30.539Z","dependency_job_id":"67d62878-4ba8-4b2b-82b8-fb34efab2274","html_url":"https://github.com/lostclus/WeatherApp","commit_stats":null,"previous_names":["lostclus/weatherapp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lostclus/WeatherApp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lostclus%2FWeatherApp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lostclus%2FWeatherApp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lostclus%2FWeatherApp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lostclus%2FWeatherApp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lostclus","download_url":"https://codeload.github.com/lostclus/WeatherApp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lostclus%2FWeatherApp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260151225,"owners_count":22966473,"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":["demo","django","fastapi","kafka","micorservices","python"],"created_at":"2024-11-13T05:11:20.357Z","updated_at":"2025-12-30T22:32:35.960Z","avatar_url":"https://github.com/lostclus.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WeatherApp\n\nMy pet project. Just a demo web application to demonstrate code and\ntechnologies.\n\nFeatures:\n- User registration and authentication\n- User settings form\n- CRUD on user locations\n- Query weather data on selected location\n- Under the hood it loads weather data from Open-Meteo API and store it in the local database\n\nTech stack on backend:\n- Python\n- Django, FastAPI\n- Celery, ARQ\n- PostgreSQL, Redis, Kafka, ClickHouse\n\nTech stack on frontend:\n- TypeScript/React\n- Material UI\n\nThis project use my open source Python libraries:\n- aiosafeconsumer \u003chttps://github.com/lostclus/aiosafeconsumer\u003e\n- django-kafka-streamer \u003chttps://github.com/lostclus/django-kafka-streamer\u003e\n\nCode quality:\n- PEP8 (linted by black and ruff)\n- Static typing (validated by mypy)\n- Unit and integration tests (powered by pytest)\n\nArchitecture: micro services. Services:\n\n`core`\n: Core service. Stack: Django, PostgreSQL, Celery. Provides user and locations\ndatabase and REST API. Stream data to Kafka.\n\n`loader`\n: Data loader service. Stack: ARQ, Redis, Kafka. Provides asynchronous periodic\ntasks to load weather data from public API and stream it to Kafka.\n\n`query`\n: Weather data query service. Stack: FastAPI, Kafka, ClickHouse. Provides\nweather database and REST API.\n\n`ui`\n: User interface. Stack: TypeScript/React, Material UI.\n\nDevelopment plan:\n\n- [x] Implement authorization API in `core` service\n- [x] Implement authorization in UI\n- [x] Implement user settings API in `core` service\n- [x] Implement user settings form in UI\n- [x] Implement locations API (CRUD) in `core` service\n- [x] Implement locations CRUD in UI\n- [x] Implement streaming data from `core` service to Kafka\n- [x] Implement consumer to sync locations data in `loader` service\n- [x] Implement asynchronous tasks in `loader` to get weather data from public API\n  and stream it to Kafka\n- [x] Implement consumer to sync weather data in `query` service\n- [x] Implement weather API in `query` service\n- [x] Implement weather explore page in UI\n- [x] Implement weather dashboard UI\n- [x] Implement weather aggregation API\n- [x] Implement weather aggregation UI\n\n## Local Deploy\n\nFirst install Docker Compose, then type:\n\n    docker compose build\n    docker compose run --rm core-migrate\n    docker compose run --rm query-migrate\n    docker compose up -d\n    docker compose run --rm core-stream\n    docker compose run --rm loader-stream\n\nAvailable URLs:\n\n\u003chttp://localhost:3000\u003e\n: Application user interface\n\n\u003chttp://localhost:3000/core/admin\u003e\n: Admin interface\n\n\u003chttp://localhost:3000/core/api/v1/docs\u003e\n: core API documentation\n\n\u003chttp://localhost:3000/query/api/v1/docs\u003e\n: query API documentation\n\n## Usage\n\nGo to UI \u003chttp://localhost:3000\u003e and create new user (sign-up). Type email and\npassword. No email confirmation is required. The first user created will have\nsuperuser privileges and can login to the admin area. Then login (sign-in) and\nuse left side menu to navigate over site.\n\n## Other Console Commands\n\nRun linters:\n\n    make lint\n\nRun tests:\n\n    docker compose run --rm core-test\n    docker compose run --rm loader-test\n    docker compose run --rm query-test\n\nLoad more historical data:\n\n    docker compose run --rm loader-stream python -m weatherapp_loader.tasks.run stream-weather 2022-01-01\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flostclus%2Fweatherapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flostclus%2Fweatherapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flostclus%2Fweatherapp/lists"}