public async Task <IHttpActionResult> InviteToRegisterInCompany(Invite inviteDetail)
        {
            CervittApiResult result = new CervittApiResult();

            if (inviteDetail == null)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            if (string.IsNullOrEmpty(inviteDetail.EmailAddress))
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }


            User user = await db.Users.SingleOrDefaultAsync(c => c.UserName == User.Identity.Name);

            if (user == null)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            if (!User.Identity.IsAuthenticated)
            {
                throw new HttpResponseException(HttpStatusCode.Unauthorized);
            }

            if (user.Company == null)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            string postEmailAddress = inviteDetail.EmailAddress.Replace(Environment.NewLine, ",");

            postEmailAddress = postEmailAddress.Replace('\r', ',');
            postEmailAddress = postEmailAddress.Replace('\n', ',');
            string[] emailListToInvite = postEmailAddress.Split(',');

            bool hasInvalidEmailAddressInList = false;

            if (emailListToInvite.Length == 0)
            {
                result.Success      = false;
                result.ErrorMessage = "No any email address to invite.";
            }
            else
            {
                hasInvalidEmailAddressInList = EmailService.CheckAnyEmailIsNotValid(emailListToInvite);

                if (hasInvalidEmailAddressInList)
                {
                    result.Success      = false;
                    result.ErrorMessage = "Invalid email address found or email format is not correct.";
                    return(Ok(result));
                }

                for (int i = 0; i <= emailListToInvite.Length - 1; i++)
                {
                    if (string.IsNullOrEmpty(emailListToInvite[i]))
                    {
                        continue;
                    }

                    string emailToInvite = emailListToInvite[i].Trim();

                    Guid inviteCode = Guid.NewGuid();

                    bool userExistInSystem = await db.Users.AnyAsync(u => u.Email == emailToInvite);

                    if (!userExistInSystem)
                    {
                        InviteRequest existingRequest = await db.InviteRequests.SingleOrDefaultAsync(c => c.InviteType == 1 && c.InviteToEmailAddress == emailToInvite && c.InviteFromUserId == user.Id && c.Processed == false);

                        if (existingRequest == null)
                        {
                            string webSiteUrl   = System.Configuration.ConfigurationManager.AppSettings["WebSiteUrl"];
                            string emailContent = " You have been invited by {0} to join." + "<br><br>" + "Please click below link to register and join.";
                            emailContent = string.Format(emailContent, user.FirstName + " (" + user.Email + ")");
                            emailContent = emailContent + "<br><br>" + string.Format("Click here to <a href='{0}/{1}'><strong>Join</strong></a>", string.Concat(webSiteUrl, "/", "registration"), inviteCode.ToString());
                            string          apiKey         = SENDGRID_API_KEY;
                            SendGridClient  sendGridClient = new SendGridClient(apiKey, "https://api.sendgrid.com");
                            EmailAddress    emailSender    = new EmailAddress("*****@*****.**", "Cervitt");
                            String          subject        = "Invitation from Cervitt User to join.";
                            EmailAddress    emailRecipient = new EmailAddress(emailToInvite);
                            Content         content        = new Content("text/html", emailContent);
                            SendGridMessage mail           = MailHelper.CreateSingleEmail(emailSender, emailRecipient, subject, "", emailContent);
                            dynamic         response       = sendGridClient.SendEmailAsync(mail);
                            InviteRequest   inviteRequest  = new InviteRequest();
                            inviteRequest.InviteType           = 1;
                            inviteRequest.Processed            = false;
                            inviteRequest.InviteDate           = DateTime.Now;
                            inviteRequest.InviteCode           = inviteCode;
                            inviteRequest.InviteFromCompanyId  = user.Company.ID;
                            inviteRequest.InviteFromUserId     = user.Id;
                            inviteRequest.InviteToEmailAddress = emailToInvite;
                            inviteRequestService.Insert(inviteRequest);
                            result.Success         = true;
                            result.SuccessMessage += emailToInvite + ",";
                        }
                    }
                }
            }

            if (result.Success)
            {
                if (result.SuccessMessage.EndsWith(","))
                {
                    result.SuccessMessage = result.SuccessMessage.TrimEnd(',');
                }

                result.SuccessMessage = "Invite request has been sent to " + result.SuccessMessage;
            }
            else
            {
                result.ErrorMessage = "Invite request not sent. (Possible reason: Either email is invalid, email already exist or request already sent.)";
            }

            return(Ok(result));
        }
        public async Task <IHttpActionResult> UpdateProductTeamMemberMutiple(List <ProductTeamMemberUpdateDTO> productTeamMemberUpdateDTO)
        {
            CervittApiResult result   = new CervittApiResult();
            string           userName = User.Identity.Name;
            User             user     = db.Users.Where(_user => _user.UserName == userName).SingleOrDefault();

            if (user == null)
            {
                throw new HttpResponseException(HttpStatusCode.Unauthorized);
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (productTeamMemberUpdateDTO == null || productTeamMemberUpdateDTO.Count == 0)
            {
                return(BadRequest("Invalid data or no any data passed."));
            }

            long userId = productTeamMemberUpdateDTO.FirstOrDefault().UserID;

            db.ProductTeamMembers.RemoveRange(db.ProductTeamMembers.Where(u => u.UserID == userId));
            await db.SaveChangesAsync();

            foreach (ProductTeamMemberUpdateDTO postItem in productTeamMemberUpdateDTO)
            {
                if (postItem.ProductID <= 0 || postItem.UserID <= 0)
                {
                    continue;
                }

                Product product = db.Products.Where(_product => _product.ID == postItem.ProductID)
                                  .Include(_product => _product.TeamMembers
                                           .Select(teamMember => teamMember.User))
                                  .SingleOrDefault();

                if (product != null)
                {
                    UserLevel userLevel = db.UserLevels.SingleOrDefault(c => c.Id == postItem.UserLevelId);
                    bool      isAdmin   = false;
                    if (userLevel.Name.ToLower() == "admin")
                    {
                        isAdmin = true;
                    }
                    ProductTeamMember productTeamMember = product.TeamMembers.Where(_productTeamMember => _productTeamMember.UserID == postItem.UserID).SingleOrDefault();

                    if (productTeamMember == null)
                    {
                        productTeamMember = new ProductTeamMember();
                        productTeamMember.CanEditTheProduct = isAdmin;
                        productTeamMember.ProductID         = postItem.ProductID;
                        productTeamMember.UserID            = postItem.UserID;
                        productTeamMember.UserLevelId       = postItem.UserLevelId;
                        db.ProductTeamMembers.Add(productTeamMember);
                        await db.SaveChangesAsync();
                    }
                    else
                    {
                        productTeamMember.Role              = postItem.Role;
                        productTeamMember.UserLevelId       = postItem.UserLevelId;
                        productTeamMember.CanEditTheProduct = isAdmin;
                        db.Entry(productTeamMember).State   = EntityState.Modified;
                        await db.SaveChangesAsync();
                    }
                }
            }

            result.Success        = true;
            result.SuccessMessage = "Records updated successfully.";
            result.ErrorMessage   = "";
            return(Ok(result));
        }