Вот это не очень хорошо. Никогда не создавайте миграции в автоматическом режиме при запуске контейнера. Это делается только вручную в процессе разработки.
В моделях БД нужно избегать свойство null=True у текстовых полей.
Если у текстового поля null=True, значит оно может иметь 2 значения в случаях когда данные отсутствуют "" и null, что не очень хорошо и нарушает single source of truth. Единственный момент, когда у текста может быть null=True, это когда unique=True и blank=True. В этом случае значение null=True нужно для того, чтобы избежать unique constraint violation при сохранении нескольких объектов с пустыми значениями.
Предлагаю в rabbitmq/consumer вынести все настройки в settings.py и использовать BaseSettings. Вы это делали ранее, почему бы и не использовать тут?
Весь сервис нотификации у вас жестко завязан с email сообщениями. Необходимо предусмотреть и другие способы связи с пользователями. Реализация не нужна, но подготовка в виде абстрактных классов и полей в моделях должна быть.
А как же персонифицированные сообщения? Что-то вроде: "Уважаемый, Ивани Арнольдович! ..." Кажется, такое у вас не предусмотрено.
Продолжая п.6. Другие сервисы кинотеатра будут обращаться к сервису нотификации для того или иного уведомления пользователя.
Вот ситуация: пользователь изменил пароль в сервисе авторизации, сервис авторизации просит сервис уведомлений отправить пользователю сообщение, что-то вроде "Пароль изменен....". Или в сервисе выдачи контента, что-то произошло и нужно уведомить пользователя.
Другие сервисы кинотеатра, которые будут взаимодействовать с этим сервисом уведомлений, не будут иметь полной и актуальной информации о пользователе. У них точно будет id пользователя, а сервис нотификации, должен сходить в сервис авторизации (где у нас лежать актуальные данные пользователя) и забрать всю необходимую информацию о получателе сообщения.
Ну и напоследок, нет тестов. Сделайте хотя бы, несколько для обозначения инфраструктуры.
Нужна небольшая доработка:
null=True
у текстовых полей. Если у текстового поляnull=True
, значит оно может иметь 2 значения в случаях когда данные отсутствуют "" и null, что не очень хорошо и нарушаетsingle source of truth
. Единственный момент, когда у текста может бытьnull=True
, это когдаunique=True
иblank=True
. В этом случае значениеnull=True
нужно для того, чтобы избежатьunique constraint violation
при сохранении нескольких объектов с пустыми значениями.rabbitmq/consumer
вынести все настройки в settings.py и использовать BaseSettings. Вы это делали ранее, почему бы и не использовать тут?