Skip to content

Latest commit

 

History

History
118 lines (84 loc) · 5.94 KB

File metadata and controls

118 lines (84 loc) · 5.94 KB

ktor-apirest-sample

English 🇬🇧

Este proyecto fue creado usando el Generador de Proyectos de Ktor.

Aquí tienes algunos enlaces útiles para comenzar:

Características

Estas son algunas características incluidas en este proyecto:

Nombre Descripción
Routing Provee un DSL estructurado para enrutar
Content Negotiation Conversión automática de contenido según los encabezados Content-Type y Accept
kotlinx.serialization Manejo de JSON con la librería kotlinx.serialization
Mongo DB Permite integrar MongoDB para operaciones de base de datos en aplicaciones Ktor
Json Web Tokens Transmisión segura de datos como objetos JSON, comúnmente usada para autenticación

Compilación y ejecución

Importante:

Para evitar exponer la cadena de conexión de la base de datos (en este caso MongoDB), se ha creado un archivo llamado local.conf dentro del directorio resources/. Este archivo contiene la cadena de conexión que usarás. Debes crearlo con tu propia URL de conexión:

mongo {
    uri = "mongodb+srv://tuUsuario:tuContraseña@cluster1.pa7b55e.mongodb.net/"
}

Este archivo será utilizado en la clase de conexión a base de datos:

val config = ConfigFactory.parseResources("local.conf").resolve()
val mongoUriLocal = config.getString("mongo.uri")

val applicationConfig = ApplicationConfig("application.conf")
val mongoUri = applicationConfig.propertyOrNull("ktor.database.uri")?.getString() ?: mongoUriLocal

También puedes usar directamente:

mongoClient = MongoClient.create("tu cadena de conexión a MongoDB")

Todo esto está pensado para el modo de desarrollo.
Cuando despliegues la aplicación en un servicio en la nube, deberás usar la variable de entorno DATABASE_URL, la cual ya está configurada en application.conf.

Para ello, simplemente deja el código así:

val applicationConfig = ApplicationConfig("application.conf")
val mongoUri = applicationConfig.propertyOrNull("ktor.database.uri")?.getString()!!

Para probar tu API en un servicio como Render, simplemente sube el repositorio y agrega la variable de entorno DATABASE_URL con tu cadena de conexión.
El Dockerfile se encargará de compilar todo lo necesario:

# Usa Gradle con JDK 11 para compilar el proyecto
FROM gradle:8.4-jdk11 AS build

# Copia los archivos del proyecto al contenedor con los permisos correctos
COPY --chown=gradle:gradle . /home/gradle/src

# Establece el directorio de trabajo
WORKDIR /home/gradle/src

# Construye el fat JAR con todas las dependencias
RUN gradle buildFatJar --no-daemon

# Usa una imagen ligera de Java 11 para ejecutar la app
FROM openjdk:11

# Expone el puerto 8080
EXPOSE 8080:8080

# Crea el directorio donde se copiará el JAR
RUN mkdir /app

# Copia el JAR compilado desde la etapa anterior
COPY --from=build /home/gradle/src/build/libs/*.jar /app/ktor-sample-api_server.jar

# Comando de entrada para ejecutar la app
ENTRYPOINT ["java","-jar","/app/ktor-sample-api_server.jar"]

Postman

Este repositorio incluye un archivo que puede ser importado en Postman y contiene todas las peticiones necesarias para probar la API.

Ten en cuenta que, para realizar la petición de "obtener todos los usuarios", primero debes crear uno y luego ejecutar la petición "login user" para obtener un token.
Este token debe ser utilizado como Bearer en la autorización de las peticiones protegidas, como la de obtener todos los usuarios.
Esto te permitirá probar correctamente la autenticación mediante JWT.

Comandos disponibles

Tarea Descripción
./gradlew test Ejecuta los tests
./gradlew build Compila todo el proyecto
buildFatJar Genera un JAR ejecutable con todas las dependencias
buildImage Crea la imagen Docker para usar con el JAR
publishImageToLocalRegistry Publica la imagen Docker en el registro local
run Ejecuta el servidor localmente
runDocker Ejecuta usando la imagen Docker local

Si el servidor se inicia correctamente, verás una salida como esta:

2024-12-04 14:32:45.584 [main] INFO  Application - Application started in 0.303 seconds.
2024-12-04 14:32:45.682 [main] INFO  Application - Responding at http://0.0.0.0:8080