From be6814ec8e0883153d23cc423c833a3ee478bcd8 Mon Sep 17 00:00:00 2001
From: Koen <koen@pop-os.localdomain>
Date: Mon, 12 Jun 2023 15:55:13 +0200
Subject: [PATCH] Added better error messages. Fixed storage type event
 handling for SQLite storage. Added new URLInfo structure.

---
 .../com/futo/polycentric/core/ApiMethods.kt   | 28 ++++++++++---------
 .../com/futo/polycentric/core/SqlLiteStore.kt | 15 ++++++++--
 .../futo/polycentric/protos/protocol.proto    | 17 +++++++++--
 3 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/app/src/main/java/com/futo/polycentric/core/ApiMethods.kt b/app/src/main/java/com/futo/polycentric/core/ApiMethods.kt
index 4755868..b818b22 100644
--- a/app/src/main/java/com/futo/polycentric/core/ApiMethods.kt
+++ b/app/src/main/java/com/futo/polycentric/core/ApiMethods.kt
@@ -13,6 +13,8 @@ import userpackage.Protocol
 //TODO: The protobuf requirements here results in lots of memory being copied, can it be avoided?
 class ApiMethods {
     companion object {
+        private const val TAG = "ApiMethods"
+
         fun postEvents(server: String, events: Protocol.Events) {
             val (_, response, result) = "$server/events".httpPost()
                 .header(Headers.CONTENT_TYPE, "application/octet-stream")
@@ -20,7 +22,7 @@ class ApiMethods {
                 .response()
 
             if (!response.isSuccessful) {
-                val formattedMessage = "Posting events to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
+                val formattedMessage = "postEvents to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
                 throw Exception(formattedMessage)
             }
         }
@@ -28,14 +30,14 @@ class ApiMethods {
         fun getRanges(server: String, system: Protocol.PublicKey): Protocol.RangesForSystem {
             val systemQuery = encode(system.toByteArray())
             val path = "/ranges?system=$systemQuery"
-            Log.i("TEST", "$server$path")
             val (_, response, result) = "$server$path".httpGet()
                 .header(Headers.CONTENT_TYPE, "application/octet-stream").response()
 
-            Log.i("TEST", "Response $response")
+            Log.i(TAG, "getRanges $path")
+
             if (!response.isSuccessful) {
-                val errorMessage = result.fold({ it.decodeToString() }, { "getRanges !ok" })
-                throw Exception(errorMessage)
+                val formattedMessage = "getRanges to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
+                throw Exception(formattedMessage)
             }
 
             return Protocol.RangesForSystem.parseFrom(result.get())
@@ -51,8 +53,8 @@ class ApiMethods {
                 .response()
 
             if (!response.isSuccessful) {
-                val errorMessage = result.fold({ it.decodeToString() }, { "getEvents !ok" })
-                throw Exception(errorMessage)
+                val formattedMessage = "getEvents to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
+                throw Exception(formattedMessage)
             }
 
             return Protocol.Events.parseFrom(result.get())
@@ -68,8 +70,8 @@ class ApiMethods {
                 .response()
 
             if (!response.isSuccessful) {
-                val errorMessage = result.fold({ it.decodeToString() }, { "getResolveClaim !ok" })
-                throw Exception(errorMessage)
+                val formattedMessage = "getResolveClaim to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
+                throw Exception(formattedMessage)
             }
 
             return Protocol.Events.parseFrom(result.get())
@@ -90,8 +92,8 @@ class ApiMethods {
                 .response()
 
             if (!response.isSuccessful) {
-                val errorMessage = result.fold({ it.decodeToString() }, { "getQueryIndex !ok" })
-                throw Exception(errorMessage)
+                val formattedMessage = "getQueryIndex to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
+                throw Exception(formattedMessage)
             }
 
             return Protocol.Events.parseFrom(result.get())
@@ -112,8 +114,8 @@ class ApiMethods {
                 .response()
 
             if (!response.isSuccessful) {
-                val errorMessage = result.fold({ it.decodeToString() }, { "getQueryReferences !ok" })
-                throw Exception(errorMessage)
+                val formattedMessage = "getQueryReferences to $server failed with status code ${response.statusCode}. Response body: ${response.body().toByteArray().decodeToString()}"
+                throw Exception(formattedMessage)
             }
 
             return Protocol.QueryReferencesResponse.parseFrom(result.get())
diff --git a/app/src/main/java/com/futo/polycentric/core/SqlLiteStore.kt b/app/src/main/java/com/futo/polycentric/core/SqlLiteStore.kt
index a2d63ac..59daa13 100644
--- a/app/src/main/java/com/futo/polycentric/core/SqlLiteStore.kt
+++ b/app/src/main/java/com/futo/polycentric/core/SqlLiteStore.kt
@@ -73,7 +73,12 @@ class SqlLiteStore(private val _db: SqlLiteDbHelper) : Store() {
         }
 
         if (value != null) {
-            return SignedEvent.fromProto(Protocol.SignedEvent.parseFrom(value))
+            val storageTypeEvent = Protocol.StorageTypeEvent.parseFrom(value)
+            if (!storageTypeEvent.hasEvent()) {
+                return null
+            }
+
+            return SignedEvent.fromProto(storageTypeEvent.event)
         }
 
         return null
@@ -90,8 +95,12 @@ class SqlLiteStore(private val _db: SqlLiteDbHelper) : Store() {
 
             do {
                 val value = it.getBlob(0);
-                val se = SignedEvent.fromProto(Protocol.SignedEvent.parseFrom(value));
-                handler(se);
+                val storageTypeEvent = Protocol.StorageTypeEvent.parseFrom(value)
+                if (!storageTypeEvent.hasEvent()) {
+                    continue
+                }
+
+                handler(SignedEvent.fromProto(storageTypeEvent.event));
             } while (it.moveToNext());
         }
     }
diff --git a/app/src/main/proto/com/futo/polycentric/protos/protocol.proto b/app/src/main/proto/com/futo/polycentric/protos/protocol.proto
index 4530b8d..739628d 100644
--- a/app/src/main/proto/com/futo/polycentric/protos/protocol.proto
+++ b/app/src/main/proto/com/futo/polycentric/protos/protocol.proto
@@ -107,9 +107,22 @@ message RangesForSystem {
 }
 
 message URLInfo {
+    // url_type 1 = URLInfoSystemLink
+    // url_type 2 = URLInfoEventLink
+    // url_type 3 = ExportBundle
+    uint64 url_type = 1;
+    bytes  body     = 2;
+}
+
+message URLInfoSystemLink {
+             PublicKey system  = 1;
+    repeated string    servers = 2;
+}
+
+message URLInfoEventLink {
              PublicKey system        = 1;
-    optional Process   process       = 2;
-    optional uint64    logical_clock = 3;
+             Process   process       = 2;
+             uint64    logical_clock = 3;
     repeated string    servers       = 4;
 }
 
-- 
GitLab