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> > InventoryReturnEntry(InverntoryReturnRequest entity, SecurityModel securityModel)
        {
            ResponseModel <BookDetails> response = new ResponseModel <BookDetails>();

            try
            {
                ScanFilter filter = new ScanFilter();
                var        book   = await _dynamoDbBookContext.GetByIdAsync(entity.BookId);

                filter.AddCondition("BookId", ScanOperator.Equal, entity.BookId);
                filter.AddCondition("UserId", ScanOperator.Equal, entity.UserId);
                var inventoryHistory = _dynamoDbHistoryContex.GetAsync(filter).Result.FirstOrDefault();
                if (inventoryHistory != null)
                {
                    inventoryHistory.ReturnStatus   = BookReturnStatus.Returned;
                    inventoryHistory.BookReturnDate = DateTime.UtcNow;
                    if (book.librarian.RenewOn < DateTime.UtcNow)
                    {
                        var dateDiff = (DateTime.UtcNow - book.librarian.RenewOn);
                        inventoryHistory.LateBy = dateDiff.Value.TotalDays.ToString();
                    }
                    await _dynamoDbHistoryContex.SaveAsync(inventoryHistory);

                    book.RemaningStock = book.RemaningStock + 1;
                    await _dynamoDbBookContext.SaveAsync(book);

                    var bookUserService = _dynamouserServices.GetAsync(filter).Result.FirstOrDefault();
                    if (bookUserService != null)
                    {
                        bookUserService.IsReserved = false;
                        await _dynamouserServices.SaveAsync(bookUserService);
                    }
                    response.Entity = book;
                    response.Status = true;
                    response.ReturnMessage.Add("Book stock has been updated sucessfully.");
                }
                else
                {
                    response.Entity = book;
                    response.Status = true;
                    response.ReturnMessage.Add("Oops!! book details not found in the history.");
                }
            }
            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 <BookDetails> > CreateAsync(BookDetails item, SecurityModel security)
        {
            ResponseModel <BookDetails> response = new ResponseModel <BookDetails>();

            try
            {
                if (string.IsNullOrEmpty(item.Id))
                {
                    item.Id = Guid.NewGuid().ToString();
                }
                item.librarian = new librarian
                {
                    BookId           = item.Id,
                    IssieOn          = DateTime.UtcNow,
                    IssueDescription = "",
                    RenewOn          = DateTime.UtcNow.AddDays(6),
                    Status           = "Pending",
                    FirstName        = security.FirstName,
                    Email            = security.EmailAddress,
                    UserId           = security.UserId
                };
                item.RemaningStock = item.Stock;
                item.AddedBy       = security.EmailAddress;
                item.AddedOn       = DateTime.UtcNow;
                item.IsActive      = true;
                item.IsDeleted     = false;
                await _dynamoDbBookContext.SaveAsync(item);

                response.ReturnMessage.Add("Book added successfully.");
                response.Entity = item;
                response.Status = true;
            }
            catch (Exception ex)
            {
                response.Status = false;
                response.ReturnMessage.Add(ex.Message);
            }
            return(response);
        }
        public async Task <ResponseModel <List <InventoryHistory> > > SendReminderEmail()
        {
            ResponseModel <List <InventoryHistory> > response = new ResponseModel <List <InventoryHistory> >();

            try
            {
                ScanFilter filter = new ScanFilter();
                filter.AddCondition("ReturnStatus", ScanOperator.Equal, BookReturnStatus.Borrow);
                filter.AddCondition("RenewOn", ScanOperator.LessThan, DateTime.Now);
                filter.AddCondition("IsReminder", ScanOperator.Equal, false);

                var inventoryHistory = _dynamoDbHistoryContex.GetAsync(filter).Result;
                if (inventoryHistory.Any())
                {
                    List <InventoryHistory> userList = new List <InventoryHistory>();
                    foreach (var item in inventoryHistory)
                    {
                        await _mailService.SendMail("", item.Email, "Reminder", "Hi '" + item.FirstName + "Please kindly return the book on time.");

                        item.IsReminder = true;
                        userList.Add(item);
                        await _dynamoDbHistoryContex.SaveAsync(item);
                    }
                    response.Entity = userList;
                    response.Status = true;
                    response.ReturnMessage.Add("Email send successfully");
                }
                else
                {
                    response.Entity = new List <InventoryHistory>();
                    response.Status = true;
                    response.ReturnMessage.Add("Inventory Data not found.");
                }
            }
            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 <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);
        }