Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 11 | Rev 44 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 11 Rev 17
Línea 12... Línea 12...
12
import SwiftyJSON
12
import SwiftyJSON
Línea 13... Línea 13...
13
 
13
 
14
class SyncAdapter
14
class SyncAdapter
Línea 15... Línea -...
15
{
-
 
-
 
15
{
16
  
16
  
17
    private let appDao = AppDao.sharedInstance
17
    
-
 
18
    private let syncDao = SyncDao.sharedInstance
Línea 18... Línea 19...
18
    private let syncDao = SyncDao.sharedInstance
19
    private var inProgress = false;
19
    private var inProgress = false;
-
 
20
    
-
 
21
    @objc func updateTimer() {
20
    private var appData = AppData.sharedInstance
22
        //print("updateTimer")
21
    
23
        
22
    @objc func updateTimerForeground() {
Línea -... Línea 23...
-
 
23
        if inProgress   {
-
 
24
            return
24
        if inProgress   {
25
        }
25
            return
26
        
26
        }
27
        
-
 
28
        
-
 
29
        inProgress = true
-
 
30
        let myQue = DispatchQueue(label: "syncQuueForeground")
-
 
31
        myQue.async {
-
 
32
            
-
 
33
            if self.isCheckChangesRequired()  {
27
        
34
                self.checkChanges(isForeground:true) { success in
28
        inProgress = true
35
                    self.inProgress = false;
-
 
36
                }
29
        let myQue = DispatchQueue(label: "syncQue")
37
            } else {
30
        myQue.async {
38
                self.sync { success in
31
            self.sync{ success in
39
                    self.inProgress = false;
Línea -... Línea 40...
-
 
40
                }
-
 
41
            }
-
 
42
        }
-
 
43
    }
-
 
44
    
-
 
45
 
-
 
46
    
-
 
47
     func isCheckChangesRequired() -> Bool {
-
 
48
        if !appData.userUuid.isEmpty && !appData.maxDateChanges.isEmpty {
-
 
49
            
-
 
50
            
-
 
51
      
-
 
52
            
-
 
53
            
-
 
54
            let formatterService = DateFormatter()
-
 
55
            formatterService.dateFormat = Constants.FORMAT_DATETIME_SERVICE
-
 
56
            guard let lastCheckChanges = formatterService.date(from: appData.lastCheckChanges) else {
-
 
57
                let now = Date()
-
 
58
                let dateFormatter = DateFormatter()
-
 
59
                dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICE
-
 
60
                let dateOn = dateFormatter.string(from: now)
-
 
61
                
-
 
62
                appData.lastCheckChanges = dateOn
-
 
63
                appData.save()
-
 
64
                
-
 
65
                return false
-
 
66
                
-
 
67
            }
-
 
68
            
-
 
69
            
-
 
70
            let now = Date()
-
 
71
          
-
 
72
            
-
 
73
            let diffComponents = Calendar.current.dateComponents([.minute], from: lastCheckChanges, to: now)
-
 
74
            let minutes = diffComponents.minute!
-
 
75
            
-
 
76
            
-
 
77
            return minutes > Constants.SYNC_CHECK_CHANGES_PERIOD
-
 
78
            
-
 
79
        }
-
 
80
        
-
 
81
        return false
-
 
82
    }
-
 
83
    
-
 
84
    func checkChanges(isForeground : Bool,  completionHandler : @escaping (_ success : Bool) -> Void) {
-
 
85
        
-
 
86
        if syncDao.countPendingRecords() > 0 {
-
 
87
            completionHandler(true)
-
 
88
        }
-
 
89
        
-
 
90
        
-
 
91
        var parameters = [String : String]()
-
 
92
        parameters[Constants.POST_MICROLEARNING_CHECK_CHANGES_DEVICE_UUID] = appData.deviceUuid
-
 
93
        
-
 
94
        parameters[Constants.POST_MICROLEARNING_CHECK_CHANGES_MAX_DATE_CHANGES] = appData.maxDateChanges
-
 
95
        
-
 
96
        
-
 
97
        parameters[Constants.POST_MICROLEARNING_CHECK_CHANGES_IS_FOREGROUND] = isForeground ? "1" : "0"
-
 
98
        
-
 
99
 
-
 
100
        
-
 
101
        
-
 
102
        let capsuleDao = CapsuleDao.sharedInstance
-
 
103
        let capsules : [CapsuleModel] = capsuleDao.selectAll()
-
 
104
        
-
 
105
        parameters[Constants.POST_MICROLEARNING_CHECK_CHANGES_MAX_IDS] = String(capsules.count)
-
 
106
        
-
 
107
        var i : Int = 0
-
 
108
        while i < capsules.count {
-
 
109
     
-
 
110
            parameters["\(Constants.POST_MICROLEARNING_CHECK_CHANGES_ID)\(i+1)"] = "\(capsules[i].topicUuid)" + "|" + "\(capsules[i].uuid)"
-
 
111
            
-
 
112
            i += 1
-
 
113
        }
-
 
114
        
-
 
115
       // print(parameters)
-
 
116
        
-
 
117
        let headerSecurity : HeaderSecurity = HeaderSecurity()
-
 
118
        
-
 
119
        let headers: HTTPHeaders = [
-
 
120
            .init(name: Constants.HTTP_HEADER_SECURITY_TOKEN, value: appData.deviceUuid),
-
 
121
            .init(name: Constants.HTTP_HEADER_SECURITY_SECRET, value: headerSecurity.secret),
-
 
122
            .init(name: Constants.HTTP_HEADER_SECURITY_CREATED, value: String(headerSecurity.created)),
-
 
123
            .init(name: Constants.HTTP_HEADER_SECURITY_RAND, value: String(headerSecurity.rand)),
-
 
124
            .accept(Constants.HTTP_HEADER_ACCEPT)
-
 
125
        ]
-
 
126
        
-
 
127
        AF.request(Config.URL_CHECK_CHANGES, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON {response in
-
 
128
 
-
 
129
            switch response.result {
-
 
130
                case .success:
-
 
131
                    let result = try? JSON(data: response.data!)
-
 
132
                    if result?["success"] ?? "" != false{
-
 
133
                        
-
 
134
    
-
 
135
                        
-
 
136
                        if result?["data"] ?? "" != "" {
-
 
137
                            let now = Date()
-
 
138
                            let dateFormatter = DateFormatter()
-
 
139
                            dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICE
-
 
140
                            let dateOn = dateFormatter.string(from: now)
-
 
141
                            
-
 
142
                            let max_date_changes = result!["data"]["max_date_changes"].string ?? ""
-
 
143
                            let snew_capsules =  result!["data"]["new_capsules"].string ?? ""
-
 
144
                            
-
 
145
                            
-
 
146
                            let new_capsules = Int(snew_capsules) ?? 0
-
 
147
                            
-
 
148
                            
-
 
149
                            var processChanges = new_capsules > 0
-
 
150
                            processChanges = processChanges || self.appData.maxDateChanges != max_date_changes
-
 
151
                            
-
 
152
                            if processChanges {
-
 
153
                                self.appData.maxDateChanges = max_date_changes
-
 
154
                            }
-
 
155
                            
-
 
156
                            self.appData.lastCheckChanges = dateOn
-
 
157
                            self.appData.save()
-
 
158
                            
-
 
159
                            if new_capsules > 0  {
-
 
160
                                let userinfo = ["new_capsules" : String(new_capsules), "is_foreground" : (isForeground ? "1" : "0")]
-
 
161
                                
-
 
162
                                NotificationCenter.default.post(name: Constants.NOTIFICATION_NAME_COMMAND_REFRESH_CONTENT , object: self, userInfo: userinfo)
-
 
163
                            }
-
 
164
                            
-
 
165
                            
-
 
166
                            
-
 
167
                            if result?["data"]["rating_and_comments"]  ?? "" != ""  {
-
 
168
                                let capsuleDao = CapsuleDao.sharedInstance
-
 
169
                                var capsuleModel : CapsuleModel
-
 
170
                                
-
 
171
                                for ratingAndComment in result!["data"]["rating_and_comments"] {
-
 
172
                                    
-
 
173
                                    let uuid = ratingAndComment.1["uuid"].string ?? ""
-
 
174
                                    let total_comments = Int(ratingAndComment.1["total_comments"].string ?? "0") ?? 0
-
 
175
                                    let total_rating = Decimal(Double(ratingAndComment.1["total_rating"].string ?? "0") ?? 0)
-
 
176
                                    
-
 
177
        
-
 
178
                                    if !uuid.isEmpty {
-
 
179
                                        capsuleModel = capsuleDao.selectByUuid(uuid: uuid)
-
 
180
                                        capsuleModel.totalRating = total_rating
-
 
181
                                        capsuleModel.totalComments = total_comments
-
 
182
                                        capsuleDao.update(capsule: capsuleModel)
-
 
183
                                    }
-
 
184
                                }
-
 
185
                            }
-
 
186
                        }
-
 
187
                    }
-
 
188
                break
-
 
189
                case .failure:
-
 
190
                   // print("JSON = \(String(describing: Error.self))")
-
 
191
                break
-
 
192
            }
-
 
193
        }
32
                self.inProgress = false;
194
    
-
 
195
        completionHandler(true)
33
            }
196
    }
Línea -... Línea 197...
-
 
197
    
-
 
198
    
34
        }
199
    func sync(completionHandler : @escaping (_ success : Bool) -> Void) {
35
    }
200
        //print("start sync")
36
    
201
        let recordsSync = self.syncDao.selectBatch()
37
    func sync(completionHandler : @escaping (_ success : Bool) -> Void) {
202
        
38
        let recordsSync = self.syncDao.selectBatch()
-
 
39
        
-
 
40
        if recordsSync.count > 0 {
203
        //print(recordsSync)
41
            var availableForOtherOperation = true;
204
        
42
            for recordSync in recordsSync
205
        if recordsSync.count > 0 {
43
            {
206
            var availableForOtherOperation = true;
44
                print(recordSync)
207
            for recordSync in recordsSync
45
                
208
            {
46
                if recordSync.type == Constants.SYNC_ADAPTER_TYPE_DEVICE {
209
                if recordSync.type == Constants.SYNC_ADAPTER_TYPE_DEVICE {
47
                    availableForOtherOperation = false
210
                    availableForOtherOperation = false
-
 
211
                    registerDevice(record: recordSync)
-
 
212
                }
-
 
213
                else if availableForOtherOperation && recordSync.type == Constants.SYNC_ADAPTER_TYPE_FCM {
-
 
214
                    availableForOtherOperation = false
-
 
215
                    registerFcm(record: recordSync)
-
 
216
                }
-
 
217
            }
-
 
218
            
48
                    registerDevice(record: recordSync)
219
            if(availableForOtherOperation) {
-
 
220
                
-
 
221
                var parameters = [ String: String ]()
-
 
222
                var i : Int = 0
-
 
223
                for recordSync in recordsSync
-
 
224
                {
-
 
225
                    if recordSync.type == Constants.SYNC_ADAPTER_TYPE_SYNC {
-
 
226
                        i  += 1
49
                }
227
                        let keyData = Constants.POST_SYNC_BATCH_FIELD_RECORD_DATA + String(i);
-
 
228
                        
50
                else if availableForOtherOperation && recordSync.type == Constants.SYNC_ADAPTER_TYPE_FCM {
229
                        let keySyncId = Constants.POST_SYNC_BATCH_FIELD_RECORD_SYNC_ID + String(i);
-
 
230
                        
-
 
231
                        //print("keyData = \(keyData) keySincId = \(keySyncId)")
51
                    availableForOtherOperation = false
232
                        
-
 
233
                        parameters["\(keyData)"]  = "\(recordSync.data)"
52
                    registerFcm(record: recordSync)
234
                        
-
 
235
                        parameters["\(keySyncId)"]  =  String(recordSync.id)
-
 
236
                        
-
 
237
                    }
53
                }
238
                }
-
 
239
               
54
                else if availableForOtherOperation && recordSync.type == Constants.SYNC_ADAPTER_TYPE_SYNC {
240
                if i > 0 {
-
 
241
                    parameters[Constants.POST_SYNC_BATCH_FIELD_MAX_RECORDS] = "\(i)"
-
 
242
                    parameters[Constants.POST_SYNC_BATCH_FIELD_DEVICE_UUID] = appData.deviceUuid
55
                    availableForOtherOperation = false
243
                    
56
                    sendSync(record: recordSync)
244
                    sendSyncBatch(parameters: parameters)
57
                }
245
                    
58
                else if recordSync.data.isEmpty {
246
                }
Línea 59... Línea 247...
59
                    syncDao.remove(id: recordSync.id)
247
              
60
                }
248
            
-
 
249
            }
61
            }
250
        }
Línea -... Línea 251...
-
 
251
        completionHandler(true)
-
 
252
    }
-
 
253
    
-
 
254
    func sendSyncBatch(parameters : [String : String])
-
 
255
    {
-
 
256
        print("Send Sync Batch  ")
-
 
257
        //print(parameters)
-
 
258
        
-
 
259
        
-
 
260
        let headers: HTTPHeaders = [
-
 
261
            .accept(Constants.HTTP_HEADER_ACCEPT)
-
 
262
        ]
-
 
263
        
-
 
264
        AF.request(Config.URL_SYNC_BATCH, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON {response in
-
 
265
            
-
 
266
            
-
 
267
            
-
 
268
            switch response.result {
-
 
269
                case .success:
-
 
270
                    let result = try? JSON(data: response.data!)
-
 
271
                    if result?["success"] ?? "" != false{
-
 
272
                        
-
 
273
                        if result?["data"] != "" {
-
 
274
 
-
 
275
                            for sync in result!["data"] {
-
 
276
                                //let success = sync.1["success"].string ?? ""
-
 
277
                                let sync_id = Int(sync.1["sync_id"].string ?? "0") ?? 0
-
 
278
                                if sync_id > 0 {
-
 
279
                                    self.syncDao.remove(id: sync_id)
-
 
280
                                }
-
 
281
                            }
-
 
282
                        }
-
 
283
                    }
-
 
284
                break
-
 
285
                case .failure:
-
 
286
                   // print("JSON = \(String(describing: Error.self))")
-
 
287
                break
62
        }
288
            }
63
        completionHandler(true)
289
        }
64
    }
290
        
65
    
291
        
66
    func sendSync(record: SyncModel)
292
    }
Línea 81... Línea 307...
81
            //print("Send Sync  ")
307
            //print("Send Sync  ")
Línea 82... Línea 308...
82
            
308
            
83
            switch response.result {
309
            switch response.result {
84
                case .success:
310
                case .success:
85
                    let result = try? JSON(data: response.data!)
311
                    let result = try? JSON(data: response.data!)
-
 
312
                    if result?["success"] ?? "" != false {
-
 
313
                        
-
 
314
                        
-
 
315
                        
86
                    if result?["success"] ?? "" != false{
316
                        
87
                        let sync_id = Int(result?["data"]["sync_id"].stringValue ?? "0") ?? 0
317
                        let sync_id = Int(result?["data"]["sync_id"].stringValue ?? "0") ?? 0
88
                        if sync_id > 0 {
318
                        if sync_id > 0 {
89
                            self.syncDao.remove(id: sync_id)
319
                            self.syncDao.remove(id: sync_id)
90
                        }
320
                        }
Línea 97... Línea 327...
97
        }
327
        }
98
    }
328
    }
Línea 99... Línea 329...
99
 
329
 
Línea 100... Línea -...
100
    func registerFcm(record: SyncModel) {
-
 
-
 
330
    func registerFcm(record: SyncModel) {
Línea 101... Línea 331...
101
 
331
 
102
        let appData = appDao.selectOne()
332
      
103
        
333
        
104
        let deviceUuid = appData.deviceUuid
334
        let deviceUuid = appData.deviceUuid
Línea 171... Línea 401...
171
                        let aes = result?["data"]["aes"].stringValue ?? ""
401
                        let aes = result?["data"]["aes"].stringValue ?? ""
172
                        let password = result?["data"]["password"].stringValue ?? ""
402
                        let password = result?["data"]["password"].stringValue ?? ""
Línea 173... Línea 403...
173
 
403
 
Línea 174... Línea -...
174
                        if !aes.isEmpty && !password.isEmpty {
-
 
175
 
-
 
176
            
404
                        if !aes.isEmpty && !password.isEmpty {
177
                            var appData = self.appDao.selectOne()
405
 
178
                            appData.deviceAes = aes
-
 
179
                            appData.devicePassword = password
-
 
180
                            
406
                            self.appData.deviceAes = aes
181
                            print("update query : 1")
407
                            self.appData.devicePassword = password
Línea 182... Línea 408...
182
                            self.appDao.update(model: appData)
408
                            self.appData.save()
183
                        }
409
                        }
184
                        
410