Skip to content

Feature/service bff #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
26 changes: 16 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,34 @@
![Context Mapper](https://raw.githubusercontent.com/wiki/ContextMapper/context-mapper-dsl/logo/cm-logo-github-small.png)
# Context Mapper Demo for Online IDE
# Demostración de Context Mapper para IDE en línea
[![Build](https://github.com/ContextMapper/web-ide-demo/actions/workflows/build.yml/badge.svg)](https://github.com/ContextMapper/web-ide-demo/actions) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ContextMapper/web-ide-demo) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)

Welcome to Context Mapper's demo repository. It illustrates how you can configure your own repository for the usage of Context Mapper in the online IDE [Gitpod](https://www.gitpod.io/).
Bienvenido al repositorio de demostración de Context Mapper. Ilustra cómo puede configurar su propio repositorio para el uso de Context Mapper en el IDE en línea. [Gitpod](https://www.gitpod.io/).

## Start Using Context Mapper Now
Start the online IDE and use Context Mapper right now:
## Comience a utilizar Context Mapper ahora
Inicie el IDE en línea y use Context Mapper ahora mismo:

<a href="https://gitpod.io/#https://github.com/ContextMapper/web-ide-demo" style="padding: 10px;">
<img src="https://gitpod.io/button/open-in-gitpod.svg" width="150" alt="Push" align="center">
</a>
<br/><br/>

## Open the Demo File
In the folder `src/main/cml` you find a small **[CML demo](./src/main/cml/demo.cml)** (DDD sample application) where you can start to familiarize yourself with our DSL and our tools.
You can find more info's about the tool and a complete documentation on our website [https://contextmapper.org/](https://contextmapper.org/).
## Abra el archivo de demostración
En la carpeta `src/main/cml` encontrarás una pequeña **[CML demo](./src/main/cml/demo.cml)** (aplicación de muestra DDD) donde podrás empezar a familiarizarte con nuestro DSL. y nuestras herramientas.
Puede encontrar más información sobre la herramienta y una documentación completa en nuestro sitio web [https://contextmapper.org/](https://contextmapper.org/).

## Create Your Own Context Mapping Repository
You can simply fork this repository and click the button above to start the online IDE for your repo.
## Cree su propio repositorio de mapas de contexto
Simplemente puede bifurcar este repositorio y hacer clic en el botón de arriba para iniciar el IDE en línea para su repositorio.

## Useful Links
## Enlaces útiles

* [More example models](https://github.com/ContextMapper/context-mapper-examples)
* [CML language reference](https://contextmapper.org/docs/language-reference/)
* [Rapid prototyping tutorial](https://contextmapper.org/docs/rapid-ooad/)
* [Architectural Refactorings](https://contextmapper.org/docs/architectural-refactorings/)
* [Generators](https://contextmapper.org/docs/generators/)

## Context Mapper
En la carpeta `src/main/resources/cml` se podrán encontrar los archivos `cml` para el AS IS y el TO BE del proyecto; como también las imágenes generadas por la herramienta en la carpeta `src/main/src-gen`, con el nombre `as_is_ContextMap.png` y `to_be_ContextMap.png`.

## Lenguaje ubicuo
En la carpeta `src/main/src-gen` se podrá encontrar las imágenes con el nombre `EventStorming AS IS.jpg` y `EventStorming TO BE.jpg`
Empty file added src/bff/bff/__init__.py
Empty file.
Binary file added src/bff/bff/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file not shown.
Binary file added src/bff/bff/__pycache__/utils.cpython-312.pyc
Binary file not shown.
16 changes: 16 additions & 0 deletions src/bff/bff/api/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from flask import Flask

from src.bff.api import ingesta_automatizada


def create_app():
aplicacion = Flask(__name__)

aplicacion.debug = True
aplicacion.register_blueprint(ingesta_automatizada.blueprint)

@aplicacion.route("/health")
def health():
return {"status": "up"}

return aplicacion
Binary file added src/bff/bff/api/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file not shown.
34 changes: 34 additions & 0 deletions src/bff/bff/api/ingesta_automatizada.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import os
import uuid

import requests
from flask import Blueprint, request

from src.bff import utils
from src.bff.despachadores import Despachador

blueprint = Blueprint('ingesta_automatizada', __name__, url_prefix="/bff/ingesta_automatizada")

STA_HOST = os.getenv("STA_HOST", default="localhost")


@blueprint.route('/imagen_medica', methods=['POST'])
def agregar_imagen_medica():
comando = dict(
id=str(uuid.uuid4()),
time=utils.time_millis(),
specversion="v1",
type="ComandoImagenMedica",
ingestion=utils.time_millis(),
datacontenttype="AVRO",
service_name="BFF",
data=request.json
)
despachador = Despachador()
despachador.publicar_mensaje(comando, "comandos-imagen-medica")
return [{'message': 'Su imagen esta siendo agregada'}], 203


@blueprint.route('/imagen_medica/<id>', methods=['GET'])
def dar_imagen_medica(id=None):
return requests.get(f'http://{STA_HOST}:5000/ingesta_automatizada/imagen_medica-query/{id}').json()
17 changes: 17 additions & 0 deletions src/bff/bff/despachadores.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import pulsar

from src.bff import utils


class Despachador():
def __init__(self):
...

def publicar_mensaje(self, mensaje, topico):
json_schema = utils.consultar_schema_registry(topico)
avro_schema = utils.obtener_schema_avro_de_diccionario(json_schema)

cliente = pulsar.Client(f'pulsar://{utils.broker_host()}:6650')
publicador = cliente.create_producer(topico, schema=avro_schema)
publicador.send(mensaje)
cliente.close()
28 changes: 28 additions & 0 deletions src/bff/bff/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import json
import time

import requests
import os

from fastavro.schema import parse_schema
from pulsar.schema import AvroSchema

PULSAR_ENV: str = 'BROKER_HOST'


def broker_host():
return os.getenv(PULSAR_ENV, default="localhost")


def consultar_schema_registry(topico: str) -> dict:
json_registry = requests.get(f'http://{broker_host()}:8080/admin/v2/schemas/public/default/{topico}/schema').json()
return json.loads(json_registry.get('data', {}))


def obtener_schema_avro_de_diccionario(json_schema: dict) -> AvroSchema:
definicion_schema = parse_schema(json_schema)
return AvroSchema(None, schema_definition=definicion_schema)


def time_millis():
return int(time.time() * 1000)
79 changes: 0 additions & 79 deletions src/main/cml/demo.cml

This file was deleted.

73 changes: 73 additions & 0 deletions src/main/resources/cml/as_is.cml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Dominio Principal de SaludTech
Domain SaludTech {
domainVisionStatement = "Recaudar, procesar, distribuir y anonimizar imágenes y diagnósticos médicos."

// Subdominios principales
Subdomain Recoleccion {
type = CORE_DOMAIN
domainVisionStatement = "Recolectan, estandarizan y anonimizan las imágenes y diagnosticos medicos."
}

Subdomain Procesamiento {
type = CORE_DOMAIN
domainVisionStatement = "Aplican modelos de IA para clasificar y extraer información de las imágenes médicas y diagnosticos medicos."
}

Subdomain Distribucion {
type = CORE_DOMAIN
domainVisionStatement = "Habilitan la consulta y descarga de las imágenes médicas y diagnosticos medicos anonimizados."
}

// Subdominios de soporte
Subdomain Proveedores {
type = SUPPORTING_DOMAIN
domainVisionStatement = "Organizan la adquisicion de las imágenes médicas y diagnosticos medicos desde la infraestructura de los proveedores."
}

Subdomain Clientes {
type = SUPPORTING_DOMAIN
domainVisionStatement = "Gestionan los clientes, suscripciones, comercialización y entrenamientos de productos IA."
}

// Subdominios generales
Subdomain Notificaciones {
type = GENERIC_SUBDOMAIN
domainVisionStatement = "Gestionan las notificaciones de todos los flujos de trabajo."
}

Subdomain Facturacion {
type = GENERIC_SUBDOMAIN
domainVisionStatement = "Gestionan la facturacion, cobros y pagos de todos los flujos de trabajo."
}
}

// Contextos
BoundedContext ContextoGestionDeImagenesYDiagnosticosMedicos implements Recoleccion, Procesamiento, Distribucion {
responsibilities = "Recolectar, estandarizar y anonimizar imágenes y diagnósticos médicos."
}

BoundedContext ContextosProveedores implements Proveedores {
responsibilities = "Organizar la adquisición de imágenes médicas y diagnósticos médicos desde la infraestructura de los proveedores."
}

BoundedContext ContextosClientes implements Clientes {
responsibilities = "Distribución, comercializacion y entrenamiento de IA de las imágenes médicas y diagnósticos médicos anonimizados a los clientes."
}

BoundedContext ContextoTransaccional implements Notificaciones, Facturacion {
responsibilities = "Gestionar las notificaciones, facturacion, cobros y pagos de todos los flujos de trabajo."
}

// Mapa de Contextos
ContextMap ImagenesClinicasSaludTechAlpes {
state = AS_IS
contains ContextoGestionDeImagenesYDiagnosticosMedicos
contains ContextosProveedores
contains ContextosClientes
contains ContextoTransaccional

ContextosProveedores -> ContextoGestionDeImagenesYDiagnosticosMedicos
ContextoGestionDeImagenesYDiagnosticosMedicos -> ContextosClientes
ContextoTransaccional -> ContextosProveedores
ContextoTransaccional -> ContextosClientes
}
98 changes: 98 additions & 0 deletions src/main/resources/cml/to_be.cml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Dominio Principal de SaludTech
Domain SaludTech {
domainVisionStatement = "Recaudar, procesar, distribuir y anonimizar imágenes y diagnósticos médicos."

// Subdominios principales
Subdomain Recoleccion {
type = CORE_DOMAIN
domainVisionStatement = "Recolectan, estandarizan y anonimizan las imágenes y diagnosticos medicos."
}

Subdomain Procesamiento {
type = CORE_DOMAIN
domainVisionStatement = "Aplican modelos de IA para clasificar y extraer información de las imágenes médicas y diagnosticos medicos."
}

Subdomain Distribucion {
type = CORE_DOMAIN
domainVisionStatement = "Habilitan la consulta y descarga de las imágenes médicas y diagnosticos medicos anonimizados."
}

// Subdominios de soporte
Subdomain Proveedores {
type = SUPPORTING_DOMAIN
domainVisionStatement = "Organizan la adquisicion de las imágenes médicas y diagnosticos medicos desde la infraestructura de los proveedores."
}

Subdomain Clientes {
type = SUPPORTING_DOMAIN
domainVisionStatement = "Gestionan los clientes, suscripciones, comercialización y entrenamientos de productos IA."
}

// Subdominios generales
Subdomain Notificaciones {
type = GENERIC_SUBDOMAIN
domainVisionStatement = "Gestionan las notificaciones de todos los flujos de trabajo."
}

Subdomain Facturacion {
type = GENERIC_SUBDOMAIN
domainVisionStatement = "Gestionan la facturacion, cobros y pagos de todos los flujos de trabajo."
}
}

// Contextos
BoundedContext ContextoIngestaAutomatizada implements Recoleccion {
responsibilities = "Automatizar la recolección de imágenes médicas desde hospitales y proveedores. Estandarizar y validar los datos antes de su procesamiento."
}

BoundedContext ContextoProcesamientoInteligenteDeImagenes implements Procesamiento {
responsibilities = "Aplicación de modelos de IA para clasificar y extraer información de las imágenes médicas. Optimización del rendimiento de los modelos para escalar con grandes volúmenes de datos."
}

BoundedContext ContextoAnonimizacionYCanonizacion implements Recoleccion {
responsibilities = "Limpieza y eliminación de información sensible en imágenes médicas. Canonización de datos para asegurar formatos estándar y cumplir normativas."
}

BoundedContext ContextoDistribucionDeDatos implements Distribucion {
responsibilities = "Facilitar la consulta y descarga de imágenes médicas anonimizadas. Manejar accesos de clientes en función de sus planes de suscripción."
}

BoundedContext ContextoInfraestructuraDistribuida implements Recoleccion, Procesamiento, Distribucion {
responsibilities = "Manejar la segmentación de datos por país y la infraestructura en la nube. Asegurar la residencia de datos conforme a normativas de cada región."
}

BoundedContext ContextoSeguridadYRegulacion implements Recoleccion, Procesamiento, Distribucion {
responsibilities = "Supervisar el cumplimiento de normativas de seguridad de los datos en cada región. Implementar controles de acceso y monitoreo en la plataforma."
}

BoundedContext ContextoTransaccional implements Notificaciones, Facturacion {
responsibilities = "Gestionar las notificaciones, facturacion, cobros y pagos de todos los flujos de trabajo."
}

// Mapa de Contextos
ContextMap ImagenesClinicasSaludTechAlpes {
state = TO_BE

contains ContextoIngestaAutomatizada
contains ContextoProcesamientoInteligenteDeImagenes
contains ContextoAnonimizacionYCanonizacion
contains ContextoDistribucionDeDatos
contains ContextoInfraestructuraDistribuida
contains ContextoSeguridadYRegulacion
contains ContextoTransaccional

ContextoIngestaAutomatizada [OHS] -> ContextoAnonimizacionYCanonizacion
ContextoAnonimizacionYCanonizacion [OHS] -> ContextoProcesamientoInteligenteDeImagenes
ContextoProcesamientoInteligenteDeImagenes [OHS] -> ContextoDistribucionDeDatos
ContextoInfraestructuraDistribuida [OHS] -> ContextoIngestaAutomatizada
ContextoInfraestructuraDistribuida [OHS] -> ContextoAnonimizacionYCanonizacion
ContextoInfraestructuraDistribuida [OHS] -> ContextoProcesamientoInteligenteDeImagenes
ContextoInfraestructuraDistribuida [OHS] -> ContextoDistribucionDeDatos
ContextoSeguridadYRegulacion [OHS] -> ContextoIngestaAutomatizada
ContextoSeguridadYRegulacion [OHS] -> ContextoAnonimizacionYCanonizacion
ContextoSeguridadYRegulacion [OHS] -> ContextoProcesamientoInteligenteDeImagenes
ContextoSeguridadYRegulacion [OHS] -> ContextoDistribucionDeDatos
ContextoTransaccional [OHS] -> ContextoIngestaAutomatizada
ContextoTransaccional [OHS] -> ContextoDistribucionDeDatos
}
Binary file added src/main/src-gen/EventStorming AS IS.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/main/src-gen/EventStorming TO BE.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/main/src-gen/as_is_ContextMap.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/main/src-gen/to_be_ContextMap.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.