From f9bde9bdc07defa302de8e2a42c81c5731494d9c Mon Sep 17 00:00:00 2001
From: Harpo Roeder <roederharpo@protonmail.ch>
Date: Wed, 23 Aug 2023 14:55:04 -0500
Subject: [PATCH] add authority event

---
 .../java/com/futo/polycentric/core/Models.kt  |  4 +-
 .../futo/polycentric/core/ProcessHandle.kt    | 59 ++++++++++++-------
 .../com/futo/polycentric/core/SystemState.kt  | 19 +++++-
 3 files changed, 57 insertions(+), 25 deletions(-)

diff --git a/app/src/main/java/com/futo/polycentric/core/Models.kt b/app/src/main/java/com/futo/polycentric/core/Models.kt
index 91d8ec5..97d2793 100644
--- a/app/src/main/java/com/futo/polycentric/core/Models.kt
+++ b/app/src/main/java/com/futo/polycentric/core/Models.kt
@@ -21,7 +21,8 @@ enum class ContentType(val value: Long) {
     CLAIM(12),
     BANNER(13),
     OPINION(14),
-    STORE(15)
+    STORE(15),
+    AUTHORITY(16)
 }
 
 enum class ClaimType(val value: Long) {
@@ -52,7 +53,6 @@ enum class ClaimType(val value: Long) {
     POLYCENTRIC(25)
 }
 
-
 class Blob(val mime: String, val content: ByteArray) { }
 @Serializable
 class Digest(val digestType: Long, @Serializable(with = ByteArraySerializer::class) val digest: ByteArray) {
diff --git a/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt b/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt
index 510343d..a651c59 100644
--- a/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt
+++ b/app/src/main/java/com/futo/polycentric/core/ProcessHandle.kt
@@ -56,6 +56,21 @@ class ProcessHandle constructor(
         )
     }
 
+    fun setCRDTElementSetItem(contentType: Long, value: ByteArray, operation: LWWElementSetOperation): Pointer {
+        return publish(
+            contentType,
+            ByteArray(0),
+            LWWElementSet(
+                operation,
+                value,
+                Date().time
+            ),
+            null,
+            mutableListOf()
+        )
+
+    }
+
     fun setUsername(username: String): Pointer {
         return setCRDTItem(
             ContentType.USERNAME.value,
@@ -92,31 +107,35 @@ class ProcessHandle constructor(
     }
 
     fun addServer(server: String): Pointer {
-        return publish(
+        return setCRDTElementSetItem(
             ContentType.SERVER.value,
-            ByteArray(0),
-            LWWElementSet(
-                LWWElementSetOperation.ADD,
-                server.toByteArray(),
-                Date().time
-            ),
-            null,
-            mutableListOf()
-        )
+            server.toByteArray(),
+            LWWElementSetOperation.ADD
+        );
     }
 
     fun removeServer(server: String): Pointer {
-        return publish(
+        return setCRDTElementSetItem(
             ContentType.SERVER.value,
-            ByteArray(0),
-            LWWElementSet(
-                LWWElementSetOperation.REMOVE,
-                server.toByteArray(),
-                Date().time
-            ),
-            null,
-            mutableListOf()
-        )
+            server.toByteArray(),
+            LWWElementSetOperation.REMOVE
+        );
+    }
+
+    fun addAuthority(server: String): Pointer {
+        return setCRDTElementSetItem(
+            ContentType.AUTHORITY.value,
+            server.toByteArray(),
+            LWWElementSetOperation.ADD
+        );
+    }
+
+    fun removeAuthority(server: String): Pointer {
+        return setCRDTElementSetItem(
+            ContentType.AUTHORITY.value,
+            server.toByteArray(),
+            LWWElementSetOperation.REMOVE
+        );
     }
 
     fun vouch(pointer: Pointer): Pointer {
diff --git a/app/src/main/java/com/futo/polycentric/core/SystemState.kt b/app/src/main/java/com/futo/polycentric/core/SystemState.kt
index 33a9bbe..27353c6 100644
--- a/app/src/main/java/com/futo/polycentric/core/SystemState.kt
+++ b/app/src/main/java/com/futo/polycentric/core/SystemState.kt
@@ -7,6 +7,7 @@ import userpackage.Protocol
 @Serializable
 class SystemState(
     val servers: Array<String>,
+    val authorities: Array<String>,
     val processes: Array<Process>,
     val username: String,
     val description: String,
@@ -21,8 +22,20 @@ class SystemState(
     companion object {
         fun fromStorageTypeSystemState(proto: StorageTypeSystemState): SystemState {
             val servers = mutableListOf<String>()
-            proto.crdtSetItems.filter { item -> item.contentType == ContentType.SERVER.value && item.operation == LWWElementSetOperation.ADD }
-                .forEach { servers.add(it.value.decodeToString()) }
+            val authorities = mutableListOf<String>()
+
+            proto.crdtSetItems.forEach { item ->
+                if (item.operation == LWWElementSetOperation.ADD) {
+                    when (item.contentType) {
+                        ContentType.SERVER.value -> {
+                            servers.add(item.value.decodeToString())
+                        }
+                        ContentType.AUTHORITY.value -> {
+                            authorities.add(item.value.decodeToString())
+                        }
+                    }
+                }
+            }
 
             val processes = mutableListOf<Process>()
             proto.processes.forEach { processes.add(it) }
@@ -52,7 +65,7 @@ class SystemState(
                 }
             }
 
-            return SystemState(servers.toTypedArray(), processes.toTypedArray(), username, description, store, avatar, banner)
+            return SystemState(servers.toTypedArray(), authorities.toTypedArray(), processes.toTypedArray(), username, description, store, avatar, banner)
         }
     }
 }
-- 
GitLab