diff --git a/MVMCore/MVMCore/ActionHandling/ActionOpenPageHandler.swift b/MVMCore/MVMCore/ActionHandling/ActionOpenPageHandler.swift index 7bdc502..3c0887e 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionOpenPageHandler.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionOpenPageHandler.swift @@ -44,7 +44,11 @@ open class ActionOpenPageHandler: MVMCoreJSONActionHandlerProtocol { open func performRequestAddingClientParameters(with requestParameters: MVMCoreRequestParameters, model: ActionOpenPageModel, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) async throws -> MVMCoreLoadRequestOperation? { // Adds any client parameters to the request parameters. if let parametersToFetch = model.clientParameters, - let fetchedParameters = try await ClientParameterHandler().getClientParameters(with: parametersToFetch, requestParameters: requestParameters.parameters as? [String : Any] ?? [:], showLoadingOverlay: !requestParameters.backgroundRequest) { + let fetchedParameters = try await ClientParameterHandler().getClientParameters( + with: parametersToFetch, + requestParameters: requestParameters.parameters as? [String : Any] ?? [:], + actionId: MVMCoreActionHandler.getUUID(additionalData: additionalData) ?? "unknown", + showLoadingOverlay: !requestParameters.backgroundRequest) { requestParameters.add(fetchedParameters) } try Task.checkCancellation() @@ -68,7 +72,7 @@ open class ActionOpenPageHandler: MVMCoreJSONActionHandlerProtocol { public extension ClientParameterHandler { /// Iterates through the clientParameters list. Gets values from the individual handlers and attaches the parameters to extraParameters. - func getClientParameters(with model: ClientParameterModel, requestParameters: [String: Any], showLoadingOverlay: Bool) async throws -> [String: Any]? { + func getClientParameters(with model: ClientParameterModel, requestParameters: [String: Any], actionId: String, showLoadingOverlay: Bool) async throws -> [String: Any]? { if showLoadingOverlay { MVMCoreLoadingOverlayHandler.sharedLoadingOverlay()?.startLoading() } @@ -79,7 +83,7 @@ public extension ClientParameterHandler { } return try await withCheckedThrowingContinuation({ continuation in do { - try getParameters(with: model, requestParameters: requestParameters) { parameters in + try getParameters(with: model, requestParameters: requestParameters, actionId: actionId) { parameters in continuation.resume(returning: parameters) } } catch { diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift index e64c756..a53c062 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift @@ -15,7 +15,6 @@ let parameterType = try ModelRegistry.getHandler(clientParameterModel) as! ClientParameterProtocol.Type return parameterType.init(clientParameterModel) } catch { - MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterNotFound(name: clientParameterModel.type)) if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) { MVMCoreLoggingHandler.addError(toLog: errorObject) } @@ -42,15 +41,15 @@ /// ] ///} /// completionHandler can return flat dictinary or a map. It depends on the paramters handler - open func getParameters(with clientParameters: [String: Any], requestParameters: [String: Any], completionHandler:@escaping ([String: Any]?) -> ()) throws { + open func getParameters(with clientParameters: [String: Any], requestParameters: [String: Any], actionId: String, completionHandler:@escaping ([String: Any]?) -> ()) throws { guard let clientParameterModel = try getClientParameterModel(clientParameters) else { completionHandler(nil) return } - try getParameters(with: clientParameterModel, requestParameters: requestParameters, completionHandler: completionHandler) + try getParameters(with: clientParameterModel, requestParameters: requestParameters, actionId: actionId, completionHandler: completionHandler) } - open func getParameters(with model: ClientParameterModel, requestParameters: [String: Any], completionHandler:@escaping ([String: Any]?) -> ()) throws { + open func getParameters(with model: ClientParameterModel, requestParameters: [String: Any], actionId: String, completionHandler:@escaping ([String: Any]?) -> ()) throws { let parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter") let group = DispatchGroup() @@ -67,7 +66,10 @@ var mergedParametersList: [String: AnyHashable] { return returnedList.enumerated().map { (index, element) -> [String: AnyHashable] in guard let parameter = element else { - MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterTimeout(name: model.list[index].type, uuid: requestUUID[index])) + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterTimeout( + name: model.list[index].type, + uuid: requestUUID[index], + actionId: actionId)) return parameterHandlerList[index].valueOnTimeout() } return parameter @@ -96,7 +98,7 @@ // Setup the parameter execution. for (index, parameterHandler) in parameterHandlerList.enumerated() { let parameterType = parameterHandler.clientParameterModel.type - MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetching(name: parameterType, uuid: requestUUID[index])) + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterStartFetch(name: parameterType, uuid: requestUUID[index], actionId: actionId)) group.enter() parameterHandler.fetchClientParameters(requestParameters: requestParameters, timingOutIn: timeout) { (receivedParameter) in @@ -105,7 +107,7 @@ if (returnedList[index] != nil) { MVMCoreLoggingHandler.addError(toLog: MVMCoreErrorObject(title: nil, message: "Client parameter \(parameterType) has already executed. The completion handler should only be called once!", code: ErrorCode.default.rawValue, domain: ErrorDomainNative, location: String(describing: ClientParameterHandler.self))!) } else { - MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetchComplete(name: parameterType, uuid: requestUUID[index])) + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetchComplete(name: parameterType, uuid: requestUUID[index], actionId: actionId)) returnedList[index] = receivedParameter group.leave() // Leaving is only done after setup (barriered). } diff --git a/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift b/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift index 3d41ea5..0753ff7 100644 --- a/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift +++ b/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift @@ -56,25 +56,29 @@ public enum MVMCoreEvent { /// Could not find the client parameter specified. case clientParameterNotFound( - name: String + name: String, + actionId: String ) /// The client perameter handler was invoked and is in progress. - case clientParameterFetching( + case clientParameterStartFetch( name: String, - uuid: String + uuid: String, + actionId: String ) /// The client perameter handler timed out and is returning a default value. case clientParameterTimeout( name: String, - uuid: String + uuid: String, + actionId: String ) /// The client paramter fetch completed. case clientParameterFetchComplete( name: String, - uuid: String + uuid: String, + actionId: String ) public enum EventType: String { @@ -94,7 +98,7 @@ public enum MVMCoreEvent { case .actionFailed: return .action case .actionComplete: return .action case .clientParameterNotFound: return .clientParameter - case .clientParameterFetching: return .clientParameter + case .clientParameterStartFetch: return .clientParameter case .clientParameterTimeout: return .clientParameter case .clientParameterFetchComplete: return .clientParameter }