diff --git a/nostr-java-api/src/main/java/nostr/api/NIP01.java b/nostr-java-api/src/main/java/nostr/api/NIP01.java index 92a1e1016..d0819dfc3 100644 --- a/nostr-java-api/src/main/java/nostr/api/NIP01.java +++ b/nostr-java-api/src/main/java/nostr/api/NIP01.java @@ -42,6 +42,7 @@ import nostr.id.Identity; import java.util.List; +import java.util.Map; /** * @@ -208,7 +209,10 @@ public static Filters createFilters(List events, List a return Filters.builder() .authors(authors) .events(events) - .genericTagQuery(genericTagQuery) + .genericTagQuery( + Map.of( + genericTagQuery.getTagName(), + genericTagQuery.getValue())) .kinds(kinds).limit(limit) .referencePubKeys(referencePubKeys) .referencedEvents(referencedEvents) diff --git a/nostr-java-api/src/main/java/nostr/api/Nostr.java b/nostr-java-api/src/main/java/nostr/api/Nostr.java index 7231b7e3f..aaf4b488d 100644 --- a/nostr-java-api/src/main/java/nostr/api/Nostr.java +++ b/nostr-java-api/src/main/java/nostr/api/Nostr.java @@ -281,8 +281,7 @@ public static String encode(@NonNull List filtersList) { * @param json */ public static Filters decodeFilters(@NonNull String json) { - final var dec = new FiltersDecoder(json); - return dec.decode(); + return new FiltersDecoder<>().decode(json); } // Generic Tag Queries diff --git a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java index 90c2e546a..44272f9f3 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java @@ -1,23 +1,25 @@ - package nostr.event.impl; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import nostr.base.GenericTagQuery; +import lombok.Setter; import nostr.base.PublicKey; import nostr.base.annotation.Key; import nostr.event.Kind; -import nostr.event.json.deserializer.CustomGenericTagQueryDeserializer; -import nostr.event.json.serializer.CustomGenericTagQuerySerializer; import nostr.event.json.serializer.CustomIdEventListSerializer; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; /** * @@ -61,7 +63,17 @@ public class Filters { private Integer limit; @Key(nip = 12) - @JsonSerialize(using=CustomGenericTagQuerySerializer.class) - @JsonDeserialize(using=CustomGenericTagQueryDeserializer.class) - private GenericTagQuery genericTagQuery; + @Setter(AccessLevel.NONE) + private Map> genericTagQuery; + + @JsonAnyGetter + public Map> getGenericTagQuery() { + return genericTagQuery; + } + + @JsonAnySetter + public void setGenericTagQuery(String key, List value) { + this.genericTagQuery = Optional.ofNullable(genericTagQuery).orElse(new HashMap<>()); + this.genericTagQuery.put(key, value); + } } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java index 17c26ff61..48160a18b 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FDecoder.java @@ -1,5 +1,5 @@ package nostr.event.json.codec; -public interface FDecoder { - Filters decode(); +public interface FDecoder { + T decode(String str); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java index 0001c44eb..b957d1c00 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersDecoder.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; +import lombok.NonNull; import nostr.event.impl.Filters; /** @@ -10,17 +11,11 @@ * @author eric */ @Data -public class FiltersDecoder implements FDecoder { - private final Class clazz; - private final String jsonString; - - public FiltersDecoder(String jsonString) { - this.clazz = Filters.class; - this.jsonString = jsonString; - } +public class FiltersDecoder implements FDecoder { + private final Class clazz = (Class)Filters.class; @Override - public Filters decode() { + public T decode(@NonNull String jsonString) { try { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(jsonString, clazz); diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java deleted file mode 100644 index aec013598..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersListDecoder.java +++ /dev/null @@ -1,26 +0,0 @@ -package nostr.event.json.codec; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.Data; -import nostr.event.impl.Filters; - -@Data -public class FiltersListDecoder implements FDecoder { - private final Class clazz; - private final String jsonString; - - public FiltersListDecoder(String jsonString) { - this.clazz = Filters.class; - this.jsonString = jsonString; - } - - public Filters decode() { - try { - ObjectMapper mapper = new ObjectMapper(); - return mapper.readValue(jsonString, clazz); - } catch (JsonProcessingException ex) { - throw new RuntimeException(ex); - } - } -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java deleted file mode 100644 index efd32285a..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/GenericTagQueryDecoder.java +++ /dev/null @@ -1,25 +0,0 @@ -package nostr.event.json.codec; - -import lombok.Data; -import nostr.base.GenericTagQuery; - -/** - * - * @author eric - */ -@Data -public class GenericTagQueryDecoder implements FDecoder { - private final Class clazz; - private final String json; - - public GenericTagQueryDecoder(String json) { - this.clazz = (Class) GenericTagQuery.class; - this.json = json; - } - - @Override - public T decode() { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody - } - -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java deleted file mode 100644 index ceedc2da9..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomFiltersListDeserializer.java +++ /dev/null @@ -1,47 +0,0 @@ -package nostr.event.json.deserializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.NoArgsConstructor; -import lombok.NonNull; -import nostr.event.impl.Filters; -import nostr.event.json.codec.FiltersDecoder; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -@NoArgsConstructor -public class CustomFiltersListDeserializer extends JsonDeserializer> { - @Override - public List deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException { - JsonNode node = jsonParser.readValueAsTree(); - return parseJson(node.toString()); - } - - public List parseJson(@NonNull String jsonString) throws IOException { - if (!jsonString.startsWith("[")) { - jsonString = "[" + jsonString.trim(); - } - if (!jsonString.endsWith("]")) { - jsonString = jsonString + "]"; - } - - List filtersList = new ArrayList<>(); - ObjectMapper mapper = new ObjectMapper(); - JsonNode rootNode = mapper.readTree(jsonString); - Iterator elementsIterator = rootNode.elements(); - while (elementsIterator.hasNext()) { - JsonNode element = elementsIterator.next(); - String strFilters = element.toString(); - FiltersDecoder decoder = new FiltersDecoder(strFilters); - filtersList.add(decoder.decode()); - } - - return filtersList; - } -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java deleted file mode 100644 index 30ba5d10f..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java +++ /dev/null @@ -1,37 +0,0 @@ -package nostr.event.json.deserializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import nostr.base.GenericTagQuery; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -public class CustomGenericTagQueryDeserializer extends JsonDeserializer { - - @Override - public GenericTagQuery deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser); - - var genericTagQuery = new GenericTagQuery(); - - Iterator> fields = rootNode.fields(); - if (fields.hasNext()) { - Map.Entry field = fields.next(); - String tagName = field.getKey(); - JsonNode valuesNode = field.getValue(); - List values = objectMapper.convertValue(valuesNode, ArrayList.class); - genericTagQuery.setTagName(tagName); // Assuming tagName is always a single character preceded by '#' - genericTagQuery.setValue(values); - } - - return genericTagQuery; - } -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java deleted file mode 100644 index 891cf0d4e..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryListDeserializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package nostr.event.json.deserializer; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import lombok.NoArgsConstructor; -import nostr.base.GenericTagQuery; - -import java.util.List; - -/** - * - * @author eric - */ -@NoArgsConstructor -public class CustomGenericTagQueryListDeserializer, U extends GenericTagQuery> extends JsonDeserializer { - @Override - public T deserialize(JsonParser p, DeserializationContext ctxt) { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody - } -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java deleted file mode 100644 index 615c0c273..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java +++ /dev/null @@ -1,46 +0,0 @@ -package nostr.event.json.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.node.ObjectNode; -import nostr.base.GenericTagQuery; -import nostr.base.IEncoder; - -import java.util.List; -import java.io.IOException; - -/** - * @author guilhermegps - * - */ -public class CustomGenericTagQueryListSerializer, U extends GenericTagQuery> extends JsonSerializer { - - @Override - public void serialize(T value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeStartObject(); - for (U gtq : value) { - JsonNode node = toJson(gtq); - gen.writeObjectField(node.fieldNames().next(), node.get(node.fieldNames().next())); - } - gen.writeEndObject(); - } - - private JsonNode toJson(GenericTagQuery gtq) { - var mapper = IEncoder.MAPPER; - try { - JsonNode node = mapper.valueToTree(gtq); - ObjectNode objNode = (ObjectNode) node; - objNode.set("#" + node.get("tagName").textValue(), node.get("value")); - objNode.remove("tagName"); - objNode.remove("value"); - objNode.remove("nip"); - - return node.get("genericTagQueryList").get(0); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java deleted file mode 100644 index 155af514f..000000000 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java +++ /dev/null @@ -1,38 +0,0 @@ -package nostr.event.json.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import nostr.base.GenericTagQuery; -import nostr.base.IEncoder; - -import java.io.IOException; -import java.io.Serial; - -/** - * @author guilhermegps - */ -public class CustomGenericTagQuerySerializer extends StdSerializer { - - @Serial - private static final long serialVersionUID = 6803478463890319884L; - - public CustomGenericTagQuerySerializer() { - super(GenericTagQuery.class); - } - - @Override - public void serialize(GenericTagQuery value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - var mapper = IEncoder.MAPPER; - JsonNode node = mapper.valueToTree(value); - ObjectNode objNode = (ObjectNode) node; - String attrName = "#" + value.getTagName(); - objNode.set(attrName, node.get("value")); - objNode.remove("tagName"); - objNode.remove("value"); - - gen.writeTree(objNode); - } -} diff --git a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java index d0bc0e72a..67cfca4d6 100644 --- a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java +++ b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java @@ -29,6 +29,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Random; /** @@ -146,7 +147,15 @@ public static Filters createFilters(PublicKey publicKey) { List refEvents = new ArrayList<>(); refEvents.add(createTextNoteEvent(publicKey)); - return Filters.builder().events(eventList).referencedEvents(refEvents).genericTagQuery(createGenericTagQuery()).build(); + GenericTagQuery genericTagQuery = createGenericTagQuery(); + return Filters.builder() + .events(eventList) + .referencedEvents(refEvents) + .genericTagQuery( + Map.of( + genericTagQuery.getTagName(), + genericTagQuery.getValue())) + .build(); } public static GenericTagQuery createGenericTagQuery() { diff --git a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java index 0dd8dcef7..1b39aa879 100644 --- a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java +++ b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java @@ -4,7 +4,6 @@ import nostr.api.NIP01; import nostr.base.Command; import nostr.base.ElementAttribute; -import nostr.base.GenericTagQuery; import nostr.base.PublicKey; import nostr.crypto.bech32.Bech32; import nostr.event.BaseEvent; @@ -18,6 +17,7 @@ import nostr.event.json.codec.BaseEventEncoder; import nostr.event.json.codec.BaseMessageDecoder; import nostr.event.json.codec.BaseTagDecoder; +import nostr.event.json.codec.FiltersDecoder; import nostr.event.json.codec.FiltersEncoder; import nostr.event.json.codec.GenericEventDecoder; import nostr.event.json.codec.GenericTagDecoder; @@ -32,6 +32,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -279,10 +280,7 @@ public void testFiltersEncoder() { String new_geohash = "2vghde"; List geohashList = new ArrayList<>(); geohashList.add(new_geohash); - GenericTagQuery genericTagQuery = new GenericTagQuery(); - genericTagQuery.setTagName("g"); - genericTagQuery.setValue(geohashList); - Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + Filters filters = Filters.builder().genericTagQuery(Map.of("#g", geohashList)).build(); FiltersEncoder encoder = new FiltersEncoder(filters); String jsonMessage = encoder.encode(); @@ -290,23 +288,164 @@ public void testFiltersEncoder() { } @Test - public void testReqMessageSerializer() { - log.info("testFiltersEncoder"); + public void testReqMessageFilterListSerializer() { + log.info("testReqMessageFilterListSerializer"); String new_geohash = "2vghde"; + String second_geohash = "3abcde"; List geohashList = new ArrayList<>(); geohashList.add(new_geohash); - GenericTagQuery genericTagQuery = new GenericTagQuery(); - genericTagQuery.setTagName("g"); - genericTagQuery.setValue(geohashList); - Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + geohashList.add(second_geohash); + Filters filters = Filters.builder().genericTagQuery(Map.of("#g", geohashList)).build(); ReqMessage reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new ArrayList(List.of(filters))); assertDoesNotThrow(() -> { String jsonMessage = reqMessage.encode(); - assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]", jsonMessage); + assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\",\"3abcde\"]}]", jsonMessage); }); } -} \ No newline at end of file + @Test + public void testReqMessageFiltersDecoder() { + log.info("testReqMessageFiltersDecoder"); + + String geohashKey = "#g"; + String geohashValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + geohashKey + "\":[\"" + geohashValue + "\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + List expectedGeohashValueList = List.of(geohashValue); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValueList); + + assertEquals(expectedFilters, decodedFilters); + } + + @Test + public void testReqMessageFiltersListDecoder() { + log.info("testReqMessageFiltersListDecoder"); + + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + geohashKey + "\":[\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + assertEquals(expectedFilters, decodedFilters); + } + + @Test + public void testReqMessageDeserializer() { + log.info("testReqMessageDeserializer"); + + String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; + String geohashKey = "#g"; + String geohashValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "[\"REQ\",\"" + subscriptionId + "\",{\"" + geohashKey + "\":[\"" + geohashValue + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + List expectedGeohashValuesList = List.of(geohashValue); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); + } + + @Test + public void testReqMessageFilterListDecoder() { + log.info("testReqMessageFilterListDecoder"); + + String subscriptionId = "npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String reqJsonWithCustomTagQueryFiltersToDecode = "[\"REQ\",\"" + subscriptionId + "\",{\"" + geohashKey + "\":[\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFiltersToDecode); + + Filters expectedFilters = new Filters(); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); + } + + @Test + public void testReqMessagePopulatedFilterDecoder() { + log.info("testReqMessagePopulatedFilterDecoder"); + + String subscriptionId = "npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh"; + String kind = "1"; + String author = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String referencedEventId = "fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"; + String reqJsonWithCustomTagQueryFilterToDecode = + "[\"REQ\", " + + "\"" + subscriptionId + "\", " + + "{\"kinds\": [" + kind + "], " + + "\"authors\": [\"" + author + "\"]," + + "\"" + geohashKey + "\": [\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]," + + "\"#e\": [\"" + referencedEventId + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + expectedFilters.setKinds(List.of(Kind.TEXT_NOTE)); + expectedFilters.setAuthors(List.of(new PublicKey(author))); + expectedFilters.setReferencedEvents(List.of(new GenericEvent(referencedEventId))); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); + } + + @Test + public void testReqMessagePopulatedListOfFiltersListDecoder() { + log.info("testReqMessagePopulatedListOfFiltersListDecoder"); + + String subscriptionId = "npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh"; + String kind = "1"; + String author = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; + String geohashKey = "#g"; + String geohashValue1 = "2vghde"; + String geohashValue2 = "3abcde"; + String referencedEventId = "fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"; + String uuidKey = "#d"; + String uuidValue1 = "UUID-1"; + String uuidValue2 = "UUID-2"; + String reqJsonWithCustomTagQueryFilterToDecode = + "[\"REQ\", " + + "\"" + subscriptionId + "\", " + + "{\"kinds\": [" + kind + "], " + + "\"authors\": [\"" + author + "\"]," + + "\"" + geohashKey + "\": [\"" + geohashValue1 + "\",\"" + geohashValue2 + "\"]," + + "\"" + uuidKey + "\": [\"" + uuidValue1 + "\",\"" + uuidValue2 + "\"]," + + "\"#e\": [\"" + referencedEventId + "\"]}]"; + + ReqMessage decodedReqMessage = new BaseMessageDecoder().decode(reqJsonWithCustomTagQueryFilterToDecode); + + Filters expectedFilters = new Filters(); + expectedFilters.setKinds(List.of(Kind.TEXT_NOTE)); + expectedFilters.setAuthors(List.of(new PublicKey(author))); + expectedFilters.setReferencedEvents(List.of(new GenericEvent(referencedEventId))); + List expectedGeohashValuesList = List.of(geohashValue1, geohashValue2); + expectedFilters.setGenericTagQuery(geohashKey, expectedGeohashValuesList); + List expectedIdentityTagValuesList = List.of(uuidValue1, uuidValue2); + expectedFilters.setGenericTagQuery(uuidKey, expectedIdentityTagValuesList); + ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, expectedFilters); + assertEquals(expectedReqMessage, decodedReqMessage); + } +}