Skip to content

Commit

Permalink
feat: added firestore collection group support
Browse files Browse the repository at this point in the history
  • Loading branch information
dereekb committed May 29, 2022
1 parent 3163d3b commit 3b4c4cf
Show file tree
Hide file tree
Showing 23 changed files with 498 additions and 122 deletions.
2 changes: 1 addition & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@
"tabWidth": 2,
"htmlWhitespaceSensitivity": "ignore",
"endOfLine": "lf",
"printWidth": 400
"printWidth": 500
}
4 changes: 3 additions & 1 deletion components/demo-firebase/src/lib/collection.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { FirestoreContext } from '@dereekb/firebase';
import { guestbookEntryFirestoreCollectionFactory, GuestbookEntryFirestoreCollectionFactory, guestbookFirestoreCollection, GuestbookFirestoreCollection, GuestbookFirestoreCollections } from './guestbook';
import { guestbookEntryFirestoreCollectionFactory, GuestbookEntryFirestoreCollectionFactory, guestbookEntryFirestoreCollectionGroup, GuestbookEntryFirestoreCollectionGroup, guestbookFirestoreCollection, GuestbookFirestoreCollection, GuestbookFirestoreCollections } from './guestbook';
import { profileFirestoreCollection, ProfileFirestoreCollection, ProfileFirestoreCollections, profilePrivateDataFirestoreCollectionFactory, ProfilePrivateDataFirestoreCollectionFactory } from './profile/profile';

export abstract class DemoFirestoreCollections implements ProfileFirestoreCollections, GuestbookFirestoreCollections {
abstract readonly guestbookFirestoreCollection: GuestbookFirestoreCollection;
abstract readonly guestbookEntryCollectionGroup: GuestbookEntryFirestoreCollectionGroup;
abstract readonly guestbookEntryCollectionFactory: GuestbookEntryFirestoreCollectionFactory;
abstract readonly profileFirestoreCollection: ProfileFirestoreCollection;
abstract readonly profilePrivateDataCollectionFactory: ProfilePrivateDataFirestoreCollectionFactory;
Expand All @@ -12,6 +13,7 @@ export abstract class DemoFirestoreCollections implements ProfileFirestoreCollec
export function makeDemoFirestoreCollections(firestoreContext: FirestoreContext): DemoFirestoreCollections {
return {
guestbookFirestoreCollection: guestbookFirestoreCollection(firestoreContext),
guestbookEntryCollectionGroup: guestbookEntryFirestoreCollectionGroup(firestoreContext),
guestbookEntryCollectionFactory: guestbookEntryFirestoreCollectionFactory(firestoreContext),
profileFirestoreCollection: profileFirestoreCollection(firestoreContext),
profilePrivateDataCollectionFactory: profilePrivateDataFirestoreCollectionFactory(firestoreContext)
Expand Down
35 changes: 34 additions & 1 deletion components/demo-firebase/src/lib/guestbook/guestbook.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
import { CollectionReference, AbstractFirestoreDocument, snapshotConverterFunctions, firestoreString, firestoreDate, FirestoreCollection, UserRelatedById, DocumentReferenceRef, FirestoreContext, FirestoreCollectionWithParent, firestoreBoolean, DocumentDataWithId, AbstractFirestoreDocumentWithParent, optionalFirestoreDate } from '@dereekb/firebase';
import {
CollectionReference,
AbstractFirestoreDocument,
snapshotConverterFunctions,
firestoreString,
firestoreDate,
FirestoreCollection,
UserRelatedById,
DocumentReferenceRef,
FirestoreContext,
FirestoreCollectionWithParent,
firestoreBoolean,
DocumentDataWithId,
AbstractFirestoreDocumentWithParent,
optionalFirestoreDate,
DocumentReference,
FirestoreCollectionGroup,
CollectionGroup
} from '@dereekb/firebase';
import { Maybe } from '@dereekb/util';

export interface GuestbookFirestoreCollections {
Expand Down Expand Up @@ -122,3 +140,18 @@ export function guestbookEntryFirestoreCollectionFactory(firestoreContext: Fires
});
};
}

export function guestbookEntryCollectionReference(context: FirestoreContext): CollectionGroup<GuestbookEntry> {
return context.collectionGroup(guestbookCollectionGuestbookEntryCollectionPath).withConverter<GuestbookEntry>(guestbookEntryConverter);
}

export type GuestbookEntryFirestoreCollectionGroup = FirestoreCollectionGroup<GuestbookEntry, GuestbookEntryDocument>;

export function guestbookEntryFirestoreCollectionGroup(firestoreContext: FirestoreContext): GuestbookEntryFirestoreCollectionGroup {
return firestoreContext.firestoreCollectionGroup({
itemsPerPage: 50,
queryLike: guestbookEntryCollectionReference(firestoreContext),
makeDocument: (accessor, documentAccessor) => new GuestbookEntryDocument(undefined, accessor, documentAccessor),
firestoreContext
});
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { FirestoreAccessorDriver, CollectionReference, Firestore, TransactionFunction, DocumentReference, TransactionFirestoreDocumentContextFactory, WriteBatchFirestoreDocumentContextFactory } from '@dereekb/firebase';
import { batch } from '@dereekb/util';
import { CollectionReference as GoogleCloudCollectionReference, DocumentReference as GoogleCloudDocumentReference, Firestore as GoogleCloudFirestore } from '@google-cloud/firestore';
import { CollectionGroup, CollectionReference as GoogleCloudCollectionReference, DocumentReference as GoogleCloudDocumentReference, Firestore as GoogleCloudFirestore } from '@google-cloud/firestore';
import { writeBatchDocumentContext } from './driver.accessor.batch';
import { defaultFirestoreDocumentContext } from './driver.accessor.default';
import { transactionDocumentContext } from './driver.accessor.transaction';
Expand Down Expand Up @@ -53,6 +53,7 @@ export function docRefForPath<T>(start: DocRefForPathInput, path?: string, pathS
export function firestoreClientAccessorDriver(): FirestoreAccessorDriver {
return {
doc: <T>(collection: CollectionReference<T>, path?: string, ...pathSegments: string[]) => docRefForPath(collection as GoogleCloudCollectionReference, path, pathSegments) as DocumentReference<T>,
collectionGroup: <T>(firestore: Firestore, collectionId: string) => (firestore as GoogleCloudFirestore).collectionGroup(collectionId) as CollectionGroup<T>,
collection: <T>(firestore: Firestore, path: string, ...pathSegments: string[]) => collectionRefForPath(firestore as GoogleCloudFirestore, path, pathSegments) as CollectionReference<T>,
subcollection: <T>(document: DocumentReference, path: string, ...pathSegments: string[]) => collectionRefForPath(document as GoogleCloudDocumentReference, path, pathSegments) as CollectionReference<T>,
transactionFactoryForFirestore:
Expand Down
5 changes: 3 additions & 2 deletions packages/firebase/src/lib/client/firestore/driver.accessor.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Firestore, runTransaction } from '@firebase/firestore';
import { doc, collection, writeBatch, Transaction } from 'firebase/firestore';
import { doc, collection, writeBatch, Transaction, collectionGroup } from 'firebase/firestore';
import { FirestoreAccessorDriver } from '../../common/firestore/driver/accessor';
import { FirestoreAccessorDriverCollectionRefFunction, FirestoreAccessorDriverDocumentRefFunction, FirestoreAccessorDriverSubcollectionRefFunction, TransactionFunction } from '../../common/firestore/driver';
import { FirestoreAccessorDriverCollectionGroupFunction, FirestoreAccessorDriverCollectionRefFunction, FirestoreAccessorDriverDocumentRefFunction, FirestoreAccessorDriverSubcollectionRefFunction, TransactionFunction } from '../../common/firestore/driver';
import { writeBatchDocumentContext } from './driver.accessor.batch';
import { defaultFirestoreDocumentContext } from './driver.accessor.default';
import { transactionDocumentContext } from './driver.accessor.transaction';
Expand All @@ -11,6 +11,7 @@ import { WriteBatchFirestoreDocumentContextFactory } from '../../common/firestor
export function firestoreClientAccessorDriver(): FirestoreAccessorDriver {
return {
doc: doc as unknown as FirestoreAccessorDriverDocumentRefFunction,
collectionGroup: collectionGroup as unknown as FirestoreAccessorDriverCollectionGroupFunction,
collection: collection as unknown as FirestoreAccessorDriverCollectionRefFunction,
subcollection: collection as unknown as FirestoreAccessorDriverSubcollectionRefFunction,
transactionFactoryForFirestore:
Expand Down
Loading

0 comments on commit 3b4c4cf

Please sign in to comment.