// // MongoController.swift // MongoView // // Created by Shadowfacts on 1/8/20. // Copyright © 2020 Shadowfacts. All rights reserved. // import Foundation import MongoSwift import NIO import Combine class MongoController { let connectionString: String var group: EventLoopGroup! var client: MongoClient! @Published var statusManager = StatusManager() @Published private(set) var status: ConnectionStatus { didSet { statusManager.set(messageFor(status: status), for: .connection) } } init(connectionString: String) { self.connectionString = connectionString self.status = .connecting self.statusManager.set(messageFor(status: .connecting), for: .connection) } deinit { try! group.syncShutdownGracefully() cleanupMongoSwift() } func setup() { print("setting up mongo") group = MultiThreadedEventLoopGroup(numberOfThreads: 1) do { client = try MongoClient(connectionString, using: group) status = .connected } catch { status = .failed print("Failed to connect to Mongo: \(error)") } } func db(for collection: DatabaseCollection) -> MongoDatabase { return client.db(collection.database) } func collection(_ collection: DatabaseCollection) -> MongoCollection { return db(for: collection).collection(collection.name) } private func messageFor(status: ConnectionStatus) -> String { switch status { case .connecting: return "Connecting..." case .connected: return "Connected to \(connectionString)" case .failed: return "Failed to connect" } } } extension MongoController { enum ConnectionStatus { case connecting, connected, failed } }