Appearance
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:
| Propiedad | Tipo | Requerido | Descripción |
|---|---|---|---|
url | string | Sí | URL completa del endpoint |
method | string | No | Método HTTP: GET, POST, PUT, DELETE, etc. Por defecto GET |
headers | table | No | Tabla con headers personalizados |
query | table | No | Parámetros query string. Se agregan automáticamente a la URL |
body | table o string | No | Cuerpo de la solicitud. Si es una tabla, se serializa como JSON |
timeout | number | No | Timeout en segundos. Por defecto 30 |
Respuesta
Devuelve una tabla con la siguiente estructura:
| Propiedad | Tipo | Descripción |
|---|---|---|
ok | boolean | true si el status code está entre 200 y 299 |
status | number | Código de estado HTTP |
body | string | Cuerpo de la respuesta en texto plano |
headers | table | Headers de la respuesta |
json | table o nil | Si el body contiene JSON válido, se parsea y expone como tabla |
error | string | Solo 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
endPOST 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ámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
templateName | string | Sí | Nombre de la plantilla en la tabla sx_templates |
model | table | No | Datos 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
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)oClearAll().