in firestore-send-email/functions/src/index.ts [98:237]
async function preparePayload(payload: QueuePayload): Promise<QueuePayload> {
const { template } = payload;
if (templates && template) {
if (!template.name) {
throw new Error(`Template object is missing a 'name' parameter.`);
}
const templateRender = await templates.render(template.name, template.data);
const mergeMessage = payload.message || {};
const attachments = templateRender.attachments
? templateRender.attachments
: mergeMessage.attachments;
payload.message = Object.assign(mergeMessage, templateRender, {
attachments: attachments || [],
});
}
let to: string[] = [];
let cc: string[] = [];
let bcc: string[] = [];
if (typeof payload.to === "string") {
to = [payload.to];
} else if (payload.to) {
validateFieldArray("to", payload.to);
to = to.concat(payload.to);
}
if (typeof payload.cc === "string") {
cc = [payload.cc];
} else if (payload.cc) {
validateFieldArray("cc", payload.cc);
cc = cc.concat(payload.cc);
}
if (typeof payload.bcc === "string") {
bcc = [payload.bcc];
} else if (payload.bcc) {
validateFieldArray("bcc", payload.bcc);
bcc = bcc.concat(payload.bcc);
}
if (!payload.toUids && !payload.ccUids && !payload.bccUids) {
payload.to = to;
payload.cc = cc;
payload.bcc = bcc;
return payload;
}
if (!config.usersCollection) {
throw new Error("Must specify a users collection to send using uids.");
}
let uids: string[] = [];
if (payload.toUids) {
validateFieldArray("toUids", payload.toUids);
uids = uids.concat(payload.toUids);
}
if (payload.ccUids) {
validateFieldArray("ccUids", payload.ccUids);
uids = uids.concat(payload.ccUids);
}
if (payload.bccUids) {
validateFieldArray("bccUids", payload.bccUids);
uids = uids.concat(payload.bccUids);
}
const toFetch = {};
uids.forEach((uid) => (toFetch[uid] = null));
const documents = await db.getAll(
...Object.keys(toFetch).map((uid) =>
db.collection(config.usersCollection).doc(uid)
),
{
fieldMask: ["email"],
}
);
const missingUids = [];
documents.forEach((documentSnapshot) => {
if (documentSnapshot.exists) {
const email = documentSnapshot.get("email");
if (email) {
toFetch[documentSnapshot.id] = email;
} else {
missingUids.push(documentSnapshot.id);
}
} else {
missingUids.push(documentSnapshot.id);
}
});
logs.missingUids(missingUids);
if (payload.toUids) {
payload.toUids.forEach((uid) => {
const email = toFetch[uid];
if (email) {
to.push(email);
}
});
}
payload.to = to;
if (payload.ccUids) {
payload.ccUids.forEach((uid) => {
const email = toFetch[uid];
if (email) {
cc.push(email);
}
});
}
payload.cc = cc;
if (payload.bccUids) {
payload.bccUids.forEach((uid) => {
const email = toFetch[uid];
if (email) {
bcc.push(email);
}
});
}
payload.bcc = bcc;
return payload;
}