Сервис для вычисления математических выражений с поддержкой многопользовательского режима.
cmd/orchestrator— HTTP и gRPC сервис (Оркестратор)cmd/agent— gRPC клиент (Агент), выполняющий вычислительные задачиinternal/database— работа с SQLite (модели, миграции, CRUD)internal/orchestrator— логика HTTP-обработчиков, парсер выражений, планировщик задач, gRPC серверinternal/agent— gRPC-воркер, выполняющий вычисления
-
Клонируем репозиторий:
git clone https://github.com/StarwinM/go_final_sprint3.git cd go_final_sprint3 -
Устанавливаем зависимости:
go mod tidy
-
Настраиваем переменные окружения:
export JWT_SECRET="your_jwt_token_here" export COMPUTING_POWER=4 # опционально
-
Запускаем оркестратор:
go run ./cmd/orchestrator
-
В новом терминале запускаем агента (можно несколько экземпляров):
go run ./cmd/agent
-
Открываем приложение в браузере по адресу:
http://localhost:8080
Базовый URL: http://localhost:8080/api/v1
-
POST
/registercurl -s -X POST http://localhost:8080/api/v1/register \ -H "Content-Type: application/json" \ -d '{"login":"user1","password":"pass123"}'
-
Коды ответа:
200 Created— успешно400 Bad Request— неверный формат или пустые поля409 Conflict— логин уже занят
-
POST
/logincurl -s -X POST http://localhost:8080/api/v1/login \ -H "Content-Type: application/json" \ -d '{"login":"user1","password":"pass123"}'
-
Коды ответа:
200 OKи JSON:{ "token": "<JWT_TOKEN>" }400 Bad Request— неверный формат401 Unauthorized— неверные логин/пароль
-
POST
/calculatecurl -s -X POST http://localhost:8080/api/v1/calculate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <JWT_TOKEN>" \ -d '{"expression":"(2+3)*4"}'
-
Коды ответа:
200 Createdи JSON:{ "id": 1, "expression": "(2+3)*4", "status": "pending" }400 Bad Request— пустое или некорректное выражение401 Unauthorized— отсутствует или неверный токен
- GET
/expressions— список всех ваших выражений - GET
/expressions/<id>— конкретное выражение по ID
curl -s -X GET http://localhost:8080/api/v1/expressions/<id> \
-H "Authorization: Bearer <JWT_TOKEN>"- Коды ответа:
200 OKи JSON-объект/массив:[ { "id": 1, "user_id": 1, "expression": "(2+3)*4", "status": "done", "result": 20, "steps": ["Result: 5","Result: 20"], "created_at": "...", "updated_at": "..." } ]
go test ./internal/orchestrator/parser.go
go test ./internal/agent/worker.go
go test ./internal/orchestrator