Fuentes:
https://www.youtube.com/watch?v=eNFAJbWCSww
https://www.youtube.com/watch?v=bDWApqAUjEI
![image](https://private-user-images.githubusercontent.com/3100356/338982590-abaca619-7497-4eef-bc23-55a2d44e0841.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE4NDkxNjQsIm5iZiI6MTcyMTg0ODg2NCwicGF0aCI6Ii8zMTAwMzU2LzMzODk4MjU5MC1hYmFjYTYxOS03NDk3LTRlZWYtYmMyMy01NWEyZDQ0ZTA4NDEucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MjRUMTkyMTA0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MDZkYzMwYTc4NTk3YjVlOGM3MTFmMjk3Zjc0ZjYyNzBlNGM1NzQxNWNhOTZlN2NiMzJjOGQzM2EyYmY5NDkwMiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.nk95L_1q7vm_JGkAfIDaGu5C9vU9fg84pqkWOc963C0)
Sirve para desacoplar lógica de (por ej) la APP y la DB.
Infra: DB, Cache, Redis, entrada y salida
App: Casos de uso -> crear user, login, logout
Domain: Lógica de negocio
- Por cada input y output se crea un puerto. El puerto es una abstracción para comunicarse con el exterior sin conocer como se implementa.
- El puerto (interfaz) luego tiene un adapter (implementación), es donde esta la lógica principal para escribir en la DB o donde sea. Convierte el output de nuestra app por algo que pueda usar la fuente externa.
![image](https://private-user-images.githubusercontent.com/3100356/338991851-dd31b9f4-f2bc-4d21-9f44-c15ba3b077ec.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE4NDkxNjQsIm5iZiI6MTcyMTg0ODg2NCwicGF0aCI6Ii8zMTAwMzU2LzMzODk5MTg1MS1kZDMxYjlmNC1mMmJjLTRkMjEtOWY0NC1jMTViYTNiMDc3ZWMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MjRUMTkyMTA0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDMyZjg1Njg3YjUxNzg5OTYxZDI1YmNlZGRlMzFjMWY5YzEwYzJkNjA0ZDhjMGNiYTdiOWNjNzZiODk0NWQwOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.Kv-3OvbJn44-96rfnwr7QYPAaueWOK8Itwt2PkPBZ-Q)
![image](https://private-user-images.githubusercontent.com/3100356/338995273-2498490f-b6cc-4224-b269-14a391c45442.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE4NDkxNjQsIm5iZiI6MTcyMTg0ODg2NCwicGF0aCI6Ii8zMTAwMzU2LzMzODk5NTI3My0yNDk4NDkwZi1iNmNjLTQyMjQtYjI2OS0xNGEzOTFjNDU0NDIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MjRUMTkyMTA0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NzI0MGZhNWE4YTgwNzA0OGYxZTVhMTIzNmIxYWIyZmUxOTBkZWRiYjBmNjJjOWFlYzRmY2VjNTZlNDkyYzJmNiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.-gqUtmELLTXdZG8AOil8UykiEmtH2IHnYcu6h7JYGQk)
Infra conoce detalles de App + Domain
App conoce detalles de Domain.
Domain conoce solo de si mismo.
![image](https://private-user-images.githubusercontent.com/3100356/338985628-ea3328e3-0c26-49ac-86cb-807190367938.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE4NDkxNjQsIm5iZiI6MTcyMTg0ODg2NCwicGF0aCI6Ii8zMTAwMzU2LzMzODk4NTYyOC1lYTMzMjhlMy0wYzI2LTQ5YWMtODZjYi04MDcxOTAzNjc5MzgucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MjRUMTkyMTA0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NzIwNGRlZTZiMzAyZjUyNzdhNjJhMTRjYzNkNmQ3Nzk3N2RmYzRjN2VlOTJiMTAzMjRiM2E5OWZkYzE3NDg2MCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.neD4D_NAaVMdg1Bj_cum4SybBDQ7BFIQDjl09trjciQ)
Es una forma de organizar carpetas.
Seria agregar infra / app / domain, dentro de cada modulo.
![image](https://private-user-images.githubusercontent.com/3100356/338988548-8b9ce875-08a3-4e43-bb52-557ff4c41278.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE4NDkxNjQsIm5iZiI6MTcyMTg0ODg2NCwicGF0aCI6Ii8zMTAwMzU2LzMzODk4ODU0OC04YjljZTg3NS0wOGEzLTRlNDMtYmI1Mi01NTdmZjRjNDEyNzgucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MjRUMTkyMTA0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NjRlNDliMDE4OWFhOWVlYzZiNzI3MzFmOTZhMTVmOGEwNmYyYTAxNzA3NzJkMDVjYTVmZmRlZDQ5NmViYmFiOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.Me_IzQXzmiMNQ3gjrwxQ_eAxwFRruhfSHexWKs41EHs)
Parte 2:
Fuente: https://www.youtube.com/watch?v=f7Su4KoqSio
Resumen: https://youtu.be/f7Su4KoqSio?si=_oWICWS5Gz-qGMOK&t=3209
![image](https://private-user-images.githubusercontent.com/3100356/340713817-e93170c6-ec26-48f4-bb4b-7497c92606ab.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjE4NDkxNjQsIm5iZiI6MTcyMTg0ODg2NCwicGF0aCI6Ii8zMTAwMzU2LzM0MDcxMzgxNy1lOTMxNzBjNi1lYzI2LTQ4ZjQtYmI0Yi03NDk3YzkyNjA2YWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MjRUMTkyMTA0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MmE2OWIxODI0M2U3ZTViNGIwMzVjZDVhNWJhZTFiYTE0YjdiN2JiZWMzOTRlYTViNjAzOWFiN2YwYmQyMTAxMyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.Jwyz9M7wncczoWK3q_SvpmOIvhhJ-fIk4e5q5bMX0gk)
En la primera el servicio depende del repositorio, porque si quiero cambiar algo de la implementacion del repo (entrada o salida de data), puedo romper el servicio.
En cambio en el segundo caso el repositorio tiene que cumplir un contrato
Al servicio se lo puede partir en archivos de Use Cases por ej: un service con metodos para crear libros y borrar, separarlo en: CreateBookUseCase.ts y RemoveBookUseCase.ts c/u con un solo metodo execute()
Se suelen usar DTOs de entrada (ej. GetEventDTO) y de salida/response (ej. EventDTO). Cada uno implementando una interface. Si se quiere agrar estructura a la respuesta, se puede hacer en el controller