From 247e30beedd5d6e55d8c53cb9356b278ed02ec3a Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 30 Jan 2026 07:31:38 -0300 Subject: [PATCH 1/4] fix Jackson deserialization for empty Filters and add regression test --- .../nip01Core/relay/filters/FilterDeserializer.kt | 14 +++++++------- .../quartz/nip01Core/jackson/JacksonMapperTest.kt | 9 +++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt b/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt index 556dda5de..5bf629536 100644 --- a/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt +++ b/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt @@ -52,15 +52,15 @@ class ManualFilterDeserializer { } return Filter( - ids = jsonObject.get("ids").mapNotNull { it.asTextOrNull() }, - authors = jsonObject.get("authors").mapNotNull { it.asTextOrNull() }, - kinds = jsonObject.get("kinds").mapNotNull { it.asIntOrNull() }, + ids = jsonObject.get("ids")?.mapNotNull { it.asTextOrNull() }, + authors = jsonObject.get("authors")?.mapNotNull { it.asTextOrNull() }, + kinds = jsonObject.get("kinds")?.mapNotNull { it.asIntOrNull() }, tags = tagsIn.associateWith { jsonObject.get(it).mapNotNull { it.asTextOrNull() } }, tagsAll = tagsAll.associateWith { jsonObject.get(it).mapNotNull { it.asTextOrNull() } }, - since = jsonObject.get("since").asLongOrNull(), - until = jsonObject.get("until").asLongOrNull(), - limit = jsonObject.get("limit").asIntOrNull(), - search = jsonObject.get("search").asTextOrNull(), + since = jsonObject.get("since")?.asLongOrNull(), + until = jsonObject.get("until")?.asLongOrNull(), + limit = jsonObject.get("limit")?.asIntOrNull(), + search = jsonObject.get("search")?.asTextOrNull(), ) } } diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt index b9cc65956..252b21789 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt @@ -21,6 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.jackson import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate import com.vitorpamplona.quartz.nip51Lists.followList.FollowListEvent import com.vitorpamplona.quartz.nip59Giftwrap.rumors.Rumor @@ -152,4 +153,12 @@ class JacksonMapperTest { assertContentEquals(tag, deserialized.tags[index]) } } + + @Test + fun shouldNotThrowExceptionWhenDeserializingEmptyFilter() { + val json = Filter().toJson() + val deserialized = JacksonMapper.fromJsonTo(json) + + assertEquals(deserialized.ids, null) + } } From 8bfd670f8b4755133030c9749bd0d4df10021bfb Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 30 Jan 2026 08:50:09 -0300 Subject: [PATCH 2/4] Fix assertEquals order --- .../vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt index 252b21789..c691bd152 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt @@ -159,6 +159,6 @@ class JacksonMapperTest { val json = Filter().toJson() val deserialized = JacksonMapper.fromJsonTo(json) - assertEquals(deserialized.ids, null) + assertEquals(null, deserialized.ids) } } From f2d7b115d93c446292bf0fae98e4a66bce949eb6 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 30 Jan 2026 09:00:52 -0300 Subject: [PATCH 3/4] Fixed NullPointerException when filter contain tags --- .../nip01Core/relay/filters/FilterDeserializer.kt | 4 ++-- .../quartz/nip01Core/jackson/JacksonMapperTest.kt | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt b/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt index 5bf629536..618491580 100644 --- a/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt +++ b/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip01Core/relay/filters/FilterDeserializer.kt @@ -55,8 +55,8 @@ class ManualFilterDeserializer { ids = jsonObject.get("ids")?.mapNotNull { it.asTextOrNull() }, authors = jsonObject.get("authors")?.mapNotNull { it.asTextOrNull() }, kinds = jsonObject.get("kinds")?.mapNotNull { it.asIntOrNull() }, - tags = tagsIn.associateWith { jsonObject.get(it).mapNotNull { it.asTextOrNull() } }, - tagsAll = tagsAll.associateWith { jsonObject.get(it).mapNotNull { it.asTextOrNull() } }, + tags = tagsIn.associateWith { jsonObject.get("#$it").mapNotNull { it.asTextOrNull() } }, + tagsAll = tagsAll.associateWith { jsonObject.get("&$it").mapNotNull { it.asTextOrNull() } }, since = jsonObject.get("since")?.asLongOrNull(), until = jsonObject.get("until")?.asLongOrNull(), limit = jsonObject.get("limit")?.asIntOrNull(), diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt index c691bd152..84844d0e2 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt @@ -161,4 +161,17 @@ class JacksonMapperTest { assertEquals(null, deserialized.ids) } + + @Test + fun shouldNotThrowExceptionWhenDeserializingFilterTags() { + val json = + Filter( + tags = mapOf("p" to listOf("123")), + tagsAll = mapOf("p" to listOf("123")), + ).toJson() + val deserialized = JacksonMapper.fromJsonTo(json) + + assertEquals(true, deserialized.tags?.keys?.contains("p")) + assertEquals(true, deserialized.tagsAll?.keys?.contains("p")) + } } From 577b4c0e0a1de0e41b8f3dd1b5d28d7d6964a2ad Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 30 Jan 2026 09:38:09 -0300 Subject: [PATCH 4/4] - use a valid hex key - check the value of the tags --- .../quartz/nip01Core/jackson/JacksonMapperTest.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt index 84844d0e2..b9b732596 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/jackson/JacksonMapperTest.kt @@ -164,14 +164,17 @@ class JacksonMapperTest { @Test fun shouldNotThrowExceptionWhenDeserializingFilterTags() { + val expectedTagValue = "3c39a7b53dec9ac85acf08b267637a9841e6df7b7b0f5e2ac56a8cf107de37da" val json = Filter( - tags = mapOf("p" to listOf("123")), - tagsAll = mapOf("p" to listOf("123")), + tags = mapOf("p" to listOf(expectedTagValue)), + tagsAll = mapOf("p" to listOf(expectedTagValue)), ).toJson() val deserialized = JacksonMapper.fromJsonTo(json) assertEquals(true, deserialized.tags?.keys?.contains("p")) + assertEquals(listOf(expectedTagValue), deserialized.tags?.get("p")) assertEquals(true, deserialized.tagsAll?.keys?.contains("p")) + assertEquals(listOf(expectedTagValue), deserialized.tagsAll?.get("p")) } }