MongoView/MongoView/MongoController.swift

79 lines
1.9 KiB
Swift

//
// 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<BSONDocument> {
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
}
}