ImagLend — Enrutamiento y URLs de la Console Publica
Proposito
Define como se resuelven las URLs publicas de la console publica (imagy-console-public) considerando tenants, organizaciones, productos y dominios custom. El enrutamiento determina que landing page mostrar, que producto ofrecer y a que organizacion asociar las solicitudes.
Estructura de URLs
Patron Base
{org}.{tenant}.reimaginetech.io/{path}URLs por Nivel
| Nivel | URL | Resolucion |
|---|---|---|
| Tenant sin org | fintech-abc.reimaginetech.io/credito/microcredito-30d | Tenant: fintech-abc, Org: ninguna, Producto: microcredito-30d |
| Tenant con org | digital.fintech-abc.reimaginetech.io/credito/microcredito-30d | Tenant: fintech-abc, Org: digital, Producto: microcredito-30d |
| Dominio custom | credito.miempresa.com/microcredito-30d | Resuelve tenant + org desde tabla tenant_domains |
| Dominio custom con org | canal-digital.miempresa.com/microcredito-30d | Resuelve tenant + org desde tabla tenant_domains |
Rutas Internas de la App
| Ruta | Componente | Descripcion |
|---|---|---|
/ | LandingHome | Pagina principal del tenant/org (lista de productos o landing default) |
/credito/{product_code} | ProductLanding | Landing page del producto con simulador |
/solicitud/{access_token} | WizardApp | Wizard de originacion (6 pasos) |
/solicitud/{access_token}/paso/{step} | WizardStep | Paso especifico del wizard |
/validar/{flow_token} | FlowExecution | Ejecucion de flujo ImagFlow |
/firmar/{signing_token} | SigningPage | Pagina de firma ImagSign |
Resolucion de Contexto
Flujo de Resolucion
Implementacion en Frontend (TenantResolver)
interface PublicContext {
tenantCode: string;
tenantId: string;
organizationCode: string | null;
organizationId: string | null;
theme: ThemeConfig;
availableProducts: ProductSummary[];
}
function resolvePublicContext(): PublicContext {
const hostname = window.location.hostname;
// 1. Dominio custom: resolver via API
if (!hostname.endsWith('.reimaginetech.io')) {
return fetchContextFromDomain(hostname);
}
// 2. Parsear patron: {org}.{tenant}.reimaginetech.io
const parts = hostname.replace('.reimaginetech.io', '').split('.');
if (parts.length === 2) {
// org.tenant
return { tenantCode: parts[1], organizationCode: parts[0] };
}
if (parts.length === 1) {
// solo tenant
return { tenantCode: parts[0], organizationCode: null };
}
throw new Error('URL format not recognized');
}API de Resolucion de Contexto
GET /api/v1/public/context?hostname={hostname}Retorna:
{
"data": {
"tenant_id": "uuid",
"tenant_code": "fintech-abc",
"tenant_name": "Fintech ABC",
"organization_id": "uuid",
"organization_code": "digital",
"organization_name": "Canal Digital",
"theme": {
"logo_url": "https://cdn.reimaginetech.io/tenants/uuid/logo.svg",
"primary_color": "#7C3AED",
"secondary_color": "#F59E0B",
"font_family": "Inter"
},
"available_products": [
{ "code": "microcredito-30d", "name": "Microcredito 30 dias", "has_landing": true },
{ "code": "consumo-180d", "name": "Credito Consumo", "has_landing": true }
],
"locale": "es",
"features": {
"multi_product_landing": true,
"app_store_links": false
}
}
}Organizaciones y Productos
Asignacion de Productos por Organizacion
Un producto puede estar asignado a:
- Todo el tenant (disponible para todas las organizaciones)
- Una organizacion especifica (solo visible en esa org)
Impacto en la Landing
| Escenario | Productos visibles | Landing |
|---|---|---|
| URL sin org | Todos los productos del tenant | Landing general del tenant |
| URL con org | Productos del tenant + productos exclusivos de la org | Landing de la org (si existe) o del tenant |
| Org sin landing propia | Hereda landing del tenant con filtro de productos | Misma landing, productos filtrados |
| Org con landing propia | Solo productos asignados a la org | Landing personalizada de la org |
Branding por Organizacion
Las organizaciones pueden tener su propio sub-tema que override el tema del tenant:
{
"organization_theme_override": {
"logo_url": "https://cdn.reimaginetech.io/tenants/uuid/orgs/digital/logo.svg",
"primary_color": "#2563EB",
"tagline": "Tu credito digital al instante"
}
}Prioridad de resolucion del tema:
- Override de la organizacion (si existe)
- Tema del tenant (ThemeConfiguration activo)
- Tema default de la plataforma (fallback)
Solicitudes y Trazabilidad
Cuando un usuario crea una solicitud desde una URL con organizacion:
{
"credit_application": {
"tenant_id": "uuid-fintech-abc",
"organization_id": "uuid-canal-digital",
"origin": {
"type": "flow",
"channel": "digital",
"organization_code": "digital",
"landing_url": "digital.fintech-abc.reimaginetech.io/credito/microcredito-30d",
"referrer": "https://google.com"
}
}
}Esto permite:
- Saber de que organizacion vino cada solicitud
- Reportes por organizacion (conversion, volumen)
- Comisiones por canal (si aplica reventa)
- Filtrar solicitudes por organizacion en el panel admin
Dominios Custom por Organizacion
Cada organizacion puede tener su propio dominio custom:
| Organizacion | Dominio custom | Resolucion |
|---|---|---|
| Canal Digital | credito-digital.fintech-abc.com | tenant: fintech-abc, org: digital |
| Aliado Comercial | prestamos.aliado.com | tenant: fintech-abc, org: aliado-comercial |
| Sin org | credito.fintech-abc.com | tenant: fintech-abc, org: null |
La tabla tenant_domains soporta esto con un campo organization_id opcional:
ALTER TABLE tenant_domains ADD COLUMN organization_id UUID REFERENCES organizations(id);Caso de Uso: Reventa
Un tenant (empresa financiera) tiene aliados comerciales que revenden sus productos de credito. Cada aliado es una organizacion con:
- Su propio dominio (
prestamos.aliado.com) - Su propio branding (logo y colores del aliado)
- Productos especificos asignados (con condiciones diferentes)
- Comisiones por solicitud originada
El usuario final ve la marca del aliado, no la del tenant ni la de Imagy. La trazabilidad permite al tenant saber cuantas solicitudes origino cada aliado.
Reglas
- Si la URL tiene organizacion, la solicitud se asocia a esa organizacion
- Si la URL no tiene organizacion, la solicitud se asocia solo al tenant
- Los productos filtrados dependen de la organizacion resuelta
- El tema se resuelve con prioridad: org override > tenant theme > platform default
- Los dominios custom pueden apuntar a tenant o a tenant+org
- El cache de resolucion tiene TTL de 5 minutos
- Si el hostname no se puede resolver, se muestra pagina 404 generica