155 lines
3.6 KiB
JavaScript
155 lines
3.6 KiB
JavaScript
const { ctx } = require("@modjo/core")
|
|
// const { taskCtx } = require("@modjo/microservice-worker/ctx")
|
|
// const pushNotification = require("~/services/push-notification")
|
|
const addNotification = require("~/services/add-notification")
|
|
const { getAlertNotificationExpirationInSeconds } = require("~/constants/time")
|
|
|
|
function createEmergencyInfoNotification({
|
|
alertId,
|
|
// code,
|
|
level,
|
|
what3words,
|
|
address,
|
|
nearestPlace,
|
|
}) {
|
|
const locationParts = []
|
|
if (what3words) {
|
|
locationParts.push(`Localisation en 3 mots: ${what3words}`)
|
|
}
|
|
if (address) {
|
|
locationParts.push(`Adresse: ${address}`)
|
|
}
|
|
if (nearestPlace) {
|
|
locationParts.push(`À proximité de: ${nearestPlace}`)
|
|
}
|
|
|
|
const notificationText = locationParts.join(".\n")
|
|
const expires = getAlertNotificationExpirationInSeconds()
|
|
|
|
return {
|
|
data: {
|
|
action: "alert-infos",
|
|
alertId,
|
|
expires,
|
|
what3words,
|
|
address,
|
|
nearestPlace,
|
|
},
|
|
notification: {
|
|
title: "Infos de localisation pour les secours",
|
|
body: notificationText,
|
|
channel: "alert-infos",
|
|
icon: `notif-${level}`,
|
|
priority: "high",
|
|
ttl: expires,
|
|
actionId: "open-alert",
|
|
},
|
|
}
|
|
}
|
|
|
|
module.exports = async function () {
|
|
async function setNotificationSent(alertId, state) {
|
|
const sql = ctx.require("postgres")
|
|
if (state === false) {
|
|
await sql`
|
|
UPDATE
|
|
"alert"
|
|
SET
|
|
"emergency_calling_notification_sent" = FALSE
|
|
WHERE
|
|
"id" = ${alertId}
|
|
`
|
|
} else {
|
|
await sql`
|
|
UPDATE
|
|
"alert"
|
|
SET
|
|
"emergency_calling_notification_sent" = TRUE
|
|
WHERE
|
|
"id" = ${alertId}
|
|
`
|
|
}
|
|
}
|
|
|
|
return Object.assign(
|
|
async function alertCallEmergencyInfoNotify(params) {
|
|
// const logger = taskCtx.require("logger")
|
|
// logger.debug(`alertNotify: ${JSON.stringify(params)}`)
|
|
|
|
const sql = ctx.require("postgres")
|
|
|
|
const { alertId } = params
|
|
|
|
const [alert] = await sql`
|
|
SELECT
|
|
"device_id" as "deviceId",
|
|
"code" as "code",
|
|
"level" as "level",
|
|
"what3words" as "what3words",
|
|
"address" as "address",
|
|
"nearest_place" as "nearestPlace"
|
|
FROM
|
|
"alert"
|
|
WHERE
|
|
"id" = ${alertId}
|
|
`
|
|
if (!alert) {
|
|
return
|
|
}
|
|
|
|
const { deviceId } = alert
|
|
|
|
const [device] = await sql`
|
|
SELECT
|
|
"fcm_token" as "fcmToken"
|
|
FROM
|
|
"device"
|
|
WHERE
|
|
"id" = ${deviceId}
|
|
`
|
|
|
|
if (!device?.fcmToken) {
|
|
await setNotificationSent(alertId, false)
|
|
return
|
|
}
|
|
|
|
const { fcmToken } = device
|
|
|
|
try {
|
|
const notificationConfig = createEmergencyInfoNotification({
|
|
alertId,
|
|
code: alert.code,
|
|
level: alert.level,
|
|
what3words: alert.what3words,
|
|
address: alert.address,
|
|
nearestPlace: alert.nearestPlace,
|
|
})
|
|
|
|
// Get the userId for the device
|
|
const [userInfo] = await sql`
|
|
SELECT
|
|
"user_id" as "userId"
|
|
FROM
|
|
"device"
|
|
WHERE
|
|
"id" = ${deviceId}
|
|
`
|
|
|
|
const { success } = await addNotification({
|
|
fcmToken,
|
|
deviceId,
|
|
...notificationConfig,
|
|
userId: userInfo.userId,
|
|
type: "alert-emergency-info",
|
|
})
|
|
await setNotificationSent(alertId, success)
|
|
} catch (e) {
|
|
console.error(e)
|
|
await setNotificationSent(alertId, false)
|
|
}
|
|
},
|
|
{
|
|
dedupOptions: { enabled: true },
|
|
}
|
|
)
|
|
}
|