コード例 #1
0
        public InProductTrainingModule(
            IInProductTrainingController inProductTrainingController,
            IMetadataRegistry metadataRegistry,
            IPolicyEvaluator policyEvaluator,
            ILoggerFactory loggerFactory)
            : base(InProductTrainingServiceBootstrapper.ServiceNameShort, metadataRegistry, policyEvaluator, loggerFactory)
        {
            _inProductTrainingController = inProductTrainingController;

            CreateRoute("CreateInProductTrainingView", HttpMethod.Post, $"{BaseInProductTrainingUrl}/viewed", CreateInProductTrainingViewAsync)
            .Description("Create a new InProductTraining resource")
            .StatusCodes(HttpStatusCode.Created, HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.BadRequest, HttpStatusCode.InternalServerError)
            .RequestFormat(InProductTrainingViewRequest.Example())
            .ResponseFormat(InProductTrainingViewResponse.Example());

            CreateRoute("GetViewedInProductTraining", HttpMethod.Get, $"{BaseInProductTrainingUrl}/viewed/{{clientApplicationId:int}}", GetViewedInProductTrainingAsync)
            .Description("Get a InProductTrainingView resource by it's identifier.")
            .StatusCodes(HttpStatusCode.OK, HttpStatusCode.BadRequest, HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.InternalServerError, HttpStatusCode.NotFound)
            .ResponseFormat(InProductTrainingViewResponse.Example());

            CreateRoute("CreateWizardView", HttpMethod.Post, $"{BaseWizardsUrl}/viewed", CreateWizardViewAsync)
            .Description("Create a new wizard view resource")
            .StatusCodes(HttpStatusCode.Created, HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.BadRequest, HttpStatusCode.InternalServerError)
            .RequestFormat(ViewedWizard.Example())
            .ResponseFormat(WizardViewResponse.Example());

            CreateRoute("GetWizardViewsByUserId", HttpMethod.Get, $"{BaseWizardsUrl}/viewed/{{userId:guid}}", GetWizardViewsByUserIdAsync)
            .Description("Get a wizard view resource by it's identifier.")
            .StatusCodes(HttpStatusCode.OK, HttpStatusCode.BadRequest, HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.InternalServerError, HttpStatusCode.NotFound)
            .ResponseFormat(WizardViewResponse.Example());
        }
        public async Task <InProductTrainingViewResponse> CreateInProductTrainingViewAsync(InProductTrainingViewRequest inProductTrainingViewRequest, Guid userId)
        {
            var validationResult = _validatorLocator.Validate <InProductTrainingViewRequestValidator>(inProductTrainingViewRequest);

            if (!validationResult.IsValid)
            {
                _logger.Error("Validation failed while attempting to create an InProductTrainingView resource.");
                throw new ValidationFailedException(validationResult.Errors);
            }

            var returnPayload    = new InProductTrainingViewResponse();
            var returnMessage    = "";
            var returnResultCode = ResultCode.Failed;

            var userApiResult = await _userApi.GetUserAsync(userId);

            string createdByUserName;

            if (userApiResult != null)
            {
                createdByUserName = !userApiResult.Payload.Username.IsNullOrEmpty() ? userApiResult.Payload.Username : userApiResult.Payload.Email;
            }
            else
            {
                createdByUserName = "******";
            }

            try
            {
                var key         = KeyResolver.InProductTrainingViews(userId, inProductTrainingViewRequest.ClientApplicationId);
                var dtoForTrace = _serializer.SerializeToString(inProductTrainingViewRequest);

                var cachedData = await _cache.SetMembersAsync <InProductTrainingViewResponse>(key);

                // ReSharper disable once UseNullPropagation
                if (cachedData != null)
                {
                    var trainingOfType = cachedData?.Where(t =>
                                                           t.InProductTrainingSubjectId == inProductTrainingViewRequest.InProductTrainingSubjectId &&
                                                           t.Title == inProductTrainingViewRequest.Title &&
                                                           t.UserId == userId)
                                         .FirstOrDefault();

                    if (trainingOfType != null)
                    {
                        returnPayload    = trainingOfType;
                        returnMessage    = CreateInProductTrainingViewReturnCode.RecordAlreadyExists.BuildResponseMessage(inProductTrainingViewRequest, userId);
                        returnResultCode = ResultCode.RecordAlreadyExists;

                        _logger.Info($"Record not created because it already exists in cache. {dtoForTrace}");
                    }
                }

                var populateCache = false;
                InProductTrainingViewResponse queryResult = null;
                if (returnResultCode != ResultCode.RecordAlreadyExists)
                {
                    var returnCode = CreateInProductTrainingViewReturnCode.CreateFailed;
                    queryResult = _dbService.CreateInProductTrainingView(
                        inProductTrainingViewRequest.InProductTrainingSubjectId, userId,
                        inProductTrainingViewRequest.Title, inProductTrainingViewRequest.UserTypeId, createdByUserName, ref returnCode);

                    returnPayload    = queryResult;
                    returnMessage    = returnCode.BuildResponseMessage(inProductTrainingViewRequest, userId);
                    returnResultCode = returnCode.ToResultCode();

                    if (returnCode == CreateInProductTrainingViewReturnCode.CreateSucceeded)
                    {
                        populateCache = true;
                        _logger.Info($"Created InProductTrainingView record. {dtoForTrace}");
                    }
                    else
                    {
                        if (returnCode == CreateInProductTrainingViewReturnCode.RecordAlreadyExists)
                        {
                            populateCache = true;
                            _logger.Info($"Record not created because it already exists in dB. {dtoForTrace}");
                        }
                        else if (returnCode == CreateInProductTrainingViewReturnCode.CreateFailed)
                        {
                            _logger.Error($"{returnMessage} {dtoForTrace}");
                        }
                        else
                        {
                            _logger.Warning($"{returnMessage} {dtoForTrace}");
                        }
                    }
                }

                if (populateCache && queryResult != null)
                {
                    var queryResultAsList = new List <InProductTrainingViewResponse> {
                        queryResult
                    };
                    if (await _cache.SetAddAsync(key, queryResultAsList) > 0 || await _cache.KeyExistsAsync(key))
                    {
                        _logger.Info($"Succesfully cached an item in the set for key '{key}' {dtoForTrace}");
                        if (!await _cache.KeyExpireAsync(key, _expirationTime, CacheCommandOptions.None))
                        {
                            _logger.Error($"Could not set cache expiration for the key '{key}' or the key does not exist. {dtoForTrace}");
                        }
                    }
                    else
                    {
                        _logger.Error($"Could not cache an item in the set for '{key}'. {dtoForTrace}");
                    }
                }
            }
            catch (Exception ex)
            {
                returnPayload.ResultCode    = ResultCode.Failed;
                returnPayload.ReturnMessage = ex.ToString();

                _logger.Error("Create InProductTrainingView failed due to an unknown exception", ex);
            }

            returnPayload.ReturnMessage = returnMessage;
            returnPayload.ResultCode    = returnResultCode;
            return(returnPayload);
        }