Skip to content

Commit 4052d5c

Browse files
committed
2 parents 8ede4d8 + 5beb3ce commit 4052d5c

File tree

8 files changed

+77
-10
lines changed

8 files changed

+77
-10
lines changed

README.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ This package provides a complete Dart implementation of Firebase Cloud Functions
1313
|-------------|--------|-----------|
1414
| **HTTPS** | ✅ Complete | `onRequest`, `onCall`, `onCallWithData` |
1515
| **Pub/Sub** | ✅ Complete | `onMessagePublished` |
16-
| **Firestore** | ✅ Complete | `onDocumentCreated`, `onDocumentUpdated`, `onDocumentDeleted`, `onDocumentWritten` |
16+
| **Firestore** | ✅ Complete | `onDocumentCreated`, `onDocumentUpdated`, `onDocumentDeleted`, `onDocumentWritten`, `onDocumentCreatedWithAuthContext`, `onDocumentUpdatedWithAuthContext`, `onDocumentDeletedWithAuthContext`, `onDocumentWrittenWithAuthContext` |
1717
| **Realtime Database** | ✅ Complete | `onValueCreated`, `onValueUpdated`, `onValueDeleted`, `onValueWritten` |
1818
| **Firebase Alerts** | ✅ Complete | Crashlytics, Billing, Performance alerts |
1919
| **Identity Platform** | ✅ Complete | `beforeUserCreated`, `beforeUserSignedIn` (+ `beforeEmailSent`, `beforeSmsSent`*) |
@@ -216,6 +216,49 @@ firebase.firestore.onDocumentCreated(
216216
print('Comment: ${event.params['commentId']}');
217217
},
218218
);
219+
220+
// With auth context (identifies the principal that triggered the write)
221+
firebase.firestore.onDocumentCreatedWithAuthContext(
222+
document: 'orders/{orderId}',
223+
(event) async {
224+
print('Auth type: ${event.authType}');
225+
print('Auth ID: ${event.authId}');
226+
final data = event.data?.data();
227+
print('Order: ${data?['product']}');
228+
},
229+
);
230+
231+
firebase.firestore.onDocumentUpdatedWithAuthContext(
232+
document: 'orders/{orderId}',
233+
(event) async {
234+
print('Updated by: ${event.authType} (${event.authId})');
235+
final before = event.data?.before?.data();
236+
final after = event.data?.after?.data();
237+
print('Before: $before');
238+
print('After: $after');
239+
},
240+
);
241+
242+
firebase.firestore.onDocumentDeletedWithAuthContext(
243+
document: 'orders/{orderId}',
244+
(event) async {
245+
print('Deleted by: ${event.authType} (${event.authId})');
246+
final data = event.data?.data();
247+
print('Deleted data: $data');
248+
},
249+
);
250+
251+
firebase.firestore.onDocumentWrittenWithAuthContext(
252+
document: 'orders/{orderId}',
253+
(event) async {
254+
print('Written by: ${event.authType} (${event.authId})');
255+
final before = event.data?.before;
256+
final after = event.data?.after;
257+
if (before == null || !before.exists) print('CREATE');
258+
else if (after == null || !after.exists) print('DELETE');
259+
else print('UPDATE');
260+
},
261+
);
219262
```
220263

221264
## Realtime Database Triggers

lib/firebase_functions.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
library;
5555

5656
// Re-export Firestore types for convenience
57-
export 'package:googleapis_firestore/googleapis_firestore.dart'
57+
export 'package:google_cloud_firestore/google_cloud_firestore.dart'
5858
show DocumentData, DocumentSnapshot, QueryDocumentSnapshot;
5959
// Re-export Shelf types for convenience
6060
export 'package:shelf/shelf.dart' show Request, Response;

lib/src/firebase.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'dart:async';
22
import 'dart:io';
33

44
import 'package:dart_firebase_admin/dart_firebase_admin.dart';
5-
import 'package:googleapis_firestore/googleapis_firestore.dart' as gfs;
5+
import 'package:google_cloud_firestore/google_cloud_firestore.dart' as gfs;
66
import 'package:shelf/shelf.dart';
77

88
import 'alerts/alerts_namespace.dart';

lib/src/firestore/document_snapshot.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:googleapis_firestore/googleapis_firestore.dart'
1+
import 'package:google_cloud_firestore/google_cloud_firestore.dart'
22
show DocumentData;
33

44
export '../common/change.dart';

lib/src/firestore/firestore_namespace.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,12 @@ class FirestoreNamespace extends FunctionsNamespace {
453453
final params = _extractParams(document, headers.documentPath);
454454

455455
final parsed = await _parseBody(request);
456-
final snapshot = parsed?['value'];
456+
final snapshotKey =
457+
(methodName == 'onDocumentDeleted' ||
458+
methodName == 'onDocumentDeletedWithAuthContext')
459+
? 'old_value'
460+
: 'value';
461+
final snapshot = parsed?[snapshotKey];
457462

458463
try {
459464
if (withAuthContext) {

pubspec.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ dependencies:
3131
url: https://github.com/invertase/dart_firebase_admin.git
3232
ref: next
3333
path: packages/dart_firebase_admin
34-
googleapis_firestore:
34+
google_cloud_firestore:
3535
git:
3636
url: https://github.com/invertase/dart_firebase_admin.git
3737
ref: next
38-
path: packages/googleapis_firestore
38+
path: packages/google_cloud_firestore
3939
stack_trace: ^1.12.1
4040
protobuf: ^6.0.0
4141
http: ^1.6.0
@@ -57,11 +57,11 @@ dev_dependencies:
5757
yaml: ^3.1.3
5858

5959
dependency_overrides:
60-
googleapis_firestore:
60+
google_cloud_firestore:
6161
git:
6262
url: https://github.com/invertase/dart_firebase_admin.git
6363
ref: next
64-
path: packages/googleapis_firestore
64+
path: packages/google_cloud_firestore
6565
googleapis_storage:
6666
git:
6767
url: https://github.com/invertase/dart_firebase_admin.git

test/e2e/tests/firestore_tests.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,26 @@ void runFirestoreTests(
9898
await client.deleteDocument('users/$testUserId');
9999
print('✓ Document deleted successfully');
100100

101-
// Wait for trigger
101+
// Wait for trigger to fire
102102
await Future<void>.delayed(const Duration(seconds: 2));
103103

104104
// Verify document no longer exists
105105
final doc = await client.getDocument('users/$testUserId');
106106
expect(doc, isNull, reason: 'Document should not exist after deletion');
107107
print('✓ Document deletion verified');
108+
109+
// Verify handler received the pre-deletion document data by checking
110+
// the structured log line emitted by the handler.
111+
final outputLogs = getEmulator().outputLines.join('\n');
112+
expect(
113+
outputLogs,
114+
contains('[onDocumentDeleted] hasData=true'),
115+
reason: 'event.data should be non-null for delete events',
116+
);
117+
expect(outputLogs, contains('name=To Be Deleted'));
118+
expect(outputLogs, contains('email=delete@example.com'));
119+
expect(outputLogs, contains('finalMessage=goodbye'));
120+
print('✓ Handler received correct pre-deletion document data');
108121
});
109122

110123
test('onDocumentWritten fires for all operations', () async {

test/fixtures/dart_reference/bin/server.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ void main(List<String> args) async {
184184
final data = event.data?.data();
185185
print('Document deleted: users/${event.params['userId']}');
186186
print(' Final data: $data');
187+
print(
188+
'[onDocumentDeleted] hasData=${data != null}'
189+
' name=${data?['name']}'
190+
' email=${data?['email']}'
191+
' finalMessage=${data?['finalMessage']}',
192+
);
187193
});
188194

189195
firebase.firestore.onDocumentWritten(document: 'users/{userId}', (

0 commit comments

Comments
 (0)