Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JSON 12.65 KB | None | 0 0
  1. //
  2. //  DataService.swift
  3. //  restauracy
  4. //
  5. //  Created by Artur on 04/11/2017.
  6. //  Copyright © 2017 restauracy. All rights reserved.
  7. //
  8.  
  9. import Foundation
  10. import FirebaseDatabase
  11.  
  12. class DataService {
  13.     static let shared = DataService()
  14.     var ref: DatabaseReference!
  15.     var ordersRef: DatabaseReference!
  16.     var archivedOrdersRef: DatabaseReference!
  17.     var connectionStatus: Bool = false
  18.    
  19.     private init() {
  20.         ref = Database.database().reference()
  21.         archivedOrdersRef = ref.child("archivedOrders")
  22.         self.subscribeToOnlineOfflineListener()
  23.         ordersRef = ref.child("activeOrders")
  24.  
  25.     }
  26.    
  27.     func loadRestaurant(tableId: String, completion: @escaping (_ data: Dictionary<String, Any>) -> Void) {
  28.        
  29.         //determine the id of the restaurant based on the table
  30.         ref.child("Tables").queryOrderedByKey().queryEqual(toValue: tableId.makeFirebaseString()).observeSingleEvent(of: .value, with: { (snapshot) in
  31.             guard let value = snapshot.value as? Dictionary<String, Any>,
  32.                 let table = value[tableId.makeFirebaseString()] as? Dictionary<String, Any>,
  33.                 let restaurantId = table["restaurantId"],
  34.                 let tableName = table["name"] as? String
  35.                 else {
  36.                     completion([:])
  37.                     return
  38.             }
  39.             //now query the restaurant identified based on the table ID
  40.             self.ref.child("Restaurants").queryOrderedByKey().queryEqual(toValue: restaurantId).observeSingleEvent(of: .value, with: { (snapshot) in
  41.                 if let value = snapshot.value as? Dictionary<String, Any> {
  42.                     var result: Dictionary<String, Any> = [:]
  43.                     for (_, tmpValue) in value {
  44.                         result = tmpValue as! Dictionary<String, Any>
  45.                     }
  46.                     Table.shared.name = tableName
  47.                     completion(result)
  48.                     return
  49.                 } else {
  50.                     completion([:])
  51.                     return
  52.                 }
  53.             }) { (error) in
  54.                 completion([:])
  55.                 return
  56.             }
  57.         })  { (error) in
  58.             completion([:])
  59.             return
  60.         }
  61.     }
  62.    
  63.     //////////////MARK: USER MANAGEMENT FUNCTIONS
  64.     func registerUserAtTable(user: User, tableId: String) {
  65.         ref.child("Users").child(user.id).child("currentTable").setValue(tableId)
  66.     }
  67.    
  68.     //Trigger back-end for user re-authentication as in logging in and changing from anonymous to authenticated user.
  69.     func triggerUserLogin (oldId: String, newId: String) {
  70.         let userRef = ref.child("Users").child(newId).child("triggerLoginFrom")
  71.         userRef.setValue(oldId)
  72.     }
  73.    
  74.     //Trigger back-end for user log-out (log-in as anonymous)
  75.     func triggerUserLogout (oldId: String, newId: String) {
  76.         let userRef = ref.child("Users").child(newId).child("triggerLogoutFrom")
  77.         userRef.setValue(oldId)
  78.     }
  79.    
  80.     ///////MARK: order handling functions
  81.     func subscribeToTableChanges(tableId: String) {
  82.        
  83.         let ordersQuery = ordersRef.queryOrdered(byChild: "tableId").queryEqual(toValue: tableId)
  84.        
  85.         ordersQuery.observe(.childAdded, with: { (snapshot) -> Void in
  86.             if snapshot.hasChildren() {
  87.                 Table.shared.handleOrderAdded(snapshot: snapshot)
  88.             }
  89.         })
  90.        
  91.         ordersQuery.observe(.childChanged, with: { (snapshot) -> Void in
  92.             if snapshot.hasChildren() {
  93.                 Table.shared.handleOrderChanged(snapshot: snapshot)
  94.             }
  95.         })
  96.        
  97.         ordersQuery.observe(.childRemoved, with: { (snapshot) -> Void in
  98.             if snapshot.hasChildren() {
  99.                 Table.shared.handleOrderRemoved(snapshot: snapshot)
  100.             }
  101.         })
  102.     }
  103.    
  104.     func readUsersPaidOrders(user: User, completion: @escaping (_ result: DataSnapshot) -> Void) {
  105.         let activeOrdersQuery = ref.child("activeOrders").queryOrdered(byChild: "paidByUid")
  106.         activeOrdersQuery.queryEqual(toValue: user.id).observeSingleEvent(of: .value, with: { (snapshot) in
  107.             completion(snapshot)
  108.         })
  109.     }
  110.    
  111.     func addOrder(order: Order) {
  112.         let orderRef = ordersRef.childByAutoId()
  113.         let storedOrder = order
  114.         storedOrder.id = orderRef.key
  115.        
  116.         for category in storedOrder.categories {
  117.             category.orderId = storedOrder.id
  118.         }
  119.         orderRef.setValue(storedOrder.toDictionary())
  120.         orderRef.child("timeInitiated").setValue(ServerValue.timestamp())
  121.     }
  122.    
  123.     func addCategory(category: Category) {
  124.         let categoryRef = ordersRef.child(category.orderId!).child("categories").child(category.id)
  125.         let storedCategory = category
  126.         storedCategory.id = categoryRef.key
  127.         categoryRef.setValue(storedCategory.toDictionary())
  128.     }
  129.    
  130.     func addMenuItem(menuItem: MenuItem) {
  131.         let itemRef = ordersRef.child((Table.shared.getItemForId(id: menuItem.categoryId) as! Category).orderId!).child("categories").child(menuItem.categoryId).child("menuItems").child(menuItem.id)
  132.         let storedMenuItem = menuItem
  133.         storedMenuItem.id = itemRef.key
  134.         itemRef.setValue(storedMenuItem.toDictionary())
  135.     }
  136.    
  137.     func addVariant(variant: Variant) {
  138.         let variantRef = ordersRef.child((Table.shared.getItemForId(id: variant.categoryId) as! Category).orderId!).child("categories").child(variant.categoryId).child("menuItems").child(variant.itemId).child("variants").child(variant.id)
  139.         let storedVariant = variant
  140.         storedVariant.id = variantRef.key
  141.         variantRef.setValue(storedVariant.toDictionary())
  142.     }
  143.    
  144.     func increaseQuantity(menuItem: MenuItem) {
  145.         let itemRef = ordersRef.child((Table.shared.getItemForId(id: menuItem.categoryId) as! Category).orderId!).child("categories").child(menuItem.categoryId).child("menuItems").child(menuItem.id).child("quantity")
  146.         itemRef.setValue(menuItem.quantity + 1)
  147.     }
  148.    
  149.     func increaseQuantity(variant: Variant) {
  150.         let variantRef = ordersRef.child((Table.shared.getItemForId(id: variant.categoryId) as! Category).orderId!).child("categories").child(variant.categoryId).child("menuItems").child(variant.itemId).child("variants").child(variant.id).child("quantity")
  151.         variantRef.setValue(variant.quantity + 1)
  152.     }
  153.    
  154.     func updateComment(menuItem: MenuItem, comment: String?) {
  155.         let itemRef = ordersRef.child((Table.shared.getItemForId(id: menuItem.categoryId) as! Category).orderId!).child("categories").child(menuItem.categoryId).child("menuItems").child(menuItem.id).child("comment")
  156.         itemRef.setValue(comment)
  157.     }
  158.    
  159.     func updateComment(variant: Variant, comment: String?) {
  160.         let variantRef = ordersRef.child((Table.shared.getItemForId(id: variant.categoryId) as! Category).orderId!).child("categories").child(variant.categoryId).child("menuItems").child(variant.itemId).child("variants").child(variant.id).child("comment")
  161.         variantRef.setValue(comment)
  162.     }
  163.    
  164.     func updatePaidByUid(order: Order, uid: String?) {
  165.         let orderRef = ordersRef.child(order.id).child("paidByUid")
  166.         orderRef.setValue(uid)
  167.     }
  168.    
  169.     func deleteOrder(order: Order) {
  170.         let orderRef = ordersRef.child(order.id)
  171.         orderRef.removeValue()
  172.     }
  173.    
  174.     func deleteCategory(category: Category) {
  175.         let categoryRef = ordersRef.child(category.orderId!).child("categories").child(category.id)
  176.         categoryRef.removeValue()
  177.     }
  178.    
  179.     func deleteMenuItem(menuItem: MenuItem) {
  180.         let itemRef = ordersRef.child((Table.shared.getItemForId(id: menuItem.categoryId) as! Category).orderId!).child("categories").child(menuItem.categoryId).child("menuItems").child(menuItem.id)
  181.         itemRef.removeValue()
  182.     }
  183.    
  184.     func deleteVariant(variant: Variant) {
  185.         let variantRef = ordersRef.child((Table.shared.getItemForId(id: variant.categoryId) as! Category).orderId!).child("categories").child(variant.categoryId).child("menuItems").child(variant.itemId).child("variants").child(variant.id)
  186.         variantRef.removeValue()
  187.     }
  188.    
  189.     func assignSessionIdToOrders(orders: [Order], sessionId: String, completion: @escaping (_ result: String) -> Void) {
  190.         var updates: [AnyHashable : Any] = [:]
  191.         for order in orders {
  192.             updates[order.id+"/sessionId"] = sessionId
  193.         }
  194.         ordersRef.updateChildValues(updates, withCompletionBlock: { (err, ref) in
  195.             if err == nil {
  196.                 completion("")
  197.             } else {
  198.                 completion(err!.localizedDescription)
  199.             }
  200.         })
  201.     }
  202.    
  203.     func unassignSessionIdToOrders(orders: [Order], sessionId: String, completion: @escaping (_ result: String) -> Void) {
  204.         var updates: [AnyHashable : Any] = [:]
  205.         for order in orders {
  206.             updates[order.id+"/sessionId"] = NSNull()
  207.         }
  208.         ordersRef.updateChildValues(updates, withCompletionBlock: { (err, ref) in
  209.             if err == nil {
  210.                 completion("")
  211.             } else {
  212.                 completion(err!.localizedDescription)
  213.             }
  214.         })
  215.     }
  216.    
  217.     func handleOrdersPaid(orders: [Order]) {
  218.         var updates: [AnyHashable : Any] = [:]
  219.        
  220.         for order in orders {
  221.             var orderDictionary = order.toDictionary()
  222.             orderDictionary["timePaid"] = ServerValue.timestamp()
  223.             updates[order.id] = orderDictionary
  224.         }
  225.        
  226.         archivedOrdersRef.updateChildValues(updates) { (err, ref) in
  227.             if err == nil {
  228.                 var deletions: [AnyHashable : Any] = [:]
  229.                 for order in orders {
  230.                     deletions[order.id] = NSNull()
  231.                 }
  232.                
  233.                 self.ordersRef.updateChildValues(deletions, withCompletionBlock: { (err, ref) in
  234.                     print(err == nil ? "Update successful" : "Error deleting old orders")
  235.                 })
  236.                
  237.             } else { print("error moving orders from paid!") }
  238.         }
  239.     }
  240.    
  241.     func removeOrderObservers(){
  242.         if archivedOrdersRef != nil {
  243.             archivedOrdersRef.removeAllObservers()
  244.         }
  245.         if ordersRef != nil {
  246.             ordersRef.removeAllObservers()
  247.         }
  248.        
  249.         OrderManager.removeOrders()
  250.  
  251.     }
  252.    
  253.     func subscribeToArchivedOrderChanges(user: User) {
  254.         archivedOrdersRef.removeAllObservers()
  255.        
  256.         let archivedOrdersQuery = archivedOrdersRef.queryOrdered(byChild: "ownedByUid").queryEqual(toValue: user.id).queryLimited(toLast: 25)
  257.                 archivedOrdersQuery.observe(.childAdded, with: { (snapshot) -> Void in
  258.                     if snapshot.hasChildren() {
  259.                         User.shared.handleArchivedOrderAdded(snapshot: snapshot)
  260.                     }
  261.                 })
  262.        
  263.                 archivedOrdersQuery.observe(.childChanged, with: { (snapshot) -> Void in
  264.                     if snapshot.hasChildren() {
  265.                         User.shared.handleArchivedOrderChanged(snapshot: snapshot)
  266.                     }
  267.                 })
  268.        
  269.                 archivedOrdersQuery.observe(.childRemoved, with: { (snapshot) -> Void in
  270.                     if snapshot.hasChildren() {
  271.                         User.shared.handleArchivedOrderRemoved(snapshot: snapshot)
  272.                     }
  273.                 })
  274.     }
  275.    
  276.     // MARK: connectivity functions
  277.     func subscribeToOnlineOfflineListener () -> Void {
  278.         let connectedRef = Database.database().reference(withPath: ".info/connected")
  279.         connectedRef.removeAllObservers()
  280.  
  281.         connectedRef.observe(.value, with: { snapshot in
  282.             if let connected = snapshot.value as? Bool, connected {
  283.                 self.connectionStatus = true
  284.             } else {
  285.                 self.connectionStatus = false
  286.             }
  287.         })
  288.     }
  289.    
  290.     func getFirebaseConnectionStatus () -> Bool {
  291.         return self.connectionStatus
  292.     }
  293.    
  294. //    func loadArchivedOrders (user: User, completion: @escaping (_ orders: [Order]) -> Void) {
  295. //        var tempOrders: [Order] = []
  296. //
  297. //        archivedOrdersRef.queryOrdered(byChild: "ownedByUid").queryEqual(toValue: user.id).observeSingleEvent(of: .value, with: { (snapshot) in
  298. //            for userOrder in snapshot.children {
  299. //                let tempOrder = Order(snapshot: userOrder as! DataSnapshot)
  300. //                tempOrders.append(tempOrder)
  301. //            }
  302. //            tempOrders.sort(by: {$0.id > $1.id})
  303. //            completion(tempOrders)
  304. //        })
  305. //    }
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement