Usar API externa para crear notificaciones
Hola, en este artículo comparto cómo usar una API para crear notificaciones. En concreto trabajaremos con OneSignal:
https://documentation.onesignal.com/reference#create-notification
Primero, en el servicio recibimos un mensaje con la siguiente estructura:
{
"idApp": "111111111",
"numExpediente": "111111111",
"idioma": "ES",
"tipoNotificacion": "citafuturaAP",
"notificacion": {
"titulo": "Cita Atención Primaria",
"subtitulo": "C.P. ISORA",
"mensaje": "Aquí el contenido del mensaje si aplicase",
"datosAdicionales": [
{
"clave": "centro",
"valor": "C.P. ISORA",
},
{
"clave": "fecha", {}
"valor": "yyyy/mm/dd",
},
{
"clave": "hora",
"valor": "hh:mm",
},
{
"clave": "profesional",
"valor": "nombre del profesional",
},
{
"clave": "nomUsuario",
"valor": "nombre del usuario",
},
{
"clave": "codcita",
"valor": "idCita",
},
{
"clave": "sepuedeborrar",
"valor": 1,
}
]
}
}
Segundo, necesitamos enviar a OneSignal la siguiente estructura:
{
"app_id": "11111",
"headings": {"en":"Cita Atencion Primaria","es":"Cita Atencion Primaria"},
"subtitle": {"en":"C.P. ISORA","es":"C.P. ISORA"},
"contents": {"en": "Next appointment", "es": "Siguiente cita"},
"data":{
"centro": "C.P. ISORA",
"fecha": "yyyy/mm/dd",
"hora": "hh:mm",
"profesional": "nombre del profesional",
"nomUsuario": "nombre del usuario",
"codcita": "idCita",
"sepuedeborrar": 1
},
"include_player_ids": ["c2917a6f-6ecf-4f45-8b31-9b72538580fd"]
}
Lo que haremos será ayudarnos del siguiente código en el Proceso, cuya misión es convertir datosAdicionales, en data, guardándolo en la variable global ^data:
set data = "{"
$$$LOGINFO("datosAdicionales: "_request.notificacion.datosAdicionales)
for i=1:1:request.notificacion.datosAdicionales.Count(){
//$$$LOGINFO("i: "_i)
set datos = request.notificacion.datosAdicionales.GetAt(i)
//$$$LOGINFO("datos.clave: "_datos.clave)
//$$$LOGINFO("datos.valor: "_datos.valor)
set data = data_""""_datos.clave_""""_":"_""""_datos.valor_""""_","
$$$LOGINFO("data: "_data)
}
set data=$extract(data,1,$length(data)-1)_"}"
$$$LOGINFO("data: "_data)
set ^data = data
El resultado de hacer pasar el mensaje anterior por el proceso es:
^data: {"centro":"C.P. ISORA","fecha":"yyy/mm/dd","hora":"hh:mm","profesional":"nombre del profesional","nomUsuario":"nombre de usuario","codcita":"idCita","sepuedeborrar":"1"}
A continuación, vamos a la Operación, donde haremos un POST, creando el JSON y enviándolo a la API:
Class Operaciones.REST.NotificacionesPUSH.CrearNotificacion Extends EnsLib.REST.Operation
{
Parameter INVOCATION = "Queue";
Method CrearNotificacion(pRequest As Mensajes.Request.NotificacionesPUSH.CrearNotificacion, pResponse As Mensajes.Response.NotificacionesPUSH.CrearNotificacion) As %Library.Status
{
$$$LOGINFO("^data: "_^data)
Set body = {
"app_id": (pRequest.idApp),
"headings": {"en":(pRequest.notificacion.titulo),"es":(pRequest.notificacion.titulo)},
"subtitle": {"en":(pRequest.notificacion.subtitulo),"es":(pRequest.notificacion.subtitulo)},
"contents": {"en":(pRequest.notificacion.mensaje),"es":(pRequest.notificacion.mensaje)},
"data":(^data),
"include_player_ids": ["c2917a6f-6ecf-4f45-8b31-9b72538580fd"]
}
set httpRequest = ##class(%Net.HttpRequest).%New()
set tResponse = ##class(%Net.HttpResponse).%New()
set httpRequest.Server = "onesignal.com"
set httpRequest.ContentType = "application/json"
set httpRequest.Authorization = "Basic "_##class(Util.TablasMaestras).getValorMaestra("NOTIFICACIONESPUSH.PARAMETRIZACIONES","ONESIGNAL_APIKEY")
$$$LOGINFO("httpRequest.Authorization: "_httpRequest.Authorization)
set httpRequest.Https = 1
set httpRequest.SSLConfiguration = "Certificado"
Do httpRequest.EntityBody.Write(body.%ToJSON())
set tSC = httpRequest.Post("https://onesignal.com/api/v1/notifications")
set tResponse = httpRequest.HttpResponse
if $$$ISERR(tSC){
$$$ThrowOnError(tSC)
}
if (tResponse.Data.AtEnd = 0) {
set linea = tResponse.Data.Read()
}
set pResponse = ##class(Mensajes.Response.NotificacionesPUSH.CrearNotificacion).%New()
do pResponse.informacion.Write(linea)
Quit pResponse
}
XData MessageMap
{
<MapItems>
<MapItem MessageType="Mensajes.Request.NotificacionesPUSH.CrearNotificacion">
<Method>CrearNotificacion</Method>
</MapItem>
</MapItems>
}
}
Con lo anterior hecho, estamos listos para probar mediante POSTMAN. Creamos una nueva request con la URL hacia nuestro servidor, y enviamos el mensaje que hay al inicio del artículo. Como resultado veremos que la API nos responde con el id de la notificación creada, y a cuántos usuarios (recipients) se logró enviar.
Como hemos visto, gracias a ensemble y con algo de código 💻, logramos conectar con APIs externas.
Para más información:
https://community.intersystems.com/post/how-could-we-include-json-object...