netflix-movies-api's People
netflix-movies-api's Issues
[FEATURE] Test films [functional tests]
Description
Написать функциональные тесты для Фильмов
Possible solution
- Протестировать эндпоинты
GET /api/v1/films/
,GET /api/v1/films/search?query=XXX
,GET /api/v1/films/{uuid}
- Протестировать работу пагинации и сортировки
- Протестировать получение данных из кеша
Additional context
[FEATURE] NP-05_ETL genre
Description
Добавить в существующий ETL пайплайн, в котором создается и заполняется индекс genre. Плоский индекс без денормализованных данных.
Possible solution
- Отрефакторить существующий ETL сервис
- По аналогии с
Filmwork
сделать пайплайн для обновленияGenre
Additional context
[FEATURE] Test repositories layer [unit tests]
Description
Написать юнит тесты для слоя репозиториев
Possible solution
- Протестировать базовые репозитории для работы с БД и кешом
- Протестировать репозитории
FilmRepository
,GenreRepository
,PersonRepository
- получение данных напрямую из БД и из кеша
Additional context
[FEATURE] NP-07_2_Persons logic
Description
Добавить сервис, который обращается к Elasticsearch и возвращает информацию о персоналиях - по одному или списком.
При запросе списком учитывать параметры фильтрации.
Possible solution
- Сделать репозиторий по аналогии с
FilmworkRepository
иGenreRepository
- Репозиторий для персоналий:
- получение объекта по ID
- поиск объекта с переданными параметрами
- пагинация (пример:
page[number]=1&page[size]=50
)
- Добавить эндпоинты:
- вывод списка персон (с возможной фильтрацией, пагинацией);
- детальная страницы персоны (с простым списком фильмов);
- страница персоны (с разбивкой фильмов по ролям);
- поиск по персонам;
- фильмы по персоне
Additional context
[FEATURE] Test persons [unit tests]
Description
Написать юнит тесты для Персон
Possible solution
- Протестировать эндпоинты
GET /api/v1/persons/
,GET /api/v1/persons/search?query=XXX
,GET /api/v1/persons/{uuid}
,GET /api/v1/persons/full/{uuid}
,GET /api/v1/persons/{uuid}/films
- Протестировать работу пагинации и сортировки
- Протестировать обработку ошибок
Additional context
[FEATURE] Exponential backoff
Description
Реализовать работу с внешними сервисами (Redis, Elasticsearch) через exponential backoff
Possible solution
- Использовать декоратор
backoff
при запросах к внешним сервисам
Additional context
[FEATURE] New Film fields
Description
Добавить новые поля в схему FilmDetail
:
age_rating
: Enumrelease_date
: date
Possible solution
- Обновить схему
FilmDetail
- Добавить Enum с возможными возрастными рейтингами
- Отдавать в АПИ на
GET /api/v1/films/{uuid}
новые поля
Additional context
[FEATURE] Test genres [unit tests]
Description
Написать юнит тесты для Жанров
Possible solution
- Протестировать эндпоинты
GET /api/v1/genres/
,GET /api/v1/films/search?query=XXX
,GET /api/v1/genres/{uuid}
- Протестировать обработку ошибок
Additional context
[FEATURE] NP-02_Docker
Description
Нужен Dockerfile для билда бекенда для API. Также нужно создать (или адаптировать созданные ранее) docker-compose, чтобы поднимались все сервисы разом.
Possible solution
- Поднять сервис ETL на сервере:
- Развернуть сервис ETL в Яндекс Облаке (можно использовать Container Optimized Image)
- Подключаться к Elasticsearch по заданному адресу
- Использование докер образов:
- Запушить образы контейнеров из сервиса ETL в Cloud Registry
- Создать новый docker-compose.yml файл для всего проекта
- Добавить сервисы из ETL в новый docker-compose
Additional context
Code review
Отличная работа, все задания выполнены на крайне высоком уровне. Очевидно, что подобная работа не первая подобного рода :)
- В сервисах
src/services
методыget_....._by_id
практически идентичны. Можно вынести в базовый класс. - Раз вы знакомы с паттерном проектирования с использованием репозиториев и сервисов, то может быть интересным https://python-dependency-injector.ets-labs.org/examples/fastapi.html
[FEATURE] CacheTestMixin with params
Description
по аналогии с CacheTestMixin сделать миксин для проверки кэша с параметрами
Possible solution
Вынести в миксин следующие методы:
test_film_list_from_cache_with_params
test_film_search_from_cache_with_params
Additional context
- Вопросы поднимались в 38 пул реквесте
[FEATURE] NP-06_ETL person
Description
Добавить в существующие ETL пайплайн, в котором создается и заполняется индекс person с авторами, сценаристами и режиссерами. Плоский индекс без денормализованных данных.
Possible solution
- По аналогии с пайплайном для
Filmwork
иGenre
добавитьPerson
Additional context
[FEATURE] NP-00_Create repo
Description
Создать репозитарий для проекта на основе шаблона, расшарить доступы для тиммейтов и кодревьюеров
Каждый микросервис реализуется и работает как полностью независимая система, предоставляющая доступ к своей внутренней логике и данным с помощью определенного интерфейса. Это способствует повышению гибкости ПО, поскольку каждый микросервис является независимой единицей в плане разработки и масштабирования.
Будучи независимыми сервисами с четкими границами, не копируйте admin и etl в новый репозиторий
Possible solution
.
Additional context
.
[FEATURE] Refactor Person repository
Description
Отрефакторить метод PersonRepository. get_person_films
- делать запрос к индексу movies
и искать фильмы для данной персоны (можно искать по actors
, writers
, directors
)
Possible solution
- Делать запрос к индексу
movies
и фильтровать фильмы по uuid персоны - Пример запроса к индексу (
GET movies/_search
):
{
"query": {
"bool": {
"should": [
{
"nested": {
"path": "actors",
"query": {
"term": {
"actors.uuid": {
"value": "065dcb6d-a32d-4f16-89cf-dcaa36561253"
}
}
}
}
},
{
"nested": {
"path": "writers",
"query": {
"term": {
"writers.uuid": {
"value": "065dcb6d-a32d-4f16-89cf-dcaa36561253"
}
}
}
}
},
{
"nested": {
"path": "directors",
"query": {
"term": {
"directors.uuid": {
"value": "065dcb6d-a32d-4f16-89cf-dcaa36561253"
}
}
}
}
}
]
}
}
}
Additional context
[FEATURE] NP-03_Schemas
Description
Создать модели, прописав правильные типы данных для:
- фильмов
- жанров,
- актеров, сценаристов, режиссеров
Possible solution
.
Additional context
[FEATURE] Refactor repositories layer
Description
Отрефакторить слой репозиториев в проекте (следуя принципам SOLID).
Possible solution
- Сделать отдельный класс для кеша + реализацию кеша с использованием Redis
- Сделать отдельный класс для работы с данными напрямую из БД + реализацию с использованием Elasticsearch
- Отрефакторить существующие миксины для работы с Redis и Elasticsearch
Additional context
[FEATURE] NP-08_Cache
Description
Кешировать ответы ручек, запрошенных с одинаковыми параметрами, чтобы не ходить лишний раз в Elasticsearch.
Possible solution
- Изменить репозитории/добавить базовый, который будет возвращать данные либо из кэша, либо непосредственно из Elasticsearch
- Если данных в кэше не было - записываем их после запроса в кэш и выставляем ttl. В качестве ключа можно использовать хэш самого запроса с параметрами
Additional context
[FEATURE] Tests infrastructure
Description
Разработать инфраструктуру для функциональных и юнит тестов.
Possible solution
- Создать тестового клиента АПИ
- Создать основные фикстуры/фабрики
Additional context
[FEATURE] NP-04_Movie logic
Description
Добавить сервис, который обращается к Elasticsearch (используя драйвер) и возвращает информацию о фильмах – по одному или списком.
При запросе списком учитывать параметры фильтрации и сортировки.
Possible solution
- Репозиторий фильмов:
- получения фильма по ID
- поиск фильма с переданными параметрами
- пагинация (пример:
page[number]=1&page[size]=50
)
Additional context
[FEATURE] NP-01_Create basis
Description
Создать базовые файлы и папки по уроку FastAPI, включить туда requirements.txt.
Possible solution.
.
Additional context
[FEATURE] Netflix Auth Integration
Description
Сделать интеграцию с сервисом авторизации Netflix Auth API
. Ссылка на задачу в Netflix Auth.
Possible solution
Написать клиенты для работы с auth0 и сервисом Netflix Auth (integrations: http, client)- Проверять роли пользователя по JWT токену
- Сделать отдельный эндпоинт для получения фильмов, доступных только по подписке
- "Защитить" этот эндпоинт jwt авторизацией - будем ходить в Netflix Auth для получения информации по пользователю
- Написать функциональные тесты
Additional context
[FEATURE] NP-07_Genres logic
Description
Добавить сервис, который обращается к Elasticsearch и возвращает информацию о жанрах - по одному или списком.
Possible solution
- Сделать репозиторий по аналогии с
FilmworkRepository
- Репозиторий для жанров:
- получение объекта по ID
- поиск объекта с переданными параметрами
- Добавить эндпоинты:
- вывод списка жанров
- детальная страница жанра
Additional context
[FEATURE] * Refactor services
Description
Отрефакторить слой сервисов в проекте.
Possible solution
- Использовать Dependency Injector вместо стандартного
Depends
из FastAPI ? - Изменить базовые сервисы и миксины ?
- Передавать в конструктор класса функцию для генерации ключа в кэше ?
Additional context
Code review
Привет! Отличная работа! Отдельно отмечу то, как вы подробно оформляете и ведете issue - это очень круто! Ниже пара рекомендаций:
- Совет: в ETL вы сделали классные пайплайны, но тут есть нюанс, вы в атрибуты класса кладете инстанциированные объекты. У этого подхода есть две проблемы: у вас не синглтоны и вы рискуете, что в будущем ваш класс могут инстанциировать более одного раза и получить проблемы с объектами в атрибутах. Второе: момент инициализации, сейчас у вас инициализация произойдет в момент импорта модуля, а это не всегда хорошо и удобно. Более правильные пути:
- использовать property
- написать примерно так (ведь инициализация у них одинаковая и можно сделать ее внутри init):
class FilmworkPipeline(ETLPipeline): loader = FilmworkLoader transformer = FilmworkTransformer extractor = FilmworkExtractor```
- Укажите конкретную версию redis
- Задайте здесь workdir='/app/src', тогда не придется в commands делать cd
- Здесь лишняя новая строка, и то и другое - установленные зависимости, их не надо разделять
- Тут просто интересная логика разделения: почему ES - это остальное, а redis указали в настройках проекта?
[FEATURE] Test services layer [unit tests]
Description
Написать юнит тесты для слоя сервисов
Possible solution
- Протестировать сервисы
FilmService
,GenreService
,PersonService
- получение данных напрямую из БД или из кеша
Additional context
[FEATURE] Exceptions handling
Description
Улучшить обработку ошибок в проекте
Possible solution
- Унифицировать формат ошибок (описание, код)
- Добавить кастомные обработчики ошибок (например, для эластика: elasticsearch.exceptions.RequestError, 400)
Additional context
[FEATURE] Test persons [functional tests]
Description
Написать функциональные тесты для Персон
Possible solution
- Протестировать эндпоинты
GET /api/v1/persons/
,GET /api/v1/persons/search?query=XXX
,GET /api/v1/persons/{uuid}
,GET /api/v1/persons/full/{uuid}
,GET /api/v1/persons/{uuid}/films
- Протестировать работу пагинации и сортировки
- Протестировать получение данных из кеша
Additional context
[FEATURE] Test genres [functional tests]
Description
Написать функциональные тесты для Жанров
Possible solution
- Протестировать эндпоинты
GET /api/v1/genres/
,GET /api/v1/genres/{uuid}
- Протестировать получение данных из кеша
Additional context
[FEATURE] Test films [unit tests]
Description
Написать юнит тесты для Фильмов
Possible solution
- Протестировать эндпоинты
GET /api/v1/films/
,GET /api/v1/films/search?query=XXX
,GET /api/v1/films/{uuid}
- Протестировать работу пагинации и сортировки
- Протестировать обработку ошибок
Additional context
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.