Концерн разрешения на регистрацию DDD - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть приложение Todo, которое использует CQRS. Я хочу проверить некоторые разрешения для пользователя, который выполняет операции создания / чтения / обновления.

Учитывая :

  • У меня есть 2 группы Office и Kitchen
  • Каждый Todo и User должен принадлежать группе
  • Каждый пользователь может выполнять операции в соответствии со следующими правилами

Правила :

  • Пользователь может прочитать Todo, если он находится в его группе (Todo в Office и Пользователь в Office)
  • Пользователь не может прочитать Todo, если его нет в их группа (Todo в Office и пользователь на кухне)
  • Пользователь может создать Todo только в своей группе (пользователь в Office, значит, Todo должен быть в Office)
  • ...

Таблица : Groups

| GroupId | GroupName |
|    1    |   Office  |
|    2    |   Kitchen |

Таблица : Todo

| TodoId | GroupId |
|    1   |     1   |
|    2   |     1   |
|    3   |     2   |

Таблица: User

|UserId | GroupId |
|  1    |    1    |
|  2    |    1    |
|  3    |    2    |

Что я хочу знать :

  • Какой уровень должен отвечать за проверку вышеуказанных правил (домен, приложение, инфраструктура) ?
  • Где поставить этот элемент управления? Может быть, когда мы думаем, что мы используем CQRS (в контроллере (действии), в сущности, в обработчике запросов / команд)?

Пожалуйста, дайте мне знать ваши идеи.

Спасибо.

1 Ответ

0 голосов
/ 01 мая 2020

Приложение (иначе Служба) должно координировать действия, а модель Домена должна содержать правила.

Часть этого может зависеть от специфики, но вы можете сделать что-то вроде этого ...

// Todo Command Service
public ResponseModel CreateTodoItem(CreateTodoItemCommand command, User user) {
  var userPermissionCheck = _userTodoCommandPermissions.GetPermissions(user, command.GroupId);

  if (!userPermissionCheck.CanCreate) {
    return ResponseModel.Failed();
  }

  // continue

} 

Я бы сделал нечто подобное на той же стороне запроса.

С точки зрения CQRS, я не уверен, что существует реальная необходимость избавиться от Сервиса слой - но, возможно, ваш обработчик разработан таким образом, чтобы справиться с этим. Так что вроде как зависит.

...