public static void CreateUser(string username, string authCode, string avatar)
        {
            ValidateUsername(username);
            ValidateAuthCode(authCode);
            using (NewsFeedContext context = new NewsFeedContext())
            {
                var usernameToLower = username.ToLower();

                var dbUser = context.Users.FirstOrDefault(u => u.Username == usernameToLower);

                if (dbUser != null)
                {
                    throw new ServerErrorException("Username already exists", "ERR_DUP_USR");
                }

                dbUser = new User()
                {
                    Username = usernameToLower,
                    AuthenticationCode = authCode,
                    Avatar = avatar
                };
                context.Users.Add(dbUser);
                context.SaveChanges();
            }
        }
 protected static User GetUser(int userId, NewsFeedContext context)
 {
     var user = context.Users.FirstOrDefault(u => u.Id == userId);
     if (user == null)
     {
         throw new ServerErrorException("Invalid user", "ERR_INV_USR");
     }
     return user;
 }
 public static void DeleteRequest(int id)
 {
     using (NewsFeedContext context = new NewsFeedContext())
     {
         var request = context.Requests.Find(id);
         context.Requests.Remove(request);
         context.SaveChanges();
     }
 }
 public static void CreatePost(string title, string content, string sessionKey)
 {
     using (NewsFeedContext context = new NewsFeedContext())
     {
         Post dbPost = new Post()
         {
             Title = title,
             Content = content,
             PublicDate = DateTime.Now,
             UserId = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey).Id
         };
         context.Posts.Add(dbPost);
         context.SaveChanges();
     }
 }
 public static IEnumerable<UserSearchModel> GetUser(string username)
 {
     var context = new NewsFeedContext();
     using (context)
     {
         var users =
             (from u in context.Users
              where u.Username.Contains(username)
              select new UserSearchModel()
              {
                  Username = u.Username,
                  Avatar = u.Avatar
              }).ToList();
         return users;
     }
 }
 public static UserLoggedModel GetUserBySessionKey(string sessionKey)
 {
     ValidateSessionKey(sessionKey);
     var context = new NewsFeedContext();
     using (context)
     {
         var user =
             from u in context.Users
             where u.SessionKey == sessionKey
             select new UserLoggedModel()
             {
                 Username = u.Username,
                 Avatar = u.Avatar,
                 SessionKey = sessionKey
             };
         return user.FirstOrDefault();
     }
 }
 public static void SendRequest(string username, string sessionKey)
 {
     using (NewsFeedContext context = new NewsFeedContext())
     {
         Request dbRequest = new Request()
         {
             RecipientId = (from user in context.Users
                            where user.Username == username
                            select user.Id).FirstOrDefault(),
             SenderId = (from user in context.Users
                         where user.SessionKey == sessionKey
                         select user.Id).FirstOrDefault(),
             Title = "Friend request",
         };
         context.Requests.Add(dbRequest);
         context.SaveChanges();
     }
 }
 public static IEnumerable<PostModel> GetAllPosts(string sessionKey)
 {
     var context = new NewsFeedContext();
     using (context)
     {
         var posts =
             (from post in context.Posts
              where post.User.SessionKey == sessionKey
              select new PostModel()
              {
                  Title = post.Title,
                  Content = post.Content,
                  PublicDate = post.PublicDate,
                  Author = post.User.Username,
                  Avatar = post.User.Avatar
              }).ToList();
         return posts;
     }
 }
        //Accept request
        public static void AddFriend(int senderId, string sessionKey)
        {
            using (NewsFeedContext context = new NewsFeedContext())
            {
                //Add request sender as friend in request receiver's list
                Friend dbFriendSender = new Friend()
                {
                    Username = (from request in context.Requests
                                where request.SenderId == senderId
                                select request.Sender.Username).FirstOrDefault(),
                    Avatar = (from request in context.Requests
                              where request.SenderId == senderId
                              select request.Sender.Avatar).FirstOrDefault(),
                    UserId = (from user in context.Users
                              where user.SessionKey == sessionKey
                              select user.Id).FirstOrDefault()
                };

                //Add request receiver as friend in request sender's list
                Friend dbFriendReceiver = new Friend()
                {
                    Username = (from user in context.Users
                                where user.SessionKey == sessionKey
                                select user.Username).FirstOrDefault(),
                    Avatar = (from user in context.Users
                              where user.SessionKey == sessionKey
                              select user.Avatar).FirstOrDefault(),
                    UserId = (from request in context.Requests
                              where request.SenderId == senderId
                              select request.Sender.Id).FirstOrDefault()
                };
                context.Friends.Add(dbFriendSender);
                context.Friends.Add(dbFriendReceiver);
                context.SaveChanges();
            }
        }
        public static IEnumerable<UserFriendModel> GetUserFriendsBySessionKey(string sessionKey)
        {
            ValidateSessionKey(sessionKey);
            var context = new NewsFeedContext();
            using (context)
            {
                int userId = context.Users.Where(u => u.SessionKey == sessionKey)
                    .Select(u => u.Id).FirstOrDefault();

                var friends =
                    (from friend in context.Friends
                     where friend.UserId == userId
                     select new UserFriendModel()
                     {
                         Username = friend.Username,
                         Avatar = friend.Avatar,
                         Wall = (from post in context.Posts
                                 //Filter post friend with username - username it's unique
                                 where post.User.Username == friend.Username
                                 select new PostModel()
                                 {
                                     Title = post.Title,
                                     Content = post.Content,
                                     PublicDate = post.PublicDate,
                                     Author = post.User.Username,
                                     Avatar = post.User.Avatar
                                 }).ToList()
                     }).ToList();

                return friends;
            }
        }
        public static string LoginUser(string username, string authCode, out string avatar)
        {
            ValidateUsername(username);
            ValidateAuthCode(authCode);
            var context = new NewsFeedContext();
            using (context)
            {
                var usernameToLower = username.ToLower();
                var user = context.Users.FirstOrDefault(u => u.Username == usernameToLower && u.AuthenticationCode == authCode);
                if (user == null)
                {
                    throw new ServerErrorException("Invalid username or password", "ERR_INV_USR");
                }

                var sessionKey = GenerateSessionKey((int)user.Id);
                user.SessionKey = sessionKey;
                avatar = user.Avatar;
                context.SaveChanges();
                return sessionKey;
            }
        }
        public static IEnumerable<PostModel> GetUserWallBySessionKey(string sessionKey)
        {
            ValidateSessionKey(sessionKey);
            var context = new NewsFeedContext();
            using (context)
            {
                int userId = context.Users.Where(u => u.SessionKey == sessionKey)
                    .Select(u => u.Id).FirstOrDefault();

                var wall =
                    (from post in context.Posts
                     //Add friends posts here
                     where post.UserId == userId
                     select new PostModel()
                     {
                         Title = post.Title,
                         Content = post.Content,
                         PublicDate = post.PublicDate,
                         Author = post.User.Username,
                         Avatar = post.User.Avatar
                     }).ToList();

                return wall;
            }
        }
        public static IEnumerable<ReceiveRequestModel> GetUserRequestsBySessionKey(string sessionKey)
        {
            ValidateSessionKey(sessionKey);
            var context = new NewsFeedContext();
            using (context)
            {
                int userId = context.Users.Where(u => u.SessionKey == sessionKey)
                    .Select(u => u.Id).FirstOrDefault();

                var requests =
                    (from request in context.Requests
                     where request.RecipientId == userId
                     select new ReceiveRequestModel()
                     {
                         Id = request.Id,
                         Title = request.Title,
                         SenderId = request.SenderId,
                         SenderName = request.Sender.Username,
                         SenderAvatar = request.Sender.Avatar,
                     }).ToList();

                return requests;
            }
        }