170 похожих чатов

Вопрос общего характера по бекенду: должен ли я валидировать и

защищать внутреннюю реализацию (сервисы и сущности) или только внешний интерфейс (контроллеры и дто?)

Представим такую ситуацию, у меня на проекте есть Entity и Dto. Первый я не валидирую никак, просто задаю тип данных - строка. Второй я очень жестко валидирую - принимать только строку с хешем алгоритма sha3-256

Представим другую ситуацию, у меня на проекте есть Service и Controller для ресайза изображений. Первый я не валидирую никак, он может, скажем, ресайзить картинку хоть до 400000000x400000000 (что будет крайне долго). Второй я жестко валидирую - если переданная пользователем ширина или высота больше 2000, то я троваю ошибку BadRequest.

Это ОК или нужно валидировать данные на уровне внутренней реализации, а не внешнего интерфейса? (тровать ошибки в сервисе, делать валидацию Entity при записи в БД [при том, что по типам БД оно проходит] и т.д)

13 ответов

11 просмотров

Entity должна делать все чтобы она не могла оказаться в невалидном состоянии относительно бизнес логики по идеи не нужно, поскольку это только больше в кашу прерварит твой код бизнес логики, смешав его с кодом проверки данных

по максимуму валидации на входных точках (контроллеры) и в самой бд (констрейнты)

Veli- Автор вопроса

не совсем понял, как будто бы второе предложение противоречит первому) Так Entity должна защищаться либо защита на уровне контроллера - это ок?

Veli- Автор вопроса

так вот проблема, что сама БД не имеет валидация типа «хочу хэш вот в этой вот колонке, а не просто строчку». Могу на уровне сервиса или репозитория это вручную предотвращать, но стоит ли?

имею ввиду что вот например в запросе POST /api/orders/status в контроллере статус "sent" - это валидное значение в теле запроса но сам энтити не может в нем оказаться, поскольку например заказ уже закрыт

простые ошибки валидации(тип, формат не тот) валидируешь в контроллере Все что сложнее(уникальность) валидируешь в сервисе Если я правильно понял вопрос

Veli- Автор вопроса

уникальность бд сама заблочит, так что тут можно даже не думать) Значит формат все-таки к контроллеру, я тоже к этому склоняюсь

Veli- Автор вопроса

хм, тоже интересный пример

имхо всё постороннее должно отваливаться еще на этапе middleware

если это то что-то, что должно отвалиться, требует проверки в бд или еще где то, это тоже мидлвара?

размер картинки?

Veli- Автор вопроса

это не размер картинки, это параметры, по которым я ресайзю картинку, если речь конкретно про мое уточнение)

Похожие вопросы

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта