go-park-mail-ru / 2023_1_ContentDealers

Бэкенд Filmium

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Некоторые задачи, вопросы, замечания рк2

mmikhail2001 opened this issue · comments

Замечания после интеграции БД

Новые слои в мидлвеере

  • AccessLog в мидлвеере, предлагаю использовать логрус
  • Обработка паники в мидлвеере

Работа с БД

  • Пинговать бд нужно несколько раз с временным интервалом
  • Все методы репозитория принимают контекст с таймаутом (это будет контект запроса, спускающийся от хэндлеров, или новый, созданный в слое usecase?). 2 примера использования контекстов: https://pkg.go.dev/database/sql
  • #6
  • Проверка нарушения ограничения уникальности при insert, нужно обработать ошибку (repository/user/user.go)
  • Пароль лучше везде называть password_hash, потому что именно с хэшом мы имеем дело.
  • Сущности в БД называются films, на текущий момент в go - movies, это нужно исправить

Ответ от сервера с ошибкой

  • if sessionCookie, err := r.Cookie("session_id"); errors.Is(err, http.ErrNoCookie) { ... }. Проверяем отсутствие сессии через специализированную ошибку.

Замечания после РК1

  • Наверное, лучше между слоями обмениваться указателями на модель, потому что иначе каждый раз происходит копирование
  • У моделей нужно убрать json теги и добавить приватные DTO.
  • Регулярка для пароля и почты
  • Авторизация сразу после регистрации. Думаю, пусть фронт сразу отправит запрос на авторизацию после регистрации.
  • По требованиям не нужно делать страницу подборок, но на созвоне мы решили отдавать в /selections ограниченное количество фильмов, а в /selections/id отправлять все фильмы в подборке. Стоит ли изменять функциональность?
  • Интерфейс SessionUseCase зависит от uuid.UUID
  • Слои обмениваются моделью доменной области - User, UserCredentials - не модель, это DTO для принятия информации о пользователе, который хочет войти на сайт

Задачи РК2

Новые сущности и атрибуты

  • Схема БД (можно пока только для текущего рк сущностей добавить, либо сразу всю бд проектировать). draw.io схема бд: https://drive.google.com/file/d/1Qx-kfswq3sjzeswq8FcW3yuPoQIcWpEC/view
  • Страница фильма - нужно больше инфы, чем названия, описание и previewURL. Например, жанр, длительность, страна, возрастное ограничение, бюджет, режиссер, все актеры
  • Страница актера, какая нужна информация? ФИО, аватарка, дата рождения, место рождения, лучшие фильмы,
  • Хорошо было бы пропарсить питоном кинопоиск, хотя бы пару десятков фильмов и актеров, и автоматом сгенерить скрипт для заполнения БД
  • Стоит определить CRUD методы для новых сущностей и новых задач
  • Думаю, у пользователя при регистрации надо еще возраст спрашивать и хранить его.
  • Загрузка аватарок. Нужно при регистрации и при изменении профиля принимать аватарку. Аватарки сохраняем в папке media, думаю, как в вебе прошлого сема, для каждого года, месяца и дня создавать папки. 1. Возможно, имеет смысл сжимать большие картинки, отправляя эту задачу в очередь rabbitMQ, т.к. пользователь может картинку весом ГБ отправить и бек встанет. 2. Можно поставить ограничение на принимаемый размер данных.

Безопасность, мониторинг и тестирование

  • Шифрование паролей
  • Graceful shutdown
  • XSS, CSRF
  • Тесты с моками
  • Инициализация логгера, добавление логгера во все структуры (предлагаю логрус)
  • Если дело быстрое, то можно купить домен (1. красиво, 2. возможность настройки https)

Видео

  • Настройка nginx
  • При парсинге кинопоиска нужно скачать трейлеры
  • При наличие времени можно подкрутить облачное хранилище для трейлеров

Вопросы

  • http.Error - компактный способ отдать ошибку, но внутри он ставит Content-Type : plain/text, поэтому отдаем ошибку по старой технологии через w.WriteHeader() и io.WriteString. Замена местами строчек в мидлвеере, который добавляет Content-Type : json к ответу, не помогает
  • Запись запрошенных из бд полей в приватные структуры репозитория, а потом копирование этих полей в структуры модели для возврата верхнему уровню - неоптимально
  • Должен ли метод GetAll() репозитория подборок возвращать подборки и все фильмы каждый подборки? Если usecase должен сам запрашивать данные у репозиториев подборок и фильмов, а потом объединять слайсы, то очень неэффективно.
  • Имеет ли смысл хранить userAgent в сессии? Один и тот же человек с разных устройств, разная сессия? (в примерах лекции userAgent использовался в структуре сессии)

Требования РК2

image
image