protected override async Task <IEnumerable <ExamResultReadModel> > ProcessAsync(ExamResultCommand <ExamResultCreateModel> message, CancellationToken cancellationToken)
        {
            var exam = await _dataContext.TrainingExams
                       .ProjectTo <TrainingExamReadModel>(_configurationProvider)
                       .ToListAsync(cancellationToken)
                       .ConfigureAwait(false);

            if (exam.Count == 0)
            {
                throw new DomainException(422, $"Training Exam is null., Please Create question in exam module.,");
            }
            var dbSet = _dataContext.Set <Data.Entities.TraineeExamResult>();

            foreach (var item in exam)
            {
                var map = _mapper.Map(item, message.Exam);
                dbSet.AddIfNotExists(x => new { x.Id, x.QuestionId, x.CourseId, x.UserId }, _mapper.Map <TraineeExamResult>(map));
            }
            var result = await _dataContext
                         .SaveChangesAsync(cancellationToken)
                         .ConfigureAwait(false);

            var examresult = _dataContext.ExamResults.Include(x => x.Question)
                             .Where(x => x.UserId == message.Exam.UserId && x.CourseId == message.Exam.CourseId);

            return(_mapper.Map <IEnumerable <ExamResultReadModel> >(examresult));
        }
        protected override async Task <UserReadModel> ProcessAsync(UserManagementCommand <UserVerifyOTPModel> message, CancellationToken cancellationToken)
        {
            var model = message.Model;

            var user = await _dataContext.Users.GetByKeyAsync(model.Id)
                       .ConfigureAwait(false);

            if (user == null)
            {
                throw new DomainException(422, $"User with Id '{model.Id}' not found.");
            }
            if (user.PhoneNumber != model.PhoneNumber)
            {
                throw new DomainException(422, $"User with phone number '{model.PhoneNumber}' not exist in system.");
            }

            if (user.OTP != model.OTP)
            {
                throw new DomainException(422, $"The '{model.OTP}' account verification number is not valid.,");
            }

            user.IsPhoneNumberConfirmed = true;
            user.Updated = DateTimeOffset.UtcNow;

            await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

            var readModel = _mapper.Map <UserReadModel>(user);

            return(readModel);
        }
Beispiel #3
0
        protected override async Task <UserReadModel> ProcessAsync(UserManagementCommand <UserSendOTPModel> message, CancellationToken cancellationToken)
        {
            var otp   = GenerateRandomOTP(4, saAllowedCharacters);
            var model = message.Model;

            var user = await _dataContext.Users.GetByKeyAsync(model.Id)
                       .ConfigureAwait(false);

            if (user == null)
            {
                throw new DomainException(422, $"User with Id '{model.Id}' not found.");
            }
            if (user.PhoneNumber != model.PhoneNumber)
            {
                throw new DomainException(422, $"User with phone number '{model.PhoneNumber}' not exist in system.");
            }

            var result = await _sMSTemplateService.SendOTP(user.PhoneNumber, otp).ConfigureAwait(false);

            if (result == false)
            {
                throw new DomainException(422, $"Unable to send OTP '{model.PhoneNumber}' please try again later or contact administrator.");
            }

            user.OTP     = otp;
            user.Updated = DateTimeOffset.UtcNow;
            user.IsPhoneNumberConfirmed = false;
            await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

            var readModel = _mapper.Map <UserReadModel>(user);

            return(readModel);
        }
Beispiel #4
0
        protected override async Task <PaymentReadModel> ProcessAsync(PaymentApprovalCommand <Guid, PaymentTransaction, PaymentReadModel> message, CancellationToken cancellationToken)
        {
            var command = new EntityIdentifierQuery <Guid, PaymentTransaction, PaymentReadModel>(message.Id, message.Principal);
            var result  = await Mediator.Send(command, cancellationToken).ConfigureAwait(false);

            if (result == null)
            {
                throw new DomainException(422, $"Payment Id '{message.Id}' not found.");
            }

            if (result.Status != message.PaymentStatus)
            {
                var commandCourse = new EntityIdentifierQuery <Guid, TrainingCourse, CourseReadModel>(result.CourseId.Value, message.Principal);
                var resultCourse  = await Mediator.Send(commandCourse, cancellationToken).ConfigureAwait(false);

                if (resultCourse == null)
                {
                    throw new DomainException(422, $"Course Id '{result.CourseId}' not found.");
                }

                if (resultCourse.MaxAttendee == resultCourse.NoAttendee)
                {
                    throw new DomainException(422, $"Course '{resultCourse.Title}' is already full.");
                }
                var mapCourse = _mapper.Map <CourseUpdateModel>(resultCourse);
                mapCourse.MaxAttendee = mapCourse.MaxAttendee - 1;
                mapCourse.NoAttendee  = mapCourse.NoAttendee + 1;

                var updateCourse = new EntityUpdateCommand <Guid, TrainingCourse, CourseUpdateModel, CourseReadModel>(resultCourse.Id, mapCourse, message.Principal);

                var mediatorCourse = await Mediator.Send(updateCourse, cancellationToken)
                                     .ConfigureAwait(false);

                result.Status = message.PaymentStatus;
                var map    = _mapper.Map <PaymentUpdateModel>(result);
                var update = new EntityUpdateCommand <Guid, PaymentTransaction, PaymentUpdateModel, PaymentReadModel>(message.Id, map, message.Principal);

                result = await Mediator.Send(update, cancellationToken).ConfigureAwait(false);

                var history      = _mapper.Map <PaymentTransactionHistory>(result);
                var dbSetHistory = _dataContext.Set <Data.Entities.PaymentTransactionHistory>();
                await dbSetHistory.AddAsync(history, cancellationToken).ConfigureAwait(false);

                await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                var mapAttendee = _mapper.Map <TrainingBuildCoursesAttendeeCreatedModel>(result);

                var courseAttendee = new EntityCreateCommand <Core.Data.Entities.TrainingBuildCourseAttendee, TrainingBuildCoursesAttendeeCreatedModel, TrainingBuildCoursesAttendeeReadModel>(mapAttendee, message.Principal);

                var resultCourseAttendee = await Mediator.Send(courseAttendee, cancellationToken).ConfigureAwait(false);
            }
            return(result);
        }
        private async Task <TokenResponse> RefreshAuthenticate(AuthenticateCommand authenticateCommand)
        {
            var tokenRequest = authenticateCommand.TokenRequest;
            var token        = tokenRequest.RefreshToken;

            // hash refresh_token so session can't be hijacked
            var hashedToken = HashToken(token);

            var refreshToken = await _dataContext.RefreshTokens
                               .GetByTokenHashedAsync(hashedToken)
                               .ConfigureAwait(false);

            if (refreshToken == null)
            {
                Logger.LogWarning($"Refresh token not found; Token: {token}");
                throw new AuthenticationException(TokenConstants.Errors.InvalidRequest, "Invalid refresh token");
            }

            if (DateTimeOffset.UtcNow > refreshToken.Expires)
            {
                Logger.LogWarning($"Refresh token expired; Token: {token}");
                throw new AuthenticationException(TokenConstants.Errors.InvalidRequest, "Refresh token expired");
            }
            var clientId = refreshToken.ClientId;
            var userName = refreshToken.UserName;

            // create new token from refresh data
            var result = await CreateToken(authenticateCommand.UserAgent, clientId, userName, null, false).ConfigureAwait(false);

            // delete refresh token to prevent reuse
            _dataContext.RefreshTokens.Remove(refreshToken);
            await _dataContext.SaveChangesAsync().ConfigureAwait(false);

            return(result);
        }
Beispiel #6
0
        protected override async Task <UserReadModel> ProcessAsync(UserManagementCommand <UserForgotPasswordModel> message, CancellationToken cancellationToken)
        {
            var model = message.Model;

            // check for existing user
            var user = await _dataContext.Users
                       .GetByEmailAddressAsync(model.EmailAddress)
                       .ConfigureAwait(false);

            if (user == null)
            {
                throw new DomainException(422, $"User with email '{model.EmailAddress}' not found.");
            }


            var resetToken = Guid.NewGuid().ToString("N");
            var resetHash  = _passwordHasher.HashPassword(resetToken);

            user.ResetHash = resetHash;
            user.UpdatedBy = "system";
            user.Updated   = DateTimeOffset.UtcNow;

            await _dataContext
            .SaveChangesAsync(cancellationToken)
            .ConfigureAwait(false);

            var emailModel = new UserResetPasswordEmail
            {
                EmailAddress = user.EmailAddress,
                DisplayName  = user.DisplayName,
                ResetToken   = resetToken,
                UserAgent    = message.UserAgent,
                ResetLink    = $"{_hostingOptions.Value.ClientDomain}#/reset-password/{resetToken}"
            };

            await _emailTemplateService.SendResetPasswordEmail(emailModel).ConfigureAwait(false);

            // convert to read model
            var readModel = _mapper.Map <UserReadModel>(user);

            return(readModel);
        }
Beispiel #7
0
        protected override async Task <UserReadModel> ProcessAsync(UserManagementCommand <UserChangePasswordModel> message, CancellationToken cancellationToken)
        {
            var model        = message.Model;
            var userId       = message.Principal.Identity.GetUserId();
            var emailAddress = message.Principal.Identity.GetUserName();

            // check for existing user
            var user = await _dataContext.Users
                       .FindAsync(userId)
                       .ConfigureAwait(false);

            if (user == null)
            {
                throw new DomainException(422, $"User with email '{emailAddress}' not found.");
            }

            if (!_passwordHasher.VerifyPassword(user.PasswordHash, model.CurrentPassword))
            {
                throw new DomainException(HttpStatusCode.Unauthorized, "The password is incorrect");
            }

            var passwordHashed = _passwordHasher
                                 .HashPassword(model.UpdatedPassword);

            user.PasswordHash = passwordHashed;
            user.UpdatedBy    = emailAddress;
            user.Updated      = DateTimeOffset.UtcNow;

            await _dataContext
            .SaveChangesAsync(cancellationToken)
            .ConfigureAwait(false);

            // convert to read model
            var readModel = _mapper.Map <UserReadModel>(user);

            return(readModel);
        }
Beispiel #8
0
        protected override async Task <UserReadModel> ProcessAsync(UserManagementCommand <UserResetPasswordModel> message, CancellationToken cancellationToken)
        {
            var model = message.Model;

            // check for existing user
            var user = await _dataContext.Users
                       .GetByEmailAddressAsync(model.EmailAddress)
                       .ConfigureAwait(false);

            if (user == null)
            {
                throw new DomainException(422, $"User with email '{model.EmailAddress}' not found.");
            }

            if (!_passwordHasher.VerifyPassword(user.ResetHash, model.ResetToken))
            {
                throw new DomainException(HttpStatusCode.Forbidden, "Invalid reset password security token.");
            }


            var passwordHashed = _passwordHasher
                                 .HashPassword(model.UpdatedPassword);

            user.PasswordHash      = passwordHashed;
            user.AccessFailedCount = 0;
            user.LockoutEnabled    = false;
            user.LockoutEnd        = null;
            user.Updated           = DateTimeOffset.UtcNow;

            await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

            // convert to read model
            var readModel = _mapper.Map <UserReadModel>(user);

            return(readModel);
        }
Beispiel #9
0
        protected override async Task <UserReadModel> ProcessAsync(UserManagementCommand <UserRegisterModel> message, CancellationToken cancellationToken)
        {
            var otp   = GenerateRandomOTP(4, saAllowedCharacters);
            var model = message.Model;

            using (var scope = await _dataContext.Database.BeginTransactionAsync(cancellationToken).ConfigureAwait(false))
            {
                try
                {
                    // check for existing user
                    var user = await _dataContext.Users
                               .GetByEmailAddressAsync(model.EmailAddress)
                               .ConfigureAwait(false);

                    if (user != null)
                    {
                        throw new DomainException(422, $"User with email '{model.EmailAddress}' already exists.");
                    }

                    var passwordHashed = _passwordHasher
                                         .HashPassword(model.Password);

                    user = new Data.Entities.User
                    {
                        EmailAddress           = model.EmailAddress,
                        DisplayName            = model.DisplayName,
                        PasswordHash           = passwordHashed,
                        Created                = DateTimeOffset.UtcNow,
                        Updated                = DateTimeOffset.UtcNow,
                        PhoneNumber            = model.PhoneNumber,
                        OTP                    = otp,
                        IsPhoneNumberConfirmed = false,
                        IsGlobalAdministrator  = false
                    };

                    await _dataContext.Users
                    .AddAsync(user, cancellationToken)
                    .ConfigureAwait(false);

                    await _dataContext
                    .SaveChangesAsync(cancellationToken)
                    .ConfigureAwait(false);


                    // convert to read model
                    var readModel   = _mapper.Map <UserReadModel>(user);
                    var currentUser = _mapper.Map <Data.Entities.UserProfile>(user);

                    var roles = await _dataContext.Roles.GetByNameAsync(Data.Constants.Role.MemberName).ConfigureAwait(false);

                    var defaultRoles = _mapper.Map <Data.Entities.UserRole>(user);
                    defaultRoles.RoleId   = roles.Id;
                    defaultRoles.UserType = (int)Enum.Roles.Trainee;

                    await _dataContext.UserRoles.AddAsync(defaultRoles, cancellationToken).ConfigureAwait(false);

                    await _dataContext.UserProfiles.AddAsync(currentUser, cancellationToken).ConfigureAwait(false);

                    var status = await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                    if (status != 0)
                    {
                        var result = await _sMSTemplateService.SendOTP(user.PhoneNumber, otp).ConfigureAwait(false);

                        if (result == false)
                        {
                            Logger.LogWarning($"Unable to send OTP '{model.PhoneNumber}' please try again later or contact administrator.");
                            throw new DomainException(422, $"Unable to send OTP '{model.PhoneNumber}' please try again later or contact administrator.");
                        }
                        else
                        {
                            scope.Commit();
                            return(readModel);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex.Message);
                    scope.Rollback();
                    throw new DomainException(422, $"Unable to Register:'{ex.Message}', Please try again.");
                }
            }

            return(null);
        }
        protected override async Task <TrainingVideoReadModel> ProcessAsync(TrainingVideoCommand <TrainingVideoCreateModel> message, CancellationToken cancellationToken)
        {
            var records = new TrainingVideoReadModel();
            var current = _mapper.Map <TrainingVideo>(message.Model);
            var result  = _mapper.Map <CreateResult>(_dataContext.FindFolder(new TrainingVideoPic()
            {
                Name = typeof(TrainingVideoPic).Name
            }));

            if (result == null)
            {
                result = _dataContext.CreateDir(new TrainingVideoPic()
                {
                    Name = typeof(TrainingVideoPic).Name, ParentPath = null
                });
            }

            if (message.Model.File != null)
            {
                if (message.Model.File.Length > 0)
                {
                    var file     = message.Model.File;
                    var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
                    using (var ms = new MemoryStream())
                    {
                        file.CopyTo(ms);
                        var now = DateTimeOffset.Now;
                        result = _dataContext.CreateFile(new TrainingVideoPic()
                        {
                            Name             = Guid.NewGuid() + "_" + message.Model.File.FileName,
                            File_stream      = ms.ToArray(),
                            ParentPath       = result.Path,
                            Creation_time    = now,
                            Last_access_time = now,
                            Last_write_time  = now
                        });
                        _mapper.Map(result, current);
                    }
                }
            }
            if (result != null)
            {
                var dbSet = _dataContext.Set <TrainingVideo>();
                await dbSet.AddAsync(current, cancellationToken).ConfigureAwait(false);

                var status = await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                current = await _dataContext.TrainingVideo
                          .Where(x => x.Id == current.Id).SingleOrDefaultAsync().ConfigureAwait(false);

                if (status != 0)
                {
                    _mapper.Map(current, records);
                    var videofile = _dataContext.TrainingVideoPicFiletable.GetLevelVidoePicId(current.FileId);
                    _mapper.Map(videofile.FirstOrDefault(), records);
                    return(records);
                }
                else
                {
                    Logger.LogWarning($"Unable to insert training video, please try again later or contact administrator.");
                    throw new DomainException(422, $"Unable to insert training video, please try again later or contact administrator.");
                }
            }
            else
            {
                Logger.LogWarning($"Unable to insert training video, please try again later or contact administrator.");
                throw new DomainException(422, $"Unable to insert training video, please try again later or contact administrator.");
            }
        }
        protected override async Task <UserProfileReadModel> ProcessAsync(UserProfileCommand message, CancellationToken cancellationToken)
        {
            byte[] bytes;
            if (message.UserProfile == null)
            {
                throw new DomainException(422, $"Unable to Register: User Profile is null , Please try again.");
            }

            var currentUser = await _dataContext.UserProfiles
                              .ByUserId(message.UserProfile.UserId)
                              .ConfigureAwait(false);

            if (currentUser == null)
            {
                throw new DomainException(422, $"User profile not found, Please try again.");
            }
            _mapper.Map(message.UserProfile, currentUser);
            var user = _dataContext.Users.Where(x => x.Id == message.UserProfile.UserId).FirstOrDefault();

            if (user == null)
            {
                throw new DomainException(422, $"User not found, Please try again.");
            }
            _mapper.Map(currentUser, user);

            CreateResult result = new CreateResult();

            result = _mapper.Map <CreateResult>(_dataContext.FindFolder(new UserProfilePic()
            {
                Name = typeof(UserProfilePic).Name
            }));
            if (result == null)
            {
                result = _dataContext.CreateDir(new UserProfilePic()
                {
                    Name = typeof(UserProfilePic).Name, ParentPath = null
                });
            }
            if (message.UserProfile.File != null)
            {
                var file     = message.UserProfile.File;
                var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
                using (var ms = new MemoryStream())
                {
                    file.CopyTo(ms);
                    var now            = DateTimeOffset.Now;
                    var userProfilePic = new UserProfilePic()
                    {
                        Stream_id        = currentUser.FileId ?? Guid.NewGuid(),
                        Name             = Guid.NewGuid() + "_" + message.UserProfile.File.FileName,
                        File_stream      = ms.ToArray(),
                        ParentPath       = result.Path,
                        Creation_time    = now,
                        Last_access_time = now,
                        Last_write_time  = now
                    };
                    result = currentUser.FileId.HasValue ? _dataContext.UpdateFile(userProfilePic) : _dataContext.CreateFile(userProfilePic);
                }
                _mapper.Map(result, currentUser);
            }
            if (result != null)
            {
                var status = await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                if (status != 0)
                {
                    return(_mapper.Map <UserProfileReadModel>(currentUser));
                }
                else
                {
                    Logger.LogWarning($"Unable to update user profile '{currentUser.FullName }' please try again later or contact administrator.");
                    throw new DomainException(422, $"Unable to update user profile '{currentUser.FullName }' please try again later or contact administrator.");
                }
            }
            else
            {
                Logger.LogWarning($"Unable to update user profile '{currentUser.FullName }' please try again later or contact administrator.");
                throw new DomainException(422, $"Unable to update user profile '{currentUser.FullName }' please try again later or contact administrator.");
            }
        }
Beispiel #12
0
        protected override async Task <TrainingVideoReadModel> ProcessAsync(TrainingVideoUpdateCommand <TrainingVideoUpdateModel, Guid> message, CancellationToken cancellationToken)
        {
            if (message.Id == null)
            {
                throw new DomainException(422, $"Id is null , Please try again.");
            }
            var current = await _dataContext.TrainingVideo.GetByKeyAsync
                              (message.Id);

            current = current == null?_mapper.Map <Data.Entities.TrainingVideo>(message.TrainingVideo) :
                          _mapper.Map(message.TrainingVideo, current);

            CreateResult result = new CreateResult();

            result = _mapper.Map <CreateResult>(_dataContext.FindFolder(new PaymentTransactionPic()
            {
                Name = typeof(PaymentTransactionPic).Name
            }));
            if (result == null)
            {
                result = _dataContext.CreateDir(new PaymentTransactionPic()
                {
                    Name = typeof(PaymentTransactionPic).Name, ParentPath = null
                });
            }
            if (message.TrainingVideo.File != null)
            {
                if (message.TrainingVideo.File.Length > 0)
                {
                    var file     = message.TrainingVideo.File;
                    var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
                    using (var ms = new MemoryStream())
                    {
                        file.CopyTo(ms);
                        var now     = DateTimeOffset.Now;
                        var payment = new PaymentTransactionPic()
                        {
                            Name             = Guid.NewGuid() + "_" + message.TrainingVideo.File.FileName,
                            File_stream      = ms.ToArray(),
                            ParentPath       = result.Path,
                            Creation_time    = now,
                            Last_access_time = now,
                            Last_write_time  = now,
                            Stream_id        = current == null?Guid.NewGuid() : current.FileId
                        };

                        result = _dataContext.UpdateFile(payment);
                    }
                    _mapper.Map(result, current);
                }
            }
            if (result != null)
            {
                if (current.Id == Guid.Empty)
                {
                    var dbSet = _dataContext.Set <Data.Entities.TrainingVideo>();
                    await dbSet.AddAsync(current, cancellationToken).ConfigureAwait(false);
                }
                var status = await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                if (status != 0)
                {
                    return(_mapper.Map <TrainingVideoReadModel>(current));
                }
                else
                {
                    Logger.LogWarning($"Unable to update training video, please try again later or contact administrator.");
                    throw new DomainException(422, $"Unable to update training video, please try again later or contact administrator.");
                }
            }
            else
            {
                Logger.LogWarning($"Unable to update training video, please try again later or contact administrator.");
                throw new DomainException(422, $"Unable to update training video, please try again later or contact administrator.");
            }
        }
        protected override async Task <PaymentReadModel> ProcessAsync(PaymentCommand message, CancellationToken cancellationToken)
        {
            CreateResult result = new CreateResult();

            if (message.Payment.UserProfileId == null)
            {
                throw new DomainException(422, $"User Profile  Id is null , Please try again.");
            }
            var current = _dataContext.PaymentTransactions
                          .GetByUserProfileId(message.Payment.UserProfileId.Value).Result;

            if (!message.Payment.CourseId.HasValue)
            {
                throw new DomainException(422, $"Course is required for training registration and payments.");
            }

            var course = _dataContext.TrainingCourse.GetByKey(message.Payment.CourseId.Value);

            if (course == null)
            {
                throw new DomainException(422, $"Course is not exists.");
            }
            if (course.NoAttendee == course.MaxAttendee)
            {
                throw new DomainException(422, $"Course is already full., Please select other course or contact System Administrator.");
            }

            if (current != null)
            {
                throw new DomainException(422, $"You already register to training, Please contact System Administrator.");
            }
            current = current == null?_mapper.Map <Data.Entities.PaymentTransaction>(message.Payment) :
                          _mapper.Map(message.Payment, current);


            result = _mapper.Map <CreateResult>(_dataContext.FindFolder(new PaymentTransactionPic()
            {
                Name = typeof(PaymentTransactionPic).Name
            }));
            if (result == null)
            {
                result = _dataContext.CreateDir(new PaymentTransactionPic()
                {
                    Name = typeof(PaymentTransactionPic).Name, ParentPath = null
                });
            }
            if (message.Payment.File != null)
            {
                if (message.Payment.File.Length > 0)
                {
                    var file     = message.Payment.File;
                    var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
                    using (var ms = new MemoryStream())
                    {
                        file.CopyTo(ms);
                        var now     = DateTimeOffset.Now;
                        var payment = new PaymentTransactionPic()
                        {
                            Name             = Guid.NewGuid() + "_" + message.Payment.File.FileName,
                            File_stream      = ms.ToArray(),
                            ParentPath       = result.Path,
                            Creation_time    = now,
                            Last_access_time = now,
                            Last_write_time  = now,
                            Stream_id        = current.FileId ?? Guid.NewGuid()
                        };

                        result = _dataContext.CreateFile(payment);
                    }
                    _mapper.Map(result, current);
                }
            }
            if (result != null)
            {
                if (current.Id == Guid.Empty)
                {
                    var dbSet = _dataContext.Set <Data.Entities.PaymentTransaction>();
                    await dbSet
                    .AddAsync(current, cancellationToken)
                    .ConfigureAwait(false);
                }
                var status = await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                if (status != 0)
                {
                    var msg = string.Format(@"Request for TOT payment approval. Id: {0}", current.Id);
                    await _sMSTemplateService.ForApproval(_smsConfiguration.Value.Admin, msg)
                    .ConfigureAwait(false);

                    var history      = _mapper.Map <Data.Entities.PaymentTransactionHistory>(current);
                    var dbSetHistory = _dataContext.Set <Data.Entities.PaymentTransactionHistory>();
                    await dbSetHistory.AddAsync(history, cancellationToken).ConfigureAwait(false);

                    await _dataContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false);

                    return(_mapper.Map <PaymentReadModel>(current));
                }
                else
                {
                    Logger.LogWarning($"Unable to update user your payment, please try again later or contact administrator.");
                    throw new DomainException(422, $"Unable to update user your payment, please try again later or contact administrator.");
                }
            }
            else
            {
                Logger.LogWarning($"Unable to update user your payment, please try again later or contact administrator.");
                throw new DomainException(422, $"Unable to update user your payment, please try again later or contact administrator.");
            }
        }