Skip to content

Extract interfaces #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: prerelease
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class EncodersTest {
val decoded = decode(TestData.serializer(), mapOf("map" to mapOf("key" to "value"), "nullableBool" to null))
assertNull(decoded.nullableBool)
}
}

@Test
fun testEncodeDecodedSealedClass() {
val test = SealedClass.Test("Foo")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.gitlive.firebase.firestore

actual class FirebaseDocumentReferenceEncoder actual constructor() {
actual fun encode(value: DocumentReference): Any {
actual fun encode(value: DocumentReferenceWrapper): Any {
return value.android
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

expect class FirebaseDocumentReferenceEncoder() {
fun encode(value: DocumentReference): Any
fun encode(value: DocumentReferenceWrapper): Any
}

class FirebaseDocumentReferenceSerializer : KSerializer<DocumentReference> {
class FirebaseDocumentReferenceSerializer : KSerializer<DocumentReferenceWrapper> {

override val descriptor = object : SerialDescriptor {
val keys = listOf("path")
Expand All @@ -27,17 +27,17 @@ class FirebaseDocumentReferenceSerializer : KSerializer<DocumentReference> {
override fun isElementOptional(index: Int) = false
}

override fun serialize(encoder: Encoder, value: DocumentReference) {
override fun serialize(encoder: Encoder, value: DocumentReferenceWrapper) {
val objectEncoder = encoder.beginStructure(descriptor) as FirebaseCompositeEncoder
val documentReferenceEncoder = FirebaseDocumentReferenceEncoder()
objectEncoder.encodeObject(descriptor, 0, documentReferenceEncoder.encode(value))
objectEncoder.endStructure(descriptor)
}

override fun deserialize(decoder: Decoder): DocumentReference {
override fun deserialize(decoder: Decoder): DocumentReferenceWrapper {
val objectDecoder = decoder.beginStructure(descriptor) as FirebaseCompositeDecoder
val path = objectDecoder.decodeStringElement(descriptor, 0)
objectDecoder.endStructure(descriptor)
return Firebase.firestore.document(path)
return Firebase.firestore.document(path) as DocumentReferenceWrapper
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package dev.gitlive.firebase.firestore

sealed class FirebaseReference {
data class Value(val value: DocumentReference) : FirebaseReference()
data class Value(val value: DocumentReferenceWrapper) : FirebaseReference()
object ServerDelete : FirebaseReference()
}

val FirebaseReference.reference: DocumentReference? get() = when (this) {
val FirebaseReference.reference: DocumentReferenceWrapper? get() = when (this) {
is FirebaseReference.Value -> value
is FirebaseReference.ServerDelete -> null
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class FirebaseReferenceNullableSerializer : AbstractFirebaseReferenceSerializer<
val objectDecoder = decoder.beginStructure(descriptor) as FirebaseCompositeDecoder
return try {
val path = objectDecoder.decodeStringElement(descriptor, 0)
FirebaseReference.Value(Firebase.firestore.document(path))
FirebaseReference.Value(Firebase.firestore.document(path) as DocumentReferenceWrapper)
} catch (exception: Exception) {
null
} finally {
Expand All @@ -68,6 +68,6 @@ class FirebaseReferenceSerializer : AbstractFirebaseReferenceSerializer<Firebase
val objectDecoder = decoder.beginStructure(descriptor) as FirebaseCompositeDecoder
val path = objectDecoder.decodeStringElement(descriptor, 0)
objectDecoder.endStructure(descriptor)
return FirebaseReference.Value(Firebase.firestore.document(path))
return FirebaseReference.Value(Firebase.firestore.document(path) as DocumentReferenceWrapper)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerializationStrategy
import kotlin.js.JsName
import kotlin.jvm.JvmName

/** Returns the [FirebaseFirestore] instance of the default [FirebaseApp]. */
expect val Firebase.firestore: FirebaseFirestore

/** Returns the [FirebaseFirestore] instance of a given [FirebaseApp]. */
expect fun Firebase.firestore(app: FirebaseApp): FirebaseFirestore

expect class FirebaseFirestore {
interface IFirebaseFirestore {
fun collection(collectionPath: String): CollectionReference
fun document(documentPath: String): DocumentReference
fun collectionGroup(collectionId: String): Query
Expand All @@ -32,6 +33,8 @@ expect class FirebaseFirestore {
suspend fun enableNetwork()
}

expect class FirebaseFirestore : IFirebaseFirestore

expect class Transaction {

fun set(documentRef: DocumentReference, data: Any, encodeDefaults: Boolean = true, merge: Boolean = false): Transaction
Expand Down Expand Up @@ -114,43 +117,56 @@ expect class WriteBatch {
suspend fun commit()
}

expect class DocumentReference {

interface DocumentReference {
val id: String
val path: String
val snapshots: Flow<DocumentSnapshot>

fun collection(collectionPath: String): CollectionReference
suspend fun get(): DocumentSnapshot

suspend inline fun <reified T> set(data: T, encodeDefaults: Boolean = true, merge: Boolean = false)
suspend inline fun <reified T> set(data: T, encodeDefaults: Boolean = true, vararg mergeFields: String)
suspend inline fun <reified T> set(data: T, encodeDefaults: Boolean = true, vararg mergeFieldPaths: FieldPath)

suspend fun <T> set(strategy: SerializationStrategy<T>, data: T, encodeDefaults: Boolean = true, merge: Boolean = false)
suspend fun <T> set(strategy: SerializationStrategy<T>, data: T, encodeDefaults: Boolean = true, vararg mergeFields: String)
suspend fun <T> set(strategy: SerializationStrategy<T>, data: T, encodeDefaults: Boolean = true, vararg mergeFieldPaths: FieldPath)

suspend inline fun <reified T> update(data: T, encodeDefaults: Boolean = true)
suspend fun <T> update(strategy: SerializationStrategy<T>, data: T, encodeDefaults: Boolean = true)

@Suppress("INAPPLICABLE_JVM_NAME")
@JvmName("updateFieldsByKey")
suspend fun update(vararg fieldsAndValues: Pair<String, Any?>)

@Suppress("INAPPLICABLE_JVM_NAME")
@JvmName("updateFieldsByFieldPath")
suspend fun update(vararg fieldsAndValues: Pair<FieldPath, Any?>)

suspend fun delete()
}

expect class CollectionReference : Query {
expect class DocumentReferenceWrapper : DocumentReference {

suspend inline fun <reified T> set(data: T, encodeDefaults: Boolean = true, merge: Boolean = false)
suspend inline fun <reified T> set(data: T, encodeDefaults: Boolean = true, vararg mergeFields: String)
suspend inline fun <reified T> set(data: T, encodeDefaults: Boolean = true, vararg mergeFieldPaths: FieldPath)

suspend inline fun <reified T> update(data: T, encodeDefaults: Boolean = true)
}

interface CollectionReference {
val path: String

fun document(documentPath: String): DocumentReference
fun document(): DocumentReference
suspend inline fun <reified T> add(data: T, encodeDefaults: Boolean = true): DocumentReference

@Deprecated("This will be replaced with add(strategy: SerializationStrategy<T>, data: T, encodeDefaults: Boolean = true)")
suspend fun <T> add(data: T, strategy: SerializationStrategy<T>, encodeDefaults: Boolean = true): DocumentReference
suspend fun <T> add(strategy: SerializationStrategy<T>, data: T, encodeDefaults: Boolean = true): DocumentReference
}

expect class CollectionReferenceWrapper : Query, CollectionReference {
suspend inline fun <reified T> add(data: T, encodeDefaults: Boolean = true): DocumentReference
}

expect class FirebaseFirestoreException : FirebaseException

@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.gitlive.firebase.firestore

actual class FirebaseDocumentReferenceEncoder actual constructor() {
actual fun encode(value: DocumentReference): Any {
actual fun encode(value: DocumentReferenceWrapper): Any {
return value.ios
}
}
Loading