Skip to content

Commit beba28b

Browse files
committed
Refactoring to firebase v9
1 parent f9fe702 commit beba28b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+3691
-4273
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ src/**/*.js
3434
.rts*
3535
TEST.config.ts
3636
FIREBASE_CONFIG.js
37+
38+
database-debug.log
39+
firestore-debug.log

firebase.json

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{
2+
"storage": {
3+
"rules": "storage.rules"
4+
},
25
"emulators": {
36
"firestore": {
47
"port": 8080

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"@types/react": "^18.0.9",
2323
"@types/react-router-dom": "^5.3.3",
2424
"@types/rx": "^4.1.1",
25-
"firebase": "^9.8.1",
25+
"firebase": "^9.15.0",
2626
"firebase-tools": "11.x",
2727
"gulp": "^4.0.2",
2828
"jest": "^23.6.0",

src/misc/document-parser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ export function parseFireStoreDocument<T extends ra.Record>(
2020
const result = translateDocFromFirestore(data);
2121
const dataWithRefs = applyRefDocs(result.parsedDoc, result.refdocs);
2222
// React Admin requires an id field on every document,
23-
// So we can just using the firestore document id
23+
// So we can just use the firestore document id
2424
return { id: doc.id, ...dataWithRefs } as T;
2525
}

src/misc/firebase-models.ts

+41-24
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,51 @@
1-
import firebase from 'firebase/compat/app';
2-
import 'firebase/compat/storage';
1+
import { FirebaseApp } from 'firebase/app';
2+
import { Auth, User, UserCredential } from 'firebase/auth';
3+
import {
4+
CollectionReference,
5+
DocumentData,
6+
DocumentReference,
7+
DocumentSnapshot,
8+
FieldValue,
9+
Firestore,
10+
OrderByDirection,
11+
Query,
12+
QueryDocumentSnapshot,
13+
WriteBatch,
14+
} from 'firebase/firestore';
15+
import {
16+
FirebaseStorage,
17+
StorageReference,
18+
TaskState,
19+
UploadTask,
20+
UploadTaskSnapshot,
21+
} from 'firebase/storage';
322

4-
export type FireUser = firebase.User;
5-
export type FireApp = firebase.app.App;
23+
export type FireUser = User;
24+
export type FireApp = FirebaseApp;
625

7-
export type FireStorage = firebase.storage.Storage;
8-
export type FireStorageReference = firebase.storage.Reference;
9-
export type FireUploadTaskSnapshot = firebase.storage.UploadTaskSnapshot;
10-
export type FireUploadTask = firebase.storage.UploadTask;
26+
export type FireStorage = FirebaseStorage;
27+
export type FireStorageReference = StorageReference;
28+
export type FireUploadTaskSnapshot = UploadTaskSnapshot;
29+
export type FireUploadTask = UploadTask;
1130
export type FireStoragePutFileResult = {
1231
task: FireUploadTask;
1332
taskResult: Promise<FireUploadTaskSnapshot>;
1433
downloadUrl: Promise<string>;
1534
};
1635

17-
export type FireAuth = firebase.auth.Auth;
18-
export type FireAuthUserCredentials = firebase.auth.UserCredential;
36+
export type FireAuth = Auth;
37+
export type FireAuthUserCredentials = UserCredential;
1938

20-
export type FireStore = firebase.firestore.Firestore;
21-
export type FireStoreBatch = firebase.firestore.WriteBatch;
22-
export type FireStoreTimeStamp = firebase.firestore.FieldValue;
23-
export type FireStoreDocumentRef = firebase.firestore.DocumentReference;
24-
export type FireStoreDocumentSnapshot =
25-
firebase.firestore.DocumentSnapshot<firebase.firestore.DocumentData>;
26-
export type FireStoreCollectionRef = firebase.firestore.CollectionReference;
27-
export type FireStoreQueryDocumentSnapshot =
28-
firebase.firestore.QueryDocumentSnapshot;
29-
export type FireStoreQuery = firebase.firestore.Query;
30-
export type FireStoreQueryOrder = firebase.firestore.OrderByDirection;
39+
export type FireStore = Firestore;
40+
export type FireStoreBatch = WriteBatch;
41+
export type FireStoreTimeStamp = FieldValue;
42+
export type FireStoreDocumentRef = DocumentReference;
43+
export type FireStoreDocumentSnapshot = DocumentSnapshot<DocumentData>;
44+
export type FireStoreCollectionRef = CollectionReference;
45+
export type FireStoreQueryDocumentSnapshot = QueryDocumentSnapshot;
46+
export type FireStoreQuery = Query;
47+
export type FireStoreQueryOrder = OrderByDirection;
3148

32-
export const TASK_PAUSED = firebase.storage.TaskState.PAUSED;
33-
export const TASK_RUNNING = firebase.storage.TaskState.RUNNING;
34-
export const TASK_CANCELED = firebase.storage.TaskState.CANCELED;
49+
export const TASK_PAUSED = 'paused' as TaskState;
50+
export const TASK_RUNNING = 'running' as TaskState;
51+
export const TASK_CANCELED = 'cancelled' as TaskState;

src/misc/messageTypes.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FireStoreCollectionRef } from './firebase-models';
1+
import { FireStoreCollectionRef, FireStoreQuery } from './firebase-models';
22
import { ParsedRefDoc } from './internal.models';
33
// Firebase types
44
import { GetListParams } from './react-admin-models';
@@ -9,7 +9,7 @@ export namespace messageTypes {
99

1010
export type CollectionQueryType = (
1111
arg0: FireStoreCollectionRef
12-
) => FireStoreCollectionRef;
12+
) => FireStoreQuery;
1313

1414
export interface IParamsGetOne {
1515
id: string;

src/misc/status-code-translator.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { logError } from './logger';
44

5+
// tslint:disable-next-line:max-line-length
56
// - https://github.com/firebase/firebase-js-sdk/blob/9f109f85ad0d99f6c13e68dcb549a0b852e35a2a/packages/functions/src/api/error.ts
67
export function retrieveStatusTxt(status: number): 'ok' | 'unauthenticated' {
78
// Make sure any successful status is OK.

src/misc/translate-from-firestore.ts

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getDownloadURL, ref } from 'firebase/storage';
12
import { has, set } from 'lodash';
23
import { IFirebaseWrapper } from 'providers/database';
34
import { FireStoreDocumentRef } from './firebase-models';
@@ -56,9 +57,12 @@ export function recusivelyCheckObjectValue(
5657
}
5758
const isDocumentReference = isInputADocReference(input);
5859
if (isDocumentReference) {
59-
const ref = input as FireStoreDocumentRef;
60-
result.refdocs.push({ fieldPath: fieldPath, refDocPath: ref.path });
61-
return ref.id;
60+
const documentReference = input as FireStoreDocumentRef;
61+
result.refdocs.push({
62+
fieldPath: fieldPath,
63+
refDocPath: documentReference.path,
64+
});
65+
return documentReference.id;
6266
}
6367
const isObject = typeof input === 'object';
6468
if (isObject) {
@@ -98,10 +102,9 @@ export const recursivelyMapStorageUrls = async (
98102
const isFileField = has(fieldValue, 'src');
99103
if (isFileField) {
100104
try {
101-
const src = await fireWrapper
102-
.storage()
103-
.ref(fieldValue.src)
104-
.getDownloadURL();
105+
const src = await getDownloadURL(
106+
ref(fireWrapper.fireStorage(), fieldValue.src)
107+
);
105108
return {
106109
...fieldValue,
107110
src,

src/providers/commands/Create.ts

+16-14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { doc, getDoc, setDoc } from 'firebase/firestore';
12
import { log } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
34
import { FireClient } from '../database/FireClient';
@@ -14,36 +15,37 @@ export async function Create<T extends ra.Record>(
1415
log('Create', { hasOverridenDocId });
1516
if (hasOverridenDocId) {
1617
const overridenId = params.data.id;
17-
const exists = (await r.collection.doc(overridenId).get()).exists;
18+
const exists = (await getDoc(doc(r.collection, overridenId))).exists();
1819
if (exists) {
1920
throw new Error(
2021
`the id:"${overridenId}" already exists, please use a unique string if overriding the 'id' field`
2122
);
2223
}
23-
const docData = await client.parseDataAndUpload(
24+
25+
const createData = await client.parseDataAndUpload(
2426
r,
2527
overridenId,
2628
params.data
2729
);
2830
if (!overridenId) {
2931
throw new Error('id must be a valid string');
3032
}
31-
const documentObj = { ...docData };
32-
client.checkRemoveIdField(documentObj, overridenId);
33-
await client.addCreatedByFields(documentObj);
34-
await client.addUpdatedByFields(documentObj);
35-
const documentObjTransformed = client.transformToDb(
33+
const createDocObj = { ...createData };
34+
client.checkRemoveIdField(createDocObj, overridenId);
35+
await client.addCreatedByFields(createDocObj);
36+
await client.addUpdatedByFields(createDocObj);
37+
const createDocObjTransformed = client.transformToDb(
3638
resourceName,
37-
documentObj,
39+
createDocObj,
3840
overridenId
3941
);
40-
log('Create', { documentObj });
41-
await r.collection
42-
.doc(overridenId)
43-
.set(documentObjTransformed, { merge: false });
42+
log('Create', { docObj: createDocObj });
43+
await setDoc(doc(r.collection, overridenId), createDocObjTransformed, {
44+
merge: false,
45+
});
4446
return {
4547
data: {
46-
...documentObjTransformed,
48+
...createDocObjTransformed,
4749
id: overridenId,
4850
},
4951
};
@@ -55,7 +57,7 @@ export async function Create<T extends ra.Record>(
5557
await client.addCreatedByFields(docObj);
5658
await client.addUpdatedByFields(docObj);
5759
const docObjTransformed = client.transformToDb(resourceName, docObj, newId);
58-
await r.collection.doc(newId).set(docObjTransformed, { merge: false });
60+
await setDoc(doc(r.collection, newId), docObjTransformed, { merge: false });
5961
return {
6062
data: {
6163
...docObjTransformed,

src/providers/commands/Delete.Soft.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { doc, updateDoc } from 'firebase/firestore';
12
import { log, logError } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
3-
import { FireClient } from '../database/FireClient';
4+
import { FireClient } from '../database';
45

56
export async function DeleteSoft<T extends ra.Record>(
67
resourceName: string,
@@ -13,12 +14,11 @@ export async function DeleteSoft<T extends ra.Record>(
1314
log('DeleteSoft', { resourceName, resource: r, params });
1415
const docObj = { deleted: true };
1516
await client.addUpdatedByFields(docObj);
16-
r.collection
17-
.doc(id)
18-
.update(docObj)
19-
.catch((error) => {
20-
logError('DeleteSoft error', { error });
21-
});
17+
18+
updateDoc(doc(r.collection, id), docObj).catch((error) => {
19+
logError('DeleteSoft error', { error });
20+
});
21+
2222
return {
2323
data: params.previousData as T,
2424
};

src/providers/commands/Delete.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { deleteDoc, doc } from 'firebase/firestore';
12
import { log } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
34
import { FireClient } from '../database/FireClient';
@@ -16,7 +17,8 @@ export async function Delete<T extends ra.Record>(
1617
log('apiDelete', { resourceName, resource: r, params });
1718
try {
1819
const id = params.id + '';
19-
await r.collection.doc(id).delete();
20+
21+
await deleteDoc(doc(r.collection, id));
2022
} catch (error) {
2123
throw new Error(error as any);
2224
}

src/providers/commands/DeleteMany.Soft.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { doc, updateDoc } from 'firebase/firestore';
12
import { log, logError } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
3-
import { FireClient } from '../database/FireClient';
4+
import { FireClient } from '../database';
45

56
export async function DeleteManySoft(
67
resourceName: string,
@@ -16,12 +17,9 @@ export async function DeleteManySoft(
1617
const idStr = id + '';
1718
const docObj = { deleted: true };
1819
await client.addUpdatedByFields(docObj);
19-
r.collection
20-
.doc(idStr)
21-
.update(docObj)
22-
.catch((error) => {
23-
logError('apiSoftDeleteMany error', { error });
24-
});
20+
updateDoc(doc(r.collection, idStr), docObj).catch((error) => {
21+
logError('apiSoftDeleteMany error', { error });
22+
});
2523
return idStr;
2624
})
2725
);

src/providers/commands/DeleteMany.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { doc } from 'firebase/firestore';
12
import { log } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
3-
import { FireClient } from '../database/FireClient';
4+
import { FireClient } from '../database';
45
import { DeleteManySoft } from './DeleteMany.Soft';
56

67
export async function DeleteMany(
@@ -18,10 +19,11 @@ export async function DeleteMany(
1819
const batch = fireWrapper.dbCreateBatch();
1920
for (const id of params.ids) {
2021
const idStr = id + '';
21-
const docToDelete = r.collection.doc(idStr);
22+
const docToDelete = doc(r.collection, idStr);
2223
batch.delete(docToDelete);
2324
returnData.push(id);
2425
}
26+
2527
try {
2628
await batch.commit();
2729
} catch (error) {

src/providers/commands/Update.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { doc, updateDoc } from 'firebase/firestore';
12
import { log } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
3-
import { FireClient } from '../database/FireClient';
4+
import { FireClient } from '../database';
45

56
export async function Update<T extends ra.Record>(
67
resourceName: string,
@@ -18,7 +19,7 @@ export async function Update<T extends ra.Record>(
1819
client.checkRemoveIdField(docObj, id);
1920
await client.addUpdatedByFields(docObj);
2021
const docObjTransformed = client.transformToDb(resourceName, docObj, id);
21-
await r.collection.doc(id).update(docObjTransformed);
22+
await updateDoc(doc(r.collection, id), docObjTransformed);
2223
return {
2324
data: {
2425
...data,

src/providers/commands/UpdateMany.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { doc, updateDoc } from 'firebase/firestore';
12
import { log } from '../../misc';
23
import * as ra from '../../misc/react-admin-models';
3-
import { FireClient } from '../database/FireClient';
4+
import { FireClient } from '../database';
45

56
export async function UpdateMany(
67
resourceName: string,
@@ -25,7 +26,7 @@ export async function UpdateMany(
2526
docObj,
2627
idStr
2728
);
28-
await r.collection.doc(idStr).update(docObjTransformed);
29+
await updateDoc(doc(r.collection, idStr), docObjTransformed);
2930
return {
3031
...data,
3132
id: idStr,

src/providers/database/FireClient.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
import { doc } from 'firebase/firestore';
12
import { get, set } from 'lodash';
23
import {
34
AddCreatedByFields,
45
AddUpdatedByFields,
56
dispatch,
67
IFirestoreLogger,
7-
joinPaths,
88
log,
99
logError,
1010
parseStoragePath,
@@ -51,7 +51,7 @@ export class FireClient {
5151
if (!data) {
5252
return data;
5353
}
54-
const docPath = r.collection.doc(id).path;
54+
const docPath = doc(r.collection, id).path;
5555

5656
const result = translateDocToFirestore(data);
5757
const uploads = result.uploads;

0 commit comments

Comments
 (0)