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); }