public IQueryable <Movie> GetMovies(UserAccessToken user)
        {
            var result = _ctx.Movies.OrderByDescending(x => x.ReleaseDate).Take(10);

            if (user.UserName != null && user.UserName != "")
            {
                foreach (var item in result)
                {
                    int userId = _ctx.Users.Single(x => x.UserName == user.UserName).Id;
                    if (_ctx.UserRatings.Where(x => (x.UserId == userId && x.MovieId == item.Id)).Count() > 0)
                    {
                        var userRating = _ctx.UserRatings.Single(x => (x.UserId == userId && x.MovieId == item.Id));
                        if (userRating != null)
                        {
                            item.UserRating = userRating.Rating;
                        }
                    }
                }
            }
            return(result);
        }
        public UserAccessToken RegisterNewUser(User newUser)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                newUser.UserGuid = Guid.NewGuid();
                newUser.Password = HelperClass.GetMd5Hash(md5Hash, newUser.Password + newUser.UserGuid.ToString());
            }

            try
            {
                _ctx.Users.Add(newUser);
                if (_ctx.SaveChanges() > 0)
                {
                    string          token = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
                    UserAccessToken newUserAccessToken = new UserAccessToken();
                    newUserAccessToken.UserName       = newUser.UserName;
                    newUserAccessToken.AccessToken    = token;
                    newUserAccessToken.ExpirationDate = DateTime.Now.AddYears(1);
                    _ctx.UserAccessTokens.Add(newUserAccessToken);
                    if (_ctx.SaveChanges() > 0)
                    {
                        return(newUserAccessToken);
                    }
                    else
                    {
                        var res = new HttpResponseMessage(HttpStatusCode.NotFound)
                        {
                            Content      = new StringContent(string.Format("There was an error.")),
                            ReasonPhrase = "There was an error"
                        };
                        throw new HttpResponseException(res);
                    }
                }
                else
                {
                    throw new HttpResponseException(System.Net.HttpStatusCode.BadRequest);
                }
            }
            catch (DbUpdateException) { throw new HttpResponseException(System.Net.HttpStatusCode.BadRequest); }
        }
        public UserAccessToken ValidateExistingUser(User newUser)
        {
            try
            {
                bool IsUserValidated = false;

                User existingUser = _ctx.Users.Single(x => x.UserName == newUser.UserName);
                using (MD5 md5Hash = MD5.Create())
                {
                    IsUserValidated = HelperClass.VerifyMd5Hash(md5Hash, newUser.Password + existingUser.UserGuid, existingUser.Password);
                }

                if (IsUserValidated) {
                    string token = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
                    UserAccessToken newUserAccessToken = new UserAccessToken();
                    newUserAccessToken.UserName = newUser.UserName;
                    newUserAccessToken.AccessToken = token;
                    newUserAccessToken.ExpirationDate = DateTime.Now.AddYears(1);
                    _ctx.UserAccessTokens.Add(newUserAccessToken);
                    if (_ctx.SaveChanges() > 0)
                        return newUserAccessToken;
                    else
                    {
                        var res = new HttpResponseMessage(HttpStatusCode.NotFound)
                        {
                            Content = new StringContent(string.Format("There was an error.")),
                            ReasonPhrase = "There was an error"
                        };
                        throw new HttpResponseException(res);
                    }
                }
                else
                {
                    var res = new HttpResponseMessage(HttpStatusCode.NotFound)
                    {
                        Content = new StringContent(string.Format("Invalid Username/Password Combination.")),
                        ReasonPhrase = "Invalid Username and Password"
                    };
                    throw new HttpResponseException(res);
                }
            }
            catch (InvalidOperationException)
            {
                var res = new HttpResponseMessage(HttpStatusCode.NotFound)
                {
                    Content = new StringContent(string.Format("User not found.")),
                    ReasonPhrase = "User not found."
                };
                throw new HttpResponseException(res);
            }
        }
        public UserAccessToken RegisterNewUser(User newUser)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                newUser.UserGuid = Guid.NewGuid();
                newUser.Password = HelperClass.GetMd5Hash(md5Hash, newUser.Password + newUser.UserGuid.ToString());
            }

            try
            {
                _ctx.Users.Add(newUser);
                if (_ctx.SaveChanges() > 0) {
                    string token = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
                    UserAccessToken newUserAccessToken = new UserAccessToken();
                    newUserAccessToken.UserName = newUser.UserName;
                    newUserAccessToken.AccessToken = token;
                    newUserAccessToken.ExpirationDate = DateTime.Now.AddYears(1);
                    _ctx.UserAccessTokens.Add(newUserAccessToken);
                    if (_ctx.SaveChanges() > 0)
                        return newUserAccessToken;
                    else
                    {
                        var res = new HttpResponseMessage(HttpStatusCode.NotFound)
                        {
                            Content = new StringContent(string.Format("There was an error.")),
                            ReasonPhrase = "There was an error"
                        };
                        throw new HttpResponseException(res);
                    }
                }
                else
                    throw new HttpResponseException(System.Net.HttpStatusCode.BadRequest);
            }
            catch (DbUpdateException) { throw new HttpResponseException(System.Net.HttpStatusCode.BadRequest); }
        }
        public IQueryable<Movie> GetMovies(UserAccessToken user)
        {
            var result = _ctx.Movies.OrderByDescending(x => x.ReleaseDate).Take(10);

            if (user.UserName != null && user.UserName != "") {
                foreach (var item in result)
                {
                    int userId = _ctx.Users.Single(x => x.UserName == user.UserName).Id;
                    if (_ctx.UserRatings.Where(x => (x.UserId == userId && x.MovieId == item.Id)).Count() > 0) {
                        var userRating = _ctx.UserRatings.Single(x => (x.UserId == userId && x.MovieId == item.Id));
                        if (userRating != null)
                        {
                            item.UserRating = userRating.Rating;
                        }
                    }

                }
            }
            return result;
        }
 public IEnumerable<Movie> Get(UserAccessToken user)
 {
     return _repo.GetMovies(user);
 }