public User GetUser(Guid userId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var user = ctx.Users.Include(x => x.UserSkills.Select(y => y.ProgrammingLanguage)).Where(x => x.Id == userId).FirstOrDefault();
         if (user == null)
         {
             throw new UserNotFoundException();
         }
         var skills = ctx.UserSkills
                      .Where(x => x.UserId == userId)
                      .ToList()
                      .Select(x => new UserSkill()
         {
             ProgrammingLanguage = new ProgrammingLanguage()
             {
                 Id   = x.ProgrammingLanguageId,
                 Name = x.ProgrammingLanguage.Name
             },
             Proficiency = (byte)x.Proficiency
         })
                      .ToList();
         return(new User()
         {
             Id = user.Id,
             DateOfBirth = user.DOB,
             Email = user.Email,
             FirstName = user.FirstName,
             LastName = user.LastName,
             Password = user.Password,
             Skills = skills,
             Username = user.Username
         });
     }
 }
 public IEnumerable <Post> GetPosts(int pageNumber)
 {
     if (pageNumber <= 0)
     {
         throw new InvalidPageNumberException();
     }
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var posts = (from p in ctx.Posts
                      join r in ctx.RatableEntities on p.Id equals r.Id
                      join u in ctx.Users on r.UserId equals u.Id
                      orderby r.PublishDate descending
                      select new { AuthorId = r.UserId, Id = p.Id, Content = p.Content, PublishDate = r.PublishDate, Title = p.Title, AuthorUsername = u.Username })
                     .Skip((pageNumber - 1) * PostsPerPage)
                     .Take(PostsPerPage)
                     .ToList()
                     .Select(x => new Post()
         {
             AuthorId = x.AuthorId, Id = x.Id, Content = x.Content, PublishDate = x.PublishDate, Title = x.Title, AuthorUsername = x.AuthorUsername
         });
         foreach (var post in posts)
         {
             yield return(post);
         }
     }
 }
 private void ValidateComment(Comment comment, CommentProperties props)
 {
     if (comment.Content == null || props.HasFlag(CommentProperties.Content) && string.IsNullOrWhiteSpace(comment.Content))
     {
         throw new InvalidContentException();
     }
     if (props.HasFlag(CommentProperties.PublishDate) && comment.PublishDate > DateTime.Now)
     {
         throw new InvalidPublishDateException("The publish date cannot be in the future.");
     }
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var post = ctx.Posts.Where(x => x.Id == comment.PostId).FirstOrDefault();
         if (props.HasFlag(CommentProperties.PostId) && post == null)
         {
             throw new PostNotFoundException();
         }
         if (props.HasFlag(CommentProperties.PublishDate) && comment.PublishDate < ctx.RatableEntities.Where(x => x.Id == comment.PostId).FirstOrDefault().PublishDate)
         {
             throw new InvalidPublishDateException("The comment cannot be published before the post.");
         }
         if (props.HasFlag(CommentProperties.AuthorId) && comment.AuthorId != null && ctx.Users.Where(x => x.Id == comment.AuthorId).FirstOrDefault() == null)
         {
             throw new UserNotFoundException();
         }
     }
 }
 public Guid GetUserId(string login, string passwordHash)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var user = ctx.Users.Where(x => (x.Email == login || x.Username == login) && x.Password == passwordHash).FirstOrDefault();
         if (user == null)
         {
             throw new UserNotFoundException();
         }
         return(user.Id);
     }
 }
 public void AddRating(Guid userId, Guid entityId, sbyte rating)
 {
     ValidateRating(userId, entityId, rating);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         ctx.RatedEntities.Add(new DB.RatedEntity()
         {
             UserId = userId, EntityId = entityId, Rating = rating
         });
         ctx.SaveChanges();
     }
 }
 public void UpdateUser(Guid oldUserId, User @new, UserProperties propertiesToChange)
 {
     ValidateUser(@new, propertiesToChange);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Users.Where(x => x.Username == @new.Username && x.Password == @new.Password).Count() != 0)
         {
             throw new InvalidCredentialsException();
         }
         var r = ctx.Users.Include(x => x.UserSkills).Where(x => x.Id == oldUserId).FirstOrDefault();
         if (r == null)
         {
             throw new UserNotFoundException();
         }
         if (propertiesToChange.HasFlag(UserProperties.DateOfBirth))
         {
             r.DOB = @new.DateOfBirth;
         }
         if (propertiesToChange.HasFlag(UserProperties.Email))
         {
             r.Email = @new.Email;
         }
         if (propertiesToChange.HasFlag(UserProperties.FirstName))
         {
             r.FirstName = @new.FirstName;
         }
         if (propertiesToChange.HasFlag(UserProperties.LastName))
         {
             r.LastName = @new.LastName;
         }
         if (propertiesToChange.HasFlag(UserProperties.Password))
         {
             r.Password = @new.Password;
         }
         if (propertiesToChange.HasFlag(UserProperties.Username))
         {
             r.Username = @new.Username;
         }
         if (propertiesToChange.HasFlag(UserProperties.Skills))
         {
             r.UserSkills.Clear();
             foreach (var s in @new.Skills)
             {
                 r.UserSkills.Add(new DB.UserSkill()
                 {
                     ProgrammingLanguageId = s.ProgrammingLanguage.Id, Proficiency = s.Proficiency, UserId = r.Id
                 });
             }
         }
         ctx.SaveChanges();
     }
 }
 public void RemoveUser(Guid userId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var user = ctx.Users.Where(x => x.Id == userId).FirstOrDefault();
         if (user == null)
         {
             throw new UserNotFoundException();
         }
         ctx.Users.Remove(user);
         ctx.SaveChanges();
     }
 }
 public IEnumerable <ProgrammingLanguage> GetProgrammingLanguages()
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         foreach (var lang in ctx.ProgrammingLanguages)
         {
             yield return(new ProgrammingLanguage()
             {
                 Id = lang.Id, Name = lang.Name
             });
         }
     }
 }
 public void RemoveProgrammingLanguage(Guid languageId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var lang = ctx.ProgrammingLanguages.Where(x => x.Id == languageId).FirstOrDefault();
         if (lang == null)
         {
             throw new ProgrammingLanguageNotFoundException();
         }
         ctx.ProgrammingLanguages.Remove(lang);
         ctx.SaveChanges();
     }
 }
 public void RemoveComment(Guid commentId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var entity = ctx.RatableEntities.Where(x => x.Id == commentId).FirstOrDefault();
         if (entity == null)
         {
             throw new CommentNotFoundException();
         }
         ctx.RatableEntities.Remove(entity);
         ctx.SaveChanges();
     }
 }
 public void UpdateRating(Guid userId, Guid entityId, sbyte newRating)
 {
     ValidateRating(userId, entityId, newRating);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var r = ctx.RatedEntities.Where(x => x.UserId == userId && x.EntityId == entityId).FirstOrDefault();
         if (r == null)
         {
             throw new RatingNotFoundException();
         }
         r.Rating = newRating;
         ctx.SaveChanges();
     }
 }
 public void UpdateSkill(Guid userId, Guid languageId, byte proficiency)
 {
     ValidateSkill(userId, languageId, proficiency);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var s = ctx.UserSkills.Where(x => x.UserId == userId && x.ProgrammingLanguageId == languageId).FirstOrDefault();
         if (s == null)
         {
             throw new UserSkillNotFoundException();
         }
         s.Proficiency = proficiency;
         ctx.SaveChanges();
     }
 }
 private void ValidateSavePost(Guid userId, Guid postToSaveId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Users.Where(x => x.Id == userId).FirstOrDefault() == null)
         {
             throw new UserNotFoundException();
         }
         if (ctx.Posts.Where(x => x.Id == postToSaveId).FirstOrDefault() == null)
         {
             throw new PostNotFoundException();
         }
     }
 }
 public sbyte GetRatingByUser(Guid userId, Guid entityId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var rating = ctx.RatedEntities
                      .Where(x => x.UserId == userId && x.EntityId == entityId)
                      .FirstOrDefault();
         if (rating == null)
         {
             return(0);
         }
         return((sbyte)rating.Rating);
     }
 }
 public void AddSkill(Guid userId, Guid languageId, byte proficiency)
 {
     ValidateSkill(userId, languageId, proficiency);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         ctx.UserSkills.Add(new DB.UserSkill()
         {
             UserId = userId,
             ProgrammingLanguageId = languageId,
             Proficiency           = proficiency
         });
         ctx.SaveChanges();
     }
 }
        public void AddProgrammingLanguage(ProgrammingLanguage language)
        {
            ValidateProgrammingLanguage(language, ProgrammingLanguageProperties.All);
            var langModel = new DB.ProgrammingLanguage()
            {
                Id   = language.Id,
                Name = language.Name
            };

            using (var ctx = new DB.CodingIdeasEntities())
            {
                ctx.ProgrammingLanguages.Add(langModel);
                ctx.SaveChanges();
            }
        }
        public int GetTotalRating(Guid entityId)
        {
            using (var ctx = new DB.CodingIdeasEntities())
            {
                var allRatings = from r in ctx.RatedEntities
                                 where r.EntityId == entityId
                                 select(int) r.Rating;

                if (allRatings.Count() == 0)
                {
                    return(0);
                }
                return(allRatings.AsEnumerable().Aggregate((x, y) => x + y));
            }
        }
 public void UpdateComment(Guid oldCommentId, string newContent)
 {
     ValidateComment(new Comment()
     {
         Content = newContent
     }, CommentProperties.Content);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var c = ctx.Comments.Where(x => x.Id == oldCommentId).FirstOrDefault();
         if (c == null)
         {
             throw new CommentNotFoundException();
         }
         c.Content = newContent;
         ctx.SaveChanges();
     }
 }
 public void UpdateProgrammingLanguage(Guid oldLanguageId, string newName)
 {
     ValidateProgrammingLanguage(new ProgrammingLanguage()
     {
         Name = newName
     }, ProgrammingLanguageProperties.All);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var l = ctx.ProgrammingLanguages.Where(x => x.Id == oldLanguageId).FirstOrDefault();
         if (l == null)
         {
             throw new ProgrammingLanguageNotFoundException();
         }
         l.Name = newName;
         ctx.SaveChanges();
     }
 }
 public void RemovePost(Guid postId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var post = ctx.Posts.Include(x => x.Comments).Where(x => x.Id == postId).FirstOrDefault();
         if (post == null)
         {
             throw new PostNotFoundException();
         }
         foreach (var c in post.Comments.ToList())
         {
             ctx.Comments.Remove(c);
         }
         ctx.Posts.Remove(post);
         ctx.SaveChanges();
     }
 }
 private void ValidateSkill(Guid userId, Guid languageId, byte proficiency)
 {
     if (proficiency < 1 || proficiency > 5)
     {
         throw new InvalidProficiencyException();
     }
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Users.Where(x => x.Id == userId).FirstOrDefault() == null)
         {
             throw new UserNotFoundException();
         }
         if (ctx.ProgrammingLanguages.Where(x => x.Id == languageId).FirstOrDefault() == null)
         {
             throw new ProgrammingLanguageNotFoundException();
         }
     }
 }
 private void ValidateRating(Guid userId, Guid entityId, sbyte rating)
 {
     if (rating != -1 && rating != 1)
     {
         throw new InvalidRatingException();
     }
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Users.Where(x => x.Id == userId).FirstOrDefault() == null)
         {
             throw new UserNotFoundException();
         }
         if (ctx.RatableEntities.Where(x => x.Id == entityId).FirstOrDefault() == null)
         {
             throw new RatableEntityNotFoundException();
         }
     }
 }
 public IEnumerable <dynamic> GetMostActivePosters(int howMany)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var posters = ctx.Posts
                       .Include(x => x.RatableEntity)
                       .Include(x => x.RatableEntity.User)
                       .GroupBy(x => x.RatableEntity.UserId)
                       .Where(x => x.Key != null)
                       .OrderByDescending(x => x.Count())
                       .Take(howMany)
                       .Select(x => new { UserId = x.Key.Value, NumberOfPosts = x.Count(), Username = x.FirstOrDefault().RatableEntity.User.Username });
         foreach (var p in posters)
         {
             yield return(p);
         }
     }
 }
 public void Unsave(Guid userId, Guid postId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var user = ctx.Users.Include(x => x.SavedPosts).Where(x => x.Id == userId).FirstOrDefault();
         if (user == null)
         {
             throw new UserNotFoundException();
         }
         var savedPost = user.SavedPosts.Where(x => x.Id == postId).FirstOrDefault();
         if (savedPost == null)
         {
             throw new SavedPostNotFoundException();
         }
         user.SavedPosts.Remove(savedPost);
         ctx.SaveChanges();
     }
 }
 public void Save(Guid userId, Guid postToSaveId)
 {
     ValidateSavePost(userId, postToSaveId);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var post = ctx.Posts.Where(x => x.Id == postToSaveId).FirstOrDefault();
         var user = ctx.Users.Where(x => x.Id == userId).FirstOrDefault();
         if (user == null)
         {
             throw new UserNotFoundException();
         }
         if (post == null)
         {
             throw new SavedPostNotFoundException();
         }
         user.SavedPosts.Add(post);
         ctx.SaveChanges();
     }
 }
 public Post GetPost(Guid postId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var post = ctx.Posts.Include(x => x.RatableEntity).Include(x => x.RatableEntity.User).Where(x => x.Id == postId).FirstOrDefault();
         if (post == null)
         {
             throw new PostNotFoundException();
         }
         return(new Post()
         {
             Id = post.Id,
             AuthorId = post.RatableEntity.UserId,
             Content = post.Content,
             PublishDate = post.RatableEntity.PublishDate,
             Title = post.Title,
             AuthorUsername = post.RatableEntity.User.Username
         });
     }
 }
 public void RemoveSkill(Guid userId, Guid languageId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Users.Where(x => x.Id == userId).FirstOrDefault() == null)
         {
             throw new UserNotFoundException();
         }
         if (ctx.ProgrammingLanguages.Where(x => x.Id == languageId).FirstOrDefault() == null)
         {
             throw new ProgrammingLanguageNotFoundException();
         }
         var skill = ctx.UserSkills.Where(x => x.UserId == userId && x.ProgrammingLanguageId == languageId).FirstOrDefault();
         if (skill == null)
         {
             throw new UserSkillNotFoundException();
         }
         ctx.UserSkills.Remove(skill);
         ctx.SaveChanges();
     }
 }
 public void UpdatePost(Guid oldPostId, Post @new, PostProperties propertiesToChange)
 {
     ValidatePost(@new, propertiesToChange);
     using (var ctx = new DB.CodingIdeasEntities())
     {
         var p = ctx.Posts.Where(x => x.Id == oldPostId).FirstOrDefault();
         if (p == null)
         {
             throw new PostNotFoundException();
         }
         if (propertiesToChange.HasFlag(PostProperties.Content))
         {
             p.Content = @new.Content;
         }
         if (propertiesToChange.HasFlag(PostProperties.Title))
         {
             p.Title = @new.Title;
         }
         ctx.SaveChanges();
     }
 }
 public void RemoveRating(Guid userId, Guid entityId)
 {
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Users.Where(x => x.Id == userId).FirstOrDefault() == null)
         {
             throw new UserNotFoundException();
         }
         if (ctx.RatableEntities.Where(x => x.Id == entityId).FirstOrDefault() == null)
         {
             throw new RatableEntityNotFoundException();
         }
         var rating = ctx.RatedEntities.Where(x => x.EntityId == entityId && x.UserId == userId).FirstOrDefault();
         if (rating == null)
         {
             throw new RatingNotFoundException();
         }
         ctx.RatedEntities.Remove(rating);
         ctx.SaveChanges();
     }
 }
 public IEnumerable <Comment> GetComments(Guid postId, int pageNumber)
 {
     if (pageNumber <= 0)
     {
         throw new InvalidPageNumberException();
     }
     using (var ctx = new DB.CodingIdeasEntities())
     {
         if (ctx.Posts.Where(x => x.Id == postId).FirstOrDefault() == null)
         {
             throw new PostNotFoundException();
         }
         using (var conn = new SqlConnection(ctx.Database.Connection.ConnectionString))
         {
             string selectSql = $@"SELECT C.[{Constants.Comment_Id}], C.[{Constants.Comment_Content}], R.[{Constants.RatableEntity_UserId}], U.[{Constants.User_Username}], R.[{Constants.RatableEntity_PublishDate}]
                                   FROM [{Constants.Schema}].[{Constants.Comment}] as C, [{Constants.Schema}].[{Constants.RatableEntity}] as R, [{Constants.Schema}].[{Constants.User}] as U
                                   WHERE R.[{Constants.RatableEntity_Id}] = C.[{Constants.Comment_Id}] AND C.[{Constants.Comment_PostId}] = '{postId}' AND R.[{Constants.RatableEntity_UserId}] = U.[{Constants.User_Id}]
                                   ORDER BY R.[{Constants.RatableEntity_PublishDate}] DESC";
             using (var adapter = new SqlDataAdapter(selectSql, conn))
             {
                 var table = new DataTable();
                 adapter.Fill(CommentsPerPage * (pageNumber - 1), CommentsPerPage, table);
                 var comments = table.AsEnumerable()
                                .Select(x => new Comment()
                 {
                     Id             = Guid.Parse(x[0].ToString()),
                     PostId         = postId,
                     Content        = x[1].ToString(),
                     AuthorId       = x[2].ToString() == "" ? (Guid?)null : Guid.Parse(x[2].ToString()),
                     PublishDate    = DateTime.Parse(x[4].ToString()),
                     AuthorUsername = x[3].ToString()
                 });
                 foreach (var c in comments)
                 {
                     yield return(c);
                 }
             }
         }
     }
 }