public ResponseModel <UserViewModel> ChangePassword(ChangePasswordViewModel model)
        {
            ResponseModel <UserViewModel> response = new ResponseModel <UserViewModel>();

            try
            {
                var user        = _dynamodbUserContext.GetByIdAsync(model.UserId).Result;
                var oldPassword = Hasher.GenerateHash(model.OldPassword + user.Salt);
                if (user.Password != oldPassword)
                {
                    response.ReturnMessage.Add("Password is incorrect");
                    response.Status = false;
                    return(response);
                }
                // New Password
                var    salt           = Hasher.GetSalt();
                string hashedPassword = Hasher.GenerateHash(model.NewPassword + salt);
                user.Salt     = salt;
                user.Password = hashedPassword;
                _dynamodbUserContext.SaveAsync(user);
                response.Entity = _mapper.Map <UserViewModel>(user);
                response.Status = true;
                response.ReturnMessage.Add("Password changed successfully.");
            }
            catch (Exception ex)
            {
                response.Status = false;
                response.ReturnMessage.Add(ex.Message);
            }
            return(response);
        }
        public async Task <ResponseModel <BookDetails> > DeleteAsync(string id)
        {
            ResponseModel <BookDetails> response = new ResponseModel <BookDetails>();

            try
            {
                var item = await _dynamoDbBookContext.GetByIdAsync(id);

                await _dynamoDbBookContext.DeleteByIdAsync(item);

                response.Status = true;
                response.ReturnMessage.Add("Book has been deleted successfully.");
            }
            catch (AmazonServiceException amazon)
            {
                response.Status = false;
                response.ReturnMessage.Add($"Amazon error in table operation! Error: {amazon.Message}");
            }
            catch (Exception ex)
            {
                response.Status = false;
                response.ReturnMessage.Add(ex.Message);
            }
            return(response);
        }
        public async Task <ResponseModel <UserServicesItem> > CreateAsync(BookRequestParam item, SecurityModel security)
        {
            ResponseModel <UserServicesItem> response = new ResponseModel <UserServicesItem>();

            try
            {
                UserServicesItem bookRequestInfo = new UserServicesItem();
                ScanFilter       filter          = new ScanFilter();
                filter.AddCondition("UserId", ScanOperator.Equal, item.UserId);
                filter.AddCondition("BookId", ScanOperator.Equal, item.BookId);
                filter.AddCondition("IsReserved", ScanOperator.Equal, true);
                var userContextItem = _dynamodbContext.GetAsync(filter).Result;
                if (!userContextItem.Any())
                {
                    var user = await _dynamoDbUserContex.GetByIdAsync(item.UserId);

                    var book = await _dynamoDBBookContext.GetByIdAsync(item.BookId);

                    if (string.IsNullOrEmpty(bookRequestInfo.Id))
                    {
                        bookRequestInfo.Id = Guid.NewGuid().ToString();
                    }
                    bookRequestInfo.BookId        = item.BookId;
                    bookRequestInfo.UserId        = item.UserId;
                    bookRequestInfo.RequestStatus = "Requested";
                    bookRequestInfo.BookName      = book.BookName;
                    bookRequestInfo.BookAuthor    = book.BookAuthor;
                    bookRequestInfo.BookType      = book.BookType;
                    bookRequestInfo.BookPrice     = book.BookPrice;
                    bookRequestInfo.Stock         = book.Stock;
                    bookRequestInfo.UserName      = user.UserName;
                    bookRequestInfo.Email         = user.Email;
                    bookRequestInfo.FirstName     = user.FirstName;
                    bookRequestInfo.LastName      = user.LastName;
                    bookRequestInfo.SubmittedOn   = DateTime.UtcNow;
                    bookRequestInfo.IsReserved    = true;
                    await _dynamodbContext.SaveAsync(bookRequestInfo);

                    response.Status = true;
                    response.ReturnMessage.Add("Your request has been submitted to admin, Please wait for approbal.");
                }
                else
                {
                    response.Status = true;
                    response.ReturnMessage.Add("Oops!! You have already requested this book.");
                }
            }
            catch (Exception ex)
            {
                response.Status = false;
                response.ReturnMessage.Add(ex.Message);
            }
            return(response);
        }
        public async Task <ResponseModel <string> > ApproveUserRequest(RequestApproveModel entity, SecurityModel securityModel)
        {
            ResponseModel <string> response = new ResponseModel <string>();

            try
            {
                var bookRequestbyUser = await _dynamodbContext.GetByIdAsync(entity.Id);

                var user = await _dynamoDbUserContex.GetByIdAsync(entity.UserId);

                var book = await _dynamoDBBookContext.GetByIdAsync(entity.BookId);

                bookRequestbyUser.RequestStatus = entity.Status; //Approved, Rejected
                await _dynamodbContext.SaveAsync(bookRequestbyUser);

                if (entity.Status == "Approved")
                {
                    book.RemaningStock = (book.Stock - 1);
                    book.UserDetails.Add(_mapper.Map <UserViewModel>(user));
                    book.librarian.IssieOn = DateTime.UtcNow;
                    book.librarian.RenewOn = DateTime.UtcNow.AddDays(7);
                    await _dynamoDBBookContext.SaveAsync(book);

                    InventoryHistory invHistory = new InventoryHistory
                    {
                        Id              = Guid.NewGuid().ToString(),
                        BookId          = entity.BookId,
                        BookAuthor      = book.BookAuthor,
                        BookDescription = book.BookDescription,
                        BookName        = book.BookName,
                        BookPrice       = book.BookPrice,
                        BookPublication = book.BookPublication,
                        BookType        = book.BookType,
                        City            = user.City,
                        Email           = user.Email,
                        FirstName       = user.FirstName,
                        LastName        = user.LastName,
                        MobileNumber    = user.MobileNumber,
                        PostCode        = user.PostCode,
                        State           = user.State,
                        Suburb          = user.Suburb,
                        UserId          = entity.UserId,
                        UserName        = user.Email,
                        librarian       = new librarian
                        {
                            BookId           = entity.BookId,
                            IssieOn          = book.librarian.IssieOn,
                            IssueDescription = book.librarian.IssueDescription,
                            RenewOn          = book.librarian.RenewOn
                        },
                        RenewOn      = book.librarian.RenewOn,
                        ReturnStatus = BookReturnStatus.Borrow
                    };
                    await _dynamoDbHistoryContex.SaveAsync(invHistory);
                }
                else
                {
                    bookRequestbyUser.IsReserved = false;
                }
                await _mailService.SendMail("", user.Email, "Request '" + entity.Status + "'", "Hi '" + user.FirstName + "' you request has been '" + entity.Status + "'");

                response.Entity = "success";
                response.Status = true;
                response.ReturnMessage.Add("Request has been " + entity.Status + " sucessfully.");
            }
            catch (AmazonServiceException amazon)
            {
                response.Status = false;
                response.ReturnMessage.Add($"Amazon error in table operation! Error: {amazon.Message}");
            }
            catch (Exception ex)
            {
                response.Status = false;
                response.ReturnMessage.Add(ex.Message);
            }
            return(response);
        }