Files
2026-04-19 13:12:04 +03:00

52 lines
2.1 KiB
Markdown

# GymLogAI
GymLogAI is a minimal multi-project skeleton for importing workout messages, parsing them into structured training history, and generating workout recommendations.
## Architecture
- `GymLogAI.Core`: domain entities, enums, and primitive abstractions like `IClock` and `IIdGenerator`
- `GymLogAI.Application`: repository contracts, AI contracts, DTOs, and use-case handlers
- `GymLogAI.Persistence`: EF Core `AppDbContext`, PostgreSQL mappings, repositories, infrastructure services, and the first migration
- `GymLogAI.AI`: OpenRouter-ready options and stubbed AI implementations for parsing, recommendations, and embeddings
- `GymLogAI.API`: minimal API composition root with Swagger, import/recommend/history endpoints, and database migration on startup
- `GymLogAI.TelegramBot`: Telegram long-polling host with `/start`, `/today`, and text message import
- `GymLogAI.Worker`: background worker that polls pending telegram messages and parses them into workouts
## Runtime Flow
1. API or Telegram bot imports a raw Telegram message into `telegram_messages` with `Pending` status.
2. Worker polls pending messages and runs `ParseTelegramMessageHandler`.
3. Parsed workouts are stored in `workouts`, `workout_exercises`, and `exercise_sets`.
4. API and Telegram bot can request workout recommendations from the application layer.
## Key Endpoints
- `POST /api/messages/import`
- `POST /api/workouts/recommend`
- `GET /api/workouts/history?userId=<guid>`
- Swagger UI: `/swagger`
## Database
- Provider: PostgreSQL
- Migration project: `GymLogAI.Persistence`
- Initial migration is included in `GymLogAI.Persistence/Migrations`
- `Exercise` includes an `Embedding` field stored as nullable `real[]`
## Run
```bash
dotnet build
dotnet run --project GymLogAI.API/
dotnet run --project GymLogAI.TelegramBot/
dotnet run --project GymLogAI.Worker/
docker compose -f compose.yaml up --build
```
## Configuration
- Connection string: `ConnectionStrings:Postgres`
- Telegram bot token: `TelegramBot:BotToken`
- OpenRouter settings: `OpenRouter:*`
- Worker polling settings: `Worker:BatchSize`, `Worker:PollingIntervalSeconds`