Saltar a contenido

Práctica platform

Enunciado:

Se debe lograr desarrollar y deployar dos sistemas, una web API y un Worker, con sincronización a través de Kafka

Objetivos

Adquirir conocimientos en:

  1. Desarrollo de web API
    1. Estándar Rest
    2. Validar request
  2. Integración a base de datos
    1. Conexión
    2. ABM de recurso
    3. Consultas
  3. Sincronización con Kafka
    1. Publicador
    2. Consumidor
  4. Implementación auditoria y monitorización
    1. Logging de información
    2. Implementación de metricas
  5. Unit Test
  6. Deploy en OCP

Onboarding Base 1. Desarrollo de Web API * Puntos a validar: Estandar Rest, Validación Request. 2. Integración a base de datos * Puntos a Validar: Conexión a BBDD, ABM, Querys. 3. Auditoria: * Puntos a conocer: Logging, metricas y treacing. 4. Unit Test: * Puntos a validar: Unit Test, Code Coverage. 5. Deploy en OCP.

Onboarding Kafka 6. Desarrollo de Publicador/Subcriptor Puntos a conocer: Generación de eventos, publicar mensaje, consumir mensaje.

Recursos

Se preparo una carpeta con recursos necesarios para completar el desafio. Puede acceder a ellos desde GitHub

ETAPA 1

Se debe desarrollar un sistema que permita dar de alta a un pedido y pueda consultar la información de dicho pedido.

Web API

  1. Desarrollar una web API que realice el alta de un pedido. Se debe exponer los siguientes endpoints.
[POST] ~/api/pedido

-body
{
    "cuentaCorriente" : "123123123123",
    "codigoDeContratoInterno": "123123123"
}

Si la operación fue procesada correctamente, devolver el código 201 - Created y en un header la url para obtener el resultado. Por ejemplo: Location: "/api/pedido/{id}", donde id es el identificador que se le asignó a esa operación.

Validar que los valores, cuentaCorriente y codigoDeContratoInterno del request sean números. En caso de que no cumpla la validación devolver un mensaje de error, con un mensaje adecuado y un status code 400 - bad request.

  1. Además se debe disponibilizar una API de consulta que devuelva la información de un pedido creado previamente. La API debe cumplir lo siguiente:
[GET] ~/api/pedido/{id}

Realizar la validación pertinente para que el Id ingresado sea un uniqueidentifier.

En caso de no existir el pedido se debe devolver un mensaje de error, con el mensaje adecuado y un status code 404 - not found.

En caso de resultar correcto el request se debe devolver la siguiente estructura con un status code 200 - Ok.

{
    "id": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9",
    "numeroDePedido": 1212312312,
    "cicloDelPedido": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9",
    "codigoDeContratoInterno": 123123123,
    "estadoDelPedido": "CREADO",
    "cuentaCorriente": 123123123123,
    "cuando": "2021-01-01"
}

Database

El endpoint de POST pedidos, debe realizar la creación en la base de datos de ese recurso. Por lo que debe realizar la configuración y el mapeo de las entidades a la base de datos. En la carpeta de recursos se encuentra el script para construir el modelo de datos en una base sql server.

Puede instalar el motor de SQLServerExpress o utilizar la imagen docker que se encuentra en la carpeta de recursos.

para conectarse. Puede usar el siguiente connection string

Yml ConnectionString: "Data Source=(localhost:{puerto donde se levanta el docker});Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=admin1234"

(esta configuración corresponde si se levanta la imagen del docker y ejecutando el script para la creación de las tablas y las entidades)

Para hacer el insert se debe completar el objeto con los siguientes datos.

{
    "id": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9", // Guid.NewGuid()
    "numeroDePedido": null, // siempre null en la creación
    "cicloDelPedido": "f61da6b5-b7ab-41e8-aa63-1c0174bfbfc9", // valor tomado del id generado
    "codigoDeContratoInterno": 123123123, // valor tomado de request
    "estadoDelPedido": 1, // 1 - creado, siempre en esta intancia.
    "cuentaCorriente": 123123123123, // valor tomado de request
    "cuando": "2021-01-01" // Fecha actual.
}

Por otro lado, el endpoint de GET pedido debe buscar en base de datos el pedido y devolver la información como se detallo anteriormente.

ETAPA 2

Se debe realizar la lógica para asignar el número de pedido.

Publicador

Ajustar la web API para que cada vez que se cree un pedido se publique el evento Pedido en el Tópico PedidoCreado de Kafka, la clase del evento se encuentra en la librería

Nuget

    Install-Package Andreani.Onboarding.Event --version 6.0.0
GO
    go get ---

La estructura del evento es similar a la estructura de la entidad.

Config AMQStreams

AMQStreams:
  BootstrapServer: "SSL://cluster-kafka-bootstrap-amq-streams-test.apps.ocptest.andreani.com.ar:443"
  SchemaUrl: "http://apicurioregistry.apps.ocptest.andreani.com.ar/apis/ccompat/v6"
  Protocol: Ssl
  AutoOffsetReset: Earliest
  AutoRegisterSchemas: true
  MaxRetry: 3
Para visualizar los topicos y dentro los mensajes que se estan enviando se puede consultar Kafka-ui y buscar los topicos correspondientes a este onboarding ´PedidoCreado´ y ´PedidoAsignado´

Se deberá utilizar el archivo kafka.pem donde se disponibiliza las certificaciones y se debe alojar (recomendacion) en la raíz para luego que dentro de la configuración del appsetting lo logre encontrar. En caso de especificar otra ruta se debe aclarar en la configuración. El archivo se encuentra dentro de la carpeta resource

Consumer Worker

Se debe crear otro microservicio con la estructura de una application worker, que debe estar subscripto al evento Pedido. Cuando recibe el evento debe ejecutar algún algoritmo random para asignar un número de pedido. Luego debe publicar el evento Pedido, con el valor de número de pedido encontrado, en el tópico PedidoAsignado.

Consumer Web API

Modificar la Web API para que se subscriba al evento Pedido del topic PedidoAsignado, cuando reciba el evento debe actualizar la información del pedido con el número de pedido y actualizar el estado del pedido a ASIGNADO.

ETAPA 3

auditoria y monitorización

Agregar en la web API:

  1. En cada request debe existir logs de tipo información con la información que se intenta crear o consultar y logs de error en caso de falla de la app.
  2. Agregar observabilidad con el Agente de Elastic APM

Unit test

Realizar los unit test que crea necesario para cubrir la mayor cantidad de escenarios posibles.

ETAPA 4

Realizar el deploy de los microservicios en open shift.

Toda la información necesaria para realizar la configuracion en el startup tanto como para publicar un evento y Consumir en kafka se puede en el Docs de arquitectura