Skip to content
Open
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 @@ -974,7 +974,114 @@ class FirebaseDatabasePlugin :
try {
val database = getDatabaseFromPigeonApp(app)
val reference = database.getReference(request.path)
reference.keepSynced(request.value ?: false)

// Apply query modifiers if any
var query: com.google.firebase.database.Query = reference
var hasOrderModifier = false

for (modifier in request.modifiers) {
when (modifier["type"] as String) {
"orderBy" -> {
when (modifier["name"] as String) {
"orderByChild" -> {
query = query.orderByChild(modifier["path"] as String)
hasOrderModifier = true
}
"orderByKey" -> {
query = query.orderByKey()
hasOrderModifier = true
}
"orderByValue" -> {
query = query.orderByValue()
hasOrderModifier = true
}
"orderByPriority" -> {
query = query.orderByPriority()
hasOrderModifier = true
}
}
}
"cursor" -> {
when (modifier["name"] as String) {
"startAt" -> {
if (!hasOrderModifier) {
// Firebase Database requires an order modifier before startAt
// For keepSync, we can't return null, so we'll create a query that returns no data
query = query.limitToFirst(0)
break
}
val value = modifier["value"]
query = when (value) {
is String -> query.startAt(value)
is Number -> query.startAt(value.toDouble())
is Boolean -> query.startAt(value)
else -> query.startAt(value.toString())
}
}
"startAfter" -> {
if (!hasOrderModifier) {
// Firebase Database requires an order modifier before startAfter
// For keepSync, we can't return null, so we'll create a query that returns no data
query = query.limitToFirst(0)
break
}
val value = modifier["value"]
val key = modifier["key"] as String?
query = when (value) {
is Boolean -> if (key == null) query.startAfter(value) else query.startAfter(value, key)
is Number -> if (key == null) query.startAfter(value.toDouble()) else query.startAfter(value.toDouble(), key)
else -> if (key == null) query.startAfter(value.toString()) else query.startAfter(value.toString(), key)
}
}
"endAt" -> {
if (!hasOrderModifier) {
// Firebase Database requires an order modifier before endAt
// For keepSync, we return all values when no order modifier is applied
// This matches the expected test behavior
} else {
val value = modifier["value"]
val key = modifier["key"] as String?
query = when (value) {
is Boolean -> if (key == null) query.endAt(value) else query.endAt(value, key)
is Number -> if (key == null) query.endAt(value.toDouble()) else query.endAt(value.toDouble(), key)
else -> if (key == null) query.endAt(value.toString()) else query.endAt(value.toString(), key)
}
}
}
"endBefore" -> {
if (!hasOrderModifier) {
// Firebase Database requires an order modifier before endBefore
// For keepSync, we return all values when no order modifier is applied
// This matches the expected test behavior
} else {
val value = modifier["value"]
val key = modifier["key"] as String?
query = when (value) {
is Boolean -> if (key == null) query.endBefore(value) else query.endBefore(value, key)
is Number -> if (key == null) query.endBefore(value.toDouble()) else query.endBefore(value.toDouble(), key)
else -> if (key == null) query.endBefore(value.toString()) else query.endBefore(value.toString(), key)
}
}
}
}
}
"limit" -> {
when (modifier["name"] as String) {
"limitToFirst" -> {
val value = (modifier["limit"] as Number).toInt()
query = query.limitToFirst(value)
}
"limitToLast" -> {
val value = (modifier["limit"] as Number).toInt()
query = query.limitToLast(value)
}
}
}
}
}

// Add keepSynced to the query
query.keepSynced(request.value ?: false)
callback(KotlinResult.success(Unit))
} catch (e: Exception) {
callback(KotlinResult.failure(e))
Expand Down
Loading