in functions/index.js [52:98]
async function storePing(pubSubMessage, rawPing, error) {
const db = admin.firestore();
const batch = db.batch();
let pingJson = null;
let os = "???";
try {
// TODO: make sure this is safe if some fields are missing
pingJson = JSON.parse(rawPing);
os = sanitize(pingJson.client_info.os) + " " + sanitize(pingJson.client_info.os_version);
} catch (e) {
// this is validation error
console.error(`JSON parse error: ${e}, raw ping was: ${rawPing}`);
}
const appName = sanitize(pubSubMessage.attributes.document_namespace);
const geo = sanitize(pubSubMessage.attributes.geo_city) + ", " +
sanitize(pubSubMessage.attributes.geo_country);
const debugId = sanitize(pubSubMessage.attributes.x_debug_id);
const clientRef = db.collection("clients").doc(debugId);
batch.set(clientRef, {
appName: appName,
debugId: debugId,
geo: geo,
lastActive: pubSubMessage.publishTime,
os: os,
});
const pingType = pubSubMessage.attributes.document_type;
const pingRef = db.collection("pings").doc(pubSubMessage.attributes.document_id);
const errorFields = await revalidateAndGetErrorFields(pubSubMessage, rawPing, error);
const baseFields = {
addedAt: pubSubMessage.publishTime,
debugId: debugId,
payload: rawPing,
pingType: pingType,
};
batch.set(pingRef, {
...baseFields,
...errorFields,
});
return batch.commit();
}