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