Refactor to remove redundancies

This commit is contained in:
Patrick McDonagh
2018-05-29 20:58:07 -05:00
parent 53ddf1b15e
commit 84af67cb1a
13 changed files with 839 additions and 706 deletions

View File

@@ -7,6 +7,9 @@
//
import UIKit
import PromiseKit
import Alamofire
import SwiftyJSON
import RealmSwift
@UIApplicationMain
@@ -14,21 +17,212 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let baseURL : String = "https://henrypump.meshify.com/api/v3"
var user : User?
let channelDataTypes: [Int : String] = [
0: "Unknown",
1: "Float",
2: "String",
3: "Integer",
4: "Boolean",
5: "DateTime",
6: "Timespan",
7 :"File",
8: "LatLng"
]
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Chameleon.setGlobalThemeUsingPrimaryColor(UIColor.flatSkyBlue(), with: UIContentStyle.contrast)
// print(Realm.Configuration.defaultConfiguration.fileURL)
//
// do {
// _ = try Realm()
// } catch {
// print("Error initializing Realm: \(error)")
// }
//
return true
}
//MARK: - Data Methods
// func getAddresses() ->Promise<Any> {
// let realm = try! Realm()
// let url = "\(baseURL)/addresses"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
// return Promise { promise in
// Alamofire.request(url, method: .get, headers: headers)
// .validate()
// .responseJSON { response in
// switch response.result {
//
// case .success:
// let addressesJSON : JSON = JSON(response.result.value!)
// for(_, json) : (String, JSON) in addressesJSON {
// do {
// try realm.write {
// let addr = Address()
// addr.id = json["id"].intValue
// addr.apartment = json["id"].stringValue
// addr.city = json["city"].stringValue
// addr.country = json["country"].stringValue
// addr.lat = json["lat"].doubleValue
// addr.long = json["long"].doubleValue
// addr.state = json["state"].stringValue
// addr.street1 = json["street1"].stringValue
// addr.street2 = json["street2"].stringValue
// addr.zip = json["zip"].stringValue
// addr.zoneId = json["zoneid"].intValue
// realm.add(addr, update: true)
// }
// } catch {
// promise.reject(error)
// }
// }
// promise.fulfill(true)
// case .failure(let error):
// promise.reject(error)
// }
// }
// }
//
// }
//
// func getDevices(gateways : Results<Gateway>, deviceTypes : Results<DeviceType>) ->Promise<Any> {
// let realm = try! Realm()
// let url = "\(baseURL)/devices"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
// return Promise { promise in
// Alamofire.request(url, method: .get, headers: headers)
// .validate()
// .responseJSON { response in
//
// switch response.result {
//
// case .success:
// let devicesJSON : JSON = JSON(response.result.value!)
// for(_, json) : (String, JSON) in devicesJSON {
// do {
// try realm.write {
// let dev = Device()
// dev.companyId = json["companyId"].intValue
// dev.deviceTypeId = json["deviceTypeId"].intValue
// dev.gatewayId = json["gatewayId"].intValue
// dev.id = json["id"].intValue
// dev.macAddress = json["macAddress"].stringValue
// dev.techName = json["techname"].stringValue
// dev.tenantId = json["tenantId"].intValue
// dev.vanityName = json["vanityName"].stringValue
//
// let pGateway = gateways.filter("id == %d", dev.gatewayId).first
// let pDeviceType = deviceTypes.filter("id == %d", dev.deviceTypeId).first
//
// realm.add(dev, update: true)
// pGateway?.devices.append(dev)
// pDeviceType?.devices.append(dev)
// }
// } catch {
// promise.reject(error)
// }
// }
// promise.fulfill(true)
// case .failure(let error):
// promise.reject(error)
// }
// }
// }
//
// }
//
// func getGateways(addresses : Results<Address>) -> Promise<Any> {
//
// let realm = try! Realm()
// let url = "\(baseURL)/gateways"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
// return Promise { promise in
// Alamofire.request(url, method: .get, headers: headers)
// .responseJSON { response in
// switch response.result {
//
// case .success:
// let gatewaysJSON : JSON = JSON(response.result.value!)
// for(_, json) : (String, JSON) in gatewaysJSON {
//
// do {
// try realm.write {
// let gtw = Gateway()
// gtw.addressId = json["addressId"].intValue
// gtw.companyId = json["companyId"].intValue
// gtw.diaVersion = json["diaVersion"].stringValue
// gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
// gtw.gatewayTypeId = json["gatewayTypeId"].intValue
// gtw.id = json["id"].intValue
// gtw.macAddress = json["macAddress"].stringValue
// gtw.name = json["name"].stringValue
// gtw.panId = json["panId"].stringValue
// gtw.tenantId = json["tenantId"].intValue
// gtw.userId = json["userId"].intValue
//
// let associatedAddress = addresses.filter("id == %d", gtw.addressId).first
//
// gtw.address = associatedAddress
// realm.add(gtw, update: true)
// }
// } catch {
// promise.reject(error)
// }
// }
// promise.fulfill(true)
// case .failure(let error):
// promise.reject(error)
// }
// }
// }
// }
//
//
// func getDeviceTypes() -> Promise<Any> {
// let realm = try! Realm()
// let url = "\(baseURL)/devicetypes"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
// return Promise { promise in
// Alamofire.request(url, method: .get, headers: headers)
// .responseJSON { response in
// switch response.result {
//
// case .success:
// let deviceTypesJson : JSON = JSON(response.result.value!)
// for(_, json) : (String, JSON) in deviceTypesJson {
// do {
// try realm.write {
// let dt = DeviceType()
// dt.companyId = json["CompanyId"].intValue
// dt.id = json["id"].intValue
// dt.imgUrl = json["imgUrl"].stringValue
// dt.name = json["name"].stringValue
// dt.note = json["note"].stringValue
// dt.tenantId = json["tenantId"].intValue
// dt.vanityName = json["vanityName"].stringValue
// realm.add(dt, update: true)
// }
// } catch {
// promise.reject(error)
// }
// }
// promise.fulfill(true)
// case .failure(let error):
// promise.reject(error)
// }
// }
// }
// }
}

View File

@@ -15,30 +15,16 @@ import SVProgressHUD
class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let realm = try! Realm()
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
let user = (UIApplication.shared.delegate as! AppDelegate).user
let channelDataTypes = (UIApplication.shared.delegate as! AppDelegate).channelDataTypes
let formatter = DateFormatter()
var user : User?
var thisDevice : Device?
var thisChannel : Channel?
var channelHistory : [ChannelHistoryValue] = [ChannelHistoryValue]()
let channelDataTypes: [Int : String] = [
0: "Unknown",
1: "Float",
2: "String",
3: "Integer",
4: "Boolean",
5: "DateTime",
6: "Timespan",
7 :"File",
8: "LatLng"
]
@IBOutlet weak var deviceNameLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var helpDescriptionLabel: UILabel!
@@ -57,8 +43,9 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
setupChannelDisplay()
SVProgressHUD.show()
firstly {
getChannelHistory()
}.done { _ in
getChannelHistory(deviceId: (self.thisDevice?.id)!, channelId: (self.thisChannel?.id)!, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done { (hist) in
self.channelHistory = hist
self.historyTableView.reloadData()
SVProgressHUD.dismiss()
}.catch { error in
@@ -70,7 +57,6 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
if segue.identifier == "openHistoryGraph" {
let destinationVC = segue.destination as! HistoryGraphViewController
destinationVC.channelHistory = channelHistory
destinationVC.user = user
destinationVC.thisChannel = thisChannel
}
}
@@ -112,10 +98,11 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
// what will happen once the user clicks the add item button on our UIAlert
SVProgressHUD.show()
firstly {
self.writeChannelValue(value: textField.text!)
writeChannelValue(deviceId: (self.thisDevice?.id)!, channelName: (self.thisChannel?.name)!, value: textField.text!, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then{ _ in
self.getChannelHistory()
}.done { _ in
getChannelHistory(deviceId: (self.thisDevice?.id)!, channelId: (self.thisChannel?.id)!, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done { (hist) in
self.channelHistory = hist
self.historyTableView.reloadData()
SVProgressHUD.dismiss()
}.catch { error in
@@ -134,77 +121,50 @@ class ChannelDetailViewController: UIViewController, UITableViewDelegate, UITabl
present(alert, animated: true, completion: nil)
}
func getChannelHistory() -> Promise<Any> {
let url = "\(baseURL)/devices/\(thisDevice!.id)/values/\(thisChannel!.id)"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { promise in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let channelHistoryJSON : JSON = JSON(response.result.value!)
self.channelHistory.removeAll()
for(_, json) : (String, JSON) in channelHistoryJSON {
let chHistVal = ChannelHistoryValue()
chHistVal.timestamp = Date(timeIntervalSince1970: Double(json["timestamp"].intValue))
chHistVal.value = json["value"].stringValue
self.channelHistory.append(chHistVal)
}
self.channelHistory.reverse()
promise.fulfill(true)
case .failure(let error):
promise.reject(error)
}
}
}
}
func writeChannelValue(value : String) -> Promise<Any> {
let timestamp: Int = Int(Date().timeIntervalSince1970)
let channelName = thisChannel?.name
var channelJson : JSON = JSON()
channelJson["name"].string = channelName
channelJson["timestamp"].int = timestamp
channelJson["value"].string = value
var listJson = JSON()
listJson.arrayObject = [channelJson]
let url = "\(baseURL)/devices/\(thisDevice!.id)/values"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { promise in
Alamofire.request(url, method: .put, parameters: [:], encoding: listJson.rawString()!, headers: headers)
.response { response in
if response.response?.statusCode == 200 {
promise.fulfill(true)
} else {
promise.reject(String(response.response!.statusCode) as! Error)
}
}
}
}
// func writeChannelValue(value : String) -> Promise<Any> {
// let timestamp: Int = Int(Date().timeIntervalSince1970)
// let channelName = thisChannel?.name
// var channelJson : JSON = JSON()
// channelJson["name"].string = channelName
// channelJson["timestamp"].int = timestamp
// channelJson["value"].string = value
//
// var listJson = JSON()
// listJson.arrayObject = [channelJson]
//
// let url = "\(baseURL)/devices/\(thisDevice!.id)/values"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
//
//
// return Promise { promise in
// Alamofire.request(url, method: .put, parameters: [:], encoding: listJson.rawString()!, headers: headers)
// .response { response in
// if response.response?.statusCode == 200 {
// promise.fulfill(true)
// } else {
// promise.reject(String(response.response!.statusCode) as! Error)
// }
// }
// }
//
// }
}
extension String: ParameterEncoding {
public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try urlRequest.asURLRequest()
request.httpBody = data(using: .utf8, allowLossyConversion: false)
return request
}
}
//extension String: ParameterEncoding {
//
// public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
// var request = try urlRequest.asURLRequest()
// request.httpBody = data(using: .utf8, allowLossyConversion: false)
// return request
// }
//
//}

View File

@@ -16,11 +16,10 @@ import SVProgressHUD
class DeviceDetailViewController: UITableViewController {
let realm = try! Realm()
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
let user = (UIApplication.shared.delegate as! AppDelegate).user
var thisDevice : Device?
var user : User?
var deviceTypes : Results<DeviceType>?
var selectedChannel : Channel?
override func viewDidLoad() {
@@ -43,9 +42,9 @@ class DeviceDetailViewController: UITableViewController {
// tableView.addSubview(refreshControl!)
firstly {
getChannels(deviceTypeId: thisDevice!.deviceTypeId)
getChannels(deviceTypeId: thisDevice!.deviceTypeId, baseURL: baseURL, authToken: (user?.authToken)!)
}.then { _ in
self.getChannelValues(deviceId: self.thisDevice!.id)
getChannelValues(deviceId: self.thisDevice!.id, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done { _ in
self.tableView.reloadData()
SVProgressHUD.dismiss()
@@ -59,9 +58,9 @@ class DeviceDetailViewController: UITableViewController {
@objc func refresh() {
SVProgressHUD.show()
firstly {
getChannels(deviceTypeId: thisDevice!.deviceTypeId)
getChannels(deviceTypeId: thisDevice!.deviceTypeId, baseURL: baseURL, authToken: (user?.authToken)!)
}.then { _ in
self.getChannelValues(deviceId: self.thisDevice!.id)
getChannelValues(deviceId: self.thisDevice!.id, baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done { _ in
self.tableView.reloadData()
SVProgressHUD.dismiss()
@@ -102,7 +101,6 @@ class DeviceDetailViewController: UITableViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToChannelView" {
let destinationVC = segue.destination as! ChannelDetailViewController
destinationVC.user = user!
destinationVC.thisDevice = thisDevice!
destinationVC.thisChannel = selectedChannel!
@@ -112,92 +110,92 @@ class DeviceDetailViewController: UITableViewController {
//MARK: - Data Methods
func getChannels(deviceTypeId: Int) -> Promise<Any> {
let url = "\(baseURL)/devicetypes/\(deviceTypeId)/channels"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let channelsJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in channelsJSON {
do {
try self.realm.write {
let ch = Channel()
ch.channelType = json["channelType"].intValue
ch.dataType = json["dataType"].intValue
ch.defaultValue = json["defaultValue"].stringValue
ch.deviceTypeId = json["deviceTypeId"].intValue
ch.fromMe = json["fromMe"].boolValue
ch.helpExplanation = json["helpExplanation"].stringValue
ch.id = json["id"].intValue
ch.io = json["io"].boolValue
ch.name = json["name"].stringValue
ch.regex = json["regex"].stringValue
ch.regexErrMsg = json["regexErrMsg"].stringValue
ch.subTitle = json["subTitle"].stringValue
let pDeviceType = self.deviceTypes?.filter("id == %d", ch.deviceTypeId).first
self.realm.add(ch, update: true)
pDeviceType?.channels.append(ch)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
// func getChannels(deviceTypeId: Int) -> Promise<Any> {
// let url = "\(baseURL)/devicetypes/\(deviceTypeId)/channels"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
// return Promise { seal in
// Alamofire.request(url, method: .get, headers: headers)
// .responseJSON { response in
// switch response.result {
//
// case .success:
// let channelsJSON : JSON = JSON(response.result.value!)
// for(_, json) : (String, JSON) in channelsJSON {
// do {
// try self.realm.write {
// let ch = Channel()
// ch.channelType = json["channelType"].intValue
// ch.dataType = json["dataType"].intValue
// ch.defaultValue = json["defaultValue"].stringValue
// ch.deviceTypeId = json["deviceTypeId"].intValue
// ch.fromMe = json["fromMe"].boolValue
// ch.helpExplanation = json["helpExplanation"].stringValue
// ch.id = json["id"].intValue
// ch.io = json["io"].boolValue
// ch.name = json["name"].stringValue
// ch.regex = json["regex"].stringValue
// ch.regexErrMsg = json["regexErrMsg"].stringValue
// ch.subTitle = json["subTitle"].stringValue
//
// let pDeviceType = self.deviceTypes?.filter("id == %d", ch.deviceTypeId).first
//
// self.realm.add(ch, update: true)
// pDeviceType?.channels.append(ch)
//
// }
// } catch {
// seal.reject(error)
// }
// }
// seal.fulfill(true)
// case .failure(let error):
// seal.reject(error)
// }
// }
// }
// }
func getChannelValues(deviceId: Int) -> Promise<Any> {
let url = "\(baseURL)/devices/\(deviceId)/values"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { prom in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let channelValJSON : JSON = JSON(response.result.value!)
for(chName, json) : (String, JSON) in channelValJSON {
do {
try self.realm.write {
let chv = ChanValue()
chv.uid = "\(deviceId).\(chName)"
chv.name = chName
chv.value = json["value"].stringValue
chv.timestamp = json["timestamp"].intValue
self.realm.add(chv, update: true)
self.thisDevice!.values.append(chv)
}
} catch {
prom.reject(error)
}
}
prom.fulfill(true)
case .failure(let error):
prom.reject(error)
}
}
}
}
// func getChannelValues(deviceId: Int) -> Promise<Any> {
// let url = "\(baseURL)/devices/\(deviceId)/values"
// let headers : HTTPHeaders = [
// "Authorization": user!.authToken
// ]
//
// return Promise { prom in
// Alamofire.request(url, method: .get, headers: headers)
// .responseJSON { response in
// switch response.result {
//
// case .success:
// let channelValJSON : JSON = JSON(response.result.value!)
//
// for(chName, json) : (String, JSON) in channelValJSON {
// do {
// try self.realm.write {
// let chv = ChanValue()
// chv.uid = "\(deviceId).\(chName)"
// chv.name = chName
// chv.value = json["value"].stringValue
// chv.timestamp = json["timestamp"].intValue
//
// self.realm.add(chv, update: true)
// self.thisDevice!.values.append(chv)
//
// }
// } catch {
// prom.reject(error)
// }
// }
// prom.fulfill(true)
// case .failure(let error):
// prom.reject(error)
// }
// }
// }
// }
func loadData() -> Promise<Void> {
return Promise { promise in

View File

@@ -16,7 +16,7 @@ import SVProgressHUD
class DeviceListViewController: UITableViewController {
let realm = try! Realm()
var user : User?
let user = (UIApplication.shared.delegate as! AppDelegate).user
var addresses : Results<Address>?
var gateways : Results<Gateway>?
var devices : Results<Device>?
@@ -49,13 +49,13 @@ class DeviceListViewController: UITableViewController {
func loadJSONData() -> Promise<Void>{
return Promise { promise in
firstly {
self.getDeviceTypes()
getDeviceTypes(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
self.getAddresses()
getAddresses(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
self.getGateways()
getGateways(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
self.getDevices()
getDevices(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done{ _ in
promise.fulfill(())
}.catch { error in
@@ -100,14 +100,8 @@ class DeviceListViewController: UITableViewController {
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openMapView" {
let destinationVC = segue.destination as! MapViewController
destinationVC.user = user!
}
if segue.identifier == "openDeviceDetailView" {
let destinationVC = segue.destination as! DeviceDetailViewController
destinationVC.user = user!
destinationVC.thisDevice = selectedDevice!
}
}
@@ -127,191 +121,6 @@ class DeviceListViewController: UITableViewController {
}
//MARK: - Data Methods
func getAddresses() ->Promise<Any> {
let url = "\(baseURL)/addresses"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.validate()
.responseJSON { response in
switch response.result {
case .success:
let addressesJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in addressesJSON {
do {
try self.realm.write {
let addr = Address()
addr.id = json["id"].intValue
addr.apartment = json["id"].stringValue
addr.city = json["city"].stringValue
addr.country = json["country"].stringValue
addr.lat = json["lat"].doubleValue
addr.long = json["long"].doubleValue
addr.state = json["state"].stringValue
addr.street1 = json["street1"].stringValue
addr.street2 = json["street2"].stringValue
addr.zip = json["zip"].stringValue
addr.zoneId = json["zoneid"].intValue
self.realm.add(addr, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getDevices() ->Promise<Any> {
let url = "\(baseURL)/devices"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.validate()
.responseJSON { response in
switch response.result {
case .success:
let devicesJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in devicesJSON {
do {
try self.realm.write {
let dev = Device()
dev.companyId = json["companyId"].intValue
dev.deviceTypeId = json["deviceTypeId"].intValue
dev.gatewayId = json["gatewayId"].intValue
dev.id = json["id"].intValue
dev.macAddress = json["macAddress"].stringValue
dev.techName = json["techname"].stringValue
dev.tenantId = json["tenantId"].intValue
dev.vanityName = json["vanityName"].stringValue
let pGateway = self.gateways?.filter("id == %d", dev.gatewayId).first
let pDeviceType = self.deviceTypes?.filter("id == %d", dev.deviceTypeId).first
self.realm.add(dev, update: true)
pGateway?.devices.append(dev)
pDeviceType?.devices.append(dev)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getGateways() -> Promise<Any> {
let url = "\(baseURL)/gateways"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let gatewaysJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in gatewaysJSON {
do {
try self.realm.write {
let gtw = Gateway()
gtw.addressId = json["addressId"].intValue
gtw.companyId = json["companyId"].intValue
gtw.diaVersion = json["diaVersion"].stringValue
gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
gtw.gatewayTypeId = json["gatewayTypeId"].intValue
gtw.id = json["id"].intValue
gtw.macAddress = json["macAddress"].stringValue
gtw.name = json["name"].stringValue
gtw.panId = json["panId"].stringValue
gtw.tenantId = json["tenantId"].intValue
gtw.userId = json["userId"].intValue
let associatedAddress = self.addresses?.filter("id == %d", gtw.addressId).first
gtw.address = associatedAddress
self.realm.add(gtw, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getDeviceTypes() -> Promise<Any> {
let url = "\(baseURL)/devicetypes"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let deviceTypesJson : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in deviceTypesJson {
do {
try self.realm.write {
let dt = DeviceType()
dt.companyId = json["CompanyId"].intValue
dt.id = json["id"].intValue
dt.imgUrl = json["imgUrl"].stringValue
dt.name = json["name"].stringValue
dt.note = json["note"].stringValue
dt.tenantId = json["tenantId"].intValue
dt.vanityName = json["vanityName"].stringValue
self.realm.add(dt, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
//MARK: - Realm Functions
func loadRealmData() -> Promise<Void> {

View File

@@ -10,25 +10,17 @@ import UIKit
import SwiftChart
class HistoryGraphViewController: UIViewController, ChartDelegate{
let user = (UIApplication.shared.delegate as! AppDelegate).user
let channelDataTypes = (UIApplication.shared.delegate as! AppDelegate).channelDataTypes
@IBOutlet weak var leftConstraint: NSLayoutConstraint!
@IBOutlet weak var lineChart: Chart!
@IBOutlet weak var label: UILabel!
var thisChannel : Channel?
var channelHistory : [ChannelHistoryValue] = [ChannelHistoryValue]()
var user : User?
var dateFormatter = DateFormatter()
let channelDataTypes: [Int : String] = [
0: "Unknown",
1: "Float",
2: "String",
3: "Integer",
4: "Boolean",
5: "DateTime",
6: "Timespan",
7 :"File",
8: "LatLng"
]
override func viewDidLoad() {
super.viewDidLoad()

View File

@@ -28,7 +28,7 @@ extension String {
class LoginViewController: UIViewController {
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
var user : User?
let user = (UIApplication.shared.delegate as! AppDelegate).user
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Auth.plist")
@@ -51,7 +51,7 @@ class LoginViewController: UIViewController {
firstly {
fetchCurrentUser(authToken: authToken)
}.done { fetchedUser in
self.user = fetchedUser
(UIApplication.shared.delegate as! AppDelegate).user = fetchedUser
self.saveAuth()
SVProgressHUD.dismiss()
SVProgressHUD.showSuccess(withStatus: "Login Success")
@@ -100,15 +100,9 @@ class LoginViewController: UIViewController {
@IBAction func logOutPressed(_ sender: UIBarButtonItem) {
user = User()
(UIApplication.shared.delegate as! AppDelegate).user = User()
saveAuth()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "logInSegue" {
let destinationVC = segue.destination as! DeviceListViewController
destinationVC.user = user
}
}
func saveAuth(){
let encoder = PropertyListEncoder()
@@ -132,7 +126,7 @@ class LoginViewController: UIViewController {
firstly {
fetchCurrentUser(authToken: storedUser.authToken)
}.done { currentUser in
self.user = currentUser
(UIApplication.shared.delegate as! AppDelegate).user = currentUser
SVProgressHUD.dismiss()
SVProgressHUD.showSuccess(withStatus: "Found User!")
self.performSegue(withIdentifier: "logInSegue", sender: nil)

View File

@@ -17,8 +17,8 @@ import SVProgressHUD
class MapDetailViewController: UIViewController, MKMapViewDelegate, UITableViewDataSource, UITableViewDelegate {
let baseURL = (UIApplication.shared.delegate as! AppDelegate).baseURL
let realm = try! Realm()
let user = (UIApplication.shared.delegate as! AppDelegate).user
var user : User?
var gateway: Gateway?
var devices : Results<Device>?
var selectedDevice : Device?
@@ -113,7 +113,6 @@ class MapDetailViewController: UIViewController, MKMapViewDelegate, UITableViewD
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openDeviceDetailView" {
let destinationVC = segue.destination as! DeviceDetailViewController
destinationVC.user = user!
destinationVC.thisDevice = selectedDevice!
}
}

View File

@@ -20,10 +20,8 @@ class MapViewController: UIViewController, MKMapViewDelegate {
let realm = try! Realm()
let locationManager = CLLocationManager()
let user = (UIApplication.shared.delegate as! AppDelegate).user
var user : User?
var addresses : Results<Address>?
var gateways : Results<Gateway>?
var devices : Results<Device>?
@@ -42,13 +40,13 @@ class MapViewController: UIViewController, MKMapViewDelegate {
SVProgressHUD.show()
loadData()
firstly {
getDeviceTypes()
getDeviceTypes(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
self.getAddresses()
getAddresses(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
self.getGateways()
getGateways(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.then { _ in
self.getDevices()
getDevices(baseURL: self.baseURL, authToken: (self.user?.authToken)!)
}.done { _ in
self.showMarkersOnMap()
SVProgressHUD.dismiss()
@@ -111,201 +109,10 @@ class MapViewController: UIViewController, MKMapViewDelegate {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openDetailView" {
let destinationVC = segue.destination as! MapDetailViewController
destinationVC.user = user!
destinationVC.gateway = selectedGateway
}
if segue.identifier == "openListView" {
let destinationVC = segue.destination as! DeviceListViewController
destinationVC.user = user!
}
}
//MARK: - Data Methods
func getAddresses() ->Promise<Any> {
let url = "\(baseURL)/addresses"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.validate()
.responseJSON { response in
switch response.result {
case .success:
let addressesJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in addressesJSON {
do {
try self.realm.write {
let addr = Address()
addr.id = json["id"].intValue
addr.apartment = json["apartment"].stringValue
addr.city = json["city"].stringValue
addr.country = json["country"].stringValue
addr.lat = json["lat"].doubleValue
addr.long = json["long"].doubleValue
addr.state = json["state"].stringValue
addr.street1 = json["street1"].stringValue
addr.street2 = json["street2"].stringValue
addr.zip = json["zip"].stringValue
addr.zoneId = json["zoneid"].intValue
self.realm.add(addr, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getDevices() ->Promise<Any> {
let url = "\(baseURL)/devices"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.validate()
.responseJSON { response in
switch response.result {
case .success:
let devicesJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in devicesJSON {
do {
try self.realm.write {
let dev = Device()
dev.companyId = json["companyId"].intValue
dev.deviceTypeId = json["deviceTypeId"].intValue
dev.gatewayId = json["gatewayId"].intValue
dev.id = json["id"].intValue
dev.macAddress = json["macAddress"].stringValue
dev.techName = json["techname"].stringValue
dev.tenantId = json["tenantId"].intValue
dev.vanityName = json["vanityName"].stringValue
let pGateway = self.gateways?.filter("id == %d", dev.gatewayId).first
let pDeviceType = self.deviceTypes?.filter("id == %d", dev.deviceTypeId).first
self.realm.add(dev, update: true)
pGateway?.devices.append(dev)
pDeviceType?.devices.append(dev)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getGateways() -> Promise<Any> {
let url = "\(baseURL)/gateways"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let gatewaysJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in gatewaysJSON {
do {
try self.realm.write {
let gtw = Gateway()
gtw.addressId = json["addressId"].intValue
gtw.companyId = json["companyId"].intValue
gtw.diaVersion = json["diaVersion"].stringValue
gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
gtw.gatewayTypeId = json["gatewayTypeId"].intValue
gtw.id = json["id"].intValue
gtw.macAddress = json["macAddress"].stringValue
gtw.name = json["name"].stringValue
gtw.panId = json["panId"].stringValue
gtw.tenantId = json["tenantId"].intValue
gtw.userId = json["userId"].intValue
let associatedAddress = self.addresses?.filter("id == %d", gtw.addressId).first
gtw.address = associatedAddress
self.realm.add(gtw, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getDeviceTypes() -> Promise<Any> {
let url = "\(baseURL)/devicetypes"
let headers : HTTPHeaders = [
"Authorization": user!.authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let deviceTypesJson : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in deviceTypesJson {
do {
try self.realm.write {
let dt = DeviceType()
dt.companyId = json["CompanyId"].intValue
dt.id = json["id"].intValue
dt.imgUrl = json["imgUrl"].stringValue
dt.name = json["name"].stringValue
dt.note = json["note"].stringValue
dt.tenantId = json["tenantId"].intValue
dt.vanityName = json["vanityName"].stringValue
self.realm.add(dt, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
//MARK: - Realm Functions
func loadData() {

View File

@@ -0,0 +1,358 @@
//
// MeshifyFunctions.swift
// pocloud
//
// Created by Patrick McDonagh on 5/29/18.
// Copyright © 2018 patrickjmcd. All rights reserved.
//
import Foundation
import RealmSwift
import Alamofire
import SwiftyJSON
import PromiseKit
func getDeviceTypes(baseURL : String, authToken : String) -> Promise<Any> {
let realm = try! Realm()
let url = "\(baseURL)/devicetypes"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let deviceTypesJson : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in deviceTypesJson {
do {
try realm.write {
let dt = DeviceType()
dt.companyId = json["CompanyId"].intValue
dt.id = json["id"].intValue
dt.imgUrl = json["imgUrl"].stringValue
dt.name = json["name"].stringValue
dt.note = json["note"].stringValue
dt.tenantId = json["tenantId"].intValue
dt.vanityName = json["vanityName"].stringValue
realm.add(dt, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getAddresses(baseURL : String, authToken : String) ->Promise<Any> {
let realm = try! Realm()
let url = "\(baseURL)/addresses"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.validate()
.responseJSON { response in
switch response.result {
case .success:
let addressesJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in addressesJSON {
do {
try realm.write {
let addr = Address()
addr.id = json["id"].intValue
addr.apartment = json["id"].stringValue
addr.city = json["city"].stringValue
addr.country = json["country"].stringValue
addr.lat = json["lat"].doubleValue
addr.long = json["long"].doubleValue
addr.state = json["state"].stringValue
addr.street1 = json["street1"].stringValue
addr.street2 = json["street2"].stringValue
addr.zip = json["zip"].stringValue
addr.zoneId = json["zoneid"].intValue
realm.add(addr, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getGateways(baseURL : String, authToken : String) -> Promise<Any> {
let realm = try! Realm()
let url = "\(baseURL)/gateways"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let gatewaysJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in gatewaysJSON {
do {
try realm.write {
let gtw = Gateway()
gtw.addressId = json["addressId"].intValue
gtw.companyId = json["companyId"].intValue
gtw.diaVersion = json["diaVersion"].stringValue
gtw.gatewayConfigurationId = json["gatewayConfigurationId"].intValue
gtw.gatewayTypeId = json["gatewayTypeId"].intValue
gtw.id = json["id"].intValue
gtw.macAddress = json["macAddress"].stringValue
gtw.name = json["name"].stringValue
gtw.panId = json["panId"].stringValue
gtw.tenantId = json["tenantId"].intValue
gtw.userId = json["userId"].intValue
let associatedAddress = realm.objects(Address.self).filter("id == %d", gtw.addressId).first
gtw.address = associatedAddress
realm.add(gtw, update: true)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getDevices(baseURL : String, authToken : String) ->Promise<Any> {
let realm = try! Realm()
let url = "\(baseURL)/devices"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.validate()
.responseJSON { response in
switch response.result {
case .success:
let devicesJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in devicesJSON {
do {
try realm.write {
let dev = Device()
dev.companyId = json["companyId"].intValue
dev.deviceTypeId = json["deviceTypeId"].intValue
dev.gatewayId = json["gatewayId"].intValue
dev.id = json["id"].intValue
dev.macAddress = json["macAddress"].stringValue
dev.techName = json["techname"].stringValue
dev.tenantId = json["tenantId"].intValue
dev.vanityName = json["vanityName"].stringValue
let pGateway = realm.objects(Gateway.self).filter("id == %d", dev.gatewayId).first
let pDeviceType = realm.objects(DeviceType.self).filter("id == %d", dev.deviceTypeId).first
realm.add(dev, update: true)
pGateway?.devices.append(dev)
pDeviceType?.devices.append(dev)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getChannels(deviceTypeId: Int, baseURL : String, authToken : String) -> Promise<Any> {
let realm = try! Realm()
let url = "\(baseURL)/devicetypes/\(deviceTypeId)/channels"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { seal in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let channelsJSON : JSON = JSON(response.result.value!)
for(_, json) : (String, JSON) in channelsJSON {
do {
try realm.write {
let ch = Channel()
ch.channelType = json["channelType"].intValue
ch.dataType = json["dataType"].intValue
ch.defaultValue = json["defaultValue"].stringValue
ch.deviceTypeId = json["deviceTypeId"].intValue
ch.fromMe = json["fromMe"].boolValue
ch.helpExplanation = json["helpExplanation"].stringValue
ch.id = json["id"].intValue
ch.io = json["io"].boolValue
ch.name = json["name"].stringValue
ch.regex = json["regex"].stringValue
ch.regexErrMsg = json["regexErrMsg"].stringValue
ch.subTitle = json["subTitle"].stringValue
let pDeviceType = realm.objects(DeviceType.self).filter("id == %d", ch.deviceTypeId).first
realm.add(ch, update: true)
pDeviceType?.channels.append(ch)
}
} catch {
seal.reject(error)
}
}
seal.fulfill(true)
case .failure(let error):
seal.reject(error)
}
}
}
}
func getChannelValues(deviceId: Int, baseURL : String, authToken : String) -> Promise<Any> {
let realm = try! Realm()
let url = "\(baseURL)/devices/\(deviceId)/values"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { prom in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let channelValJSON : JSON = JSON(response.result.value!)
for(chName, json) : (String, JSON) in channelValJSON {
do {
try realm.write {
let chv = ChanValue()
chv.uid = "\(deviceId).\(chName)"
chv.name = chName
chv.value = json["value"].stringValue
chv.timestamp = json["timestamp"].intValue
realm.add(chv, update: true)
realm.objects(Device.self).filter("id == %d", deviceId).first?.values.append(chv)
}
} catch {
prom.reject(error)
}
}
prom.fulfill(true)
case .failure(let error):
prom.reject(error)
}
}
}
}
func getChannelHistory(deviceId: Int, channelId : Int, baseURL : String, authToken : String) -> Promise<[ChannelHistoryValue]> {
let url = "\(baseURL)/devices/\(deviceId)/values/\(channelId)"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { promise in
Alamofire.request(url, method: .get, headers: headers)
.responseJSON { response in
switch response.result {
case .success:
let channelHistoryJSON : JSON = JSON(response.result.value!)
var channelHistory = [ChannelHistoryValue]()
for(_, json) : (String, JSON) in channelHistoryJSON {
let chHistVal = ChannelHistoryValue()
chHistVal.timestamp = Date(timeIntervalSince1970: Double(json["timestamp"].intValue))
chHistVal.value = json["value"].stringValue
channelHistory.append(chHistVal)
}
channelHistory.reverse()
promise.fulfill(channelHistory)
case .failure(let error):
promise.reject(error)
}
}
}
}
func writeChannelValue(deviceId: Int, channelName: String, value : String, baseURL : String, authToken : String) -> Promise<Any> {
let timestamp: Int = Int(Date().timeIntervalSince1970)
var channelJson : JSON = JSON()
channelJson["name"].string = channelName
channelJson["timestamp"].int = timestamp
channelJson["value"].string = value
var listJson = JSON()
listJson.arrayObject = [channelJson]
let url = "\(baseURL)/devices/\(deviceId)/values"
let headers : HTTPHeaders = [
"Authorization": authToken
]
return Promise { promise in
Alamofire.request(url, method: .put, parameters: [:], encoding: listJson.rawString()!, headers: headers)
.response { response in
if response.response?.statusCode == 200 {
promise.fulfill(true)
} else {
promise.reject(String(response.response!.statusCode) as! Error)
}
}
}
}
extension String: ParameterEncoding {
public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try urlRequest.asURLRequest()
request.httpBody = data(using: .utf8, allowLossyConversion: false)
return request
}
}

View File

@@ -0,0 +1,21 @@
//
// NavigationController.swift
// pocloud
//
// Created by Patrick McDonagh on 5/29/18.
// Copyright © 2018 patrickjmcd. All rights reserved.
//
import UIKit
import ChameleonFramework
class NavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.navigationBar.tintColor = UIColor.flatSkyBlue()
}
}

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="iJg-Zc-arO">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="iJg-Zc-arO">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
@@ -655,10 +655,11 @@
<!--Navigation Controller-->
<scene sceneID="zCd-ds-i4W">
<objects>
<navigationController id="iJg-Zc-arO" sceneMemberID="viewController">
<navigationController id="iJg-Zc-arO" customClass="NavigationController" customModule="pocloud" customModuleProvider="target" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="eWM-wh-jgG">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<color key="barTintColor" red="0.90823972225189209" green="0.92638683319091797" blue="0.9317171573638916" alpha="1" colorSpace="calibratedRGB"/>
</navigationBar>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="d2l-6j-5nr"/>