From 12770a2cb87f3aa57cd3202676fea1ea55a9a2c6 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 29 Nov 2022 10:30:27 +0100
Subject: [PATCH] Add GroupRequestHandler to messenger example

---
 .../AppCore/Groups/GroupRequestHandler.swift  | 99 +++++++++++++++++++
 1 file changed, 99 insertions(+)
 create mode 100644 Examples/xx-messenger/Sources/AppCore/Groups/GroupRequestHandler.swift

diff --git a/Examples/xx-messenger/Sources/AppCore/Groups/GroupRequestHandler.swift b/Examples/xx-messenger/Sources/AppCore/Groups/GroupRequestHandler.swift
new file mode 100644
index 00000000..7a5be6c5
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/Groups/GroupRequestHandler.swift
@@ -0,0 +1,99 @@
+import XXModels
+import XXClient
+import Foundation
+import XXMessengerClient
+import XCTestDynamicOverlay
+
+public struct GroupRequestHandler {
+  public typealias OnError = (Error) -> Void
+
+  public var run: (@escaping OnError) -> Cancellable
+
+  public func callAsFunction(onError: @escaping OnError) -> Cancellable {
+    run(onError)
+  }
+}
+
+extension GroupRequestHandler {
+  public static func live(
+    messenger: Messenger,
+    db: DBManagerGetDB
+  ) -> GroupRequestHandler {
+    GroupRequestHandler { onError in
+      messenger.registerGroupRequestHandler(.init { group in
+        do {
+          if let _ = try db().fetchGroups(.init(id: [group.getId()])).first {
+            return
+          }
+          guard let leader = try group.getMembership().first else {
+            return // Failed to get group membership/leader
+          }
+          try db().saveGroup(.init(
+            id: group.getId(),
+            name: String(data: group.getName(), encoding: .utf8)!,
+            leaderId: leader.id,
+            createdAt: Date(timeIntervalSince1970: TimeInterval(group.getCreatedMS()) / 1_000),
+            authStatus: .pending,
+            serialized: group.serialize()
+          ))
+          if let initialMessageData = group.getInitMessage(),
+             let initialMessage = String(data: initialMessageData, encoding: .utf8) {
+            try db().saveMessage(.init(
+              senderId: leader.id,
+              recipientId: nil,
+              groupId: group.getId(),
+              date: Date(timeIntervalSince1970: TimeInterval(group.getCreatedMS()) / 1_000),
+              status: .received,
+              isUnread: true,
+              text: initialMessage
+            ))
+          }
+          let members = try group.getMembership()
+          let friends = try db().fetchContacts(.init(id: Set(members.map(\.id)), authStatus: [
+            .friend, .hidden, .confirming,
+            .verified, .requested, .requesting,
+            .verificationInProgress, .requestFailed,
+            .verificationFailed, .confirmationFailed
+          ]))
+          let strangers = Set(members.map(\.id)).subtracting(Set(friends.map(\.id)))
+          try strangers.forEach {
+            if let stranger = try? db().fetchContacts(.init(id: [$0])).first {
+              print(stranger)
+            } else {
+              try db().saveContact(.init(
+                id: $0,
+                username: "Fetching...",
+                authStatus: .stranger,
+                isRecent: false,
+                isBlocked: false,
+                isBanned: false,
+                createdAt: Date(timeIntervalSince1970: TimeInterval(group.getCreatedMS()) / 1_000)
+              ))
+            }
+          }
+          try members.map {
+            XXModels.GroupMember(groupId: group.getId(), contactId: $0.id)
+          }.forEach {
+            try db().saveGroupMember($0)
+          }
+          let lookupResult = try messenger.lookupContacts(ids: strangers.map { $0 })
+          for user in lookupResult.contacts {
+            if var foo = try? db().fetchContacts(.init(id: [user.getId()])).first,
+               let username = try? user.getFact(.username)?.value {
+              foo.username = username
+              _ = try? db().saveContact(foo)
+            }
+          }
+        } catch {
+          onError(error)
+        }
+      })
+    }
+  }
+}
+
+extension GroupRequestHandler {
+  public static let unimplemented = GroupRequestHandler(
+    run: XCTestDynamicOverlay.unimplemented("\(Self.self)", placeholder: Cancellable {})
+  )
+}
-- 
GitLab