Этот проект — это API для вычисления математических выражений. Поддерживает базовые операции, такие как сложение, вычитание, умножение, деление и использование скобок.
До сих пор не оставлял его, но поскольку я посчитал, что установка проекта под Windows может вызвать у кого-нибудь абсолютно непредсказуемые затруднения(хоть я и расписал в README инструкцию как запустить библиотеки с линукса), по вопросам билда под эту платформу можете строчить гневные письма. Сам же я запустил на этой системе, и описал проделанные мной пункты, поэтому проект должен запуститься и у вас :)
Сей проект работает по следующей методике:
1. Установите Go
git clone https://github.com/nomaleus/djanGO.git
cd djanGO
go mod tidy
cd cmd
go run main.go
Сервер запустится по адресу: http://localhost:80. Если сервер не запустился, то повторите данную инструкцию сначала, или освободите порт (:
В принципе, можно не выполнять все описанные ниже действия, проект покрыт модульными и интеграционными тестами, имеет интеграцию с базой данных sqlite3, имеется grpc, веб-интерфейс и всё такое. О том, что он билдится и проходят все возможные и невозможные тесты можно догадаться, взглянув на бейдж пайплайна, или подробно на коммиты, но я бы рекомендовал посмотреть на веб хотя бы)
Если у вас не Linux, и даже не OSX, то придется поплакать, потому что одна из библиотек проекта использует инструменты GNU, которые изначально не могут быть в системе Windows. Методом проб, гнева и ошибок составил максимально простую инструкцию как можно запустить проект под Windows:
1. Установите Go
Для PowerShell:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
Для CMD:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))"
После установки проверьте, что оно работает командой choco --version.
Откройте CMD или PowerShell от имени администратора, и введите команду:
choco install mingw
Затем следуйте инструкции. В конце введите "gcc --version", и убедитесь, что установка прошла успешно.
Перейдите в любую папку и склонируйте репозиторий
git clone https://github.com/nomaleus/djanGO.git
cd djanGO
go mod tidy
cd cmd
go run main.go
Сервер запустится по адресу: http://localhost:80. Если сервер не запустился, то повторите данную инструкцию сначала, или освободите порт (:
Проект поддерживает загрузку переменных окружения.
Для LINUX/OSX создайте файл .env и выставьте необходимые настройки по образу и подобию файла .env.example
Для Windows повторите тоже самое, только положите этот файл в ту же папку, откуда и запускаете проект(по инструкции в папку cmd, и тогда сервер найдет его).
Если вы включили GRPC, не забудьте перед отправкой выражения запустить воркера из директории "cmd/grpc_worker":
go run main.go
Если не хотите лицезреть спам запросами от клиента, который не понимает, почему его задачу никто не берёт.
В проекте реализован веб-интерфейс для демонстрации возможностей API, поэтому использование нижеописанными способами необязательно.
Чтобы перейти в веб-интерфейс, необходимо всего лишь перейти по адресу, на котором стартовал сервер, по умолчанию это - localhost:80 :)
Нестандартный дисклеймер Павла: Веб-интерфейс может быть требователен к железу и предоставлен лишь для демонстрации возможностей API, но никак не может являться решением для PROD.
Не нестандартный дисклеймер: YOUR_ACCESS_TOKEN заменяйте на полученный любым способом токен авторизации. И да, это не гпт писал...)
Для отправки каждого из предоставленных запросов, необходимо установить в заголовке Authorization действующий JWT Bearer, который можно получить через инструменты разработчика в веб-интерфейсе.
Отправьте POST-запрос с выражением в формате JSON для вычисления.
{
"expression": "3 + (2 * 5) / (7 - 4)"
}
curl --location 'localhost/api/v1/calculate' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--data '{
"expression": "2+2*2"
}'
{
"id": "ca79f6ef-9861-44ac-bd7f-0702e89559e7"
}
Отправьте GET-запрос для получения списка выражений.
curl --location 'localhost/api/v1/expressions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
{
"expressions": [
{
"id": "dc953f2c-e63e-4546-ae7d-db6a6c23bec7",
"status": "COMPLETED",
"result": 82
},
{
"id": "57147543-87b2-4b87-8896-77407b4cb914",
"status": "COMPLETED",
"result": 84
}
]
}
Отправьте GET запрос, чтобы узнать информацию о конкретном выражении по его уникальному идентификатору(id).
curl --location 'localhost/api/v1/expressions/id' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
Данная команда выведет подробную информацию о том как считалось отправленное вами выражение(это действительно интересно, пусть и ужасно).
{
"expression": {
"id": "dc953f2c-e63e-4546-ae7d-db6a6c23bec7",
"status": "COMPLETED",
"result": 82
}
}
Сервер не позволяет пользователю извне вмешиваться в задачи, но существует подобный путь для POST-запросов.
{
"task": {
"id": "4",
"arg1": "2",
"arg2": "3",
"operation": "*",
"operation_time": 5000
}
}
{
"id": "4",
"result": 6
}
Есть возможность зарегистрироваться, вот пример запроса:
{"login":"admin","password":"admin123"}
curl --location 'localhost/api/v1/register' \
--header 'Content-Type: application/json' \
--data '{
"login":"testuser","password":"testuser"
}'
Пример ответа:
{
"message": "Пользователь успешно зарегистрирован",
"success": "true"
}
Можно и авторизоваться на сервере. Пример запроса:
{"login":"admin","password":"admin123"}
curl --location 'localhost/api/v1/login' \
--header 'Content-Type: application/json' \
--data '{
"login":"testuser","password":"testuser"
}'
Пример ответа:
{
"success": true,
"login": "admin",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dpbiI6ImFkbWluIiwiZXhwIjoxNzQ2NDg4MDI0LCJuYmYiOjE3NDY0MDE2MjQsImlhdCI6MTc0NjQwMTYyNH0.iRcUvn0X2tylQCPM9JYmTJYoojqGSnmihmgeV9nzBXA"
}
Токен можете использовать для дальнейшей авторизации в заголовках.
curl --location 'localhost/api/v1/calculate' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--data '{
"expression": "2+2*2"
}'
YOUR_ACCESS_TOKEN замените на уже имеющийся JWT(Получите его авторизовавшись через веб, либо любым другим удобным способом). Если всё сделаете правильно, то можно увидеть стандартный ответ вроде:
{"id":"17464008-0300-8932-0005-853018633061"}
200 - успешно
201 - выражение принято для вычисления, либо же создано
304 - сообщает о том, что нет необходимости передавать ресурсы
401 - пользователь не авторизован
404 - что-то не найдено :)
405 - нет доступа к методу
409 - конфликт с имеющимися данными на сервере
500 - что-то пошло не так
В проекте есть несколько тестов. Чтобы запустить тесты, выполните:
go test ./...
Если все прошло успешно, вы увидите вывод вроде:
ok djanGO/handlers 1.276s
ok djanGO/handlers/tests 3.428s
ok djanGO/integration 0.540s
ok djanGO/storage 0.903s
ok djanGO/utils 0.707s
Как можно было догадаться, проект обладает gRPC клиентом и сервером :)
Ниже описанная инструкция скорее для разработчиков, а также она имеет место быть только на системах Linux/OSX, поскольку я использую инструмент make, но для Windows-юзеров в папке scripts оставлены скрипты cmd и Powershell(в зависимости от того, что нравится) для сброки grpc сервера и воркера.
- Для генерации Go-кода из proto-файлов вам потребуется установить
protoc
и плагины для Go:
Установка protoc (пример для macOS с Homebrew)
brew install protobuf
Установка плагинов Go для protoc
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
- Генерация Go-кода из proto-файлов:
make proto
- Сборка сервера и gRPC воркера:
make build
- Запуск сервера с включенным gRPC:
make server
- Запуск gRPC воркера в отдельном терминале:
make worker
- Альтернативно, запуск и сервера, и воркера одновременно:
make run
Чуть подробнее о переменных окружения. Там, откуда вы запускаете сервер, может находиться файл dotENV(.env), в котором могут быть установлены настройки, отличающиеся от стандартных на сервере
# Порт для HTTP сервера
PORT=8080
# Включить gRPC сервер (true/false)
ENABLE_GRPC=true
# Адрес и порт для gRPC сервера
GRPC_ADDR=:50051
# Количество gRPC воркеров
WORKERS_COUNT=2
# Вычислительная мощность сервера (количество локальных воркеров)
COMPUTING_POWER=2
В репозитории есть пример файла .env.example
для справки.