diff --git a/api/src/main/java/com/readrops/api/services/fever/adapters/FeverItemsAdapter.kt b/api/src/main/java/com/readrops/api/services/fever/adapters/FeverItemsAdapter.kt new file mode 100644 index 00000000..a34f9a31 --- /dev/null +++ b/api/src/main/java/com/readrops/api/services/fever/adapters/FeverItemsAdapter.kt @@ -0,0 +1,73 @@ +package com.readrops.api.services.fever.adapters + +import android.annotation.SuppressLint +import com.readrops.api.utils.exceptions.ParseException +import com.readrops.api.utils.extensions.nextNonEmptyString +import com.readrops.api.utils.extensions.nextNullableString +import com.readrops.api.utils.extensions.skipField +import com.readrops.api.utils.extensions.toBoolean +import com.readrops.db.entities.Item +import com.squareup.moshi.FromJson +import com.squareup.moshi.JsonReader +import com.squareup.moshi.ToJson +import org.joda.time.LocalDateTime + +class FeverItemsAdapter { + + @ToJson + fun toJson(items: List) = "" + + @SuppressLint("CheckResult") + @FromJson + fun fromJson(reader: JsonReader): List = with(reader) { + return try { + val items = arrayListOf() + + beginObject() + + repeat(4) { + skipField() + } + + nextName() // beginning of items array + beginArray() + + while (hasNext()) { + beginObject() + + val item = Item() + while (hasNext()) { + with(item) { + when (selectName(NAMES)) { + 0 -> remoteId = nextNonEmptyString() + 1 -> feedRemoteId = nextInt().toString() + 2 -> title = nextNonEmptyString() + 3 -> author = nextNullableString() + 4 -> content = nextNullableString() + 5 -> link = nextNullableString() + 6 -> isRead = nextInt().toBoolean() + 7 -> pubDate = LocalDateTime(nextLong() * 1000L) + else -> skipValue() + } + } + } + + items += item + endObject() + } + + endArray() + + items + } catch (e: Exception) { + throw ParseException(e.message) + } + } + + companion object { + val NAMES: JsonReader.Options = JsonReader.Options.of( + "id", "feed_id", "title", "author", "html", "url", + "is_read", "created_on_time" + ) + } +} \ No newline at end of file diff --git a/api/src/main/java/com/readrops/api/utils/extensions/JsonReaderExtensions.kt b/api/src/main/java/com/readrops/api/utils/extensions/JsonReaderExtensions.kt index d634a711..0d160269 100644 --- a/api/src/main/java/com/readrops/api/utils/extensions/JsonReaderExtensions.kt +++ b/api/src/main/java/com/readrops/api/utils/extensions/JsonReaderExtensions.kt @@ -24,3 +24,5 @@ fun JsonReader.skipToEnd() { skipField() } } + +fun Int.toBoolean(): Boolean = this == 1 diff --git a/api/src/test/java/com/readrops/api/services/fever/adapters/FeverItemsAdapterTest.kt b/api/src/test/java/com/readrops/api/services/fever/adapters/FeverItemsAdapterTest.kt new file mode 100644 index 00000000..42e1cff4 --- /dev/null +++ b/api/src/test/java/com/readrops/api/services/fever/adapters/FeverItemsAdapterTest.kt @@ -0,0 +1,36 @@ +package com.readrops.api.services.fever.adapters + +import com.readrops.api.TestUtils +import com.readrops.db.entities.Item +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types +import okio.Buffer +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +class FeverItemsAdapterTest { + + private val adapter = Moshi.Builder() + .add(FeverItemsAdapter()) + .build() + .adapter>(Types.newParameterizedType(List::class.java, Item::class.java)) + + @Test + fun validItemsTest() { + val stream = TestUtils.loadResource("services/fever/items.json") + + val items = adapter.fromJson(Buffer().readFrom(stream))!! + + with(items[0]) { + assertEquals(title, "FreshRSS 1.9.0") + assertEquals(author, "Alkarex") + assertEquals(link, "https://github.com/FreshRSS/FreshRSS/releases/tag/1.9.0") + assertNotNull(content) + assertEquals(isRead, true) + assertNotNull(pubDate) + assertEquals(remoteId, "1546007484154894") + assertEquals(feedRemoteId, "2") + } + } +} \ No newline at end of file diff --git a/api/src/test/resources/services/fever/items.json b/api/src/test/resources/services/fever/items.json new file mode 100644 index 00000000..1dc2e138 --- /dev/null +++ b/api/src/test/resources/services/fever/items.json @@ -0,0 +1,19 @@ +{ + "api_version": 3, + "auth": 1, + "last_refreshed_on_time": 1635849601, + "total_items": 10814, + "items": [ + { + "id": "1546007484154894", + "feed_id": 2, + "title": "FreshRSS 1.9.0", + "author": "Alkarex", + "html": "\n