Appearance
Arquitectura de acceso a datos por API
Este documento describe el diseno aplicado para permitir que la aplicacion VB6 acceda a datos de clientes mediante una API REST, manteniendo como alternativa el acceso directo a la base de datos.
Objetivo
La meta es desacoplar los formularios del origen real de los datos. El formulario no deberia decidir si consulta MySQL directamente o si consume HTTP. Esa decision queda centralizada en la clase de dominio, en este caso cCliente.
Con este enfoque se puede migrar funcionalidad gradualmente:
- Cuando la API esta habilitada,
cClienteusacClienteApiGateway. - Cuando la API no esta habilitada,
cClienteconserva el comportamiento historico contramenu.conn. - Los formularios siguen trabajando con propiedades, metodos y
ADODB.Recordset, reduciendo cambios en la UI.
Componentes
Formularios
Los formularios deben delegar la lectura y escritura de clientes en cCliente.
Ejemplos:
frmCliente.frm: ABM de un cliente individual.frmClientes.frm: listado, busqueda y paginado de clientes.
El formulario puede seguir construyendo filtros visuales o validando datos de pantalla, pero no deberia abrir directamente consultas principales contra menu.conn cuando existe una operacion equivalente en la clase.
Clase de dominio cCliente
cCliente actua como capa de acceso compatible con VB6. Expone metodos como:
SeleccionarXIdListarListarParametrizadoListarHojaRutaPListarFiltradoIngresarModificarEliminar
Cada metodo decide internamente que camino usar:
vb
If ClienteApiHabilitada Then
' Acceso via API
Else
' Acceso directo a BD
End IfLa funcion ClienteApiHabilitada valida dos condiciones:
- que la API de clientes este habilitada;
- que exista una
BaseUrlconfigurada.
Gateway REST cClienteApiGateway
cClienteApiGateway encapsula los detalles HTTP:
- construccion del recurso REST;
- envio de requests con
cRestClient; - parseo de JSON;
- validacion de respuestas HTTP;
- extraccion de colecciones, objetos y totales.
La clase de dominio no deberia armar HTTP manualmente. Solo llama al gateway.
Cliente HTTP cRestClient
cRestClient contiene la infraestructura generica para consumir REST:
BaseUrl;- token bearer;
- timeout;
- headers;
- serializacion/deserializacion JSON.
Este componente es reutilizable por otros dominios si se migran mas entidades.
Configuracion modRestApi
La configuracion se lee desde settings de la aplicacion o variables de entorno:
ClientesHabilitada/MG_API_CLIENTES_HABILITADABaseUrl/MG_API_BASE_URLToken/MG_API_TOKENTimeoutMs/MG_API_TIMEOUT_MS
Tambien puede configurarse por codigo con ConfigurarApiClientes.
Flujo de lectura
Para un listado filtrado de clientes:
frmClientestoma los valores de los controles de busqueda.- Arma los filtros historicos SQL para compatibilidad con BD directa.
- Arma tambien un query string REST equivalente.
- Llama a
cCliente.ListarFiltrado. cClientedecide:- si la API esta habilitada, llama a
cClienteApiGateway.ListarConTotal; - si no, ejecuta el SQL historico contra
menu.conn.
- si la API esta habilitada, llama a
- En ambos casos devuelve un
ADODB.Recordsetcompatible con la grilla.
La UI queda aislada del origen de datos real.
Flujo de escritura
Para alta, modificacion o baja:
frmClientecarga los datos en una instancia decCliente.- Llama a
Ingresar,ModificaroEliminar. cClientedecide si usar API o BD directa.- Si usa API, transforma el objeto cliente en JSON mediante
cClienteApiGateway. - Si usa BD directa, ejecuta el SQL historico y mantiene las novedades locales existentes.
Compatibilidad con VB6
Para minimizar impacto en formularios existentes, la capa mantiene estas decisiones:
- Las lecturas de listados devuelven
ADODB.Recordset. - Las propiedades publicas de
cClientesiguen siendo la interfaz principal del ABM. - Los formularios no consumen JSON directamente.
- El parseo de alias JSON se concentra en
cCliente, por ejemploidCliente,idcliente,nroCliente,nrocliente.
Ventajas del diseno
- Migracion gradual por entidad o metodo.
- Fallback inmediato a BD directa si la API no esta configurada.
- Menos cambios en formularios VB6.
- Un solo punto para manejar errores HTTP.
- Un solo contrato REST documentado en
docs/cliente-rest-api.md. - Permite reutilizar el patron en otras clases de dominio.
Consideraciones
El listado de frmClientes tiene filtros avanzados que originalmente estaban expresados como SQL dinamico. Para soportar API, esos filtros deben tener equivalente como parametros REST.
Los filtros simples ya se envian como parametros estructurados. Los filtros de atributos especiales actualmente se envian como filtrosAtributos en forma descriptiva. Si la API debe aplicarlos realmente, conviene definir un contrato estructurado para atributos especiales.
Regla recomendada para nuevas migraciones
Al migrar otra pantalla:
- Crear o completar una clase de dominio.
- Mover ahi el acceso principal a datos.
- Crear un gateway REST especifico si la entidad consume API.
- Mantener fallback directo a BD dentro de la clase de dominio.
- Hacer que el formulario invoque solo metodos de la clase.
- Documentar el contrato REST esperado.
El criterio central es que la UI no debe saber si los datos vienen de HTTP o de SQL.