public HttpResponseMessage Login([FromBody]User value)
        {
            User user = usersPersister.CheckLogin(value.Username, value.PasswordHash);
            if (user != null)
            {
                var sessionKey = GenerateSessionKey(user.Id);
                usersPersister.SetSessionKey(user, sessionKey);

                var userModel = new UserModel()
                {
                    Id = user.Id,
                    SessionKey = sessionKey,
                    Username = user.Username,
                    FirstName = user.FirstName,
                    LastName = user.LastName,
                    ProfilePictureUrl = user.ProfilePictureUrl,
                    Reputation = user.Reputation
                };

                return Request.CreateResponse(HttpStatusCode.OK, userModel);
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.Unauthorized, "Invalid username or password");
            }
        }
        public HttpResponseMessage Register([FromBody]User value)
        {
            if (string.IsNullOrEmpty(value.Username) || string.IsNullOrWhiteSpace(value.Username)
                || value.Username.Length < 5 || value.Username.Length > 30)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest,
                                              "Invalid username. Should be between 5 and 30 characters");
            }

            if (usersPersister.GetByUsername(value.Username) != null)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest,
                                              "Username already exists");
            }

            usersPersister.Add(value);
            var sessionKey = GenerateSessionKey(value.Id);
            usersPersister.SetSessionKey(value, sessionKey);
            var userModel = new UserModel()
            {
                Id = value.Id,
                Username = value.Username,
                SessionKey = sessionKey,
                FirstName = value.Username,
                LastName = value.LastName,
                ProfilePictureUrl = value.ProfilePictureUrl,
                Reputation = 0
            };

            return Request.CreateResponse(HttpStatusCode.Created, userModel);   
        }
        public HttpResponseMessage GetUserBySessionKey(
            [ValueProvider(typeof(HeaderValueProviderFactory<String>))] String sessionKey)
        {
            var user = usersPersister.GetBySessionKey(sessionKey);
            if (user == null)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid session key");
            }

            var userModel = new UserModel()
                                {
                                    Id = user.Id,
                                    FirstName = user.FirstName,
                                    LastName = user.LastName,
                                    ProfilePictureUrl = user.ProfilePictureUrl,
                                    SessionKey = user.SessionKey,
                                    Username = user.Username
                                };

            return Request.CreateResponse(HttpStatusCode.OK, userModel);
        }
        public HttpResponseMessage EditUser([FromBody]UsedEditModel value,
            [ValueProvider(typeof(HeaderValueProviderFactory<String>))] String sessionKey)
        {
            var user = usersPersister.GetBySessionKey(sessionKey);
            if (user == null)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, "Invalid session key");
            }

            var userToEdit = new User()
            {
                Id = user.Id,
                Username = user.Username,
                FirstName = value.FirstName,
                LastName = value.LastName,
                PasswordHash = value.OldPasswordHash,
                ProfilePictureUrl = value.ProfilePictureUrl
            };

            if (usersPersister.EditUser(userToEdit, value.NewPasswordHash))
            {
                var updatedUser = usersPersister.Get(userToEdit.Id);
                var userModel = new UserModel()
                {
                    Id = updatedUser.Id,
                    Username = updatedUser.Username,
                    SessionKey = sessionKey,
                    FirstName = updatedUser.FirstName,
                    LastName = updatedUser.LastName,
                    ProfilePictureUrl = updatedUser.ProfilePictureUrl
                };

                return Request.CreateResponse(HttpStatusCode.OK, userModel);
            }

            return Request.CreateResponse(HttpStatusCode.BadRequest, "Could not edit user");
        }