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 91d8ec518e708d7e42cd5ebdaf2a28dfdd149230..97d2793271837b53377874a79330bb2e69a60212 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 510343d5bcbdc5e5f9bcfaa42fa0fb13465593eb..a651c59b6e0f37979d6f22565dc1147631736fc9 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 33a9bbe6f3bc6af01411f8116e6d1befdad162d4..27353c642f747c48a6e14fab26e41e57130889dc 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) } } }