Proyectos de Subversion Iphone Microlearning

Rev

Autoría | Ultima modificación | Ver Log |

//
//  SyncAdapter.swift
//  twogetskills
//
//  Created by Efrain Yanez Recanatini on 2/24/22.
//

import Foundation

import Foundation
import Alamofire
import SwiftyJSON

class SyncAdapter
{
  
    var syncDao = SyncDao()
    var inProgress = false;
    
    @objc func updateTimer() {
        //print("updateTimer")
        
        if inProgress   {
            return
        }
        
        inProgress = true
        let myQue = DispatchQueue(label: "syncQue")
        myQue.async {
            self.sync{ success in
                self.inProgress = false;
            }
        }
    }
    
    func sync(completionHandler : @escaping (_ success : Bool) -> Void) {
        let recordsSync = self.syncDao.selectBatch()
        
        if recordsSync.count > 0 {
            var availableForOtherOperation = true;
            for recordSync in recordsSync
            {
                print(recordSync)
                
                if recordSync.type == Constants.SYNC_ADAPTER_TYPE_DEVICE {
                    availableForOtherOperation = false
                    registerDevice(record: recordSync)
                }
                else if availableForOtherOperation && recordSync.type == Constants.SYNC_ADAPTER_TYPE_FCM {
                    availableForOtherOperation = false
                    registerFcm(record: recordSync)
                }
                else if availableForOtherOperation && recordSync.type == Constants.SYNC_ADAPTER_TYPE_SYNC {
                    availableForOtherOperation = false
                    sendSync(record: recordSync)
                }
                else if recordSync.data.isEmpty {
                    syncDao.remove(id: recordSync.id)
                }
            }
        }
        completionHandler(true)
    }
    
    func sendSync(record: SyncModel)
    {
        let preference = Preference.sharedInstance
        let parameters = [
            Constants.POST_SYNC_FIELD_DEVICE_UUID: "\(preference.deviceUuid)",
            Constants.POST_SYNC_FIELD_DATA: "\(record.data)",
            Constants.POST_SYNC_FIELD_SYNC_ID: "\(record.id)"
        ]
        let headers: HTTPHeaders = [
            .accept(Constants.HTTP_HEADER_ACCEPT)
        ]
        
        AF.request(Config.URL_SYNC, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON {response in
            
            print("Send Sync  ")
            
            switch response.result {
                case .success:
                    let result = try? JSON(data: response.data!)
                    if result?["success"] ?? "" != false{
                        let sync_id = Int(result?["data"]["sync_id"].stringValue ?? "0") ?? 0
                        if sync_id > 0 {
                            self.syncDao.remove(id: sync_id)
                        }
                    }
                break
                case .failure:
                    print("JSON = \(String(describing: Error.self))")
                break
            }
        }
    }

    func registerFcm(record: SyncModel) {
        let preference = Preference.sharedInstance
        let deviceUuid = preference.deviceUuid
        let parameters = [
            Constants.POST_FCM_FIELD_APPLICATION_ID: "\(Constants.GLOBAL_APPLICATION_ID)",
            Constants.POST_FCM_FIELD_DEVICE_UUID: "\(deviceUuid)",
            Constants.POST_FCM_FIELD_TOKEN: "\(record.data)",
            Constants.POST_FCM_FIELD_SYNC_ID: "\(record.id)"
        ]
        
        let headers: HTTPHeaders = [
            .accept(Constants.HTTP_HEADER_ACCEPT)
        ]
            
        AF.request(Config.URL_FCM, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON{response in
            
            print("Send FCM")
            
            switch response.result {
                case .success:
                    let result = try? JSON(data: response.data!)
                    let sync_id = Int(result?["data"]["sync_id"].stringValue ?? "0") ?? 0
                    if sync_id > 0 {
                        self.syncDao.remove(id: sync_id)
                    }
                    break
                case .failure:
                    print("JSON = \(String(describing: Error.self))")
                    break
            }
        }
    }
    

    func registerDevice(record: SyncModel)
    {

        let version = UIDevice.current.systemVersion
        let model = UIDevice.current.localizedModel
        
        
        let parameters = [
            Constants.POST_DEVICE_FIELD_APPLICATION_ID: "1",
            Constants.POST_DEVICE_FIELD_DEVICE_UUID: "\(record.data)",
            Constants.POST_DEVICE_FIELD_MANUFACTURER: "Apple",
            Constants.POST_DEVICE_FIELD_BRAND: "Apple",
            Constants.POST_DEVICE_FIELD_VERSION: "\(version)",
            Constants.POST_DEVICE_FIELD_MODEL: "\(model)",
            Constants.POST_DEVICE_FIELD_PLATFORM: "Iphone",
            Constants.POST_DEVICE_FIELD_SYNC_ID: "\(record.id)"
        ]
        
        let headers: HTTPHeaders = [
            .accept(Constants.HTTP_HEADER_ACCEPT)
        ]
        
        
        print("URL DEVICE : \(Config.URL_DEVICE) ")
        
        AF.request(Config.URL_DEVICE, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON {response in
            
            print("Send Device: ")
            
            switch response.result {
                case .success:
                    let result = try? JSON(data: response.data!)
                    if result?["success"] ?? "" != false {
                        let aes = result?["data"]["aes"].stringValue ?? ""
                        let password = result?["data"]["password"].stringValue ?? ""
 
                        if !aes.isEmpty && !password.isEmpty {

                            let preference = Preference.sharedInstance
                            preference.aes = aes
                            preference.password = password
                            preference.save()
                        }
                        
                        let sync_id = Int(result?["data"]["sync_id"].stringValue ?? "0") ?? 0
                        if sync_id > 0 {
                            self.syncDao.remove(id: sync_id)
                        }
                    }
                break
                case .failure:
                    print("JSON = \(String(describing: Error.self))")
                break
            }
        }
    }
}