# README
Инструкция
Описание
Это калькулятор, который был сделан как финальная задача третьего спринта Яндекс Лицея на курсе по изучению GO.
Установка, запуск, остановка
Для установки калькулятора перейдите в папку, в которую необходимо установить приложение, и запустите следующие команды:
git clone https://github.com/ra4e1/calculator.git
cd calculator
go mod vendor
Установка SQLite, bcrypt и JWT:
go get github.com/mattn/go-sqlite3
go get -u github.com/golang-jwt/jwt/v5
go get golang.org/x/crypto/bcrypt
Для запуска калькулятора в командную строку вводится:
go run internal/main.go
Для остановки программы в командную строку вводится сочетание клавиш "Ctrl"+"C".
Должны быть включены модули.
go env -w GO111MODULE=on
Логика работы
Приложение предназначено для расчета выражений. Пользователь регистрируется, и логин с хешированныйм паролем сохраняются в БД. Дальше следует авторизация. Авторизационный токен может передоваться в заголовке http-запроса или параметром в URL-запросе и действует в течение 30 минут. Пользователь может отправить выражение с помощью метода /calc
, посмотреть ответ с помощью /answer
и увидеть список отправленных им выражений с помощью /list
Пример использования
В качестве примера рассчитаем выражение: 2+2х2
- Запустите программу.
- Введите в командную строку для регистрации нового пользователя:
curl -X POST -H "Content-Type: application/json" -d '{"login": "john", "password": "snow"}' http://localhost:8081/api/v1/register
- Введите в командную строку для авторизации:
curl -X POST -H "Content-Type: application/json" -d '{"login": "john", "password": "snow"}' http://localhost:8081/api/v1/login
В ответ будет выведен JSON с вашим токеном, скопируйте его. Пример ответа:
{"result":"OK","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTM3MTA4NDQsImlhdCI6MTcxMzcwOTA0NCwiaWQiOjIsIm5hbWUiOiJqb2huIiwibmJmIjoxNzEzNzA5MDQ0fQ.j08tpWvTK4TW6lFX5Jj6Be3wtqyntv6mbCKUxBKr5iw"}
- В браузере откройте ссылку "http://localhost:8081/calc?q=2%2b2*2&token= <your-token>". Вместо <your-token> вставьте скопированный токен (в дальнейших пунктах поступайте также). В ответ будет выведен идентификатор запроса. Запомните его.
- Перейдите по ссылке "http://localhost:8081/list?token= <your-token>" Вы должны увидеть ваш запрос в списке выполнения.
- Для получения результата перейдите по ссылке "http://localhost:8081/answer?id=1&token= <your-token>" (используйте другой id если необходимо). Вы должны увидеть результат расчета или текст "ожидайте решения", если ответ еще не посчитан.
- Остановите приложение и запустите его заново.
- Откройте ссылку "http://localhost:8081/list?token= <your-token>". Вы должны увидеть тот же список запросов, что и до остановки приложения. Состояние и список запросов восстановились после перезапуска.
Описание API
Запросы отправляются методом Post. Результат выдается в теле ответа.
/api/v1/register
Регистрирует пользователей.
Параметры:
- login (тип: json) - логин пользователя, обязательный параметр. В дальнейшем используется при авторизации.
- password (тип: json) - пароль пользователя, обязательный параметр. В дальнейшем используется при авторизации.
Ответ:
- message - сообщение об регистрации. "OK" - успешно
/api/v1/login
Авторизует пользователей.
Параметры:
- login (тип: json) - логин пользователя, обязательный параметр.
- password (тип: json) - пароль пользователя, обязательный параметр.
Ответ:
- result - сообщение об авторизации. "OK" - успешно
- token - токен пользователя.
Запросы отправляются методом GET. Результат выдается в теле ответа.
/calc
Запускает решение примера и возвращает идентификатор.
Параметры:
- q (тип: string) - выражение для расчета, обязательный параметр. Должно содержать только цифры и знаки:
+ - * / ( )
- token (тип: string) - токен пользователя, обязательный параметр.
Ответ:
- requestID - идентификатор запроса. Используется в дальнейшем в
/answer
для получения результата
Параметры передаются в URL и должны быть закодированы в соответствии с правилами кодировки url.
/answer
Используется для получения результата расчета выражения, отправленного с помощью /calc
Параметры:
- id (тип: int) - идентификатор запроса, обязательный параметр
- token (тип: string) - токен пользователя, обязательный параметр.
Ответ:
- result - результат расчета выражения или следующие ошибки:
- решается - на данный момент выражение решается. Если пример не был досчитан до завершения программы, то статус таким и останется.
- Unexpected end of expression - в выражении содержится ошибка.
- Cannot transition token types from NUMERIC [ ] to NUMERIC [ ] - в выражении используются символы, которые программа не поддерживает.
- +Inf - в выражении имеется деление на ноль.
/list
Используется для просмотра списка всех выражений пользователя. Показывает:
- идентификатор запроса
- выражение для расчета
- статус задачи
- ошибку, которая возникла при подсчетах
Параметры:
- token (тип: string) - токен пользователя, обязательный параметр.
Конфигурация приложения
В приложении предусмотрены следующие конфигурационные параметры:
- CALC_APP_PORT - порт для запуска http-сервера. По умолчанию: 8081
- CALC_APP_DELAY - время задержки расчета выражения в секундах. Используется для замедления расчета, чтобы имитировать сложное вычисление. По умолчанию: 10 секунд.
Параметры приложения задаются через переменные окружения.
Мониторинг воркеров
Расчет каждого выражения происходит в горутине. Список выполняющихся горутин можно увидеть с помощью функции /list
.
Описание структуры приложения
У приложения есть следующие логические компоненты:
- Структура
Application
. Конфигурирует и запускает приложение. Содержит одну функциюRun
- Сервисы. Предназначены для выполнения какой-то определенной задачи.
- Структура
Webserver
. Отвечает за запуск и работу http-сервера. Содержит обработчики http-запросов и middleware.