jperdior / sequra-code-challenge

0 stars 0 forks source link

[CONSULTA] DDD y relacion entre Entities #1

Closed agusmaler closed 6 months ago

agusmaler commented 6 months ago

Buenas, que tal? encontre tu perfil porque creaste una issue en el proyecto DDD con php de CodelyTv, y quisiera consultarte porque quiza sabes la respuesta a una duda que tengo: En la entidad Video, uno de sus atributos es un CourseId, y en el caso de uso de creación de un Video se le pasa un CourseId, pero en ningun momento se valida si ese curso existe o no. Esta duda me surgio tambien al ver el video donde hacen referencia a por que no recomiendan usar foreign keys en todos los casos. No se deberia validar que exista ese curso a partir del id? en ese caso, no se romperia el SRP?

image

Gracias y perdon las molestias.

jperdior commented 6 months ago

Buenas Agustín,

a ver lo que ellos tienen al final es un código de ejemplo e igual no está implementado con una lógica realista. Evidentemente como tú dices, se tendría que validar que el courseId existe, para ello yo lo que haría es un servicio de dominio en el módulo curso CourseFinder.php que devuelva un curso o lance una excepción en caso de que no encuentre un curso con ese id y en el caso de uso Videocreator que me muestras, para evitar el acoplamiento entre módulos pasaría en el constructor también el QueryBus y antes de Video::create haría un $this->queryBus->ask( new FindCourseQuery()), perdón que no te ponga el código pero como me has puesto una imagen no puedo copiar pegar pero más o menos:

public function __construct(private VideoRepository $repository, private EventBus $eventBus, private QueryBus $querybus){}

public function create(...){
$this->queryBus->ask(new FindCourseQuery($courseId));
// si no existe el curso se habrá lanzado una excepción que tendrás que tener en cuenta en el controller, si el curso existe pues tu caso de uso seguirá ejecutandose
}

creo que es mejorable pero bueno así pensado rápido con esto bastaría. El SRP no se incumpliría porque al final tu caso de uso se tiene que amoldar a los requerimientos del "cliente" y si los requerimientos son que el curso debe existir pues tu caso de uso debe contemplar eso y utilizando el querybus nos aseguramos de no inyectar un servicio de dominio del módulo curso en nuestro módulo video.

Espero haber sido de ayuda y si tienes otra duda que pueda contestar ya me dices.

Un saludo

agusmaler commented 6 months ago

Gracias!