Example #1
0
        /// <summary>
        /// Call action, i.e. service, and wrap the exceptions and result into generic result envelope
        /// </summary>
        /// <param name="serviceCall"></param>
        /// <param name="resultMessages"></param>
        /// <returns></returns>
        public IServiceResultWrap CallService(Func <IServiceResultWrap> serviceCall, Dictionary <Type, string> resultMessages)
        {
            IServiceResultWrap result = null;

            try
            {
                result = serviceCall();
                if (resultMessages.ContainsKey(typeof(string)))
                {
                    result.Messages.Infos.Add(resultMessages[typeof(string)]);
                }
            }
            catch (PtvArgumentException arEx)
            {
                result = new ServiceResultWrap();
                var error = resultMessages.ContainsKey(arEx.GetType()) ? resultMessages[arEx.GetType()] : arEx.Message;
                result.Messages.Errors.Add(new Error(error, arEx.ParamName));
                var wrappedExcps = WrapAllExceptions(arEx);
                logger.LogError("Service call error : " + wrappedExcps);
            }
            catch (PtvAppException ptvEx)
            {
                result = new ServiceResultWrap()
                {
                    Data = ptvEx.AdditionalData
                };

                var error = string.IsNullOrEmpty(ptvEx.CodeIdentifier)
                    ? resultMessages.ContainsKey(ptvEx.GetType())
                        ? resultMessages[ptvEx.GetType()]
                        : ptvEx.Message
                    : ptvEx.CodeIdentifier;

                result.Messages.Errors.Add(new Error(error, ptvEx.AdditionalParams != null ? string.Join(";", ptvEx.AdditionalParams) : null));
                logger.LogDebug(WrapAllExceptions(ptvEx));
            }
            catch (PtvValidationException ptvValidationEx)
            {
                result = new ServiceResultWrap();
                result.Messages.Errors.Add(ptvValidationEx);
            }
            catch (Exception ex)
            {
                var wrappedExcps = WrapAllExceptions(ex);
                logger.LogError("Service call error : " + wrappedExcps);
                var eType = configuration.GetEnvironmentType();
                if ((eType & (EnvironmentTypeEnum.Dev | EnvironmentTypeEnum.Qa | EnvironmentTypeEnum.Test)) == 0)
                {
                    ctxAccessor.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
                    return(result);
                }
                result = new ServiceResultWrap();
                var error = new Error(
                    resultMessages.ContainsKey(ex.GetType()) ? resultMessages[ex.GetType()] : ex.Message, String.Empty,
                    wrappedExcps);
                result.Messages.Errors.Add(error);
            }

            return(result);
        }