Skip to content

Commit 8966f48

Browse files
fix(firestore): deprecate databaseURL in favor of databaseId (#12593)
1 parent b39c0e2 commit 8966f48

File tree

10 files changed

+86
-38
lines changed

10 files changed

+86
-38
lines changed

packages/cloud_firestore/cloud_firestore/example/integration_test/second_database.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void runSecondDatabaseTests() {
3737
setUpAll(() async {
3838
firestore = FirebaseFirestore.instanceFor(
3939
app: Firebase.app(),
40-
databaseURL: 'flutterfire-2',
40+
databaseId: 'flutterfire-2',
4141
);
4242
});
4343

packages/cloud_firestore/cloud_firestore/lib/src/firestore.dart

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ part of cloud_firestore;
1616
/// FirebaseFirestore firestore = FirebaseFirestore.instanceFor(app: secondaryApp);
1717
/// ```
1818
class FirebaseFirestore extends FirebasePluginPlatform {
19-
FirebaseFirestore._({required this.app, required this.databaseURL})
20-
: super(app.name, 'plugins.flutter.io/firebase_firestore') {
21-
if (databaseURL.endsWith('/')) {
22-
databaseURL = databaseURL.substring(0, databaseURL.length - 1);
23-
}
24-
}
19+
FirebaseFirestore._({
20+
required this.app,
21+
@Deprecated(
22+
'`databaseURL` has been deprecated. Please use `databaseId` instead.',
23+
)
24+
required this.databaseURL,
25+
required this.databaseId,
26+
}) : super(app.name, 'plugins.flutter.io/firebase_firestore');
2527

2628
static final Map<String, FirebaseFirestore> _cachedInstances = {};
2729

@@ -35,16 +37,25 @@ class FirebaseFirestore extends FirebasePluginPlatform {
3537
/// Returns an instance using a specified [FirebaseApp].
3638
static FirebaseFirestore instanceFor({
3739
required FirebaseApp app,
40+
@Deprecated(
41+
'`databaseURL` has been deprecated. Please use `databaseId` instead.',
42+
)
3843
String? databaseURL,
44+
String? databaseId,
3945
}) {
40-
String url = databaseURL ?? '(default)';
41-
String cacheKey = '${app.name}|$url';
46+
String firestoreDatabaseId = databaseId ?? databaseURL ?? '(default)';
47+
String cacheKey = '${app.name}|$firestoreDatabaseId';
4248
if (_cachedInstances.containsKey(cacheKey)) {
4349
return _cachedInstances[cacheKey]!;
4450
}
4551

4652
FirebaseFirestore newInstance =
47-
FirebaseFirestore._(app: app, databaseURL: url);
53+
// Both databaseURL and databaseId are required so we have to pass both for now. We can remove databaseURL in a future release.
54+
FirebaseFirestore._(
55+
app: app,
56+
databaseURL: firestoreDatabaseId,
57+
databaseId: firestoreDatabaseId,
58+
);
4859
_cachedInstances[cacheKey] = newInstance;
4960

5061
return newInstance;
@@ -58,16 +69,23 @@ class FirebaseFirestore extends FirebasePluginPlatform {
5869
FirebaseFirestorePlatform get _delegate {
5970
return _delegatePackingProperty ??= FirebaseFirestorePlatform.instanceFor(
6071
app: app,
61-
databaseURL: databaseURL,
72+
databaseId: databaseId,
6273
);
6374
}
6475

6576
/// The [FirebaseApp] for this current [FirebaseFirestore] instance.
6677
FirebaseApp app;
6778

68-
/// Firestore Database URL for this instance. Falls back to default database: "(default)"
79+
/// Firestore Database ID for this instance. Falls back to default database: "(default)"
80+
/// This is deprecated in favor of [databaseId].
81+
@Deprecated(
82+
'`databaseURL` has been deprecated. Please use `databaseId` instead.',
83+
)
6984
String databaseURL;
7085

86+
/// Firestore Database ID for this instance. Falls back to default database: "(default)"
87+
String databaseId;
88+
7189
/// Gets a [CollectionReference] for the specified Firestore path.
7290
CollectionReference<Map<String, dynamic>> collection(String collectionPath) {
7391
assert(

packages/cloud_firestore/cloud_firestore/test/cloud_firestore_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,36 @@ void main() {
4040
);
4141
});
4242

43+
test('databaseId and databaseURL', () {
44+
final firestore = FirebaseFirestore.instanceFor(
45+
// ignore: deprecated_member_use_from_same_package
46+
app: Firebase.app(), databaseURL: 'foo',
47+
);
48+
49+
// ignore: deprecated_member_use_from_same_package
50+
expect(firestore.databaseURL, equals('foo'));
51+
52+
expect(firestore.databaseId, equals('foo'));
53+
54+
final firestore2 =
55+
FirebaseFirestore.instanceFor(app: Firebase.app(), databaseId: 'bar');
56+
57+
// ignore: deprecated_member_use_from_same_package
58+
expect(firestore2.databaseURL, equals('bar'));
59+
60+
expect(firestore2.databaseId, equals('bar'));
61+
62+
final firestore3 = FirebaseFirestore.instanceFor(
63+
// ignore: deprecated_member_use_from_same_package
64+
app: Firebase.app(), databaseId: 'fire', databaseURL: 'not-this',
65+
);
66+
67+
// databaseId should take precedence
68+
expect(firestore3.databaseId, equals('fire'));
69+
// ignore: deprecated_member_use_from_same_package
70+
expect(firestore3.databaseURL, equals('fire'));
71+
});
72+
4373
test('returns the correct $FirebaseApp', () {
4474
expect(firestore!.app, equals(Firebase.app()));
4575
expect(firestoreSecondary!.app, equals(Firebase.app('foo')));

packages/cloud_firestore/cloud_firestore/test/test_firestore_message_codec.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,20 @@ class TestFirestoreMessageCodec extends FirestoreMessageCodec {
6060
);
6161
case _kFirestoreInstance:
6262
String appName = readValue(buffer)! as String;
63-
String databaseURL = readValue(buffer)! as String;
63+
String databaseId = readValue(buffer)! as String;
6464
readValue(buffer);
6565
final FirebaseApp app = Firebase.app(appName);
6666
return MethodChannelFirebaseFirestore(
6767
app: app,
68-
databaseURL: databaseURL,
68+
databaseId: databaseId,
6969
);
7070
case _kFirestoreQuery:
7171
String appName = readValue(buffer)! as String;
7272
Map<dynamic, dynamic> values =
7373
readValue(buffer)! as Map<dynamic, dynamic>;
7474
final FirebaseApp app = Firebase.app(appName);
7575
return MethodChannelQuery(
76-
MethodChannelFirebaseFirestore(app: app, databaseURL: '(default)'),
76+
MethodChannelFirebaseFirestore(app: app, databaseId: '(default)'),
7777
values['path'],
7878
FirestorePigeonFirebaseApp(
7979
appName: "['DEFAULT']",

packages/cloud_firestore/cloud_firestore_platform_interface/lib/src/method_channel/method_channel_firestore.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import 'utils/firestore_message_codec.dart';
2525
/// You can get an instance by calling [FirebaseFirestore.instance].
2626
class MethodChannelFirebaseFirestore extends FirebaseFirestorePlatform {
2727
/// Create an instance of [MethodChannelFirebaseFirestore] with optional [FirebaseApp]
28-
MethodChannelFirebaseFirestore({FirebaseApp? app, String? databaseURL})
29-
: super(appInstance: app, databaseChoice: databaseURL);
28+
MethodChannelFirebaseFirestore({FirebaseApp? app, String? databaseId})
29+
: super(appInstance: app, databaseChoice: databaseId);
3030

3131
/// The [FirebaseApp] instance to which this [FirebaseDatabase] belongs.
3232
///
@@ -68,7 +68,7 @@ class MethodChannelFirebaseFirestore extends FirebaseFirestorePlatform {
6868

6969
late final FirestorePigeonFirebaseApp pigeonApp = FirestorePigeonFirebaseApp(
7070
appName: appInstance!.name,
71-
databaseURL: databaseURL,
71+
databaseURL: databaseId,
7272
settings: PigeonFirebaseSettings(
7373
persistenceEnabled: settings.persistenceEnabled,
7474
host: settings.host,
@@ -83,9 +83,9 @@ class MethodChannelFirebaseFirestore extends FirebaseFirestorePlatform {
8383
@override
8484
FirebaseFirestorePlatform delegateFor({
8585
required FirebaseApp app,
86-
required String databaseURL,
86+
required String databaseId,
8787
}) {
88-
return MethodChannelFirebaseFirestore(app: app, databaseURL: databaseURL);
88+
return MethodChannelFirebaseFirestore(app: app, databaseId: databaseId);
8989
}
9090

9191
@override
@@ -268,7 +268,7 @@ class MethodChannelFirebaseFirestore extends FirebaseFirestorePlatform {
268268
transactionId,
269269
event['appName'],
270270
pigeonApp,
271-
databaseURL,
271+
databaseId,
272272
);
273273

274274
// If the transaction fails on Dart side, then forward the error

packages/cloud_firestore/cloud_firestore_platform_interface/lib/src/method_channel/method_channel_transaction.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ import 'method_channel_firestore.dart';
1717
class MethodChannelTransaction extends TransactionPlatform {
1818
/// [FirebaseApp] name used for this [MethodChannelTransaction]
1919
final String appName;
20-
final String databaseURL;
20+
final String databaseId;
2121
late String _transactionId;
2222
late FirebaseFirestorePlatform _firestore;
2323
FirestorePigeonFirebaseApp pigeonApp;
2424

2525
/// Constructor.
2626
MethodChannelTransaction(
27-
String transactionId, this.appName, this.pigeonApp, this.databaseURL)
27+
String transactionId, this.appName, this.pigeonApp, this.databaseId)
2828
: _transactionId = transactionId,
2929
super() {
3030
_firestore = FirebaseFirestorePlatform.instanceFor(
31-
app: Firebase.app(appName), databaseURL: databaseURL);
31+
app: Firebase.app(appName), databaseId: databaseId);
3232
}
3333

3434
List<PigeonTransactionCommand> _commands = [];

packages/cloud_firestore/cloud_firestore_platform_interface/lib/src/method_channel/utils/firestore_message_codec.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class FirestoreMessageCodec extends StandardMessageCodec {
103103
} else if (value is MethodChannelFirebaseFirestore) {
104104
buffer.putUint8(_kFirestoreInstance);
105105
writeValue(buffer, value.app.name);
106-
writeValue(buffer, value.databaseURL);
106+
writeValue(buffer, value.databaseId);
107107
writeValue(buffer, value.settings);
108108
} else if (value is MethodChannelQuery) {
109109
buffer.putUint8(_kFirestoreQuery);
@@ -141,12 +141,12 @@ class FirestoreMessageCodec extends StandardMessageCodec {
141141
case _kDocumentReference:
142142
final String appName = readValue(buffer)! as String;
143143
final String path = readValue(buffer)! as String;
144-
final String databaseURL = readValue(buffer)! as String;
144+
final String databaseId = readValue(buffer)! as String;
145145

146146
final FirebaseApp app = Firebase.app(appName);
147147
final FirebaseFirestorePlatform firestore =
148148
FirebaseFirestorePlatform.instanceFor(
149-
app: app, databaseURL: databaseURL);
149+
app: app, databaseId: databaseId);
150150
return firestore.doc(path);
151151
case _kBlob:
152152
final int length = readSize(buffer);

packages/cloud_firestore/cloud_firestore_platform_interface/lib/src/platform_interface/platform_interface_firestore.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ abstract class FirebaseFirestorePlatform extends PlatformInterface {
3030
final String? databaseChoice;
3131

3232
/// Firestore Database URL for this instance. Falls back to default database: "(default)"
33-
String get databaseURL {
33+
String get databaseId {
3434
return databaseChoice ?? '(default)';
3535
}
3636

@@ -39,10 +39,10 @@ abstract class FirebaseFirestorePlatform extends PlatformInterface {
3939
/// Create an instance using [app] using the existing implementation
4040
factory FirebaseFirestorePlatform.instanceFor({
4141
required FirebaseApp app,
42-
required String databaseURL,
42+
required String databaseId,
4343
}) {
4444
return FirebaseFirestorePlatform.instance
45-
.delegateFor(app: app, databaseURL: databaseURL);
45+
.delegateFor(app: app, databaseId: databaseId);
4646
}
4747

4848
/// The current default [FirebaseFirestorePlatform] instance.
@@ -51,7 +51,7 @@ abstract class FirebaseFirestorePlatform extends PlatformInterface {
5151
/// if no other implementation was provided.
5252
static FirebaseFirestorePlatform get instance {
5353
return _instance ??= MethodChannelFirebaseFirestore(
54-
app: Firebase.app(), databaseURL: '(default)');
54+
app: Firebase.app(), databaseId: '(default)');
5555
}
5656

5757
static FirebaseFirestorePlatform? _instance;
@@ -66,7 +66,7 @@ abstract class FirebaseFirestorePlatform extends PlatformInterface {
6666
/// [FirebaseApp] instance is required by the user.
6767
@protected
6868
FirebaseFirestorePlatform delegateFor(
69-
{required FirebaseApp app, required String databaseURL}) {
69+
{required FirebaseApp app, required String databaseId}) {
7070
throw UnimplementedError('delegateFor() is not implemented');
7171
}
7272

packages/cloud_firestore/cloud_firestore_platform_interface/test/utils/test_firestore_message_codec.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class TestFirestoreMessageCodec extends FirestoreMessageCodec {
6262
readValue(buffer);
6363
final FirebaseApp app = Firebase.app(appName);
6464
return MethodChannelFirebaseFirestore(
65-
app: app, databaseURL: databaseURL);
65+
app: app, databaseId: databaseURL);
6666
case _kFirestoreQuery:
6767
Map<dynamic, dynamic> values =
6868
readValue(buffer)! as Map<dynamic, dynamic>;

packages/cloud_firestore/cloud_firestore_web/lib/cloud_firestore_web.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class FirebaseFirestoreWeb extends FirebaseFirestorePlatform {
3535
/// Lazily initialize [_webFirestore] on first method call
3636
firestore_interop.Firestore get _delegate {
3737
return _webFirestore ??= firestore_interop.getFirestoreInstance(
38-
core_interop.app(app.name), _settings, databaseURL);
38+
core_interop.app(app.name), _settings, databaseId);
3939
}
4040

4141
/// Called by PluginRegistry to register this plugin for Flutter Web
@@ -46,15 +46,15 @@ class FirebaseFirestoreWeb extends FirebaseFirestorePlatform {
4646

4747
/// Builds an instance of [FirebaseFirestoreWeb] with an optional [FirebaseApp] instance
4848
/// If [app] is null then the created instance will use the default [FirebaseApp]
49-
FirebaseFirestoreWeb({FirebaseApp? app, String? databaseURL})
50-
: super(appInstance: app, databaseChoice: databaseURL) {
49+
FirebaseFirestoreWeb({FirebaseApp? app, String? databaseId})
50+
: super(appInstance: app, databaseChoice: databaseId) {
5151
FieldValueFactoryPlatform.instance = FieldValueFactoryWeb();
5252
}
5353

5454
@override
5555
FirebaseFirestorePlatform delegateFor(
56-
{required FirebaseApp app, required String databaseURL}) {
57-
return FirebaseFirestoreWeb(app: app, databaseURL: databaseURL);
56+
{required FirebaseApp app, required String databaseId}) {
57+
return FirebaseFirestoreWeb(app: app, databaseId: databaseId);
5858
}
5959

6060
@override

0 commit comments

Comments
 (0)