Categorygithub.com/ra4e1/calculator
repository
0.0.0-20240421152427-bac011f9979d
Repository: https://github.com/ra4e1/calculator.git
Documentation: pkg.go.dev

# 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

  1. Запустите программу.
  2. Введите в командную строку для регистрации нового пользователя:
curl -X POST -H "Content-Type: application/json" -d '{"login": "john", "password": "snow"}'  http://localhost:8081/api/v1/register
  1. Введите в командную строку для авторизации:
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"}
  1. В браузере откройте ссылку "http://localhost:8081/calc?q=2%2b2*2&token= <your-token>". Вместо <your-token> вставьте скопированный токен (в дальнейших пунктах поступайте также). В ответ будет выведен идентификатор запроса. Запомните его.
  2. Перейдите по ссылке "http://localhost:8081/list?token= <your-token>" Вы должны увидеть ваш запрос в списке выполнения.
  3. Для получения результата перейдите по ссылке "http://localhost:8081/answer?id=1&token= <your-token>" (используйте другой id если необходимо). Вы должны увидеть результат расчета или текст "ожидайте решения", если ответ еще не посчитан.
  4. Остановите приложение и запустите его заново.
  5. Откройте ссылку "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 - результат расчета выражения или следующие ошибки:
  1. решается - на данный момент выражение решается. Если пример не был досчитан до завершения программы, то статус таким и останется.
  2. Unexpected end of expression - в выражении содержится ошибка.
  3. Cannot transition token types from NUMERIC [ ] to NUMERIC [ ] - в выражении используются символы, которые программа не поддерживает.
  4. +Inf - в выражении имеется деление на ноль.

/list

Используется для просмотра списка всех выражений пользователя. Показывает:

  • идентификатор запроса
  • выражение для расчета
  • статус задачи
  • ошибку, которая возникла при подсчетах

Параметры:

  • token (тип: string) - токен пользователя, обязательный параметр.

Конфигурация приложения

В приложении предусмотрены следующие конфигурационные параметры:

  • CALC_APP_PORT - порт для запуска http-сервера. По умолчанию: 8081
  • CALC_APP_DELAY - время задержки расчета выражения в секундах. Используется для замедления расчета, чтобы имитировать сложное вычисление. По умолчанию: 10 секунд.

Параметры приложения задаются через переменные окружения.

Мониторинг воркеров

Расчет каждого выражения происходит в горутине. Список выполняющихся горутин можно увидеть с помощью функции /list.

Описание структуры приложения

У приложения есть следующие логические компоненты:

  • Структура Application. Конфигурирует и запускает приложение. Содержит одну функцию Run
  • Сервисы. Предназначены для выполнения какой-то определенной задачи.
  • Структура Webserver. Отвечает за запуск и работу http-сервера. Содержит обработчики http-запросов и middleware.

Контакты

https://t.me/ushioko