## 🏎 F1HUB 🏎
---
La mejor app para informarse de las últimas noticias de la F1 y poder conocer los detalles más encantadores de pilotos, escuderías y leyendas retiradas
---
### DESCRIPCIÓN
La aplicación F1Hub cuenta con varias funcionalidades, entre ellas:
Inicio de sesión y registro: Los usuarios pueden iniciar sesión o registrarse en la aplicación utilizando su correo electrónico y contraseña.
Navegación: La aplicación cuenta con una barra de navegación que permite a los usuarios acceder a diferentes secciones de la aplicación, como la sección de inicio, la sección de configuración, etc.
Listado de items: La aplicación muestra un listado de items relacionados con la Fórmula 1, como pilotos, escuderías, etc.
Detalles de items: Los usuarios pueden acceder a los detalles de cada item, como la biografía de un piloto o la información de una escudería.
Configuración: Los usuarios pueden configurar su perfil de usuario (username + foto de perfil)
Anuncios: Los usuarios pueden ver anuncios relacionados con la Fórmula 1.
Detalles de los anuncios: Los usuarios pueden acceder a los detalles de cada anuncio.
---
### FUNCIONAMIENTO
Lo primero será loggearse para ello habrá que tener una cuenta registrada, en caso contrario habrá que registrarse forzosamente
para poder utilizar la aplicación. Una vez se cumplan estos requisitos y se inicie sesión, esta se mantendrá a no ser que el
usuario decida lo contrario o el token de acceso proporcionado por el backend expire.
#### LOGIN | REGISTRO


#### LISTADO ANUNCIOS
Este listado será general para todos los usuarios
[ver_lista_ads.mp4](app%2Fsrc%2Fmain%2Fres%2Fdrawable%2Freadme%2Fver_lista_ads.mp4)
Al clicar sobre la imagen de un cardview aparecerá la información relacionada con el anuncio clicado
#### LISTADO ITEMS
Este listado estará asociado con el usuario que inicie sesión, de forma que sólo se mostrarán los items creados por el usuario loggeado
[ver_lista_items.mp4](app%2Fsrc%2Fmain%2Fres%2Fdrawable%2Freadme%2Fver_lista_items.mp4)
Al clicar sobre la imagen de un cardview aparecerá la información relacionada con el item clicado
#### CREAR ITEMS
Para crear items será tan sencillo como pulsar en el volante de la esquina superior derecha, que abrirá el siguiente formulario:

* Al clicar en aceptar se añadirá el item.
* Al clicar en cancelar se cerrará el formulario sin hacer nada
* Al no rellenar un campo y clicar en aceptar mostrará un mensaje en el que se mostrará: "Algún campo está vacío" y se cerrará el formulario
#### EDITAR ITEMS
Para editar items será tan sencillo como pulsar en el ✏ , que abrirá el siguiente formulario:

* Al clicar en aceptar se actualizará el contenido del item por el establecido dentro del formulario.
* Al clicar en cancelar se cerrará el formulario sin hacer nada
* Al no rellenar un campo y clicar en aceptar mostrará un mensaje en el que se mostrará: "Algún campo está vacío" y se cerrará el formulario
#### ELIMINAR
Para eliminar un item será tan sencillo como pulsar 🗑, que abrirá la siguiente ventana:

* Al confirmar el borradodo se borrará, en caso contrario no sé hará, y en caso de que se cierre la aplicación o cualquier acción inseperada, durante el borrado, el listado se mantendrá igual.
---
### 📂 ESTRUCTURA DEL PROYECTO 📂
1️⃣ Data (/data/)
* Esta capa es responsable de manejar la fuente de datos de la aplicación.
Incluye:
* Los DTO de entrada y salida, estos son clases en cargadas en caso de ser de entradas de recibir las respuestas del backend. Estos DTO de entrada serán mappeados a los de salida, que son lo que visualiza el usuario final
* Todo lo relacionado con la conexión a la API encargada de responder peticiones de la app
* Repositorios, son implementaciones de las interfaces, definidas en la capa de dominio, actuando de intermediarios entre ambas capas
* Servicios, aportan los métodos que usan los repositorios para sobreescribir los que implementan de la interfaz, de forma que en caso tener que modificar uno de ellos sólo hay que modificar el servicio
2️⃣ Domain (/domain/)
* La capa de dominio contiene la lógica de negocio de la aplicación.
Incluye:
* Repositorios, interfaces en las que se definen los métodos que usarán los casos de uso
* Casos de uso, implementación única de cada uno de los métodos anteriormente indicados
3️⃣ UI (/ui/)
* Esta capa incluye todo lo relacionado con la presentación(interfaz) de la app.
Incluye:
* Activity principal, donde se encuentran el navigation drawer, toolbar y fragment container view
* Fragments, son los distintos fragmentos que se van intercalando al ir clicando en el navigation drawer o toolbar
* Contenido principal (listado items)
* Configuración
* Anuncios (listado anuncios)
* Más información de los distintos elementos de ambos listados (items y anuncios)
* Todos los Adapter, Viewholder y Modelview (encargados de la lógica y presentación de los recyclerview (listado de items y/o anuncios))
4️⃣ DI (/di/)
* Esta capa incluye todo lo relacionado con la inyeccion de dependencias.
Incluye:
* AppModule: es un object, que mediante patrón singleton, abastece del *SharedPreferences* y dos métodos que proporcionan el *token* e *id* del usuario loggeado
---
### PERMISOS SOLICITADOS
```xml
```
---
### EXPLICACIÓN DEL CÓDIGO
Código explicado mediante comentarios