v1.1.0/server side second dose

This commit is contained in:
2021-04-19 22:41:34 -04:00
parent 3055bf4521
commit 2eabb6807f
3 changed files with 65 additions and 27 deletions
-1
View File
@@ -24,5 +24,4 @@ yarn-debug.log*
yarn-error.log* yarn-error.log*
*.cache *.cache
*.log *.log
functions/lib/
functions/src/backup.json functions/src/backup.json
+63 -24
View File
@@ -19,16 +19,24 @@ admin.initializeApp({
credential: admin.credential.cert(params), credential: admin.credential.cert(params),
}); });
interface RequestData { type SideEffect = Record<string, boolean>;
gid: string; type DoseToSideEffect = Record<string, SideEffect>;
} type DBResult = {
name : string;
age : string;
"J&J Janssen"? : SideEffect;
"Moderna"? : DoseToSideEffect;
"Pfizer-BioNTech"? : DoseToSideEffect;
};
interface SaveResultRequestData extends RequestData { type SaveResultRequestData = {
name: string; name: string;
age: string; age: string;
dose: string; dose: string;
[x: string]: string; gid: string;
} } & {
[x: string] : boolean;
};
const serializeGaId = (_gaid: string): string => { const serializeGaId = (_gaid: string): string => {
if (_gaid) { if (_gaid) {
@@ -37,30 +45,61 @@ const serializeGaId = (_gaid: string): string => {
return ""; return "";
}; };
if (process.env.NODE_ENV && process.env.NODE_ENV === "dev") { const requestDataToDbData = (data: SaveResultRequestData) : DBResult => {
// eslint-disable-next-line @typescript-eslint/no-var-requires console.log(data);
const backup = require("./backup.json"); return {name: "a", age: "d"};
const BackupResults : Record<string, Record<string, };
boolean | Record<string, unknown> | string>> =
backup.results;
const BackupStats : Record<string, const addResultToStats = async (data : DBResult) => {
Record<string, unknown> | console.log(data);
Record<string, number> | };
Record<string, Record<string, number> |
Record<string, Record<string, Record<string, number>>>>> =
backup.stats;
Object.keys(BackupResults).forEach((key : string) => { const removeResultFromStats = async (data : DBResult) => {
admin.firestore().collection("results").doc(key).set(BackupResults[key]); console.log(data);
}); };
Object.keys(BackupStats).forEach((key : string) => {
admin.firestore().collection("stats").doc(key).set(BackupStats[key]); const setResultInDb = async (data: SaveResultRequestData) => {
const {name, age, dose} = data;
const result : DBResult = {name, age};
const rawResult : Record<string, boolean> = {};
Object.keys(data).filter(k => data[k] === true || data[k] === false).forEach(k => {
rawResult[k] = data[k];
}); });
if (!!dose.replace(/\s/g, "")) {
result[name][dose][age] =
} }
await addResultToStats(requestDataToDbData(data));
return result;
};
export const saveResult = functions.https.onCall( export const saveResult = functions.https.onCall(
async (data: SaveResultRequestData, context) => { async (data: SaveResultRequestData, context) => {
if (!!data && !!context) {
const {gid} = data;
// Get existing result
const existingResult = await admin
.firestore()
.collection("results")
.doc(serializeGaId(gid))
.get()
.then((docSnap) => docSnap.data());
// No existing result
if (existingResult === undefined) {
// Set result
setResultInDb(data);
} else {
const {dose, name, age} = data;
if (existingResult.name === name && // Same vax
existingResult.age === age && // Same age group
!!dose.replace(/\s/g, "") && // Has dose sub category
!existingResult[name][age][dose]) { // Dose not existing
setResultInDb(data);
} else {
await removeResultFromStats(existingResult);
}
}
}
if (!!data && !!context) { if (!!data && !!context) {
const {gid} = data; const {gid} = data;
const docId: string = serializeGaId(gid); const docId: string = serializeGaId(gid);
@@ -197,7 +236,7 @@ export const saveResult = functions.https.onCall(
} }
}); });
export const getPastResult = functions.https.onCall(async (data, context) => { export const getPastResult = functions.https.onCall(async (data : {gid:string}, context) => {
if (!!data && !!context) { if (!!data && !!context) {
const {gid} = data; const {gid} = data;
const existingData : admin.firestore.DocumentData | undefined = await admin const existingData : admin.firestore.DocumentData | undefined = await admin