KonstantinKlepikov / rabota-test

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Rabota-test

Тех.задание

По url расположен json c вакансиями.

Цель задания: создать «умную» кэширующую прослойку в виде отдельного веб-сервиса.

Необходимо реализовать python веб-сервер (можно использовать как чистый python, так и фреймворки Flask, Pyramid, Tornado, Django, FastAPI и подобные):

  1. Метод загрузки/перезагрузки данных
  2. Загрузка вакансий в локальную реляционную базу (можно SQLite, MySQL, Postgresql, Firebird). Таблицы базы должны создаваться на основании парсинга получаемого json (предполагаем, что как наименование, так и количество полей может со временем меняться)
  3. В базе должны создаться таблицы со словарями:
    • клиенты (сейчас это поля clientid, clientname)
    • места работы (сейчас это поля placeid, placetitle, address, latitude, longitude)
    • профессии (сейчас это поля profid, proftitle)

Записи основной таблицы должны ссылаться на записи в словарях.

Для создания структуры базы нельзя иcпользовать генерацию таблиц средствами ORM.

Методы поиска

Поиск должен проводиться по локальной базе, результат возвращается клиенту в таком же формате, как по изначальному url

Простой поиск, поисковая строка передается через параметры GET запроса, например:

  • ашан казань
  • комплектовщик озон
  • склад

Параметризированный поиск через POST-запрос. В качестве параметров form-data может передаваться:

  • clientid
  • placeid
  • profid
  • searchstring

Если clientid и/или placeid и/или profid заполнены, то поиск ведется с учетом фильтра по словарям

Ресурсы

Разработка локально

Для запуска необходимо клонировать репозиторий и поместить в корень репозитория .env файл следующего содержания

# mongo dev
DEV_ROOT_USERNAME=mongo-dev
DEV_ROOT_PASSWORD=mybrilliantpassword
ADMINUSERNAME=admin
ADMINPASSWORD=mybrilliantpassword
MONGODB_URL=mongodb://${DEV_ROOT_USERNAME}:${DEV_ROOT_PASSWORD}@rabota-mongo-dev:27017/
DB_NAME=dev-db

# test db
TEST_ROOT_USERNAME=mongo-test
TEST_ROOT_PASSWORD=mybrilliantpassword
TEST_MONGODB_URL=mongodb://${TEST_ROOT_USERNAME}:${TEST_ROOT_PASSWORD}@erabota-mongo-test:27021/

Вам потребуется docker compose 3.8 и утилита make для запуска стека.

Старт и остановка dev стека

  1. Для vscode перейди в cd api/app и создай проект code .

  2. Установи poetry окружение и подготовь линтер. Для этого используй poetry config virtualenvs.in-project true и команду poetry install --with dev. Перезапусти IDE.

  3. Внутри контейнера можно выполнить:

    • pytest -v -s -x для тестирования
    • используй python -m IPython для проверок кода
    • mypy --install-types
    • mypy app и flake8 app
  • make serve для запуска dev-стека
  • make down остановка и удаление стека
  • пересобрать отдельный сервис можно так docker compose up -d --no-deps --build <service-name>

Ссылки на локальные ресурсы, которые вы можете использовать для контроля работоспособности стека

Общее затраченное время и выполненные задачи

12 часов

Выполненые задачи:

  • развернут docker compose стек: mongodb-dev, mongodb-test, api, mongo admin panel
  • монго выбрана по причине постановкиз задачи (апи без контракта с возможностью обратно-несовместимых изменений). Кроме того, мы не знаем типы данных
  • реализован полнотекстный поиск
  • методы post и get объединены в один post c необязательным body с полями для фильтрации по запросу к БД (технически оба метода делают одно и тоже)
  • логика поиска по словам AND
  • данные из стороннего апи запрашиваются перед каждым запросом к БД. Производится update, а в случае остутсвия документа - insert

Проблемы сервиса:

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

About


Languages

Language:Python 94.1%Language:Dockerfile 3.1%Language:Shell 1.4%Language:Makefile 1.4%