Skip to content

Тестовое задание на стажировку в Авито

Notifications You must be signed in to change notification settings

yaQvadrat/Avito-test-task

Repository files navigation

Инструкция по запуску

Можно склонировать репозиторий развернуть БД и сервер с готовыми настройками из .env локально (БД на порту 5432, сервер на порту 8080) при помощи:

docker compose build
docker compose up

Собирают приложение из двух контейнеров (сделал через compose специально для того, чтобы удобнее было локально развернуть, на гитлабе же подключение к внешней бд и использование только одного Dockerfile для сервера). Параметры запуска указываются в .env файле.

На БД накатываются миграции, создающие все таблички, а также инсертятся все данные в таблички employee, organization, organization_responsible (данные взял с БД развернутой на кластере).

Пара тонких моментов:

  • в переменной POSTGRES_CONN хостом указывается psql, потому что такое имя контейнера при сборке и докер объединяет их в одну сеть, снаружи же все доступно по данным из .env.
  • миграции локально накатываются, если в файле /app/migrate.go в переменной pgUrl отключается sslmode; для подключения к БД на кластере эту строку я убирал.
  • в случае если надо развернуть не через compose, а как говорилось в задании, то нужно настроить .env для подключении к внешней БД, создать образ и запустить контейнер + убрать sslmode=disable (о чем говорилось выше) + возможно понадобится убрать из миграций создание таблиц, которые уже были в БД на кластере, а также вставку в них значений.

Используемый стек

  • Go
  • PostgreSQL и pgx библиотека для работы с БД
  • Фрэймворк Echo
  • Для миграций golang-migrate
  • go-playground/validator для валидации данных запросов
  • logrus для логирования

Немного примеров запросов

  • Создание тендера image

  • Изменение статуса тендера image

  • Редактирование тендера (причем за другого ответственного) image

P.S.

  • Задание было довольно интересное, иногда, правда, некоторые тонкие моменты реализации (особенно с правами доступа к сущностям) были не совсем ясны, делал по ощущениям. Поэтому большое спасибо за предоставленную возможность, надеюсь на успешный исход после проверки :)

  • В целом это был, наверное, первый более менее объемный проект на Go, и даже после Python язык показался очень приятным, но из-за новизны некоторые моменты, которые можно улучшить, обнаруживались в момент столкновения с последствиями, однако в будущем буду учитывать подобное.

  • Постарался поддержать более менее чистую архитектуру, структуру директорий, возможность использования другую бд, другие реализации сервисов и подобного за счет использования интерфейсов, где это было уместно.

  • Добавил Graceful Shutdown, чтобы дать сервису корректно завершить свою работу, освободив ресурсы.

  • Как мне кажется, получилось неплохо настроить конфигурацию, отделив ее от непосредственно самой работы приложения

  • Внедрил систему логов на сервере при помощи logrus (уровень логирования выставляется в конфиге), а также логирование запросов в файл при помощи функционала Echo.

  • При большем объеме времени точно стоило лучше разобраться с валидатором, расширив его функционал под собственные нужды, а также воспользовавшись уже имевшимися возможностями, о которых я мог не знать.

Контакты:

About

Тестовое задание на стажировку в Авито

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published