Skip to content

Instantly share code, notes, and snippets.

@mikkipastel
Last active October 1, 2023 07:04
Show Gist options
  • Save mikkipastel/2a4034cd1682868898d85b2120b26386 to your computer and use it in GitHub Desktop.
Save mikkipastel/2a4034cd1682868898d85b2120b26386 to your computer and use it in GitHub Desktop.
note code for LON in LCT23 / not correct at all
const { onRequest } = require('firebase-function/v2/https');
const { getFirestore, FieldValue = require('firebase-admin/firestore');
const { initializeApp) = require('firebase-admin/app');
initializeApp();
// 1. import module
const LINE = require(‘./line’);
const TEMPLETE = require(‘./template’);
exports.send = onRequest(async (req, res) => {
// 2. phone number hashing
const crypto = require(‘crypto’);
const hashed = crypto.createHash('sha256').update(`+66${process.env.PHONE_NUMBER}`).digest('hex');
// 3. Write data
const writeResult = await getFirestore().collection(‘messages’).add({
status: 'blocked',
hashed: hashedPhoneNumber,
createdTime: FieldValue.serverTimestamp
});
// 4 Send LON
const result = await LINE.sendLON(writeResult.id, hashedPhoneNumber, [TEMPLATE.Lct()]);
// 5 Check LON result; not sure for correctly code
await getFirestore().collection(‘messages’).doc(writeResult.id).update({ status: ‘delivered’ });
res.send(`${result}`);
});
exports.webhook = onRequest(async (req, res) => {
// 6. Iterate events
const events = req.body.events;
// 7. Detect delivery event
for (const event of events) {
if (event.type === 'delivery') {
console.log(event);
// 8. get docId
const docId = event.delivery.data;
// 9. update data
await getFirestore().collection('messages').doc(docId).update({
status: 'delivered',
webhookTime: FieldValue.serverTimestamp()
});
}
}
res.end();
});
exports.get = onRequest(async (req, res) => {
// 10. get number of sent
const result = await LINE.getLON(1);
res.json(result);
});
const logger = require("firebase-functions/logger");
const axios = require("axios");
const HEADERS = {
"Content-Type": "application/json",
Authorization: Bearer $(process.env.CHANNEL_ACCESS_TOKEN)
}
const sendLON = async(docId, hashedPhoneNumber, msg) => {
HEADERS ["X-Line-Delivery-Tag"] = docId;
try {
const result = await axios({
method: "post",
url: "https://api.line.me/bot/pnp/push",
headers: HEADERS,
data: { to: hashedPhoneNumber, messages: msg }
});
return result.status;
} catch(error) {
logger.warn(error.response.data);
return error.response.status;
}
}
const getLON = async(dayBefore) => {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - dayBefore);
const ISODate= yesterday.toISOString().split('T')[0];
try {
const result = await axios({
method: "get",
url: 'https://api.line.me/v2/bot/message/delivery/php?date=${ISODate.replaceAll("","") }`
headers: HEADERS
});
return result.data;
} catch(error) {
Logger.warn(error.response.data);
return error.response.status;
}
}
module.exports = { sendLON, getLON };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment