Skip to content

Comunicación y APIs

log()

Registra un mensaje en el sistema de logs de la aplicación.

lua
log(message)

send_mail()

Envía un correo electrónico usando el servicio de email configurado.

lua
result = send_mail(address, name, subject, content)

send_notification()

Envía una notificación push web a un usuario específico.

lua
send_notification(app, username, title, body)

Admite una tabla de opciones para configurar icono, badge, target, etc.

send_message()

Envía un mensaje a través del sistema de bot/mensajería (contexto de bot).

lua
send_message(text)

call_api()

Realiza una llamada HTTP a una API externa.

lua
response = call_api(url, method, requestBody, contentType)

Devuelve el cuerpo de la respuesta como string y lanza error si la llamada falla.


http_request()

Realiza una llamada HTTP completa a una API externa con control total sobre la solicitud y una respuesta estructurada.

lua
response = http_request(config)

Configuración

El parámetro config es una tabla con las siguientes propiedades:

PropiedadTipoRequeridoDescripción
urlstringURL completa del endpoint
methodstringNoMétodo HTTP: GET, POST, PUT, DELETE, etc. Por defecto GET
headerstableNoTabla con headers personalizados
querytableNoParámetros query string. Se agregan automáticamente a la URL
bodytable o stringNoCuerpo de la solicitud. Si es una tabla, se serializa como JSON
timeoutnumberNoTimeout en segundos. Por defecto 30

Respuesta

Devuelve una tabla con la siguiente estructura:

PropiedadTipoDescripción
okbooleantrue si el status code está entre 200 y 299
statusnumberCódigo de estado HTTP
bodystringCuerpo de la respuesta en texto plano
headerstableHeaders de la respuesta
jsontable o nilSi el body contiene JSON válido, se parsea y expone como tabla
errorstringSolo presente cuando hay error. Contiene el mensaje de error

Manejo de errores

Nunca lanza excepción. En caso de error de red, timeout, DNS, etc. devuelve:

lua
{ ok = false, status = 0, error = "mensaje de error" }

Ejemplos

GET simple:

lua
local r = http_request({ url = "https://api.example.com/users" })

if r.ok then
    for i = 1, #r.json do
        print(r.json[i].name)
    end
end

POST con body JSON:

lua
local r = http_request({
    method = "POST",
    url = "https://api.example.com/customers",
    headers = {
        Authorization = "Bearer " .. token
    },
    body = {
        name = "John Doe",
        email = "john@example.com"
    },
    timeout = 30
})

Query parameters:

lua
local r = http_request({
    url = "https://api.example.com/customers",
    query = {
        page = 1,
        search = "john"
    }
})

Con manejo de error:

lua
local r = http_request({ url = "https://api.example.com/data" })

if not r.ok then
    _ERROR = r.error
    return
end

print(r.json.customer.name)

render_template()

Renderiza una plantilla Handlebars almacenada en la base de datos.

lua
html = render_template(templateName, model)

Parámetros

ParámetroTipoRequeridoDescripción
templateNamestringNombre de la plantilla en la tabla sx_templates
modeltableNoDatos para la plantilla. Si se omite, se usa un objeto vacío

Retorno

Devuelve el contenido renderizado como string.

Resolución de plantillas

Busca primero una plantilla del tenant actual y si no existe, usa una global (sx_tenant_id IS NULL).

Ejemplos

Renderizado básico:

lua
local html = render_template("backup-report", {
    title = "Reporte de Backups",
    rows = {
        { sistema = "eques", dia0 = true, dia1 = false },
        { sistema = "mis_cuentas", dia0 = true, dia1 = true }
    }
})

Con envío de email:

lua
local html = render_template("backup-report", {
    title = "Backup Report",
    subtitle = "Last 7 Days"
})

send_mail("admin@example.com", "Admin", "Backup Report", html)

Plantilla Handlebars de ejemplo

handlebars
<h1>{{title}}</h1>
<table>
{{#each rows}}
    <tr>
        <td>{{sistema}}</td>
        <td>{{#if dia0}}{{else}}{{/if}}</td>
        <td>{{#if dia1}}{{else}}{{/if}}</td>
    </tr>
{{/each}}
</table>

Consideraciones

  • Las plantillas se compilan y cachean en memoria por tenant + nombre.
  • Si se actualiza una plantilla en la base de datos, el caché se invalida automáticamente al reiniciar el servidor.
  • Se puede forzar la invalidación desde código C# llamando a TemplateRenderer.ClearCache(templateName, tenantId) o ClearAll().