Skip to content
416 changes: 416 additions & 0 deletions packages/dart_firebase_admin/example/lib/auth_example.dart

Large diffs are not rendered by default.

174 changes: 174 additions & 0 deletions packages/dart_firebase_admin/example/lib/firestore_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ Future<void> firestoreExample(FirebaseApp admin) async {

await basicFirestoreExample(admin);
await multiDatabaseExample(admin);
await batchExample(admin);
await transactionExample(admin);
await collectionGroupExample(admin);
await getAllExample(admin);
await listCollectionsExample(admin);
await recursiveDeleteExample(admin);
await bulkWriterExamples(admin);
await bundleBuilderExample(admin);
}
Expand Down Expand Up @@ -260,3 +266,171 @@ Future<void> bundleBuilderExample(FirebaseApp admin) async {
print('> Error creating bundle: $e');
}
}

/// WriteBatch example
Future<void> batchExample(FirebaseApp admin) async {
print('### WriteBatch Example ###\n');

final firestore = admin.firestore();

try {
print('> Writing documents atomically with batch...\n');

final batch = firestore.batch();

final col = firestore.collection('batch-demo');
batch.set(col.doc('doc-1'), {'name': 'Alice', 'active': true});
batch.set(col.doc('doc-2'), {'name': 'Bob', 'active': false});
batch.update(col.doc('doc-1'), {
FieldPath(const ['active']): false,
});
batch.delete(col.doc('doc-2'));

await batch.commit();
print('> Batch committed successfully\n');
} catch (e) {
print('> Error: $e');
}
}

/// runTransaction example
Future<void> transactionExample(FirebaseApp admin) async {
print('### runTransaction Example ###\n');

final firestore = admin.firestore();

try {
print('> Running a transaction...\n');

final docRef = firestore.collection('counters').doc('visits');
await docRef.set({'count': 0});

await firestore.runTransaction<void>((transaction) async {
final snapshot = await transaction.get(docRef);
final current = (snapshot.data()?['count'] as int?) ?? 0;
transaction.update(docRef, {
FieldPath(const ['count']): current + 1,
});
});

final updated = await docRef.get();
print('> Counter after transaction: ${updated.data()?['count']}\n');

// Clean up
await docRef.delete();
} catch (e) {
print('> Error: $e');
}
}

/// collectionGroup example
Future<void> collectionGroupExample(FirebaseApp admin) async {
print('### collectionGroup Example ###\n');

final firestore = admin.firestore();

try {
print('> Querying all "reviews" subcollections across documents...\n');

// Set up sample data
await firestore
.collection('restaurants')
.doc('pizza-place')
.collection('reviews')
.doc('review-1')
.set({'rating': 5, 'text': 'Great pizza!'});

await firestore
.collection('restaurants')
.doc('burger-joint')
.collection('reviews')
.doc('review-2')
.set({'rating': 4, 'text': 'Good burgers'});

final query = firestore.collectionGroup('reviews');
final snapshot = await query.get();

print('Found ${snapshot.docs.length} review(s) across all restaurants:');
for (final doc in snapshot.docs) {
print(' - ${doc.ref.path}: rating=${doc.data()['rating']}');
}
print('');
} catch (e) {
print('> Error: $e');
}
}

/// getAll example
Future<void> getAllExample(FirebaseApp admin) async {
print('### getAll Example ###\n');

final firestore = admin.firestore();

try {
print('> Fetching multiple documents in one request...\n');

final col = firestore.collection('getall-demo');
await col.doc('a').set({'value': 1});
await col.doc('b').set({'value': 2});

final refs = [col.doc('a'), col.doc('b'), col.doc('missing')];
final snapshots = await firestore.getAll(refs);

for (final snap in snapshots) {
if (snap.exists) {
print(' ${snap.ref.id}: ${snap.data()}');
} else {
print(' ${snap.ref.id}: does not exist');
}
}
print('');

// Clean up
await col.doc('a').delete();
await col.doc('b').delete();
} catch (e) {
print('> Error: $e');
}
}

/// listCollections example
Future<void> listCollectionsExample(FirebaseApp admin) async {
print('### listCollections Example ###\n');

final firestore = admin.firestore();

try {
print('> Listing root-level collections...\n');

final collections = await firestore.listCollections();
print('Found ${collections.length} collection(s):');
for (final col in collections) {
print(' - ${col.id}');
}
print('');
} catch (e) {
print('> Error: $e');
}
}

/// recursiveDelete example
Future<void> recursiveDeleteExample(FirebaseApp admin) async {
print('### recursiveDelete Example ###\n');

final firestore = admin.firestore();

try {
print('> Setting up nested data to delete...\n');

final parent = firestore.collection('recursive-demo').doc('parent');
await parent.set({'name': 'parent'});
await parent.collection('children').doc('child-1').set({'name': 'child 1'});
await parent.collection('children').doc('child-2').set({'name': 'child 2'});

print('> Recursively deleting document and all subcollections...\n');
await firestore.recursiveDelete(parent);
print('Recursive delete complete\n');
} catch (e) {
print('> Error: $e');
}
}
21 changes: 20 additions & 1 deletion packages/dart_firebase_admin/example/lib/functions_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ Future<void> functionsExample(FirebaseApp admin) async {

final functions = admin.functions();

// Accessing the app property
print('> Functions app name: ${functions.app.name}\n');

// Get a task queue reference
// The function name should match an existing Cloud Function or queue name
final taskQueue = functions.taskQueue('helloWorld');
Expand Down Expand Up @@ -70,7 +73,23 @@ Future<void> functionsExample(FirebaseApp admin) async {
}
}

// Example 5: Delete a task
// Example 5: Enqueue with experimental URI override
try {
print('> Enqueuing a task with a custom handler URI...\n');
await taskQueue.enqueue(
{'action': 'customHandler'},
TaskOptions(
experimental: TaskOptionsExperimental(
uri: 'https://custom.example.com/task-handler',
),
),
);
print('Task with experimental URI enqueued!\n');
} on FirebaseFunctionsAdminException catch (e) {
print('> Functions error: ${e.code} - ${e.message}\n');
}

// Example 6: Delete a task
try {
print('> Deleting task...\n');
await taskQueue.delete('payment-order-456');
Expand Down
26 changes: 24 additions & 2 deletions packages/dart_firebase_admin/example/lib/messaging_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,29 @@ Future<void> messagingExample(FirebaseApp admin) async {
print('> Error sending multicast: $e');
}

// Example 4: Subscribe tokens to a topic
// Example 4: Send a message with a condition
try {
print('> Sending ConditionMessage...\n');
final messageId = await messaging.send(
ConditionMessage(
condition: "'TopicA' in topics || 'TopicB' in topics",
notification: Notification(
title: 'Condition Message',
body: 'Sent to subscribers of TopicA or TopicB',
),
),
dryRun: true,
);
print('ConditionMessage sent!');
print(' - Message ID: $messageId');
print('');
} on FirebaseMessagingAdminException catch (e) {
print('> Messaging error: ${e.code} - ${e.message}');
} catch (e) {
print('> Error sending condition message: $e');
}

// Example 5: Subscribe tokens to a topic
try {
print('> Subscribing tokens to topic: test-topic\n');
// Note: Using fake token for demonstration
Expand All @@ -112,7 +134,7 @@ Future<void> messagingExample(FirebaseApp admin) async {
print('> Error subscribing to topic: $e');
}

// Example 5: Send with platform-specific options
// Example 6: Send with platform-specific options
try {
print('> Sending message with platform-specific options...\n');
final messageId = await messaging.send(
Expand Down
Loading
Loading