Требования
- Docker (для redis)
- Java 7+ на компьютере (для библиотеки tika)
- PostgreSQL
- Python
Запуск
- Перейти в корень проекта
- Создать и активировать виртуальное окружение
python -m venv .venv
source .venv/Scripts/activate
- Установить зависимости
pip install -r requirements.txt
- Создать файл
.env
, основываясь на.env-example
- Запустить
redis
через команду dockerdocker pull redis
docker run --name redis-server -d redis
- Запустить
celery
в дополнительном окне терминалаcelery -A service.extract_text.celery_app worker -P solo
- Запустить сервер
python main.py
После выполнения вышеописанных действий можно перейти по адресу http://localhost/api/docs для более удобной работы с сервисом.
Запросы
- POST: http://localhost/search - создание настроек поиска
- GET: http://localhost/searches/{search_id} - результаты поиска
Тестирование
- Убедитесь, что вы прошли пункты 1-7 инструкции запуска
- Находясь в корневой директории, напишите команду
pytest .
Сессия тестирования займёт ~30 секунд.
FileSearchSystem
├── api
│ ├── endpoints
│ ─── search_endpoint.py # обработка запросов на создание поиска и получение результатов
│ ─── health_check.py # эндпойт для тестирования соединения
│ ─── routers.py # fastapi router с эндпойнтами для экспорта в main.py
├── db
│ ├── models
│ ─── search_table.py # модель для работы с БД через ORM
│ ├── repositories
│ ─── search_db.py # создание и выгрузка записи из БД
│ ─── connection.py # подключение к БД
├── schemas
│ ─── search_schema.py # pydantic схема для работы с данными из/для эндпойнтов
├── service
│ ─── extract_text.py # поиск текста в файлах, полученных из get_all_files.py
│ ─── get_all_files.py # получение файлов, подходящих по всем параметрам
├── utils
│ ─── check_path.py # проверяем корректность переданной в .env папки для поиска
│ ─── check_normal_files.py # проверяем обычные файлы (не внутри zip-архивов)
│ ─── check_zip_files.py # проверяем файлы внутри zip-архивов
│ ─── compare.py # python словарь для сравнения данных
│ ─── create_test_dir.py # создание структуры файлов для тестирования
├── tests
│ ├── endpoints_test # набор тестов для эндпойнтов
│ ─── health_check_test.py
│ ─── search_endpoint_test.py
│ ─── conftest.py
│ ─── db_test.py # тестирования базы данных
│ ─── data.py # шаблоны данных для тестирования
├── config.py # python класс для получения переменных окружения
├── main.py # создание fastapi application и точка входа
├── requirements.txt
├── pytest.ini # настройки для работы pytest
├── .env
├── README.md
Схема работы POST
- Пользователь отправляет данные на
/search
- Данные валидируются/создаются дефолтные с помощью
pydantic
- Вызывается функция для добавления в БД
- Данные из pydantic-модели распаковываются в модель для БД
- Пользователь получает
ID
для набора настроек в форматеUUID4
Особенности
- возможность последовательно вызывать /search с одинаковыми данными. Сделано из предположения, что поскольку мы работаем с файловой системой, то она может меняться, но при этом у нас не предусмотрено эндпойнта для удаления или перезаписывания результатов поиска по search_id. Один раз вызвав GET для search_id, результат записывается в БД (redis) и последующие вызовы этого search_id будут давать такой же результат. Для возможности получить новые результаты поиска с теми же условиями, нужно создать новый search_id и передать в GET.
Схема работы GET
- Пользователь передаёт
search_id
- Проверяется соответствие стандарту
UUID4
- Проверяется статус задачи в
celery
. Если задача уже выполнена, то возвращаем результат изБД для результатов redis
- Если задача в процессе выполнения, то она в
БД для отслеживания redis
. В таком случае возвращаем шаблон ответа для случая ещё не завершённого процесса поиска - Если
search_id
получен впервые, то возвращаем шаблон ответа для случая ещё не завершённого процесса поиска, а также проверяем наличие в БД - Выгрузка данных для поиска из БД
- Передача в функцию, проверяющая все файлы в
TARGER_DIRECTORY
из.env
на соответствие параметрам поиска (кроме текста внутри файлов) - Затем проверяем наличие заданного текста внутри файлов (любого формата) при помощи библиотеки
tika
- Возвращаем результат (только при повторном вызове с тем же search_id)
Особенности
- Реализована проверка zip-архивов (кроме тех, которые уже находятся внутри zip-архивов)