protected static User GetUser(int userId, CoolBlogEntity context)
        {
            var user = context.Users.FirstOrDefault(u => u.Id == userId);
            if (user == null)
            {
                throw new ServerErrorException("Invalid user", "ERR_INV_USR");
            }

            return user;
        }
        public Comment CreateComment(int postId, string sessionKey, CoolBlogEntity context)
        {
            var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
            var post = context.Posts.Find(postId);

            if (user == null || post == null)
            {
                throw new ArgumentNullException("User or post is not found!");    
            }

            return new Comment()
            {
                User = user,
                Post = post,
                PostId = postId,
                CreatorId = user.Id,
                CommentContent = this.Text,
                CreationDate = DateTime.Now
            };
        }
        public HttpResponseMessage PostAPost(PostCreateModel model, string sessionKey)
        {
            var responseMsg = this.PerformOperation(() =>
            {
                if (model.Title == null || model.Title.Length == 0)
                {
                    throw new ArgumentException("You must have post title!");
                }
                if (model.PostContent == null || model.PostContent.Length == 0)
                {
                    throw new ArgumentException("You must have post content!");
                }
                var context = new CoolBlogEntity();

                var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);

                if (user==null)
                {
                    throw new InvalidOperationException("No user with this sessionKey");
                }
                
                Post post = new Post()
                {
                    Title = model.Title,
                    PostContent = model.PostContent,
                    CreationDare=model.CreationDate,
                    User=user,
                    Tags = PostDataPersister.GetPostTitleWords(model.Title).ToList(),
                    Approved = true
                };
                context.Posts.Add(post);
                context.SaveChanges();
                model.Id = post.Id;
                
                return model;
            });

            return responseMsg;
        }
        public static void CreateUser(UserRegisterModel user)
        {
            ValidateUsername(user.Username);
            ValidateNickname(user.Nickname);
            ValidateAuthKey(user.AuthKey);
            using (CoolBlogEntity context = new CoolBlogEntity())
            {
                var usernameToLower = user.Username.ToLower();
                var nicknameToLower = user.Nickname.ToLower();
                var dbUser = context.Users.FirstOrDefault(u => u.Username == usernameToLower || u.Nickname.ToLower() == nicknameToLower);

                if (dbUser != null)
                {
                    if (dbUser.Username.ToLower() == usernameToLower)
                    {
                        throw new ServerErrorException("Username already exists", "ERR_DUP_USR");
                    }
                    else
                    {
                        throw new ServerErrorException("Nickname already exists", "ERR_DUP_NICK");
                    }
                }

                dbUser = new User()
                {
                    Username = usernameToLower,
                    Nickname = user.Nickname,
                    AuthKey = user.AuthKey,
                    Gender = user.Gender,
                    Email = user.Email,
                    RankId = user.RankId
                };

                context.Users.Add(dbUser);
                context.SaveChanges();
            }
        }
        public HttpResponseMessage PromoteUser(int userId,string sessionKey)
        {
            var responseMsg = this.PerformOperation(() =>
            {
                var context = new CoolBlogEntity();
                var admin = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                if (admin == null)
                {
                    throw new ArgumentNullException("There is no user with this sessionKey loged!");
                }
                if (admin.RankId != 2)
                {
                    throw new InvalidOperationException("This User Is Not Admin!");
                }
                var user = context.Users.FirstOrDefault(u => u.Id == userId);
                user.RankId = 2;
                context.SaveChanges();
            });

            return responseMsg;
        }
        public HttpResponseMessage PostAComment(CommentInitModel model, int id, string sessionKey)
        {
            var responseMsg = this.PerformOperation(() =>
            {
                var context = new CoolBlogEntity();

                using (context)
                {
                    var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);

                    if (user == null)
                    {
                        throw new InvalidOperationException("No user with this sessionKey");
                    }

                    Comment comment = model.CreateComment(id, sessionKey, context);
                    context.Comments.Add(comment);
                    context.SaveChanges();

                    return model;
                }
            });

            return responseMsg;
        }
        public static UserExtendedModel GetUser(int id)
        {
            var context = new CoolBlogEntity();

            var user = context.Users.FirstOrDefault(u => u.Id == id);

            UserExtendedModel extUser = new UserExtendedModel()
            {
                Nickname = user.Nickname,
                Gender = user.Gender,
                Email = user.Email,
                IsBanned = user.IsBanned,
                Rank = user.Rank.Name
            };

            return extUser;
        }
        public static IEnumerable<UserMinimalModel> GetAllUsers()
        {
            var context = new CoolBlogEntity();
            using (context)
            {
                var users =
                    (from user in context.Users
                     select new UserMinimalModel()
                     {
                         Id = user.Id,
                         Nickname = user.Nickname,
                     });

                return users.ToList();
            }
        }
        public static void LogoutUser(string sessionKey)
        {
            ValidateSessionKey(sessionKey);
            var context = new CoolBlogEntity();
            using (context)
            {
                var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new ServerErrorException("Invalid user authentication", "INV_USR_AUTH");
                }

                user.SessionKey = null;
                context.SaveChanges();
            }
        }
        public static string LoginUser(UserLoginModel usr, out string nickname, out int id,out string rank)
        {
            ValidateUsername(usr.Username);
            ValidateAuthKey(usr.AuthKey);
            var context = new CoolBlogEntity();
            using (context)
            {
                var usernameToLower = usr.Username.ToLower();
                var user = context.Users.FirstOrDefault(u => u.Username == usernameToLower && u.AuthKey== usr.AuthKey);
                if (user == null)
                {
                    throw new ServerErrorException("Invalid username or password", "ERR_INV_USR");
                }

                var sessionKey = GenerateSessionKey(user.Id);
                user.SessionKey = sessionKey;
                nickname = user.Nickname;
                id = user.Id;
                rank = user.Rank.Name;
                context.SaveChanges();

                return sessionKey;
            }
        }