You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Firestore customizable encoding for where clauses and update methods (#607)
* Moves ValueWithSerializer back into public API
It had become part of commons-internal which kind of defeats the purpose.
Also made FirebaseEncoder/FirebaseDecoder an interface in the public API. Useful for writing custom Serializers that have custom behaviour on Firebase
* Adding support for encoded queries
* Add support for customizing encoding behaviour when updating Values at paths
* Improves DSL for updating firestore references
* Slight api format change for readability
* Fixed some bugs and adding tests
* Added several tests to stabilize tests
* Make builders abstract to allow for testing
* Revert "Make builders abstract to allow for testing"
This reverts commit 4176fe6.
* PR remarks
* Fixed broken test
* Disable QueryTest for android unit tests
* Expanded documentation
* Refactored buildSettings variable to encodeNextWith cli
* Use different encodeSettings approach
* Fixed actually getting values
* Lint fix
* Corrected Filter implementation
* Small bugfix on Filter
* Back to PR remarks
* Update readme
* Run macos tests on newer macos
* Deprecation of old update methods
* API dump
* Trying to fix auto commit issue
* Print git status to debug ci
* Change trigger from pull_request_target to pull_request
---------
Co-authored-by: Nicholas Bransby-Williams <[email protected]>
It is important to remember that unlike a callback based API, wating for suspending functions to complete is implicit and so if you don't want to wait for the result you can `launch` a new coroutine:
45
+
It is important to remember that unlike a callback based API, waiting for suspending functions to complete is implicit and so if you don't want to wait for the result you can `launch` a new coroutine:
46
46
47
47
```kotlin
48
48
//TODO don't use GlobalScope
@@ -185,6 +185,52 @@ In combination with a `SerialName` specified for the child class, you have full
185
185
}
186
186
```
187
187
188
+
<h4>Serialization of Updates</h4>
189
+
Firestore contains update methods that allow for multiple fields to be updated at the same time.
190
+
This sdk offers special update methods that allow for applying custom serialization to each individual field though an update builder.
191
+
Where an `update` method exists, an `updateFields` method will also be available. In this, each value can have its serializer customized:
192
+
193
+
```kotlin
194
+
documentRef.updateFields {
195
+
// Root level encode settings
196
+
encodeDefaults =false
197
+
serializersModule = module
198
+
199
+
"field" to "value"
200
+
// Set the value of otherField to "1" using a custom Serializer
201
+
"otherField".to(IntAsStringSerializer(), 1)
202
+
203
+
// Overwrite build settings. All fields added within this block will have these build settings applied
204
+
withEncodeSettings {
205
+
encodeDefaults =true
206
+
serializersModule = otherModule
207
+
"city" to abstractCity
208
+
}
209
+
}
210
+
```
211
+
212
+
Similarly, the `Query` methods `startAt`/`startAfter`/`endAt`/`endBefore` have an alternative method in `startAtFieldValues`/`startAfterFieldValues`/`endAtFieldValues`/`endBeforeFieldValues`
213
+
214
+
```kotlin
215
+
query.orderBy("field", "otherField", "city").startAtFieldValues { // similar syntax for startAfter/endAt/endBefore
216
+
// Root level encode settings
217
+
encodeDefaults =false
218
+
serializersModule = module
219
+
220
+
add("Value")
221
+
222
+
// Starts at "1" for the otherField value
223
+
add(1, IntAsStringSerializer())
224
+
225
+
// Overwrite build settings. All field values added within this block will have these build settings applied
Copy file name to clipboardExpand all lines: firebase-auth/api/android/firebase-auth.api
+6-4Lines changed: 6 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -32,20 +32,22 @@ public final class dev/gitlive/firebase/auth/ActionCodeResult$VerifyEmail : dev/
32
32
}
33
33
34
34
public final class dev/gitlive/firebase/auth/ActionCodeSettings {
35
-
public fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;)V
36
-
public synthetic fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
35
+
public fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V
36
+
public synthetic fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
37
37
public final fun component1 ()Ljava/lang/String;
38
38
public final fun component2 ()Ldev/gitlive/firebase/auth/AndroidPackageName;
39
39
public final fun component3 ()Ljava/lang/String;
40
40
public final fun component4 ()Z
41
41
public final fun component5 ()Ljava/lang/String;
42
-
public final fun copy (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
43
-
public static synthetic fun copy$default (Ldev/gitlive/firebase/auth/ActionCodeSettings;Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
42
+
public final fun component6 ()Ljava/lang/String;
43
+
public final fun copy (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
44
+
public static synthetic fun copy$default (Ldev/gitlive/firebase/auth/ActionCodeSettings;Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
44
45
public fun equals (Ljava/lang/Object;)Z
45
46
public final fun getAndroidPackageName ()Ldev/gitlive/firebase/auth/AndroidPackageName;
46
47
public final fun getCanHandleCodeInApp ()Z
47
48
public final fun getDynamicLinkDomain ()Ljava/lang/String;
48
49
public final fun getIOSBundleId ()Ljava/lang/String;
50
+
public final fun getLinkDomain ()Ljava/lang/String;
Copy file name to clipboardExpand all lines: firebase-auth/api/jvm/firebase-auth.api
+6-4Lines changed: 6 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -32,20 +32,22 @@ public final class dev/gitlive/firebase/auth/ActionCodeResult$VerifyEmail : dev/
32
32
}
33
33
34
34
public final class dev/gitlive/firebase/auth/ActionCodeSettings {
35
-
public fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;)V
36
-
public synthetic fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
35
+
public fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V
36
+
public synthetic fun <init> (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
37
37
public final fun component1 ()Ljava/lang/String;
38
38
public final fun component2 ()Ldev/gitlive/firebase/auth/AndroidPackageName;
39
39
public final fun component3 ()Ljava/lang/String;
40
40
public final fun component4 ()Z
41
41
public final fun component5 ()Ljava/lang/String;
42
-
public final fun copy (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
43
-
public static synthetic fun copy$default (Ldev/gitlive/firebase/auth/ActionCodeSettings;Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
42
+
public final fun component6 ()Ljava/lang/String;
43
+
public final fun copy (Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
44
+
public static synthetic fun copy$default (Ldev/gitlive/firebase/auth/ActionCodeSettings;Ljava/lang/String;Ldev/gitlive/firebase/auth/AndroidPackageName;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ldev/gitlive/firebase/auth/ActionCodeSettings;
44
45
public fun equals (Ljava/lang/Object;)Z
45
46
public final fun getAndroidPackageName ()Ldev/gitlive/firebase/auth/AndroidPackageName;
46
47
public final fun getCanHandleCodeInApp ()Z
47
48
public final fun getDynamicLinkDomain ()Ljava/lang/String;
48
49
public final fun getIOSBundleId ()Ljava/lang/String;
50
+
public final fun getLinkDomain ()Ljava/lang/String;
Copy file name to clipboardExpand all lines: firebase-common-internal/api/android/firebase-common-internal.api
+4-74Lines changed: 4 additions & 74 deletions
Original file line number
Diff line number
Diff line change
@@ -31,6 +31,8 @@ public final class dev/gitlive/firebase/internal/EncodeDecodeSettingsBuilderImpl
31
31
public final class dev/gitlive/firebase/internal/EncodeDecodeSettingsKt {
32
32
public static final fun buildDecodeSettings (Ldev/gitlive/firebase/DecodeSettings$Builder;)Ldev/gitlive/firebase/DecodeSettings;
33
33
public static final fun buildEncodeSettings (Ldev/gitlive/firebase/EncodeSettings$Builder;)Ldev/gitlive/firebase/EncodeSettings;
34
+
public static final fun copyFrom (Ldev/gitlive/firebase/DecodeSettings$Builder;Ldev/gitlive/firebase/DecodeSettings$Builder;)V
35
+
public static final fun copyFrom (Ldev/gitlive/firebase/EncodeSettings$Builder;Ldev/gitlive/firebase/EncodeSettings$Builder;)V
34
36
}
35
37
36
38
public final class dev/gitlive/firebase/internal/EncodeSettingsImpl : dev/gitlive/firebase/EncodeSettings {
@@ -78,59 +80,9 @@ public final class dev/gitlive/firebase/internal/EncodersKt {
78
80
public static final fun encode (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Z)Ljava/lang/Object;
79
81
public static final fun encodeAsObject (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ldev/gitlive/firebase/internal/EncodedObject;
80
82
public static synthetic fun encodeAsObject$default (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ldev/gitlive/firebase/internal/EncodedObject;
81
-
public static final fun withSerializer (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ljava/lang/Object;
82
-
}
83
-
84
-
public final class dev/gitlive/firebase/internal/FirebaseClassDecoder : dev/gitlive/firebase/internal/FirebaseCompositeDecoder {
85
-
public fun <init> (ILdev/gitlive/firebase/DecodeSettings;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V
86
-
public fun decodeElementIndex (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
87
-
public fun decodeSequentially ()Z
88
-
}
89
-
90
-
public class dev/gitlive/firebase/internal/FirebaseCompositeDecoder : kotlinx/serialization/encoding/CompositeDecoder {
91
-
public fun <init> (ILdev/gitlive/firebase/DecodeSettings;Lkotlin/jvm/functions/Function2;)V
92
-
public fun decodeBooleanElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z
93
-
public fun decodeByteElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)B
94
-
public fun decodeCharElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)C
95
-
public fun decodeCollectionSize (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
96
-
public fun decodeDoubleElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)D
97
-
public fun decodeElementIndex (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
98
-
public fun decodeFloatElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)F
99
-
public fun decodeInlineElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/Decoder;
100
-
public fun decodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)I
101
-
public fun decodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)J
102
-
public fun decodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;
103
-
public fun decodeSequentially ()Z
104
-
public fun decodeSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;
105
-
public fun decodeShortElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)S
106
-
public fun decodeStringElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;
107
-
public fun endStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)V
108
-
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
109
-
}
110
-
111
-
public class dev/gitlive/firebase/internal/FirebaseCompositeEncoder : kotlinx/serialization/encoding/CompositeEncoder {
112
-
public fun <init> (Ldev/gitlive/firebase/EncodeSettings;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V
113
-
public synthetic fun <init> (Ldev/gitlive/firebase/EncodeSettings;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
114
-
public fun encodeBooleanElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IZ)V
115
-
public fun encodeByteElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IB)V
116
-
public fun encodeCharElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IC)V
117
-
public fun encodeDoubleElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ID)V
118
-
public fun encodeFloatElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IF)V
119
-
public fun encodeInlineElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/Encoder;
120
-
public fun encodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;II)V
121
-
public fun encodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IJ)V
122
-
public fun encodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
123
-
public final fun encodeObject (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/Object;)V
124
-
public final fun encodePolymorphicClassDiscriminator (Ljava/lang/String;Ljava/lang/String;)V
125
-
public fun encodeSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
126
-
public fun encodeShortElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IS)V
127
-
public fun encodeStringElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V
128
-
public fun endStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)V
129
-
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
130
-
public fun shouldEncodeElementDefault (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z
131
83
}
132
84
133
-
public final class dev/gitlive/firebase/internal/FirebaseDecoder : kotlinx/serialization/encoding/Decoder {
85
+
public final class dev/gitlive/firebase/internal/FirebaseDecoderImpl : dev/gitlive/firebase/FirebaseDecoder {
134
86
public fun <init> (Ljava/lang/Object;)V
135
87
public fun <init> (Ljava/lang/Object;Ldev/gitlive/firebase/DecodeSettings;)V
136
88
public fun beginStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;
@@ -153,7 +105,7 @@ public final class dev/gitlive/firebase/internal/FirebaseDecoder : kotlinx/seria
153
105
public final fun getValue ()Ljava/lang/Object;
154
106
}
155
107
156
-
public final class dev/gitlive/firebase/internal/FirebaseEncoder : kotlinx/serialization/encoding/Encoder {
108
+
public final class dev/gitlive/firebase/internal/FirebaseEncoderImpl : dev/gitlive/firebase/FirebaseEncoder {
157
109
public fun <init> (Ldev/gitlive/firebase/EncodeSettings;)V
158
110
public fun <init> (Z)V
159
111
public fun beginCollection (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/CompositeEncoder;
@@ -217,25 +169,3 @@ public final class dev/gitlive/firebase/internal/SpecialValueSerializer : kotlin
217
169
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
218
170
}
219
171
220
-
public final class dev/gitlive/firebase/internal/ValueWithSerializer {
221
-
public fun <init> (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)V
222
-
public final fun component1 ()Ljava/lang/Object;
223
-
public final fun component2 ()Lkotlinx/serialization/SerializationStrategy;
224
-
public final fun copy (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ldev/gitlive/firebase/internal/ValueWithSerializer;
225
-
public static synthetic fun copy$default (Ldev/gitlive/firebase/internal/ValueWithSerializer;Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;ILjava/lang/Object;)Ldev/gitlive/firebase/internal/ValueWithSerializer;
226
-
public fun equals (Ljava/lang/Object;)Z
227
-
public final fun getSerializer ()Lkotlinx/serialization/SerializationStrategy;
228
-
public final fun getValue ()Ljava/lang/Object;
229
-
public fun hashCode ()I
230
-
public fun toString ()Ljava/lang/String;
231
-
}
232
-
233
-
public final class dev/gitlive/firebase/internal/_decodersKt {
234
-
public static final fun getPolymorphicType (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
235
-
public static final fun structureDecoder (Ldev/gitlive/firebase/internal/FirebaseDecoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Z)Lkotlinx/serialization/encoding/CompositeDecoder;
236
-
}
237
-
238
-
public final class dev/gitlive/firebase/internal/_encodersKt {
239
-
public static final fun structureEncoder (Ldev/gitlive/firebase/internal/FirebaseEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)Ldev/gitlive/firebase/internal/FirebaseCompositeEncoder;
0 commit comments