// GET: api/Users?url=xxx&username=xxxx&app=dental
        public HttpResponseMessage GetUser(string url, string username, string app)
        {
            try
            {
                UserInformation ui = new UserInformation();
                var Session = HttpContext.Current.Session;
                var rootUrl = Url.Content("~/");
                var generatedUrl = rootUrl + "api/Users?url=" + url + "&username="******"&app=dental";
                var redirect = Request.CreateResponse(HttpStatusCode.Moved);

                //Search username and get url
                var users = db.Users.Where(u => u.Username.Equals(username)).ToArray();
                if (users.Length > 0 && users[0].Url.Equals(generatedUrl))
                {
                    var user = db.Users.Find(users[0].Id);
                    users[0].Status = 1;
                    db.Entry(user).State = EntityState.Modified;
                    db.Entry(user).CurrentValues.SetValues(users[0]);
                    db.SaveChanges();
                    Session["Username"] = username;
                    redirect.Headers.Location = new Uri(rootUrl + "#/Home/Index");
                }
                else
                    redirect.Headers.Location = new Uri(rootUrl + "Home/NotFound");
                return redirect;
            }catch(Exception){
                 throw;
            }
        }
 public void filterRecord(int length, int userType, string property, string value, string value2, ref UserInformation[] userInformation)
 {
     /* Fields that can be filter
      * FirstName
      * LastName
      * MiddleName
      * Gender
      * ContactNo
      */
     //Filter for a specific patient
     int fetch;
     userInformation = null;
     if (property.Equals("FirstName"))
     {
         value = value.ToLower();
         var records = db.UserInformations.Where(ui => (ui.FirstName.ToLower().Contains(value) || ui.FirstName.ToLower().ToLower().Equals(value))
                                                 && ui.User.UserTypeId == userType).Count();
         if (records > length)
         {
             if ((records - length) > pageSize)
                 fetch = pageSize;
             else
                 fetch = records - length;
             var getUserInformation = db.UserInformations.Where(ui => (ui.FirstName.ToLower().Contains(value) || ui.FirstName.ToLower().ToLower().Equals(value))
                                                                 && ui.User.UserTypeId == userType)
                                                                 .OrderBy(ui => ui.Id).Skip((length)).Take(fetch).ToArray();
             userInformation = getUserInformation;
         }
     }
     else if (property.Equals("MiddleName"))
     {
         value = value.ToLower();
         var records = db.UserInformations.Where(ui => (ui.MiddleName.ToLower().Contains(value) || ui.MiddleName.ToLower().ToLower().Equals(value))
                                                 && ui.User.UserTypeId == userType).Count();
         if (records > length)
         {
             if ((records - length) > pageSize)
                 fetch = pageSize;
             else
                 fetch = records - length;
             var getUserInformation = db.UserInformations.Where(ui => (ui.MiddleName.ToLower().Contains(value) || ui.MiddleName.ToLower().ToLower().Equals(value))
                                                                 && ui.User.UserTypeId == userType)
                                                                 .OrderBy(ui => ui.Id).Skip((length)).Take(fetch).ToArray();
             userInformation = getUserInformation;
         }
     }
     else if (property.Equals("LastName"))
     {
         value = value.ToLower();
         var records = db.UserInformations.Where(ui => (ui.LastName.ToLower().Contains(value) || ui.LastName.ToLower().ToLower().Equals(value))
                                                 && ui.User.UserTypeId == userType).Count();
         if (records > length)
         {
             if ((records - length) > pageSize)
                 fetch = pageSize;
             else
                 fetch = records - length;
             var getUserInformation = db.UserInformations.Where(ui => (ui.LastName.ToLower().Contains(value) || ui.LastName.ToLower().ToLower().Equals(value))
                                                                 && ui.User.UserTypeId == userType)
                                                                 .OrderBy(ui => ui.Id).Skip((length)).Take(fetch).ToArray();
             userInformation = getUserInformation;
         }
     }
     else if (property.Equals("Gender"))
     {
         value = value.ToLower();
         var records = db.UserInformations.Where(ui => (ui.Gender.ToLower().Contains(value) || ui.Gender.ToLower().ToLower().Equals(value))
                                                 && ui.User.UserTypeId == userType).Count();
         if (records > length)
         {
             if ((records - length) > pageSize)
                 fetch = pageSize;
             else
                 fetch = records - length;
             var getUserInformation = db.UserInformations.Where(ui => (ui.Gender.ToLower().Contains(value) || ui.Gender.ToLower().ToLower().Equals(value))
                                                                 && ui.User.UserTypeId == userType)
                                                                 .OrderBy(ui => ui.Id).Skip((length)).Take(fetch).ToArray();
             userInformation = getUserInformation;
         }
     }
     //ContactNo
     else
     {
         value = value.ToLower();
         var records = db.UserInformations.Where(ui => ui.Gender.ToLower().ToLower().Equals(value) && ui.User.UserTypeId == userType).Count();
         if (records > length)
         {
             if ((records - length) > pageSize)
                 fetch = pageSize;
             else
                 fetch = records - length;
             var getUserInformation = db.UserInformations.Where(ui => ui.Gender.ToLower().ToLower().Equals(value) && ui.User.UserTypeId == userType)
                                                         .OrderBy(ui => ui.Id).Skip((length)).Take(fetch).ToArray();
             userInformation = getUserInformation;
         }
     }
 }
        public IHttpActionResult PostUserInformation(UserInformation userInformation)
        {
            response.status = "FAILURE";

            if (!ModelState.IsValid)
            {
                response.message = "Bad request.";
                return Ok(response);
            }
            else if (this.checkIfExist(userInformation.User.Username))
            {
                response.message = "Username is already used, please choose another one.";
                return Ok(response);
            }
            else if (searchEmail(userInformation.EmailAddress))
            {
                response.message = "Email address is already used, please choose another one.";
                return Ok(response);
            }
            else
            {
                try
                {
                    User userDetails = new User();
                    userDetails.Username = userInformation.User.Username;
                    userDetails.Password = userInformation.User.Password;
                    userDetails.Url = this.generateUrl(20, userDetails.Username);
                    userDetails.UserTypeId = 6;
                    userDetails.RegistrationDate = DateTime.Now;
                    userDetails.Status = 0;

                    db.Users.Add(userDetails);
                    userInformation.User = null;
                    userInformation.UserId = userDetails.Id;
                    db.UserInformations.Add(userInformation);

                    //email url
                    this.emailUrl(userDetails.Url, userInformation.EmailAddress, userInformation.FirstName);

                    db.SaveChanges();
                    response.status = "SUCCESS";
                    response.message = "Thank you for your patience. Please check your email for account activation.";
                }
                catch (Exception e)
                {
                    response.message = e.Message.ToString();
                }
            }
            return Ok(response);
        }
        public IHttpActionResult PutUserInformation(int id, UserInformation userInformation)
        {
            response.status = "FAILURE";
            if (!ModelState.IsValid || id != userInformation.Id)
            {
                response.message = "Bad request";
                return Ok(response);
            }

            try
            {
                var searchEmail = db.UserInformations.Where(ui => ui.EmailAddress.Equals(userInformation.EmailAddress) && ui.User.Id != userInformation.Id).Count();
                if (searchEmail > 0)
                {
                    response.message = "Email Address is already used.";
                    return Ok(response);
                }
                var getId = db.UserInformations.Where(ui => ui.UserId == id).ToArray();
                userInformation.UserId = id;
                id = getId[0].Id;
                var getInformation = db.UserInformations.Find(id);
                userInformation.Id = id;
                //userInformation.RegistrationDate = DateTime.Now;
                db.Entry(getInformation).CurrentValues.SetValues(userInformation);
                db.Entry(getInformation).State = EntityState.Modified;
                db.SaveChanges();
                response.status = "SUCCESS";
                response.objParam1 = userInformation;
            }
            catch (Exception e)
            {
                if (!UserInformationExists(id))
                {
                    response.message = "User doesn't exist";
                }
                else
                {
                    response.message = e.InnerException.InnerException.Message.ToString();
                }
            }

            return Ok(response);
        }
 //Filtering base on status
 public IHttpActionResult GetUserInformations(int length, int userType, int status, string property, string value, string value2)
 {
     UserInformation[] userInformation = new UserInformation[pageSize];
     this.filterRecord(length, userType, status, property, value, value2, ref userInformation);
     if (userInformation != null)
         return Ok(userInformation);
     else
         return Ok();
 }