{"id":25664641,"url":"https://github.com/romaleev/gamdom-task","last_synced_at":"2026-05-13T13:43:31.620Z","repository":{"id":278331625,"uuid":"931940355","full_name":"romaleev/gamdom-task","owner":"romaleev","description":"Online Betting Dashboard","archived":false,"fork":false,"pushed_at":"2025-02-19T07:09:47.000Z","size":378,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-19T08:23:17.428Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/romaleev.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":"2025-02-13T05:18:56.000Z","updated_at":"2025-02-19T07:09:51.000Z","dependencies_parsed_at":"2025-02-19T08:23:22.526Z","dependency_job_id":"e8636f4b-aee2-4ff2-8ecd-f3cc87edee65","html_url":"https://github.com/romaleev/gamdom-task","commit_stats":null,"previous_names":["romaleev/gamdom-task"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romaleev%2Fgamdom-task","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romaleev%2Fgamdom-task/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romaleev%2Fgamdom-task/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romaleev%2Fgamdom-task/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/romaleev","download_url":"https://codeload.github.com/romaleev/gamdom-task/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240429249,"owners_count":19799822,"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":"2025-02-24T06:29:22.881Z","updated_at":"2026-05-13T13:43:31.614Z","avatar_url":"https://github.com/romaleev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gamdom-task\n\n**Online betting dashboard** allows users to view betting events, select odds, place bets, and receive real-time feedback via a snackbar notification system.\nDetails are [here](full-stack-developer-homework-assignment.pdf).\n\n## Features\n- **⚽ Event-Based Betting System**: Browse live events and place bets in real time.\n- **📊 Dynamic Odds Display**: Events display odds dynamically fetched from the API.\n- **🎫 Bet Slip Management**: Select and manage bets via an intuitive bet slip.\n- **🚀 Optimized Validated API Calls**: Uses `@tanstack/react-query` for caching and performance, `Zod` for validation.\n- **🔄 State Management with Zustand**: Efficient global state handling for UI and betting logic.\n- **🌐 Localization Support**: `i18next` integration for multilingual UI with structured translations.\n- **🎨 Modern UI**: Built with `Material-UI (MUI)` for a clean and responsive design.\n- **🖥️ Fast \u0026 Modular Backend**: `Node.js + Express + Drizzle ORM (PostgreSQL)` for high-performance data handling.\n- **🛠️ Dockerized Deployment**: Supports containerized setup for easy scalability.\n- **📡 Live Event Fetching**: Uses `ky` for efficient API requests and automatic JSON parsing.\n- **✅ Unit \u0026 E2E Testing**: `Vitest, Jest, Supertest, and Playwright` ensure high code quality.\n- **🛠️ Error Handling \u0026 Retry Logic**: Graceful API error handling and user notifications.\n- **🧹 Database Seeding \u0026 Migrations**: `Drizzle Kit` manages database schema and migrations.\n- **📜 Logging \u0026 Debugging**: [Postman](server/postman/events.postman_collection.json) collection, `Pino` for structured logs and debugging.\n- **🧪 Test Coverage \u0026 CI Integration**: Automated test execution with coverage reports.\n\n## Tech Stack\n- **Client**: React 19, Zustand, Vite, Material UI, I18next, React Query\n- **Server**: Node.js, Express, Typescript, Pino, Zod\n- **Database**: Postgres, Drizzle\n- **Testing**: Playwright, Vitest, Supertest, Jest\n- **Deployment**: Docker, Docker Swarm\n- **Code Quality**: ESLint, Prettier, pre-commit hooks, lint-staged\n\n## Commands\n\n### Installation\n\nInstall [Docker](https://docs.docker.com/get-docker/) and NPM dependencies (**Steps 1-2**)\n\n`brew install --cask docker` Install Docker using [brew](https://brew.sh/) example (**Step 1**)\n\n`npm install` Install NPM dependencies (**Step 2**)\n\n### Development\n\nStart app in Development mode with hot reload (**Step 1**).\nThe app will be available at `http://localhost:4200`.\n\n`npm run start` Start client, server, Postgres service and prepares database with mock data (**Step 1**)\n\n`npm run start:client` Start client\n\n`npm run start:server` Start server\n\n`npm run postgres:start` Start Postgres service, creates table and seed with mock data\n\n`npm run postgres:service` Start Postgres service\n\n`npm run postgres:prepare` Create Postgres table and seed it with mock data\n\n`npm run postgres:stop` Stop Postgres service\n\n### Testing\n\nRun the app in Development mode (**Step 1**) and Production mode (**Steps 1-3**) first\n\n`npm run test` Run client, server and e2e tests\n\n`npm run test:e2e` Run end-to-end tests\n\n`npm run test:e2e:local` Run end-to-end tests for local environment\n\n`npm run test:e2e:docker` Run end-to-end tests for Docker environment\n\n`npm run test:client` Run client tests\n\n`npm run test:server` Run server tests\n\n`npm run test:watch` Run client and server tests in watch mode\n\n`npm run test:watch:client` Run client tests in watch mode\n\n`npm run test:watch:server` Run server tests in watch mode\n\n`npm run test:coverage` Run client and server tests coverage report\n\n`npm run test:client:coverage` Run client tests coverage report\n\n`npm run test:server:coverage` Run server tests coverage report\n\n### Build\n\nBuild client and server\n\n`npm run build` Build client and server\n\n`npm run build:client` Build client\n\n`npm run build:server` Build server\n\n### Production\n\nStart app in Production mode in Docker environment (**Steps 1-3**). \nThe app will be available at `http://localhost:4200`.\n\n`npm run docker:build` Build Docker images (**Step 1**)\n\n`npm run docker:deploy` Deploy Docker containers (**Step 2**)\n\n`npm run postgres:migrate` Create Postgres table (**Step 3**)\n\n`npm run docker:rm` Remove Docker containers\n\n`npm run docker:init` Init Docker\n\n`npm run docker:status` Show Docker status\n\n`npm run docker:logs` Show Docker logs\n\n`npm run docker:prune` Prune Docker containers\n\n### Code quality\n\nCode quality checks and fixes\n\n`npm run lint` Run code quality checks\n\n`npm run lint:fix` Run code quality fixes\n\n`npm run update` Update libraries to the latest versions\n\n## API Endpoints\n\n- **`GET /api/events`**: Fetch all available events.\n\n- **`POST /api/events`**: Create a new event with odds.\n\n- **`PUT /api/events`**: Update an existing event.\n\n- **`DELETE /api/events`**: Delete an event.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromaleev%2Fgamdom-task","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromaleev%2Fgamdom-task","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromaleev%2Fgamdom-task/lists"}