Esta sección describe la estructura de alto nivel que guiará el desarrollo del backend, en consonancia con la arquitectura decidida.
Decisión Arquitectura - Backend
Conceptualmente, se representa como un hexágono. El núcleo contiene la lógica de negocio (Dominio), la capa de Aplicación, junto con el núcleo independientes de la tecnología externa. Definen y exponen una serie de Puertos, que actúan como puntos de entrada y salida.
Alrededor se sitúan los Adaptadores (implementaciones concretas de esos puertos), y se dividen en dos tipos:
API REST Controller que recibe peticiones HTTP y las traduce en llamadas a los servicios de la capa de Aplicación).Adaptador de Persistencia JPA que implementa un puerto de repositorio para la base de datos, y un Adaptador de API de Spotify que implementa otro puerto para comunicarse con el servicio externo).En resumen:

La estructura de paquetes/módulos en el proyecto Spring Boot reflejará esta separación de capas:
domain: Contendrá las entidades del negocio (User, Song, Swipe), los Value Objects y, crucialmente, las interfaces de los repositorios y servicios externos (Puertos). Ejemplo: SongRepositoryPort. Esta capa no tiene dependencias de framework.application: Contendrá los casos de uso o servicios de la aplicación que orquestan la lógica de negocio. Dependerá únicamente del domain. Aquí se implementan las transacciones y flujos de trabajo.infrastructure: Contendrá todos los adaptadores, conectando el núcleo con el mundo exterior.
infrastructure.input.rest: Controladores de la API REST que actúan como adaptadores de entrada.infrastructure.output.persistence: Implementaciones de los repositorios definidos en el dominio (Adaptadores de salida) usando Spring Data JPA y PostgreSQL. Ejemplo: PostgresSongRepositoryAdapter.infrastructure.output.spotify: El cliente para la API de Spotify, que implementará el puerto correspondiente definido en el dominio. Aquí residirá la lógica de llamadas HTTP, gestión de tokens y reintentos.
