Skip to content

Commit

Permalink
Clean undefined properties when writing to Firestore
Browse files Browse the repository at this point in the history
  • Loading branch information
BenjaVR committed Jan 10, 2019
1 parent a5c7c35 commit 14a5b24
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 19 deletions.
3 changes: 2 additions & 1 deletion studentplanner.code-workspace
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"*.json": "jsonc"
},
"npm.packageManager": "yarn",
"typescript.tsdk": "node_modules\\typescript\\lib"
"typescript.tsdk": "node_modules\\typescript\\lib",
"files.autoSave": "onFocusChange"
}
}
49 changes: 31 additions & 18 deletions web/src/services/FirestoreServiceBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import firebase from "firebase";
import { Firebase } from "../config/FirebaseInitializer";
import { FirebaseModelMapper } from "./FirebaseModelMapper";

interface IObjectToClean {
[key: string]: any;
}

export type OrderByType = "asc" | "desc";

export type ListenOnChangeFunc<T> = (objects: T[], size: number) => void;
Expand Down Expand Up @@ -32,7 +36,7 @@ export abstract class FirestoreServiceBase<T extends IFirebaseTable> {
resolve(mappedDoc);
})
.catch((error) => {
catchErrorDev(error);
this.catchErrorDev(error);
reject(error);
});
});
Expand All @@ -48,15 +52,17 @@ export abstract class FirestoreServiceBase<T extends IFirebaseTable> {
obj.createdTimestamp = now;
obj.updatedTimestamp = now;

this.collectionRef.add(obj)
const cleanedObj = this.cleanUndefinedFieldsInObjects(obj, false);

this.collectionRef.add(cleanedObj)
.then((docRef) => {
return docRef.get();
})
.then((doc) => {
resolve(FirebaseModelMapper.mapDocToObject<T>(doc));
})
.catch((error) => {
catchErrorDev(error);
this.catchErrorDev(error);
reject(error);
});
});
Expand All @@ -72,18 +78,12 @@ export abstract class FirestoreServiceBase<T extends IFirebaseTable> {
delete obj.id;
obj.updatedTimestamp = Firebase.firestore.Timestamp.now();

// Change all "undefined" to "delete()", because Firestore wants this.
const objToClean: { [key: string]: any } = obj;
Object.keys(objToClean).forEach((key) => {
if (objToClean[key] === undefined) {
objToClean[key] = Firebase.firestore.FieldValue.delete();
}
});
const cleanedObj = this.cleanUndefinedFieldsInObjects(obj, true);

this.collectionRef.doc(id).update(objToClean)
this.collectionRef.doc(id).update(cleanedObj)
.then(() => resolve())
.catch((error) => {
catchErrorDev(error);
this.catchErrorDev(error);
reject(error);
});
});
Expand All @@ -98,16 +98,29 @@ export abstract class FirestoreServiceBase<T extends IFirebaseTable> {
this.collectionRef.doc(obj.id).delete()
.then(resolve)
.catch((error) => {
catchErrorDev(error);
this.catchErrorDev(error);
reject(error);
});
});
}
}

function catchErrorDev(error: any): void {
if (process.env.NODE_ENV === "development") {
// tslint:disable-next-line:no-console
console.log(error);
private cleanUndefinedFieldsInObjects(obj: IObjectToClean, forceDeleteInFirestore: boolean): object {
Object.keys(obj).forEach((key) => {
if (obj[key] === undefined) {
if (forceDeleteInFirestore) {
obj[key] = Firebase.firestore.FieldValue.delete();
} else {
delete obj[key];
}
}
});
return obj;
}

private catchErrorDev(error: any): void {
if (process.env.NODE_ENV === "development") {
// tslint:disable-next-line:no-console
console.log(error);
}
}
}

0 comments on commit 14a5b24

Please sign in to comment.