diff --git a/README.bk.md b/README.bk.md new file mode 100644 index 0000000000000000000000000000000000000000..bab1c05fd3795ba4e68b80485fc0f20a90a13079 --- /dev/null +++ b/README.bk.md @@ -0,0 +1,259 @@ +¡Claro! Aquà tienes un ejemplo de un archivo `README.md` para tu proyecto de microservicios orientado a usuarios, hoteles y reservas utilizando **Spring Boot**. Este README incluye las secciones más comunes que suelen aparecer en proyectos de este tipo. + +--- + +# Microservicios para Usuarios, Hoteles y Reservas + +Este proyecto consiste en la implementación de un sistema basado en microservicios utilizando **Spring Boot**. El propósito principal es gestionar **usuarios**, **hoteles** y **reservas** en un entorno distribuido, escalable y fácil de mantener. + +## Tabla de Contenidos + +- [Microservicios para Usuarios, Hoteles y Reservas](#microservicios-para-usuarios-hoteles-y-reservas) + - [Tabla de Contenidos](#tabla-de-contenidos) + - [Introducción](#introducción) + - [CaracterÃsticas](#caracterÃsticas) + - [Arquitectura](#arquitectura) + - [Componentes Clave:](#componentes-clave) + - [TecnologÃas Usadas](#tecnologÃas-usadas) + - [Requisitos Previos](#requisitos-previos) + - [Configuración e Instalación](#configuración-e-instalación) + - [Ejecución del Proyecto](#ejecución-del-proyecto) + - [Microservicios](#microservicios) + - [1. Usuarios](#1-usuarios) + - [2. Hoteles](#2-hoteles) + - [3. Reservas](#3-reservas) + - [API Endpoints](#api-endpoints) + - [Usuarios](#usuarios) + - [Hoteles](#hoteles) + - [Reservas](#reservas) + - [Contribuciones](#contribuciones) + - [Licencia](#licencia) + +--- + +## Introducción + +Este sistema implementa tres microservicios principales: + +1. **Microservicio de Usuarios:** Gestión de usuarios registrados, incluyendo creación, edición y consulta de perfiles. +2. **Microservicio de Hoteles:** Gestión de la información de hoteles, incluyendo su ubicación, detalles y caracterÃsticas. +3. **Microservicio de Reservas:** Gestión de reservas realizadas por los usuarios en los hoteles disponibles. + +Cada microservicio es autónomo y está diseñado para comunicarte con los demás a través de REST API o mensajerÃa (opcional). + +--- + +## CaracterÃsticas + +- Diseño basado en arquitectura de microservicios. +- Comunicación entre microservicios usando REST API y, opcionalmente, un **API Gateway**. +- Persistencia de datos en bases de datos separadas para cada microservicio. +- Validaciones robustas para entradas de datos. +- Manejo de autenticación y autorización con JWT (JSON Web Tokens). +- Fácil integración y despliegue en entornos locales o en la nube. +- Escalabilidad y modularidad. + +--- + +## Arquitectura + + _(Aquà puedes añadir un diagrama de tu arquitectura, si tienes uno)_ + +La arquitectura del proyecto sigue los principios de microservicios: + +1. **Usuarios:** Este servicio maneja la creación, edición, eliminación y consulta de los usuarios. +2. **Hoteles:** Este servicio se encarga de gestionar la información de hoteles disponibles. +3. **Reservas:** Este servicio se encarga de administrar las reservas realizadas por los usuarios en los hoteles. + +### Componentes Clave: + +- **API Gateway (opcional):** Puede usarse para unificar las llamadas a los microservicios. +- **Base de Datos Descentralizada:** Cada microservicio tiene su propia base de datos para garantizar independencia. +- **Configuración Centralizada:** Utiliza Spring Cloud Config para gestionar la configuración de cada microservicio (si se requiere). + +--- + +## TecnologÃas Usadas + +- **Java 17** (o la versión que utilices) +- **Spring Boot 3.x**: + - Spring Data JPA + - Spring Web + - Spring Security (JWT) +- **Bases de Datos**: + - MySQL (o PostgreSQL) para persistencia de datos. +- **Herramientas de Comunicación**: + - Feign Client (para comunicación entre microservicios). + - Eureka Server (opcional, para registro y descubrimiento de servicios). +- **Dependencias Adicionales**: + - Lombok + - MapStruct (para mapeo entre entidades y DTOs) +- **Docker** (para contenedores y despliegue). +- **Postman** (para pruebas de APIs). + +--- + +## Requisitos Previos + +Antes de ejecutar el proyecto, asegúrate de que tienes instalados los siguientes componentes: + +- [Java 17+](https://www.oracle.com/java/technologies/javase-jdk17-downloads.html) +- [Maven](https://maven.apache.org/) o [Gradle](https://gradle.org/) +- [MySQL](https://www.mysql.com/) o cualquier base de datos compatible +- [Docker](https://www.docker.com/) (opcional) +- [Postman](https://www.postman.com/) (para pruebas) + +--- + +## Configuración e Instalación + +1. **Clona este repositorio:** + + ```bash + git clone https://github.com/tu-usuario/tu-repositorio.git + cd tu-repositorio + ``` + +2. **Configura las bases de datos:** + + - Crea tres bases de datos para `usuarios`, `hoteles` y `reservas`. + - Actualiza los archivos `application.properties` o `application.yml` de cada microservicio con las credenciales de acceso. + + Ejemplo (`application.properties`): + + ```properties + spring.datasource.url=jdbc:mysql://localhost:3306/usuarios_db + spring.datasource.username=root + spring.datasource.password=1234 + ``` + +3. **Construye los microservicios:** + + ```bash + mvn clean install + ``` + +4. **Inicia cada microservicio:** + + ```bash + cd usuarios-service + mvn spring-boot:run + ``` + + Repite el proceso para `hoteles-service` y `reservas-service`. + +--- + +## Ejecución del Proyecto + +Si utilizas Docker, puedes crear un archivo `docker-compose.yml` para ejecutar todos los microservicios en contenedores. + +Ejemplo: + +```yaml +version: "3.8" +services: + usuarios-service: + image: usuarios-service:latest + build: + context: ./usuarios-service + ports: + - "8081:8081" + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://usuarios-db:3306/usuarios_db + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: 1234 + + hoteles-service: + image: hoteles-service:latest + build: + context: ./hoteles-service + ports: + - "8082:8082" + + reservas-service: + image: reservas-service:latest + build: + context: ./reservas-service + ports: + - "8083:8083" +``` + +Ejecuta los servicios con: + +```bash +docker-compose up +``` + +--- + +## Microservicios + +### 1. Usuarios + +- Base URL: `/api/usuarios` +- Funciones: + - Crear usuario + - Consultar usuario + - Editar usuario + - Eliminar usuario + +### 2. Hoteles + +- Base URL: `/api/hoteles` +- Funciones: + - Crear hotel + - Consultar lista de hoteles + - Editar hotel + - Eliminar hotel + +### 3. Reservas + +- Base URL: `/api/reservas` +- Funciones: + - Crear reserva + - Consultar reservas por usuario o hotel + - Cancelar reserva + +--- + +## API Endpoints + +A continuación se listan algunos ejemplos de endpoints: + +### Usuarios + +- **GET** `/api/usuarios/{id}` - Obtener un usuario por ID +- **POST** `/api/usuarios` - Crear un nuevo usuario + +### Hoteles + +- **GET** `/api/hoteles` - Listar todos los hoteles +- **POST** `/api/hoteles` - Registrar un hotel + +### Reservas + +- **POST** `/api/reservas` - Crear una reserva +- **GET** `/api/reservas/{id}` - Consultar una reserva por ID + +--- + +## Contribuciones + +¡Contribuciones son bienvenidas! Por favor, sigue los pasos a continuación: + +1. Haz un fork del repositorio. +2. Crea una rama para tu funcionalidad: `git checkout -b nueva-funcionalidad`. +3. Realiza tus cambios y haz un commit: `git commit -m 'Añadida nueva funcionalidad'`. +4. Haz un push a la rama: `git push origin nueva-funcionalidad`. +5. Crea un Pull Request. + +--- + +## Licencia + +Este proyecto está licenciado bajo la licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles. + +--- + +Con este `README.md`, tienes una guÃa completa para documentar tu proyecto y compartirlo con otros desarrolladores. ¿Quieres agregar algo más especÃfico? 😊 diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..58ad10377fc6af68d0e06e16227501e8d3d8982b --- /dev/null +++ b/README.md @@ -0,0 +1,114 @@ +# DEMO + + + +# Sobre el proyecto + +En este proyecto nos hemos centrado en la creación de microservicios lo más independientes posibles, para ello se ha trabajado con microservicios spring-boot dividiendo el proyecto en: + +- Microservicio de **Autentificación**, destinado a la gestión de _autentificación_ +- Microservicio de **Usuarios**, destinado a la gestión de _usuarios_ +- Microservicio de **Hoteles**, destinado a la gestión de _hoteles_ y _habitaciones_ +- Microservicio de **Reservas**, destinado a la gestión de _reservas_ + +## Intrucciones de despliegue + +En todos los casos se proporcionan las variables de entorno oportunas, en caso contrario serÃa necesario declararlas. + +### Modo desarrollo (local, por java y angular) + +Levantar todos los servicios a mano. + +Accede a cada microservicio y ejecútalo. + +```bash +cd java/service/{service} +mvn spring-boot:run +``` + +Y para el cliente web angular: + +1. Instalar dependencias + 1. Instalar angular + ```bash + npm install -g @angular/cli + ``` + 2. Instalar el resto de dependencias + ```bash + npm install + ``` +2. Levantar el servidor de desarrollo + ```bash + ng dev [-o] # abrira un navegador con la aplicación web + ``` + +### Modo producción (docker) + +Accede a la carpeta raÃz (donde está este fichero) y ejecuta el comando de despliegue de docker compose + +```bash +docker compose up +``` + +> [!warning] +> Se recomienda la eliminación, en caso de que haya ya volúmenes de información con los mismos nombres usados en esta practica. +> +> El poblador está incluido y se reinicia por cada fallo, es importante ejecutarlo una vez ya esté kong configurado para esta practica + +## Diagramas + +### Diagrama de componente Angular + + + +### Diagrama de despliegue del sistema + + + +### Diagrama de la arquitectura lógica del microservicio de usuarios + + + +## Consideraciones de diseño + +### Separación de usuario en roles + +Debido a que la funcionalidad de los usuarios estaba entremezclada y la seguridad era un inexistente se ha decidido separar al usuario en: `Users`, `ADMINS`, `Clients` y `Managers`. + +### Integridad respecto al estado del cliente + +Debido a que el patron experto nos dice que es el microservicio de reservas quien deberÃa manejar el estado del cliente se nos solicita que esté esté reflejado en el de usuarios por lo cual, para cumplir ambos requerimientos, hemos aplicado redundancia pero dando la tarea al servicio de reservas de ser el encargado de mantener la integridad de ese estado, para ello se ha incluido una tarea programada que actualiza el estado de los usuarios que cuyas reservas hayan finalizado el dÃa anterior (esta tarea programada se ejecuta todos los dias a las 00:30). + +### Redundancia + +Para cumplir los requisitos como, por ejemplo, eliminar un `manager` y que se eliminen todas los hoteles con sus habitaciones y sus reservas se ha aplicado redundancia agregando, para este caso, los ids de la habitación, hotel y administrador a la reserva y habilitando los endpoints necesarios para reducir las comunicaciones y la latencia, haciendo más eficiente y rápida nuestra aplicación. + +## Extras + +### Seguridad + +Todos los microservicios cuentan con la seguridad proporcionada por kong salvo en algunos aspectos como los `GET`s a hoteles y la funcionalidad de autentificación del servicio `auth` ya que debe ser accesible desde todos lados. Pero además de esta se ha agregado más aún, identificando y limitando en ciertos puntos el acceso entre los propios servicios y a los recursos que no sea adecuado (usuario accediendo a datos personales que no son suyos). + +Esto lo hemos conseguido agregando funcionalidad al servicio de `auth`, **UNICAMENTE ACCESIBLE** desde dentro de la red docker (ya que ofrece identificación de servicios y decodificación de tokens). + +Al no disponer de tiempo suficiente para hacer comunicaciones asincronas hemos decidido implementar una `caché` simple para tener en memoria la información decodificada de los tokens. + +### Poblate + +Se ha creado un programa node (localizado en la carpeta `poblate`) destinado a poblar las bases de datos a través de las apis expuestas, pudiendo trabajar en 3 modos: + +- `Desarrollo` ejecutando `npm run dev` (cuando tenemos los servicios levantados en local de forma independiente, a través de mvn por ejemplo). +- `Producción` ejecutando `npm run prod` (cuando están dockerizados) +- `"Kong"` ejecutando `npm run prod -- [-k | --kong] {ip}{:port}` (una vez dockerizados, debido a que pueden ocurrir casualidades que llegen a la ejecución parcial y fallida del script se proporciona un modo de apoyo para esos casos, se conecta al puerto de kong de docker expuesto en la maquina local) + +También cuenta con algunos argumentos de apoyo: + +- `-d` o `--debug` muestra que los datos que se intentan agregar y las ids de los objetos agreados. +- `-f` o `--force` en caso de que el registro de usuarios falle por ya estar registrados se procede a realizar un login de los datos de usuarios y a agregar hoteles y reservas. +- `-e` o `--error` muestra todos los errores. + +Este programa genera 6 usuarios (1 administrador, 2 gestores de hoteles y 3 clientes), el programa dispersa de forma pseudoaleatoria administradores de hoteles, objetivos de la reserva (habitación implicada y cliente que la realiza). + +> [!note] +> Está integrado en el docker compose y si no se detiene y se define previamente la configuración de kong el programa se reiniciará constantemente. +> En caso de relanzamiento, si detecta que se puede logear como alguno de los usuarios detendrá su ejecución, en caso de que quieras ejecutarlo aún asi echa un vistazo al modo `Kong` con la configuración de `force` diff --git a/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.css b/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.css deleted file mode 100644 index fcbb63ff2da3990e7eb2bffbfedcd84cadac8004..0000000000000000000000000000000000000000 --- a/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.css +++ /dev/null @@ -1,8 +0,0 @@ -.container { - max-width: 1000px; - margin-top: 2rem; - padding: 20px; - border: 1px solid #ccc; - border-radius: 5px; - background-color: #f9f9f9; -} diff --git a/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.html b/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.html deleted file mode 100644 index 231f1d8fd1b898e90529cf994a333cb986cb8377..0000000000000000000000000000000000000000 --- a/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.html +++ /dev/null @@ -1,96 +0,0 @@ -<div class="container"> - <mat-card> - <mat-card-title class="flex text-center p-4"> - <strong class="text-5xl">Registro de Hotel</strong> - </mat-card-title> - - <mat-card-content> - <div class="form-group text-xl flex justify-center gap-20"> - <mat-form-field> - <mat-label class="text-2xl">Enter a date range</mat-label> - <mat-date-range-input [rangePicker]="picker"> - <input - matStartDate - placeholder="Start date" - (dateInput)="updateStart($event)" - (dateChange)="updateStart($event)" - /> - <input - matEndDate - placeholder="End date" - (dateInput)="updateEnd($event)" - (dateChange)="updateEnd($event)" - /> - </mat-date-range-input> - <mat-datepicker-toggle - matIconSuffix - [for]="picker" - ></mat-datepicker-toggle> - <mat-date-range-picker #picker></mat-date-range-picker> - </mat-form-field> - <mat-form-field> - <mat-label class="text-2xl">Hotel</mat-label> - <mat-select [(value)]="hotelSelected" class="text-2xl"> - @for (hotel of hotels; track hotel.id) { - <mat-option [value]="hotel" class="text-3xl">{{ - hotel.name - }}</mat-option> - } - </mat-select> - </mat-form-field> - <button - [disabled]="!this.start || !this.end || !this.hotelSelected" - mat-raised-button - class="bg-blue-500 rounded-full p-2" - (click)="search()" - > - <img class="w-3/4" src="/search.svg" /> - </button> - <mat-form-field> - <mat-label>Filter by Room Type</mat-label> - <mat-select - [(value)]="roomTypeSelected" - (selectionChange)="updateRooms()" - > - @for (type of roomTypes; track type) { - <mat-option [value]="type">{{ type }}</mat-option> - } - </mat-select> - </mat-form-field> - </div> - <!-- Lista de Habitaciones --> - @if (trateRooms.length > 0) { - <div class="grid gap-4 text-lg mb-8"> - <h2 class="text-2xl font-semibold mb-4">Habitaciones Disponibles</h2> - <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"> - @for(room of trateRooms; track room.id) { - <mat-card class="example-card" appearance="outlined"> - <mat-card-header class="flex justify-center"> - <mat-card-title> - <strong - >(#{{ $index + 1 }}) Habitación {{ room.roomNumber }} - </strong> - <span class="italic">({{ room.type }})</span> - </mat-card-title> - </mat-card-header> - <mat-card-content class="mt-4"> - <button - mat-raised-button - class="w-full text-center py-3 rounded-lg shadow-md hover:shadow-lg text-3xl bg-sky-600 text-slate-200 font-bold" - (click)="bookingRoom(room.id)" - > - Reservar - </button> - </mat-card-content> - </mat-card> - } - </div> - </div> - } @else if (searched) { - <div class="text-center text-lg"> - <p>No hay habitaciones disponibles</p> - </div> - } - </mat-card-content> - </mat-card> -</div> diff --git a/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.ts b/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.ts deleted file mode 100644 index e7e081a41511f7ccaf9996fad8943ae30a60b0dd..0000000000000000000000000000000000000000 --- a/angular/RestClient/src/app/features/bookings/[DEL] booking-list/booking-list.component.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Component } from '@angular/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { - MatDatepickerInputEvent, - MatDatepickerModule, -} from '@angular/material/datepicker'; -import { FormsModule } from '@angular/forms'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import {Hotel, Room, RoomType, roomTypeArray} from '@features/hotels' -import { Router } from '@angular/router'; -import { MatCardModule } from '@angular/material/card'; -import { MatChipsModule } from '@angular/material/chips'; -import { LocalStorageService } from '../../../core/services/storage/local-storage.service'; -import { HotelClientService } from '../../../core/services/api/hotels/hotel-client.service'; - -type SelectableRoomType = 'All' | RoomType; -const selectableRoomTypeArray: SelectableRoomType[] = ['All', ...roomTypeArray]; - -@Component({ - selector: 'app-booking-list', - standalone: true, - imports: [ - MatCardModule, - MatChipsModule, - MatFormFieldModule, - MatDatepickerModule, - MatCardModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - FormsModule, - ], - templateUrl: './booking-list.component.html', - styleUrl: './booking-list.component.css', -}) -export class BookingListComponent { - searched: boolean = false; - hotels!: Hotel[]; - start?: Date; - end?: Date; - hotelSelected?: Hotel; - roomTypeSelected?: SelectableRoomType; - roomTypes = selectableRoomTypeArray; - rooms: Room[] = []; - trateRooms: Room[] = []; - - constructor( - private router: Router, - private hotelClient: HotelClientService, - private storage: LocalStorageService - ) {} - - ngOnInit() { - this.getHotels(); - } - - getHotels() { - this.hotelClient.getAllHotels().subscribe({ - next: (resp) => { - if (resp != null) this.hotels = [...resp]; - }, - error(err) { - console.log('Error al traer la lista: ' + err.message); - throw err; - }, - }); - } - - updateStart(event: MatDatepickerInputEvent<Date>) { - this.start = event.value!; - } - - updateEnd(event: MatDatepickerInputEvent<Date>) { - this.end = event.value!; - } - - search() { - this.hotelClient - .getRoomsAvailableInDateRange( - this.hotelSelected!.id, - this.start!, - this.end! - ) - .subscribe({ - next: (resp) => { - this.rooms = resp; - this.updateRooms(); - }, - }); - } - - updateRooms() { - this.searched = true; - this.trateRooms = - this.roomTypeSelected && this.roomTypeSelected !== 'All' - ? this.rooms.filter((room) => room.type === this.roomTypeSelected) - : this.rooms; - } - - bookingRoom(roomId: number) { - this.storage.save('booking-data', { - roomId, - startDate: this.start, - endDate: this.end, - }); - this.router.navigate(['/bookings', 'new'], { queryParams: { roomId } }); - } -} diff --git a/angular/RestClient/src/app/features/bookings/index.ts b/angular/RestClient/src/app/features/bookings/index.ts index 709cc765a8bf39b141d2487ecb5640a9cada00a5..5c198cb962620e96a9db83f03d76302d17d90380 100644 --- a/angular/RestClient/src/app/features/bookings/index.ts +++ b/angular/RestClient/src/app/features/bookings/index.ts @@ -1,5 +1,4 @@ export * from './bookings.routes'; export * from './booking/booking.component'; -export * from './[DEL] booking-list/booking-list.component'; export * from './user-booking-list/user-booking-list.component'; -export type { Booking }from '@features/bookings/types/Booking'; +export type { Booking } from '@features/bookings/types/Booking'; diff --git a/kong_config.json b/kong_config.json deleted file mode 100644 index 2754cccec0e3c556e09db59dede08bec7463183e..0000000000000000000000000000000000000000 --- a/kong_config.json +++ /dev/null @@ -1 +0,0 @@ -{"createdUser":null,"updatedUser":null,"id":1,"name":"Practica","kong_node_name":"Kong","kong_node_url":"http://kong:8001","kong_version":"3.9.0","data":{"services":[{"retries":5,"tags":[],"created_at":1735150914,"updated_at":1735150914,"name":"Users","port":8201,"id":"1d1ce8d9-aa4b-4576-8d91-00326d00c26e","client_certificate":null,"write_timeout":60000,"connect_timeout":60000,"read_timeout":60000,"protocol":"http","enabled":true,"ca_certificates":null,"tls_verify":null,"path":"/users","tls_verify_depth":null,"host":"users-api","extras":{"id":1,"service_id":"1d1ce8d9-aa4b-4576-8d91-00326d00c26e","kong_node_id":"1","description":null,"tags":null,"createdAt":"2024-12-25T18:21:54.000Z","updatedAt":"2024-12-25T18:21:54.000Z","createdUser":null,"updatedUser":null}},{"retries":5,"tags":[],"created_at":1735151821,"updated_at":1735151821,"name":"Hotels","port":8301,"id":"37407f92-1d9f-4d88-b80f-0bc9a3fb57fd","client_certificate":null,"write_timeout":60000,"connect_timeout":60000,"read_timeout":60000,"protocol":"http","enabled":true,"ca_certificates":null,"tls_verify":null,"path":"/hotels","tls_verify_depth":null,"host":"hotels-api","extras":{"id":3,"service_id":"37407f92-1d9f-4d88-b80f-0bc9a3fb57fd","kong_node_id":"1","description":null,"tags":null,"createdAt":"2024-12-25T18:37:01.000Z","updatedAt":"2024-12-25T18:37:01.000Z","createdUser":null,"updatedUser":null}},{"retries":5,"tags":[],"created_at":1735151037,"updated_at":1735151134,"name":"Auth","port":8101,"id":"60e76e38-63f1-4fd7-b10c-51456722a312","client_certificate":null,"write_timeout":60000,"connect_timeout":60000,"read_timeout":60000,"protocol":"http","enabled":true,"ca_certificates":null,"tls_verify":null,"path":"/auth","tls_verify_depth":null,"host":"auth-api","extras":{"id":2,"service_id":"60e76e38-63f1-4fd7-b10c-51456722a312","kong_node_id":"1","description":null,"tags":null,"createdAt":"2024-12-25T18:23:57.000Z","updatedAt":"2024-12-25T18:25:34.000Z","createdUser":null,"updatedUser":null}},{"retries":5,"tags":[],"created_at":1735151922,"updated_at":1735151922,"name":"Bookings","port":8401,"id":"ae250c19-10c3-4ed2-8cdb-d62497721da2","client_certificate":null,"write_timeout":60000,"connect_timeout":60000,"read_timeout":60000,"protocol":"http","enabled":true,"ca_certificates":null,"tls_verify":null,"path":"/bookings","tls_verify_depth":null,"host":"bookings-api","extras":{"id":4,"service_id":"ae250c19-10c3-4ed2-8cdb-d62497721da2","kong_node_id":"1","description":null,"tags":null,"createdAt":"2024-12-25T18:38:42.000Z","updatedAt":"2024-12-25T18:38:42.000Z","createdUser":null,"updatedUser":null}}],"routes":[{"tags":null,"created_at":1735151865,"updated_at":1735151865,"name":"hotels","destinations":null,"strip_path":true,"hosts":null,"methods":["GET","POST","PUT","PATCH","DELETE","OPTIONS"],"service":{"id":"37407f92-1d9f-4d88-b80f-0bc9a3fb57fd"},"preserve_host":false,"regex_priority":0,"headers":null,"paths":["/api/hotels"],"request_buffering":true,"response_buffering":true,"protocols":["http","https"],"sources":null,"id":"17bc07be-9af8-499f-9ec6-716504cd801f","path_handling":"v1","https_redirect_status_code":426,"snis":null},{"tags":null,"created_at":1735151081,"updated_at":1735151965,"name":"Auth","destinations":null,"strip_path":true,"hosts":null,"methods":["OPTIONS","POST","DELETE"],"service":{"id":"60e76e38-63f1-4fd7-b10c-51456722a312"},"preserve_host":false,"regex_priority":0,"headers":null,"paths":["/api/auth"],"request_buffering":true,"response_buffering":true,"protocols":["http","https"],"sources":null,"id":"4f7e698c-aed6-4919-8d72-a24ce6a2a333","path_handling":"v1","https_redirect_status_code":426,"snis":null},{"tags":null,"created_at":1735151945,"updated_at":1735151945,"name":"Bookings","destinations":null,"strip_path":true,"hosts":null,"methods":["GET","POST","PATCH","PUT","DELETE","OPTIONS"],"service":{"id":"ae250c19-10c3-4ed2-8cdb-d62497721da2"},"preserve_host":false,"regex_priority":0,"headers":null,"paths":["/api/bookings"],"request_buffering":true,"response_buffering":true,"protocols":["http","https"],"sources":null,"id":"810bbb6d-a10d-416d-b5db-a121762981fa","path_handling":"v1","https_redirect_status_code":426,"snis":null},{"tags":null,"created_at":1735150976,"updated_at":1735150976,"name":"Usuarios","destinations":null,"strip_path":true,"hosts":null,"methods":["OPTIONS","GET","POST","DELETE","PUT","PATCH"],"service":{"id":"1d1ce8d9-aa4b-4576-8d91-00326d00c26e"},"preserve_host":false,"regex_priority":0,"headers":null,"paths":["/api/users"],"request_buffering":true,"response_buffering":true,"protocols":["http","https"],"sources":null,"id":"df0fefa6-7df8-4ae3-baed-ae58add42bbf","path_handling":"v1","https_redirect_status_code":426,"snis":null}],"consumers":[{"id":"c012b84f-63af-461f-8a8d-b8f99a2bd006","tags":[],"created_at":1735155577,"updated_at":1735155577,"custom_id":null,"username":"JWT","credentials":{"jwts":[{"rsa_public_key":null,"algorithm":"HS256","tags":null,"created_at":1735155689,"key":"9L8RmLEKMFd54WrR06CE9zoRSAGpCWeu","consumer":{"id":"c012b84f-63af-461f-8a8d-b8f99a2bd006"},"id":"493ad0f9-23e7-4e5f-b6e1-6982677ba0d6","secret":"MiClaveDeSeguridadMuyLargaParaQueNoFalleSpringBoot"}]}}],"plugins":[{"config":{"secret_is_base64":false,"key_claim_name":"kid","claims_to_verify":["exp"],"maximum_expiration":0,"uri_param_names":["jwt"],"cookie_names":[],"header_names":["Authorization"],"realm":null,"run_on_preflight":true,"anonymous":null},"tags":null,"created_at":1735155843,"updated_at":1735155843,"name":"jwt","route":{"id":"810bbb6d-a10d-416d-b5db-a121762981fa"},"consumer":null,"id":"3e302549-c51f-469d-a71d-98f30f2ddcab","protocols":["grpc","grpcs","http","https"],"instance_name":null,"service":null,"enabled":true},{"config":{"secret_is_base64":false,"key_claim_name":"kid","claims_to_verify":["exp"],"maximum_expiration":0,"uri_param_names":["jwt"],"cookie_names":[],"header_names":["Authorization"],"realm":null,"run_on_preflight":true,"anonymous":null},"tags":null,"created_at":1735156525,"updated_at":1735156585,"name":"jwt","route":{"id":"df0fefa6-7df8-4ae3-baed-ae58add42bbf"},"consumer":null,"id":"8386bf54-ede1-4f34-bb87-989ce4276e8a","protocols":["grpc","grpcs","http","https"],"instance_name":null,"service":null,"enabled":true},{"config":{"secret_is_base64":false,"key_claim_name":"kid","claims_to_verify":["exp"],"maximum_expiration":0,"uri_param_names":["jwt"],"cookie_names":[],"header_names":["Authorization"],"realm":null,"run_on_preflight":true,"anonymous":null},"tags":null,"created_at":1735156492,"updated_at":1735156600,"name":"jwt","route":{"id":"17bc07be-9af8-499f-9ec6-716504cd801f"},"consumer":null,"id":"9ac23748-1964-4038-8cdc-b2db799010a6","protocols":["grpc","grpcs","http","https"],"instance_name":null,"service":null,"enabled":true}],"acls":[],"upstreams":[],"certificates":[],"snis":[]},"createdAt":"2024-12-25T19:59:28.000Z","updatedAt":"2024-12-25T19:59:28.000Z"} \ No newline at end of file diff --git a/kong_config_2.json b/kong_config_2.json deleted file mode 100644 index 2ceda7ee229cb16e647140cc8275ea5130b70655..0000000000000000000000000000000000000000 --- a/kong_config_2.json +++ /dev/null @@ -1 +0,0 @@ -{"createdUser":null,"updatedUser":null,"id":2,"name":"practica","kong_node_name":"Kong","kong_node_url":"http://kong:8001","kong_version":"3.9.0","data":{"services":[{"path":"/users","port":8201,"client_certificate":null,"id":"1d1ce8d9-aa4b-4576-8d91-00326d00c26e","name":"Users","tags":[],"ca_certificates":null,"created_at":1735150914,"updated_at":1735486602,"protocol":"http","host":"users-api","tls_verify":null,"enabled":true,"read_timeout":60000,"tls_verify_depth":null,"connect_timeout":60000,"write_timeout":60000,"retries":5,"extras":{}},{"path":"/hotels","port":8301,"client_certificate":null,"id":"37407f92-1d9f-4d88-b80f-0bc9a3fb57fd","name":"Hotels","tags":[],"ca_certificates":null,"created_at":1735151821,"updated_at":1735486602,"protocol":"http","host":"hotels-api","tls_verify":null,"enabled":true,"read_timeout":60000,"tls_verify_depth":null,"connect_timeout":60000,"write_timeout":60000,"retries":5,"extras":{}},{"path":"/auth","port":8101,"client_certificate":null,"id":"60e76e38-63f1-4fd7-b10c-51456722a312","name":"Auth","tags":[],"ca_certificates":null,"created_at":1735151037,"updated_at":1735486602,"protocol":"http","host":"auth-api","tls_verify":null,"enabled":true,"read_timeout":60000,"tls_verify_depth":null,"connect_timeout":60000,"write_timeout":60000,"retries":5,"extras":{}},{"path":"/bookings","port":8401,"client_certificate":null,"id":"ae250c19-10c3-4ed2-8cdb-d62497721da2","name":"Bookings","tags":[],"ca_certificates":null,"created_at":1735151922,"updated_at":1735486602,"protocol":"http","host":"bookings-api","tls_verify":null,"enabled":true,"read_timeout":60000,"tls_verify_depth":null,"connect_timeout":60000,"write_timeout":60000,"retries":5,"extras":{}}],"routes":[{"hosts":null,"strip_path":true,"request_buffering":true,"sources":null,"https_redirect_status_code":426,"tags":null,"destinations":null,"created_at":1735151081,"updated_at":1735486602,"methods":["OPTIONS","POST","DELETE"],"protocols":["http","https"],"service":{"id":"60e76e38-63f1-4fd7-b10c-51456722a312"},"regex_priority":0,"id":"4f7e698c-aed6-4919-8d72-a24ce6a2a333","snis":null,"paths":["/api/auth"],"preserve_host":false,"name":"Auth","path_handling":"v1","response_buffering":true,"headers":null},{"hosts":null,"strip_path":true,"request_buffering":true,"sources":null,"https_redirect_status_code":426,"tags":null,"destinations":null,"created_at":1735151945,"updated_at":1735486602,"methods":["GET","POST","PATCH","PUT","DELETE","OPTIONS"],"protocols":["http","https"],"service":{"id":"ae250c19-10c3-4ed2-8cdb-d62497721da2"},"regex_priority":0,"id":"810bbb6d-a10d-416d-b5db-a121762981fa","snis":null,"paths":["/api/bookings"],"preserve_host":false,"name":"Bookings","path_handling":"v1","response_buffering":true,"headers":null},{"hosts":null,"strip_path":true,"request_buffering":true,"sources":null,"https_redirect_status_code":426,"tags":null,"destinations":null,"created_at":1735486723,"updated_at":1735486747,"methods":["GET","OPTIONS","PUT","PATCH","POST","DELETE"],"protocols":["http","https"],"service":{"id":"37407f92-1d9f-4d88-b80f-0bc9a3fb57fd"},"regex_priority":0,"id":"dc4b871c-7013-43f3-b4e1-8cfaf94ae03c","snis":null,"paths":["/api/hotels"],"preserve_host":false,"name":"Hotels","path_handling":"v1","response_buffering":true,"headers":null},{"hosts":null,"strip_path":true,"request_buffering":true,"sources":null,"https_redirect_status_code":426,"tags":null,"destinations":null,"created_at":1735150976,"updated_at":1735486602,"methods":["OPTIONS","GET","POST","DELETE","PUT","PATCH"],"protocols":["http","https"],"service":{"id":"1d1ce8d9-aa4b-4576-8d91-00326d00c26e"},"regex_priority":0,"id":"df0fefa6-7df8-4ae3-baed-ae58add42bbf","snis":null,"paths":["/api/users"],"preserve_host":false,"name":"Usuarios","path_handling":"v1","response_buffering":true,"headers":null}],"consumers":[{"created_at":1735155577,"updated_at":1735486602,"id":"c012b84f-63af-461f-8a8d-b8f99a2bd006","custom_id":null,"tags":[],"username":"JWT","credentials":{"jwts":[{"created_at":1735155689,"consumer":{"id":"c012b84f-63af-461f-8a8d-b8f99a2bd006"},"key":"9L8RmLEKMFd54WrR06CE9zoRSAGpCWeu","rsa_public_key":null,"secret":"MiClaveDeSeguridadMuyLargaParaQueNoFalleSpringBoot","algorithm":"HS256","tags":null,"id":"d9fc99a4-b111-4ff2-a02c-9348fcb176cb"}]}}],"plugins":[{"created_at":1735155843,"updated_at":1735487924,"consumer":null,"service":null,"protocols":["grpc","grpcs","http","https"],"route":{"id":"810bbb6d-a10d-416d-b5db-a121762981fa"},"config":{"uri_param_names":["jwt"],"cookie_names":[],"header_names":["Authorization"],"anonymous":null,"run_on_preflight":false,"secret_is_base64":false,"maximum_expiration":0,"key_claim_name":"kid","realm":null,"claims_to_verify":["exp"]},"tags":null,"enabled":true,"instance_name":null,"name":"jwt","id":"3e302549-c51f-469d-a71d-98f30f2ddcab"},{"created_at":1735156525,"updated_at":1735487917,"consumer":null,"service":null,"protocols":["grpc","grpcs","http","https"],"route":{"id":"df0fefa6-7df8-4ae3-baed-ae58add42bbf"},"config":{"uri_param_names":["jwt"],"cookie_names":[],"header_names":["Authorization"],"anonymous":null,"run_on_preflight":false,"secret_is_base64":false,"maximum_expiration":0,"key_claim_name":"kid","realm":null,"claims_to_verify":["exp"]},"tags":null,"enabled":true,"instance_name":null,"name":"jwt","id":"8386bf54-ede1-4f34-bb87-989ce4276e8a"},{"created_at":1735486785,"updated_at":1735487895,"consumer":null,"service":null,"protocols":["grpc","grpcs","http","https"],"route":{"id":"dc4b871c-7013-43f3-b4e1-8cfaf94ae03c"},"config":{"uri_param_names":["jwt"],"cookie_names":[],"header_names":["Authorization"],"anonymous":null,"run_on_preflight":false,"secret_is_base64":false,"maximum_expiration":0,"key_claim_name":"kid","realm":null,"claims_to_verify":["exp"]},"tags":null,"enabled":true,"instance_name":null,"name":"jwt","id":"d1fc4321-6bb5-432a-92cd-52b245df6a52"}],"acls":[],"upstreams":[],"certificates":[],"snis":[]},"createdAt":"2024-12-29T16:00:09.000Z","updatedAt":"2024-12-29T16:00:09.000Z"} \ No newline at end of file