По url расположен json c вакансиями.
Цель задания: создать «умную» кэширующую прослойку в виде отдельного веб-сервиса.
Необходимо реализовать python веб-сервер (можно использовать как чистый python, так и фреймворки Flask, Pyramid, Tornado, Django, FastAPI и подобные):
- Метод загрузки/перезагрузки данных
- Загрузка вакансий в локальную реляционную базу (можно SQLite, MySQL, Postgresql, Firebird). Таблицы базы должны создаваться на основании парсинга получаемого json (предполагаем, что как наименование, так и количество полей может со временем меняться)
- В базе должны создаться таблицы со словарями:
- клиенты (сейчас это поля 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
для запуска стека.
-
Для vscode перейди в
cd api/app
и создай проектcode .
-
Установи poetry окружение и подготовь линтер. Для этого используй
poetry config virtualenvs.in-project true
и командуpoetry install --with dev
. Перезапусти IDE. -
Внутри контейнера можно выполнить:
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 и тест. Приложение не готово к продакшену