Как создать MVP бэкенда
Показываем, какой MVP бэкенда можно разработать для приложения по отслеживанию процессов в компании. В качестве языка использован Go.
3К открытий3К показов
Меня зовут Антон Малыгин, я пишу мини-серию статей о своих пет-проектах или просто нерабочих проектах, в которых участвовал, с техническими подробностями. В прошлой статье я рассказал, как мы «озвучивали» интернет.
Сегодня расскажу о проекте из того же 2018 года, в котором мне предложили поучаствовать, также, в качестве backend-разработчика.
Идея
К моему коллеге пришел один знакомый и предложил идею — система учета речных перевозок с приложением для капитанов, в которой можно трекать события: подход, рейд, погрузка, переход, рейд, выгрузка, простой и его причина.
Суть работы сервиса была следующая: диспетчер/оператор через web-версию создает черновик маршрута для судна, с различным набором событий для учета. Капитан или кто-то из команды, с помощью мобильной версии приложения, подтверждает события из маршрута. Например, по плану должна быть погрузка, капитан подтверждает, потом начинается рейд, капитан отмечает, что рейд начался и т.д. Естественно, все это фиксируется на временных отрезках, т.е. диспетчер видит сколько фактически времени занял каждый этап.
Нужно было сделать MVP проекта, которая включала в себя web-версию, android и backend.
Техническая часть
Я решил писать backend на Go, так как к тому моменту имел небольшой опыт реализации сервиса для отправки Push-уведомлений для iOS, используя Go.
К тому уже имел опыт реализации бэка на MVC на языке Scala, и именно поэтому решил использовать MVC здесь.
После небольших поисков и сравнений решено было использовать web framework iris.
По-моему скромному мнению написан понятно и хорошо, также очень хорошо поддерживается, плюс у него есть модуль для MVC, ну и, конечно, большое количество звездочек на гитхаб =)
Вот так происходит инициализация сервиса:
Web-приложение случает 8080 порт, на который все запросы перенаправляет Nginx.
Сервис работает по принципу CRUD, т.е. по сути является прослойкой между клиентом и базой данных, выполняя простые операции.
Все приложение состоит из 3 основных слоев:
- Контроллеры
- Модели данных
- Сервисы
Рассмотрим простой контроллер аутентификации:
Контроллер получает POST запрос с логином и паролем, парсит json в AuthRequest, далее пытается получить User на основе пары логин/пароль из UserService. В случае успеха, возвращается структура UserResult c токеном и ID пользователя.
Преобразование в json и обратно происходит автоматически, с помощью метки «json» у каждого поля структуры.
Сервисы реализуют бизнес-логику, работу с хранилищем и т.д. На примере EntityService:
Интерфейс EntityService отвечает за работу с разными объектами, например, баржи, суда и т.д.
Реализация GetVessels возвращает все суда для companyId.
Для работы с БД используется расширение стандартного пакета database/sql:
Вместо наследования в Go используется композиция, например, здесь, есть объект EntityObject, с общим набором полей и специфичный Vessel, добавляющий поле InRent.
Заключение
Проект получился неплох для MVP, отработал нужный период времени, но дальнейшего развития не получил. Как оказалось, заказчик смотрел не только наш MVP, но и от «конкурентов». Другое решение выигрывало у нашего, потому что, по сути, уже не являлось MVP.
Но я выполнил программу минимум для себя — получил интересный и полезный опыт разработки на Go, поэтому потратил время не напрасно.
В следующей статье расскажу про, можно сказать, успешный пет-проект, который работает по сей день, и на котором даже удалось заработать.
3К открытий3К показов