Kinvey/swift-sdk

View on GitHub
Kinvey/Kinvey/CountOperation.swift

Summary

Maintainability
A
0 mins
Test Coverage
//
//  CountOperation.swift
//  Kinvey
//
//  Created by Victor Barros on 2016-08-24.
//  Copyright © 2016 Kinvey. All rights reserved.
//

import Foundation

class CountOperation<T: Persistable>: ReadOperation<T, Int, Swift.Error>, ReadOperationType where T: NSObject {
    
    let query: Query?
    
    typealias ResultType = Result<Int, Swift.Error>
    let requestStartHeaderHandler: ((Date) -> Void)?
    
    init(
        query: Query? = nil,
        readPolicy: ReadPolicy,
        validationStrategy: ValidationStrategy?,
        cache: AnyCache<T>?,
        options: Options?,
        requestStartHeaderHandler: ((Date) -> Void)? = nil
    ) {
        self.query = query
        self.requestStartHeaderHandler = requestStartHeaderHandler
        super.init(
            readPolicy: readPolicy,
            validationStrategy: validationStrategy,
            cache: cache,
            options: options
        )
    }
    
    func executeLocal(_ completionHandler: CompletionHandler? = nil) -> AnyRequest<ResultType> {
        let request = LocalRequest<ResultType>()
        request.execute { () -> Void in
            let result: ResultType
            if let cache = self.cache {
                let count = cache.count(query: self.query)
                result = .success(count)
            } else {
                result = .success(0)
            }
            request.result = result
            completionHandler?(result)
        }
        return AnyRequest(request)
    }
    
    func executeNetwork(_ completionHandler: CompletionHandler? = nil) -> AnyRequest<ResultType> {
        let request = client.networkRequestFactory.appData.buildAppDataCountByQuery(
            collectionName: try! T.collectionName(),
            query: query,
            options: options,
            resultType: ResultType.self
        )
        request.execute() { data, response, error in
            if let requestStartHeader = response?.requestStartHeader {
                self.requestStartHeaderHandler?(requestStartHeader)
            }
            let result: ResultType
            if let response = response, response.isOK,
                let data = data,
                let json = try? JSONSerialization.jsonObject(with: data),
                let jsonObject = json as? [String : Int],
                let count = jsonObject["count"]
            {
                result = .success(count)
            } else {
                result = .failure(buildError(data, response, error, self.client))
            }
            request.result = result
            completionHandler?(result)
        }
        return AnyRequest(request)
    }
    
}