wire in source request UUID for client parameter events

This commit is contained in:
Kyle Matthew Hedden 2022-08-31 14:34:59 -04:00
parent 55d6df4e25
commit dfb58e04b6
3 changed files with 26 additions and 16 deletions

View File

@ -44,7 +44,11 @@ open class ActionOpenPageHandler: MVMCoreJSONActionHandlerProtocol {
open func performRequestAddingClientParameters(with requestParameters: MVMCoreRequestParameters, model: ActionOpenPageModel, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) async throws -> MVMCoreLoadRequestOperation? { open func performRequestAddingClientParameters(with requestParameters: MVMCoreRequestParameters, model: ActionOpenPageModel, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) async throws -> MVMCoreLoadRequestOperation? {
// Adds any client parameters to the request parameters. // Adds any client parameters to the request parameters.
if let parametersToFetch = model.clientParameters, 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) requestParameters.add(fetchedParameters)
} }
try Task.checkCancellation() try Task.checkCancellation()
@ -68,7 +72,7 @@ open class ActionOpenPageHandler: MVMCoreJSONActionHandlerProtocol {
public extension ClientParameterHandler { public extension ClientParameterHandler {
/// Iterates through the clientParameters list. Gets values from the individual handlers and attaches the parameters to extraParameters. /// 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 { if showLoadingOverlay {
MVMCoreLoadingOverlayHandler.sharedLoadingOverlay()?.startLoading() MVMCoreLoadingOverlayHandler.sharedLoadingOverlay()?.startLoading()
} }
@ -79,7 +83,7 @@ public extension ClientParameterHandler {
} }
return try await withCheckedThrowingContinuation({ continuation in return try await withCheckedThrowingContinuation({ continuation in
do { do {
try getParameters(with: model, requestParameters: requestParameters) { parameters in try getParameters(with: model, requestParameters: requestParameters, actionId: actionId) { parameters in
continuation.resume(returning: parameters) continuation.resume(returning: parameters)
} }
} catch { } catch {

View File

@ -15,7 +15,6 @@
let parameterType = try ModelRegistry.getHandler(clientParameterModel) as! ClientParameterProtocol.Type let parameterType = try ModelRegistry.getHandler(clientParameterModel) as! ClientParameterProtocol.Type
return parameterType.init(clientParameterModel) return parameterType.init(clientParameterModel)
} catch { } catch {
MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterNotFound(name: clientParameterModel.type))
if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) { if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) {
MVMCoreLoggingHandler.addError(toLog: errorObject) MVMCoreLoggingHandler.addError(toLog: errorObject)
} }
@ -42,15 +41,15 @@
/// ] /// ]
///} ///}
/// completionHandler can return flat dictinary or a map. It depends on the paramters handler /// 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 { guard let clientParameterModel = try getClientParameterModel(clientParameters) else {
completionHandler(nil) completionHandler(nil)
return 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 parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter")
let group = DispatchGroup() let group = DispatchGroup()
@ -67,7 +66,10 @@
var mergedParametersList: [String: AnyHashable] { var mergedParametersList: [String: AnyHashable] {
return returnedList.enumerated().map { (index, element) -> [String: AnyHashable] in return returnedList.enumerated().map { (index, element) -> [String: AnyHashable] in
guard let parameter = element else { 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 parameterHandlerList[index].valueOnTimeout()
} }
return parameter return parameter
@ -96,7 +98,7 @@
// Setup the parameter execution. // Setup the parameter execution.
for (index, parameterHandler) in parameterHandlerList.enumerated() { for (index, parameterHandler) in parameterHandlerList.enumerated() {
let parameterType = parameterHandler.clientParameterModel.type 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() group.enter()
parameterHandler.fetchClientParameters(requestParameters: requestParameters, parameterHandler.fetchClientParameters(requestParameters: requestParameters,
timingOutIn: timeout) { (receivedParameter) in timingOutIn: timeout) { (receivedParameter) in
@ -105,7 +107,7 @@
if (returnedList[index] != nil) { 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))!) 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 { } else {
MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetchComplete(name: parameterType, uuid: requestUUID[index])) MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetchComplete(name: parameterType, uuid: requestUUID[index], actionId: actionId))
returnedList[index] = receivedParameter returnedList[index] = receivedParameter
group.leave() // Leaving is only done after setup (barriered). group.leave() // Leaving is only done after setup (barriered).
} }

View File

@ -56,25 +56,29 @@ public enum MVMCoreEvent {
/// Could not find the client parameter specified. /// Could not find the client parameter specified.
case clientParameterNotFound( case clientParameterNotFound(
name: String name: String,
actionId: String
) )
/// The client perameter handler was invoked and is in progress. /// The client perameter handler was invoked and is in progress.
case clientParameterFetching( case clientParameterStartFetch(
name: String, name: String,
uuid: String uuid: String,
actionId: String
) )
/// The client perameter handler timed out and is returning a default value. /// The client perameter handler timed out and is returning a default value.
case clientParameterTimeout( case clientParameterTimeout(
name: String, name: String,
uuid: String uuid: String,
actionId: String
) )
/// The client paramter fetch completed. /// The client paramter fetch completed.
case clientParameterFetchComplete( case clientParameterFetchComplete(
name: String, name: String,
uuid: String uuid: String,
actionId: String
) )
public enum EventType: String { public enum EventType: String {
@ -94,7 +98,7 @@ public enum MVMCoreEvent {
case .actionFailed: return .action case .actionFailed: return .action
case .actionComplete: return .action case .actionComplete: return .action
case .clientParameterNotFound: return .clientParameter case .clientParameterNotFound: return .clientParameter
case .clientParameterFetching: return .clientParameter case .clientParameterStartFetch: return .clientParameter
case .clientParameterTimeout: return .clientParameter case .clientParameterTimeout: return .clientParameter
case .clientParameterFetchComplete: return .clientParameter case .clientParameterFetchComplete: return .clientParameter
} }