public ArticleFullModel GetById(int id)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = this.contextFactory.Create() as NewsContext;

                var article = context.Articles
                              .Include(art => art.Author)
                              .Include(art => art.Image)
                              .Include(art => art.Comments)
                              .Include(art => art.Tags)
                              .FirstOrDefault(art => art.Id == id);

                if (article == null)
                {
                    throw new InvalidOperationException("Article doesn't exist");
                }

                article.ReadCount++;
                context.Articles.Attach(article);
                context.SaveChanges();

                var model = new ArticleFullModel()
                {
                    Id            = article.Id,
                    Title         = article.Title,
                    Content       = article.Content,
                    DatePublished = article.DatePublished,
                    Author        = article.Author.DisplayName,
                    ImageUrl      = article.Image.ThumbUrl,
                    Category      = new CategoryModel
                    {
                        Id   = article.Category.Id,
                        Name = article.Category.Name,
                    },
                    ReadCount = article.ReadCount,
                    Tags      = (from tag in article.Tags
                                 select tag.Name),
                    Comments = (from comment in article.Comments
                                select new CommentModel()
                    {
                        CommentedBy = comment.User.DisplayName,
                        Content = comment.Content,
                        DatePosted = comment.DatePosted
                    })
                };

                return(model);
            });

            return(responseMsg);
        }
        private void ValidateArticleModel(ArticleFullModel model)
        {
            if (model == null)
            {
                throw new InvalidOperationException("Invalid article!");
            }

            if (model.Content == null)
            {
                throw new ArgumentNullException("Cannot create article with empty content!");
            }

            if (model.Title == null)
            {
                throw new ArgumentNullException("Cannot create article without title!");
            }

            if (model.Category == null)
            {
                throw new InvalidOperationException("Cannot create article without category");
            }
        }
        public HttpResponseMessage PutArticle(ArticleFullModel model,
                                              [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = this.contextFactory.Create() as NewsContext;

                using (context)
                {
                    this.ValidateSessionKey(sessionKey);
                    this.ValidateArticleModel(model);

                    var article = context.Articles.FirstOrDefault(art => art.Id == model.Id);
                    if (article == null)
                    {
                        throw new InvalidOperationException("Article doesn't exist");
                    }

                    var user     = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
                    var category = context.Categories.FirstOrDefault(cat => cat.Id == model.Category.Id);

                    article.Title         = model.Title;
                    article.Content       = model.Content;
                    article.DatePublished = DateTime.Now;
                    article.Author        = user;
                    article.Category      = category;

                    foreach (var tagString in model.Tags)
                    {
                        var tagEntity = context.Tags.FirstOrDefault(tag => tag.Name == tagString.ToLower());

                        if (tagEntity == null)
                        {
                            tagEntity      = new Tag();
                            tagEntity.Name = tagString.ToLower();
                            context.Tags.Add(tagEntity);
                            context.SaveChanges();
                        }

                        if (!article.Tags.Contains(tagEntity))
                        {
                            article.Tags.Add(tagEntity);
                        }
                    }

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

                    foreach (var tagString in titleTags)
                    {
                        var tagEntity = context.Tags.FirstOrDefault(tag => tag.Name == tagString.ToLower());

                        if (tagEntity == null)
                        {
                            tagEntity      = new Tag();
                            tagEntity.Name = tagString.ToLower();
                            context.Tags.Add(tagEntity);
                            context.SaveChanges();
                        }

                        if (!article.Tags.Contains(tagEntity))
                        {
                            article.Tags.Add(tagEntity);
                        }
                    }

                    //context.Articles.Add(article);
                    context.SaveChanges();

                    ArticleModel createdModel = new ArticleModel()
                    {
                        Id             = article.Id,
                        Title          = article.Title,
                        ContentPreview = article.Content.Length > 197
                                      ? article.Content.Substring(0, 197) + "..."
                                      : article.Content,
                        DatePublished = article.DatePublished,
                        Author        = article.Author.DisplayName,
                        Category      = new CategoryModel
                        {
                            Id   = category.Id,
                            Name = category.Name,
                        },
                        ThumbUrl  = article.Image.ThumbUrl,
                        ReadCount = article.ReadCount,
                    };

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

            return(responseMsg);
        }