public static void ClassCleanup()
        {
            Mock<IUserHelper> UserHelper = new Mock<IUserHelper>(); ;
            UserHelper.Setup(x => x.GetLoggedUserRole(It.IsAny<HttpRequestMessage>())).Returns(new Role { Id = 1, Name = "Administrator" });

            var userController = new UserController(UserHelper.Object);

            using (var context = new TravelPlannerEntities())
            {
                var users = context.User.Where(x => x.Username == TestUserAdmnistratorName
                    || x.Username == TestUserManagerName
                    || x.Username == TestUserRegularUserName
                    || x.Username.Contains(RegisterUserTestName));

                /// Remove trips
                foreach (var user in users)
                {
                    var trips = context.Trip.Where(x => x.UserId == user.Id);
                    context.Trip.RemoveRange(trips);
                }

                /// Remove users
                context.User.RemoveRange(users);
                context.SaveChanges();
            }
        }
        public int CreateOrUpdateUser([FromUri]User user)
        {
            using (var context = new TravelPlannerEntities())
            {
                var loggedUser = UserHelper.GetLoggedUser(Request);

                var loggedRole = context.Role.First(x => x.Id == loggedUser.RoleId);

                if (loggedRole.Name == RolesEnum.User.ToString())
                {
                    throw new WebException(Messages.Unauthorized);
                }

                var validationMessage = ValidateUserData(user);
                if (!string.IsNullOrEmpty(validationMessage))
                {
                    throw new WebException(validationMessage);
                }

                if (user.Id == 0)
                {
                    context.User.Add(user);
                }
                else
                {
                    context.Entry(user).State = EntityState.Modified;
                }
                context.SaveChanges();
                return user.Id;
            }
        }
        public Role GetLoggedUserRole(HttpRequestMessage request)
        {
            var token = GetUserToken(request);

            using (var context = new TravelPlannerEntities())
            {
                var tokenUser = context.User.FirstOrDefault(x => x.Token == token);
                if (tokenUser == null)
                {
                    throw new UnauthorizedAccessException();
                }
                return tokenUser.Role;
            }
        }
        public bool DeleteUser(int userId)
        {
            using (var context = new TravelPlannerEntities())
            {
                var user = GetUserIfAuthorized(userId, context);

                if (context.Trip.Any(x => x.UserId == userId))
                {
                    throw new WebException(Messages.UserWithTrips);
                }

                context.User.Remove(user);
                context.SaveChanges();
            }
            return true;
        }
        // GET api/User/GetAllRoles
        public IEnumerable<Role> GetAllRoles()
        {
            var roles = new List<Role>();
            using (var context = new TravelPlannerEntities())
            {
                var userId = UserHelper.GetLoggedUser(Request).Id;
                var role = context.Role.FirstOrDefault(x => x.User.Any(y => y.Id == userId));

                if (role != null && (role.Name == RolesEnum.Manager.ToString() || role.Name == RolesEnum.Administrator.ToString()))
                {
                    roles = context.Role.ToList();
                }
            }
            return roles.Select(x => new Role
            {
                Id = x.Id,
                Name = x.Name
            }).Distinct();
        }
        private User GetUserIfAuthorized(int userId, TravelPlannerEntities context)
        {
            var loggedUser = UserHelper.GetLoggedUser(Request);

            var role = context.Role.FirstOrDefault(x => x.Id == loggedUser.RoleId);

            if (role.Name == RolesEnum.User.ToString())
            {
                throw new WebException(Messages.Unauthorized);
            }

            var user = context.User.FirstOrDefault(x => x.Id == userId);

            if (user == null)
            {
                throw new WebException(Messages.UserNotFound);
            }
            return user;
        }
        private TokenResponse CreateToken(User user, TravelPlannerEntities context)
        {
            var dateTime = DateTime.UtcNow;
            var time = BitConverter.GetBytes(dateTime.ToBinary());
            var key = Guid.NewGuid().ToByteArray();
            var token = Convert.ToBase64String(time.Concat(key).ToArray());

            user.Token = token;
            context.Entry(user).State = EntityState.Modified;
            context.SaveChanges();
            return new TokenResponse
            {
                Token = token,
                ExpirationDate = dateTime.AddHours(24).ToString("MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture),
                Role = user.Role.Name
            };
        }
        public TokenResponse RegisterUser([FromUri]User user)
        {
            using (var context = new TravelPlannerEntities())
            {
                var validationMessage = ValidateUserData(user);
                if (!string.IsNullOrEmpty(validationMessage))
                {
                    throw new WebException(validationMessage);
                }

                if (context.User.Any(x => x.Username == user.Username))
                {
                    throw new WebException(Messages.DuplicatedUser);
                }

                var role = context.Role.FirstOrDefault(x => x.Id == user.RoleId);
                if (role == null)
                {
                    throw new WebException(Messages.RoleNotFound);
                }

                context.User.Add(user);
                context.SaveChanges();

                return CreateToken(user, context);
            }
        }
 public bool Logout()
 {
     using (var context = new TravelPlannerEntities())
     {
         var loggedUserId = UserHelper.GetLoggedUser(Request).Id;
         context.User.First(x => x.Id == loggedUserId).Token = string.Empty;
         context.SaveChanges();
     }
     return true;
 }
        public TokenResponse Login(string username, string password)
        {
            using (var context = new TravelPlannerEntities())
            {
                var user = context.User.FirstOrDefault(x => x.Username == username);
                if (user == null)
                {
                    throw new WebException(Messages.UserNotFound);
                }

                if (user.Password != password)
                {
                    throw new WebException(Messages.BadCredentials);
                }

                return CreateToken(user, context);
            }
        }
 // GET api/User/GetUser
 public User GetUser(int userId)
 {
     using (var context = new TravelPlannerEntities())
     {
         var user = GetUserIfAuthorized(userId, context);
         return new User
         {
             Id = user.Id,
             Username = user.Username,
             RoleId = user.RoleId
         };
     }
 }
        // GET api/User/GetAllUsers
        public IEnumerable<User> GetAllUsers()
        {
            var users = new List<User>();
            using (var context = new TravelPlannerEntities())
            {
                var userId = UserHelper.GetLoggedUser(Request).Id;
                var role = context.Role.FirstOrDefault(x => x.User.Any(y => y.Id == userId));

                if (role == null || role.Name == RolesEnum.User.ToString())
                {
                    throw new WebException(Messages.Unauthorized);
                }

                users = context.User.Where(x => x.Id != userId).ToList();
            }
            return users.Select(x => new User
            {
                Id = x.Id,
                Username = x.Username,
                RoleId = x.RoleId
            });
        }
        internal User GetCreatedRegularUserTestUser()
        {
            if (RegularUserTestUser != null)
            {
                return RegularUserTestUser;
            }
            using (var context = new TravelPlannerEntities())
            {

                return context.User.First(x => x.Username == TestUserRegularUserName);
            }
        }
        internal User GetCreatedAdministratorTestUser()
        {
            if (AdminTestUser != null)
            {
                return AdminTestUser;
            }
            using (var context = new TravelPlannerEntities())
            {

                return context.User.First(x => x.Username == TestUserAdmnistratorName);
            }
        }
        public static void ClassSetup(TestContext context)
        {
            Mock<IUserHelper> UserHelper = new Mock<IUserHelper>(); ;
            UserHelper.Setup(x => x.GetLoggedUser(It.IsAny<HttpRequestMessage>())).Returns(GetInitialAdminUser());
            UserHelper.Setup(x => x.GetLoggedUserRole(It.IsAny<HttpRequestMessage>())).Returns(new Role { Id = 1, Name = "Administrator" });

            var userController = new UserController(UserHelper.Object);

            using (var entityContext = new TravelPlannerEntities())
            {
                if (!entityContext.User.Any(x => x.Username == TestUserAdmnistratorName))
                {
                    userController.CreateOrUpdateUser(GetAdministratorTestUser());
                }
                if (!entityContext.User.Any(x => x.Username == TestUserManagerName))
                {
                    userController.CreateOrUpdateUser(GetManagerTestUser());
                }
                if (!entityContext.User.Any(x => x.Username == TestUserRegularUserName))
                {
                    userController.CreateOrUpdateUser(GetRegularUserTestUser());
                }
            }
        }