public IQueryable<TagModel> GetAll(
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context = new BlogSystemContext();

                var user = context.Users.FirstOrDefault(
                    usr => usr.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new InvalidOperationException("Invalid sessionKey");
                }

                var tagEntities = context.Tags;
                var models =
                    (from tagEntity in tagEntities
                     select new TagModel()
                     {
                         Id = tagEntity.Id,
                         Name = tagEntity.Name,
                         Posts = tagEntity.Posts.Count
                     });
                return models.OrderBy(t => t.Name);
            });

            return responseMsg;
        }
        public object GetService(Type serviceType)
        {
            if (serviceType == typeof(UsersController))
            {
                var context = new BlogSystemContext();
                var repository = new DbUserRepository(context);

                return new UsersController(repository);
            }
            else if (serviceType == typeof(PostsController))
            {
                var context = new BlogSystemContext();
                var repository = new DbPostRepository(context);

                return new PostsController(repository);
            }
            else if (serviceType == typeof(TagsController))
            {
                var context = new BlogSystemContext();
                var repository = new DbTagRepository(context);

                return new TagsController(repository);
            }
            else
            {
                return null;
            }
        }
        public IQueryable<TagModel> GetAll(
             [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = ExceptionHandler(
            () =>
            {
                var context = new BlogSystemContext();
                using (context)
                {
                    var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password");
                    }
                }

                var tags = this.tagRepository.All();

                var models =
                    (from t in tags
                     select new TagModel
                     {
                         Id = t.Id,
                         Name = t.Name,
                         Posts = t.Posts.Count
                     });

                return models.OrderBy(t => t.Name);
            });

            return responseMsg;
        }
 public object GetService(Type serviceType)
 {
     if (serviceType == typeof(UsersController))
     {
         var context = new BlogSystemContext();
         var repository = new EfRepository<User>(context);
         return new UsersController(repository);
     }
     else if (serviceType == typeof(PostsController))
     {
         var context = new BlogSystemContext();
         var postsRepository = new EfRepository<Post>(context);
         var usersRepository = new EfRepository<User>(context);
         var tagsRepository = new EfRepository<Tag>(context);
         var commentsRepository = new EfRepository<Comment>(context);
         return new PostsController(postsRepository, usersRepository, tagsRepository, commentsRepository);
     }
     else if (serviceType == typeof(TagsController))
     {
         var context = new BlogSystemContext();
         var tagsRepository = new EfRepository<Tag>(context);
         var usersRepository = new EfRepository<User>(context);
         var postsRepository = new EfRepository<Post>(context);
         return new TagsController(tagsRepository, usersRepository, postsRepository);
     }
     else
     {
         return null;
     }
 }
        public HttpResponseMessage PostRegisterUser(UserModel model)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {

                var context = new BlogSystemContext();

                using (context)
                {
                    this.ValidateUserName(model.UserName);
                    this.ValidateDisplayName(model.DisplayName);
                    this.ValidateAuthCode(model.AuthCode);

                    var userNameToLower = model.UserName.ToLower();
                    var displayNameToLower = model.DisplayName.ToLower();

                    var user = context.Users.FirstOrDefault(
                        usr => usr.UserName == userNameToLower &&
                            usr.DisplayName == usr.DisplayName);

                    if (user != null)
                    {
                        throw new InvalidOperationException("User exists!");
                    }

                    user = new User()
                    {
                        UserName = userNameToLower,
                        DisplayName = model.DisplayName,
                        AuthCode = model.AuthCode
                    };

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

                    user.SessionKey = this.GenerateSessionKey(user.Id);
                    context.SaveChanges();

                    var loggedModel = new UserLoggedModel()
                    {
                        DisplayName = user.DisplayName,
                        SessionKey = user.SessionKey
                    };

                    var response = this.Request.CreateResponse(HttpStatusCode.Created,
                        loggedModel);

                    return response;
                }
            });

            return responseMsg;
        }
        public object GetService(Type serviceType)
        {
            if (serviceType == typeof(UsersController))
            {
                return new UsersController(this.UsersRepository as IRepository<User>);
            }
            else if (serviceType == typeof(PostsController))
            {
                var context = new BlogSystemContext();
                this.postsRepository = new EfRepository<Post>(context);
                this.usersRepository = new EfRepository<User>(context);
                this.tagsRepository = new EfRepository<Tag>(context);
                return new PostsController(postsRepository, usersRepository, tagsRepository, commentsRepository);
            }

            return null;
        }
        public IQueryable<PostModel> GetPosts(int tagId,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context = new BlogSystemContext();

                var user = context.Users.FirstOrDefault(
                    usr => usr.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new InvalidOperationException("Invalid sessionKey");
                }

                var tag = context.Tags.FirstOrDefault(t => t.Id == tagId);

                if (tag == null)
                {
                    throw new InvalidOperationException("Invalid tagId");
                }

                var postEntities = tag.Posts;
                var models =
                    (from postEntity in postEntities
                     select new PostModel()
                     {
                         Id = postEntity.Id,
                         Title = postEntity.Title,
                         PostDate = postEntity.PostDate,
                         Text = postEntity.Text,
                         PostedBy = postEntity.User.Nickname,
                         Tags = (from tagEntity in postEntity.Tags
                                 select tagEntity.Name),
                         Comments = (from commentEntity in postEntity.Comments
                                     select new CommentModel()
                                     {
                                         Text = commentEntity.Text,
                                         PostDate = commentEntity.PostDate,
                                         CommentedBy = commentEntity.User.Nickname
                                     })
                     });
                return models.OrderByDescending(p => p.PostDate);
            });

            return responseMsg.AsQueryable();
        }
        public IQueryable<PostModel> GetAll(
             [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = ExceptionHandler(
            () =>
            {
                var context = new BlogSystemContext();
                using (context)
                {
                    var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password");
                    }
                }

                var posts = this.postRepository.All();

                var models =
                    (from p in posts
                     select new PostModel
                     {
                         Id = p.Id,
                         Title = p.Title,
                         PostDate = p.PostDate,
                         PostedBy = p.User.DisplayName,
                         Text = p.Text,
                         Tags = (from t in p.Tags
                                 select t.Name),
                         Comments = (from c in p.Comments
                                     select new CommendModel
                                     {
                                         Text = c.Content,
                                         CommentedBy = c.User.DisplayName,
                                         PostDate = c.CommentDate
                                     })
                     });

                return models.OrderByDescending(d => d.PostDate);
            });

            return responseMsg;
        }
        public ICollection<PostModel> GetPostsForTag(int tagId,
             [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = ExceptionHandler(
            () =>
            {
                var context = new BlogSystemContext();
                using (context)
                {
                    var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password");
                    }
                }

                var tag = this.tagRepository.Get(tagId);

                var models =
                    (from t in tag.Posts
                     select new PostModel
                     {
                         Id = t.Id,
                         Title = t.Title,
                         PostDate = t.PostDate,
                         PostedBy = t.User.DisplayName,
                         Text = t.Text,
                         Tags = (from p in t.Tags
                                 select p.Name),
                         Comments = (from c in t.Comments
                                     select new CommendModel
                                     {
                                         Text = c.Content,
                                         CommentedBy = c.User.DisplayName,
                                         PostDate = c.CommentDate
                                     })
                     });

                return models.OrderBy(p => p.PostDate);
            });

            return responseMsg.ToList();
        }
        public HttpResponseMessage PostLoginUser(UserModel model)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
              () =>
              {
                  var context = new BlogSystemContext();
                  using (context)
                  {
                      this.ValidateUsername(model.Username);
                      this.ValidateAuthCode(model.AuthCode);
                      var usernameToLower = model.Username.ToLower();
                      var user = context.Users.FirstOrDefault(
                          usr => usr.Username == usernameToLower
                          && usr.AuthCode == model.AuthCode);

                      if (user == null)
                      {
                          throw new InvalidOperationException("Invalid username or password");
                      }

                      if (user.SessionKey == null)
                      {
                          user.SessionKey = this.GenerateSessionKey(user.Id);
                          context.SaveChanges();
                      }

                      var loggedModel = new UserLoggedModel()
                      {
                          Nickname = user.Nickname,
                          SessionKey = user.SessionKey
                      };

                      var response =
                          this.Request.CreateResponse(HttpStatusCode.Created,
                                          loggedModel);
                      return response;
                  }
              });

            return responseMsg;
        }
        public IQueryable<PostModel> GetAll(
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                this.ValidateSessionKey(sessionKey);

                var context = new BlogSystemContext();

                var user = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new InvalidOperationException("Invalid username or password");
                }

                var postEntities = context.Posts;
                var models =
                    (from postEntity in postEntities
                     select new PostModel()
                     {
                         Id = postEntity.Id,
                         Title = postEntity.Title,
                         PostedBy = postEntity.User.DisplayName,
                         PostDate = postEntity.DatePosted,
                         Text = postEntity.Text,
                         Tags = (from tagEntity in postEntity.Tags
                                       select tagEntity.Name),
                         Comments = (from commentEntity in postEntity.Comments
                                  select new CommentModel()
                                  {
                                      Text = commentEntity.Text,
                                      CommentedBy = commentEntity.User.DisplayName,
                                      PostDate = commentEntity.DateCommented
                                  }),
                     });

                return models.OrderByDescending(post => post.PostDate);
            });

            return responseMsg;
        }
        public IQueryable<IEnumerable<TagModel>> GetAll(
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                this.ValidateSessionKey(sessionKey);

                var context = new BlogSystemContext();

                var user = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new InvalidOperationException("Invalid username or password");
                }

                var postEntities = context.Posts;
                var postsModels =
                    (from postEntity in postEntities
                     select new PostTagsModel()
                     {
                         Tags =
                         (from tagEntity in postEntity.Tags
                          select new TagModel()
                          {
                              Id = postEntity.Id,
                              Name = tagEntity.Name,
                              Posts = tagEntity.Posts.Count
                          })
                     });

                var tagModels = postsModels.Select(p => p.Tags);

                return tagModels;
            });

            return responseMsg;
        }
        public HttpResponseMessage PostPost(CreatePostModel model,
             [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = ExceptionHandler(
            () =>
            {
                User user;
                var context = new BlogSystemContext();
                using (context)
                {
                    user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password");
                    }
                }

                Dictionary<string, Tag> tags = new Dictionary<string, Tag>();

                foreach (var tag in model.Tags)
                {
                    var tagToLower = tag.ToLower();
                    if (!tags.ContainsKey(tagToLower))
                    {
                        Tag newTag = new Tag { Name = tagToLower };
                        tags.Add(tagToLower, newTag);
                    }
                }

                var titleTags = model.Title.Split(' ');

                foreach (var tag in titleTags)
                {
                    var tagToLower = tag.ToLower();
                    if (!tags.ContainsKey(tagToLower))
                    {
                        Tag newTag = new Tag { Name = tagToLower };
                        tags.Add(tagToLower, newTag);
                    }
                }

                List<Tag> filtTags = new List<Tag>();

                foreach (var tag in tags.Values)
                {
                    filtTags.Add(tag);
                }

                var newPost = new Post
                {
                    Title = model.Title,
                    Text = model.Text,
                    Tags = filtTags,
                    PostDate = DateTime.Now,
                    User = user,
                };

                var dbPost = this.postRepository.Add(newPost);

                var postMode = new CreatedPostModel
                {
                    Id = dbPost.Id,
                    Title = dbPost.Title
                };

                var response = this.Request.CreateResponse(HttpStatusCode.Created, postMode);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = postMode.Id }));

                return response;
            });

            return responseMsg;
        }
        public HttpResponseMessage PutCommentPost(int id, [FromBody]CommentModelSimple comment,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                this.ValidateSessionKey(sessionKey);
                var context = new BlogSystemContext();
                using (context)
                {
                    var user = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password");
                    }

                    var post = context.Posts.FirstOrDefault(p => p.Id == id);

                    post.Comments.Add(new Comment()
                    {
                        Text = comment.Text,
                        DateCommented = DateTime.Now,
                        User = user
                    });

                    context.SaveChanges();
                    
                    var response = this.Request.CreateResponse(HttpStatusCode.OK);

                    return response;
                }
            });

            return responseMsg;
        }
 public UsersController()
 {
     var dbContext = new BlogSystemContext();
     this.userRepository = new DbUserRepository(dbContext);
 }
        public HttpResponseMessage PutLogoutUser(
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
              () =>
              {
                  var context = new BlogSystemContext();
                  using (context)
                  {
                      var user = context.Users.FirstOrDefault(
                          usr => usr.SessionKey == sessionKey);

                      if (user == null)
                      {
                          throw new InvalidOperationException("Invalid sessionKey");
                      }

                      user.SessionKey = null;
                      context.SaveChanges();

                      var response =
                          this.Request.CreateResponse(HttpStatusCode.OK);
                      return response;
                  }
              });

            return responseMsg;
        }
        public HttpResponseMessage PutComment(int postId, CommentNewModel model,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
              () =>
              {
                  var context = new BlogSystemContext();
                  using (context)
                  {
                      var user = context.Users.FirstOrDefault(
                          usr => usr.SessionKey == sessionKey);

                      if (user == null)
                      {
                          throw new InvalidOperationException("Invalid sessionKey");
                      }

                      var post = context.Posts.FirstOrDefault(p => p.Id == postId);

                      if (post == null)
                      {
                          throw new InvalidOperationException("Invalid postId");
                      }

                      if (model.Text == null)
                      {
                          throw new ArgumentNullException("Comment text cannot be null");
                      }

                      var comment = new Comment()
                      {
                          Text = model.Text,
                          User = user,
                          PostDate = DateTime.Now,
                          Post = post
                      };

                      context.Comments.Add(comment);
                      context.SaveChanges();

                      var response =
                          this.Request.CreateResponse(HttpStatusCode.OK, "NULL");
                      return response;
                  }
              });

            return responseMsg;
        }
        public HttpResponseMessage PostNewPost(PostNewModel model,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
              () =>
              {
                  var context = new BlogSystemContext();
                  using (context)
                  {
                      var user = context.Users.FirstOrDefault(
                          usr => usr.SessionKey == sessionKey);
                      if (user == null)
                      {
                          throw new InvalidOperationException("Invalid sessionKey");
                      }

                      if (model.Title == null || model.Text == null)
                      {
                          throw new ArgumentNullException("Post title or post text cannot be null");
                      }

                      string[] titleWords = model.Title.Split(
                          new char[] { ' ', ',', '.', '!', '?', '\'', '(', ')' },
                          StringSplitOptions.RemoveEmptyEntries);

                      IList<Tag> tags = new List<Tag>();
                      if (model.Tags != null)
                      {
                          foreach (var item in model.Tags)
                          {
                              var tag = context.Tags.FirstOrDefault(t => t.Name == item.ToLower());
                              if (tag == null)
                              {
                                  tag = new Tag()
                                  {
                                      Name = item.ToLower()
                                  };

                                  context.Tags.Add(tag);
                                  context.SaveChanges();
                              }

                              tags.Add(tag);
                          }
                      }

                      foreach (var item in titleWords)
                      {
                          var tag = context.Tags.FirstOrDefault(t => t.Name == item.ToLower());
                          if (tag == null)
                          {
                              tag = new Tag()
                              {
                                  Name = item.ToLower()
                              };

                              context.Tags.Add(tag);
                              context.SaveChanges();
                          }

                          tags.Add(tag);
                      }

                      var post = new Post()
                      {
                          Title = model.Title,
                          Text = model.Text,
                          PostDate = DateTime.Now,
                          User = user,
                          Tags = tags
                      };

                      context.Posts.Add(post);
                      context.SaveChanges();

                      var createdModel = new PostCreatedModel()
                      {
                          Id = post.Id,
                          Title = post.Title
                      };

                      var response =
                          this.Request.CreateResponse(HttpStatusCode.Created,
                                          createdModel);
                      return response;
                  }
              });

            return responseMsg;
        }
        public HttpResponseMessage AddComent(CreateCommentModel model, int postId,
             [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = ExceptionHandler(
            () =>
            {
                User user;
                var context = new BlogSystemContext();
                using (context)
                {
                    user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid username or password");
                    }
                }

                var selectedPost = this.postRepository.Get(postId);

                var newComment = new Comment
                {
                    Content = model.Text,
                    CommentDate = DateTime.Now,
                    Post = selectedPost,
                    //User = user,
                };

                selectedPost.Comments.Add(newComment);
                this.postRepository.Update(selectedPost, postId, true);

                var response = this.Request.CreateResponse(HttpStatusCode.OK);

                return response;
            });

            return responseMsg;
        }
        public HttpResponseMessage PostCreatePost(PostModel model,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                this.ValidateSessionKey(sessionKey);

                if (model == null)
                {
                    throw new InvalidOperationException("Model cannot be null");
                }

                var context = new BlogSystemContext();
                using (context)
                {
                    User user = context.Users.Where(usr => usr.SessionKey == sessionKey).FirstOrDefault();
                    if (user == null)
                    {
                        throw new InvalidOperationException("Invalid sessionkey");
                    }

                    var titleTags = model.Title.Split(
                        new char[] { '.', ',', ';', '!', '?', ' ' }, StringSplitOptions.RemoveEmptyEntries);

                    var newTags = new HashSet<Tag>();
                    foreach (var tagName in titleTags)
                    {
                        Tag newtag = new Tag()
                        {
                            Name = tagName.ToLower()
                        };

                        if (!newTags.Contains(newtag))
                        {
                            newTags.Add(newtag);
                        }
                    }

                    foreach (var tagName in model.Tags)
                    {
                        Tag newtag = new Tag()
                        {
                            Name = tagName.ToLower()
                        };

                        if (!newTags.Contains(newtag))
                        {
                            newTags.Add(newtag);
                        }
                    }

                    var newDbTags = new HashSet<Tag>();
                    foreach (var tag in newTags)
                    {
                        var tagDb = context.Tags.FirstOrDefault(tg => tg.Name == tag.Name);
                        if (tagDb == null)
                        {
                            newDbTags.Add(tag);
                        }
                        else
                        {
                            newDbTags.Add(tagDb);
                        }
                    }

                    var post = new Post()
                    {
                        Title = model.Title,
                        Text = model.Text,
                        DatePosted = DateTime.Now,
                        User = user,
                        Tags = newDbTags
                    };

                    user.Posts.Add(post);
                    context.SaveChanges();

                    var responseModel = new CreatePostResponseModel()
                    {
                        Title = post.Title,
                        Id = post.Id
                    };

                    var response = this.Request.CreateResponse(HttpStatusCode.Created, responseModel);

                    return response;
                }
            });

            return responseMsg;
        }
 public PostsController()
 {
     var dbContext = new BlogSystemContext();
     this.postRepository = new DbPostRepository(dbContext);
 }
 public TagsController()
 {
     var dbContext = new BlogSystemContext();
     this.tagRepository = new DbTagRepository(dbContext);
 }