async function storePing()

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();
}