Exemple #1
0
        public IOrderedQueryable <PostDto> FilterByTags(string tags)
        {
            try
            {
                var sessionKey = ApiControllerHelper.GetHeaderValue(Request.Headers, "X-SessionKey");
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("No session key provided in the request header!");
                }

                var context = new BloggingSystemContext();

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

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

                string[] tagsSpecified = tags.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

                var posts = context.Posts
                            .Include(p => p.Tags)
                            .Include(p => p.Comments)
                            .Where(p => tagsSpecified.All(s => p.Tags.Any(t => string.Compare(t.Name, s, true) == 0)));

                var postDtos = GetAllPostDtos(posts);
                return(postDtos.OrderByDescending(p => p.PostDate));
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
        }
        public HttpResponseMessage PutLogoutUser(
            [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = new BloggingSystemContext();
                using (context)
                {
                    if (sessionKey == null)
                    {
                        throw new ArgumentNullException("You do not have session");
                    }
                    var user = context.Users.FirstOrDefault(
                        usr => usr.SessionKey == sessionKey);

                    if (user == null)
                    {
                        throw new InvalidOperationException("Your session is expired");
                    }

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

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

            return(responseMsg);
        }
Exemple #3
0
        public HttpResponseMessage Comment(int postId, [FromBody]
                                           CommentModel model, [ValueProvider(typeof(HeaderValueProviderFactory <string>))]
                                           string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context    = new BloggingSystemContext();
                Post foundPost = context.Posts.Where(x => x.Id == postId).FirstOrDefault();
                User foundUser = context.Users.Where(x => x.Id == foundPost.User.Id).FirstOrDefault();
                if (foundPost == null)
                {
                    throw new ArgumentException("No post was found");
                }

                if (foundUser == null)
                {
                    throw new ArgumentException("No user was found");
                }

                Comment newComment = new Comment()
                {
                    Text        = model.Text,
                    CommentDate = DateTime.Now
                };
                foundUser.Comments.Add(newComment);
                foundPost.Comments.Add(newComment);
                context.SaveChanges();

                string result = null;
                return(Request.CreateResponse(HttpStatusCode.OK, result));
            });

            return(responseMsg);
        }
Exemple #4
0
        public IQueryable <TagFullModel> GetAll(
            [ValueProvider(typeof(HeaderValueProviderFactory <string>))]
            string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context = new BloggingSystemContext();
                var user    = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new InvalidOperationException("Invalid username or password");
                }
                var postEntities = context.Tags;
                var models       =
                    from tag in postEntities
                    select new TagFullModel
                {
                    Id    = tag.Id,
                    Name  = tag.Name,
                    Posts = tag.Posts.Count
                };
                return(models.OrderBy(thr => thr.Name));
            });

            return(responseMsg);
        }
Exemple #5
0
        public IOrderedQueryable <TagDto> GetAll()
        {
            try
            {
                var sessionKey = ApiControllerHelper.GetHeaderValue(Request.Headers, "X-SessionKey");
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("No session key provided in the request header!");
                }

                var context = new BloggingSystemContext();

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

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

                var tags = context.Tags.Include(t => t.Posts).AsQueryable();

                var tagDtos = GetAllTagDtos(tags);
                return(tagDtos.OrderBy(t => t.Name));
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
        }
Exemple #6
0
        public IOrderedQueryable <PostDto> FilterByKeyword(string keyword)
        {
            try
            {
                var sessionKey = ApiControllerHelper.GetHeaderValue(Request.Headers, "X-SessionKey");
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("No session key provided in the request header!");
                }

                var context = new BloggingSystemContext();

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

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

                var posts = context.Posts
                            .Include(p => p.Tags)
                            .Include(p => p.Comments)
                            .Where(p => p.Title.ToLower().IndexOf(keyword.ToLower()) >= 0);

                var postDtos = GetAllPostDtos(posts);
                return(postDtos.OrderByDescending(p => p.PostDate));
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
        }
        public IQueryable <TagModel> GetAllTags(
            [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var context = new BloggingSystemContext();

            using (context)
            {
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("You dont have session");
                }
                var user = context.Users.FirstOrDefault(
                    usr => usr.SessionKey == sessionKey);

                if (user == null)
                {
                    throw new InvalidOperationException("Your session is expired");
                }

                var tags =
                    (from tag in context.Tags
                     select new TagModel()
                {
                    Id = tag.Id,
                    Name = tag.Name,
                    PostsNumber = tag.Post.Count()
                }).ToList();

                return(tags.OrderBy(t => t.Name).AsQueryable());
            }
        }
        public IQueryable <PostModel> GetPostsByTagId(int tagId,
                                                      [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var context = new BloggingSystemContext();

            using (context)
            {
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("You dont have session");
                }
                var user = context.Users.FirstOrDefault(
                    usr => usr.SessionKey == sessionKey);

                if (user == null)
                {
                    throw new InvalidOperationException("Your session is expired");
                }

                if (tagId <= 0)
                {
                    throw new ArgumentOutOfRangeException("Incorrect request");
                }

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

                if (tag == null)
                {
                    throw new ArgumentNullException("No tag found");
                }

                var postModel =
                    (from post in tag.Post
                     select new PostModel()
                {
                    Id = post.Id,
                    Title = post.Title,
                    Author = post.Author.DisplayName,
                    PostDate = post.PostDate,
                    Text = post.Text,
                    Tags = (
                        (from tagPost in post.Tags
                         select tagPost.Name)
                        ),
                    Comments = (
                        from comment in post.Comments
                        select new CommentModel()
                    {
                        Text = comment.Text,
                        Author = comment.Author.DisplayName,
                        PostDate = comment.PostDate
                    }
                        )
                }).ToList();
                return(postModel.OrderByDescending(p => p.PostDate).AsQueryable());
            }
        }
        public HttpResponseMessage PutComment(int postId, PostModel model,
                                              [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = new BloggingSystemContext();
                using (context)
                {
                    if (sessionKey == null)
                    {
                        throw new ArgumentNullException("You dont have session");
                    }
                    var user = context.Users.FirstOrDefault(
                        usr => usr.SessionKey == sessionKey);

                    if (user == null)
                    {
                        throw new InvalidOperationException("Your session is expired");
                    }

                    if (model.Text == null)
                    {
                        throw new ArgumentNullException("You dont have text");
                    }
                    if (postId <= 0)
                    {
                        throw new ArgumentOutOfRangeException("Incorrect request");
                    }

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

                    if (post == null)
                    {
                        throw new ArgumentNullException("No post found");
                    }


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

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

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

            return(responseMsg);
        }
        public HttpResponseMessage LoginUser(UserDto value)
        {
            BloggingSystemContext context = null;

            try
            {
                context = new BloggingSystemContext();

                this.ValidateUserIdentifier(
                    value.Username,
                    "Username",
                    MinUsernameLength,
                    MaxUsernameLength,
                    ValidUsernameCharacters);
                this.ValidateAuthCode(value.AuthCode);

                var user = context.Users.FirstOrDefault(
                    u => u.Username == value.Username &&
                    u.AuthCode == value.AuthCode);

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

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

                var loggedUserDto = new LoggedUserDto()
                {
                    DisplayName = user.DisplayName,
                    SessionKey  = user.SessionKey
                };

                var response = Request.CreateResponse(HttpStatusCode.Accepted, loggedUserDto);
                return(response);
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
            finally
            {
                if (context != null)
                {
                    context.Dispose();
                }
            }
        }
        private static void Main()
        {
            // Run the console client first in order to create the database

            Database.SetInitializer <BloggingSystemContext>(new DatabaseInitializer());

            using (var dbContext = new BloggingSystemContext())
            {
                dbContext.Database.Initialize(true);

                Console.WriteLine(dbContext.Users.Count());
            }
        }
Exemple #12
0
        public HttpResponseMessage PostRegisterUser(UserModel model)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = new BloggingSystemContext();
                using (context)
                {
                    this.ValidateUsername(model.Username);
                    this.ValidateNickname(model.DisplayName);
                    this.ValidateAuthCode(model.AuthCode);
                    var usernameToLower = model.Username.ToLower();
                    var nicknameToLower = model.DisplayName.ToLower();

                    var user = context.Users.FirstOrDefault(
                        usr => usr.Username == usernameToLower ||
                        usr.DisplayName.ToLower() == nicknameToLower);

                    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);
        }
Exemple #13
0
        public HttpResponseMessage CreateComment(int postId, [FromBody] CommentDto value)
        {
            try
            {
                var sessionKey = ApiControllerHelper.GetHeaderValue(Request.Headers, "X-SessionKey");
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("No session key provided in the request header!");
                }

                Validate(value.Text, "text");

                var context = new BloggingSystemContext();

                using (context)
                {
                    var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new ArgumentException("Users must be logged in to leave comments!");
                    }

                    var post = context.Posts.FirstOrDefault(p => p.Id == postId);
                    if (post == null)
                    {
                        throw new ArgumentException("Invalid post id: " + postId);
                    }

                    var newComment = new Comment()
                    {
                        Text     = value.Text,
                        PostDate = DateTime.Now,
                        Author   = user,
                        Post     = post
                    };

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

                    var response = Request.CreateResponse(HttpStatusCode.OK);
                    return(response);
                }
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
        }
Exemple #14
0
        public IQueryable <PostModel> GetAll(
            [ValueProvider(typeof(HeaderValueProviderFactory <string>))]
            string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context = new BloggingSystemContext();

                var user = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
                if (user == null)
                {
                    throw new InvalidOperationException("The user is not logged in");
                }

                var postEntities = context.Posts;

                var models =
                    from post in postEntities
                    select new PostModel
                {
                    Id       = post.Id,
                    PostedBy = post.User.DisplayName,
                    PostDate = post.PostDate,
                    Text     = post.Text,
                    Comments = (from comment in post.Comments
                                select new CommentModel()
                    {
                        CommentedBy = comment.User.DisplayName,
                        PostDate = comment.CommentDate,
                        Text = comment.Text
                    }),
                    Tags = from tag in post.Tags
                           select tag.Name,
                    Title = post.Title
                };

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

            return(responseMsg);
        }
        public HttpResponseMessage LogoutUser()
        {
            BloggingSystemContext context = null;

            try
            {
                string sessionKey = ApiControllerHelper.GetHeaderValue(Request.Headers, "X-SessionKey");
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("No session key provided in the request header!");
                }

                context = new BloggingSystemContext();

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

                if (user.SessionKey == null)
                {
                    throw new ArgumentNullException("User is already logged out!");
                }

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

                var response = Request.CreateResponse(HttpStatusCode.OK);
                return(response);
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
            finally
            {
                if (context != null)
                {
                    context.Dispose();
                }
            }
        }
        public HttpResponseMessage PostLoginUser(UserModel model)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = new BloggingSystemContext();
                using (context)
                {
                    this.ValidateUsername(model.Username);
                    var username = model.Username.ToLower();
                    var user     = context.Users.FirstOrDefault(
                        usr => usr.Username == username &&
                        usr.Password == model.AuthCode);

                    if (user == null)
                    {
                        throw new InvalidOperationException(
                            "Username or password is incorrect");
                    }

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

                    var loggedUser = new LoggedUserModel()
                    {
                        DisplayName = user.DisplayName,
                        SessionKey  = user.SessionKey
                    };

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

            return(responseMsg);
        }
Exemple #17
0
        public HttpResponseMessage PutLogoutUser(
            [ValueProvider(typeof(HeaderValueProviderFactory <string>))]
            string sessionKey)
        {
            var response = this.PerformOperation(() =>
            {
                var context = new BloggingSystemContext();
                using (context)
                {
                    var user = context.Users.Where(u => u.SessionKey == sessionKey).FirstOrDefault();

                    if (user == null)
                    {
                        throw new InvalidOperationException("The user is not valid");
                    }

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

            return(response);
        }
Exemple #18
0
        public IQueryable <PostModel> Posts(int tagId, [ValueProvider(typeof(HeaderValueProviderFactory <string>))]
                                            string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context   = new BloggingSystemContext();
                Tag foundPost = context.Tags.Where(x => x.Id == tagId).FirstOrDefault();

                if (foundPost == null)
                {
                    throw new ArgumentException("No post was found");
                }

                var posts = from post in foundPost.Posts
                            select new PostModel
                {
                    Id       = post.Id,
                    PostedBy = post.User.DisplayName,
                    PostDate = post.PostDate,
                    Text     = post.Text,
                    Comments = (from comment in post.Comments
                                select new CommentModel()
                    {
                        CommentedBy = comment.User.DisplayName,
                        PostDate = comment.CommentDate,
                        Text = comment.Text
                    }),
                    Tags = from tag in post.Tags
                           select tag.Name,
                    Title = post.Title
                };

                return(posts.OrderByDescending(thr => thr.PostDate));
            });

            return(responseMsg.AsQueryable <PostModel>());
        }
Exemple #19
0
        public HttpResponseMessage CreatePost([FromBody]
                                              PostModel model,
                                              [ValueProvider(typeof(HeaderValueProviderFactory <string>))]
                                              string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(() =>
            {
                var context = new BloggingSystemContext();

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

                if (user == null)
                {
                    throw new InvalidOperationException("The user is not logged in");
                }

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

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

                foreach (var tagName in titleSplited)
                {
                    Tag addedTag = new Tag()
                    {
                        Name = tagName.ToLower()
                    };

                    context.Tags.Add(addedTag);
                    newPost.Tags.Add(addedTag);
                }

                if (model.Tags != null)
                {
                    foreach (var post in model.Tags)
                    {
                        Tag addedTag = new Tag()
                        {
                            Name = post.ToLower()
                        };

                        context.Tags.Add(addedTag);
                        newPost.Tags.Add(addedTag);
                    }
                }

                // var filteredTags = FilterTags(possibleTags, context);

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

                var response = this.Request.CreateResponse(HttpStatusCode.Created,
                                                           new PostCreatedModel
                {
                    Id    = newPost.Id,
                    Title = model.Title
                });

                return(response);
            });

            return(responseMsg);
        }
        public HttpResponseMessage RegisterUser(UserDto value)
        {
            BloggingSystemContext context = null;

            try
            {
                context = new BloggingSystemContext();

                this.ValidateUserIdentifier(
                    value.Username,
                    "Username",
                    MinUsernameLength,
                    MaxUsernameLength,
                    ValidUsernameCharacters);

                this.ValidateUserIdentifier(
                    value.DisplayName,
                    "Display name",
                    MinDisplayNameLength,
                    MaxDisplayNameLength,
                    ValidDisplayNameCharacters);

                this.ValidateAuthCode(value.AuthCode);

                var user = context.Users.FirstOrDefault(
                    u => u.Username == value.Username ||
                    u.DisplayName == value.DisplayName);

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

                user = new User()
                {
                    Username    = value.Username,
                    DisplayName = value.DisplayName,
                    AuthCode    = value.AuthCode
                };

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

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

                var loggedUserDto = new LoggedUserDto()
                {
                    DisplayName = user.DisplayName,
                    SessionKey  = user.SessionKey
                };

                var response = Request.CreateResponse(HttpStatusCode.Created, loggedUserDto);
                return(response);
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
            finally
            {
                if (context != null)
                {
                    context.Dispose();
                }
            }
        }
        /*
         * { "title": "NEW POST",
         * "tags": ["post"],
         * "text": "this is just a test post" }
         */
        public HttpResponseMessage PostAdd(PostModel model,
                                           [ValueProvider(typeof(HeaderValueProviderFactory <string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
            {
                var context = new BloggingSystemContext();
                using (context)
                {
                    if (sessionKey == null)
                    {
                        throw new ArgumentNullException("You dont have session");
                    }
                    var user = context.Users.FirstOrDefault(
                        usr => usr.SessionKey == sessionKey);

                    if (user == null)
                    {
                        throw new InvalidOperationException("Your session is expired");
                    }
                    if (model.Title == null)
                    {
                        throw new ArgumentNullException("You dont have title");
                    }
                    if (model.Text == null)
                    {
                        throw new ArgumentNullException("You dont have text");
                    }

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

                    string[] tagsTile = model.Title.Split(new char[] { ' ' });
                    for (int i = 0; i < tagsTile.Length; i++)
                    {
                        var tagEnt = new Tag()
                        {
                            Name = tagsTile[i].ToLower()
                        };

                        var tag = context.Tags.FirstOrDefault(t => t.Name == tagEnt.Name);

                        if (tag == null)
                        {
                            post.Tags.Add(tagEnt);
                        }
                        else
                        {
                            post.Tags.Add(tag);
                        }
                    }
                    if (model.Tags != null)
                    {
                        foreach (var tag in model.Tags)
                        {
                            var tagEnt = new Tag()
                            {
                                Name = tag.ToLower()
                            };

                            var tagTitle = context.Tags.FirstOrDefault(t => t.Name == tagEnt.Name);

                            if (tagTitle == null)
                            {
                                post.Tags.Add(tagEnt);
                            }
                            else
                            {
                                post.Tags.Add(tagTitle);
                            }
                        }
                    }

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


                    var createdPost = new CreatedPostModel()
                    {
                        Id    = post.Id,
                        Title = post.Title
                    };

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

            return(responseMsg);
        }
Exemple #22
0
        public HttpResponseMessage CreatePost(CreatePostDto value)
        {
            try
            {
                var sessionKey = ApiControllerHelper.GetHeaderValue(Request.Headers, "X-SessionKey");
                if (sessionKey == null)
                {
                    throw new ArgumentNullException("No session key provided in the request header!");
                }

                Validate(value.Title, "title");
                Validate(value.Text, "text");

                var context = new BloggingSystemContext();

                using (context)
                {
                    var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);
                    if (user == null)
                    {
                        throw new ArgumentException("Users must be logged in to create posts!");
                    }

                    var newPost = new Post()
                    {
                        Title    = value.Title,
                        Text     = value.Text,
                        PostDate = DateTime.Now,
                        Author   = user
                    };

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

                    List <string> tagsToCheck = new List <string>();

                    foreach (var tagFromTitle in tagsFromTitle)
                    {
                        tagsToCheck.Add(tagFromTitle);
                    }

                    if (value.Tags != null)
                    {
                        foreach (string tagName in value.Tags)
                        {
                            tagsToCheck.Add(tagName);
                        }
                    }

                    foreach (string tagName in tagsToCheck)
                    {
                        var matchingTag = context.Tags.FirstOrDefault(t => string.Compare(t.Name, tagName, true) == 0);
                        if (matchingTag == null)
                        {
                            // tag not found, insert it in the database
                            matchingTag = new Tag
                            {
                                Name = tagName.ToLower()
                            };

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

                        newPost.Tags.Add(matchingTag);
                    }

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

                    var createdPostDto = new CreatePostDto()
                    {
                        Id    = newPost.Id,
                        Title = newPost.Title,
                        Tags  = newPost.Tags.Select(t => t.Name),
                        Text  = newPost.Text
                    };

                    var response = Request.CreateResponse(HttpStatusCode.Created, createdPostDto);
                    return(response);
                }
            }
            catch (Exception ex)
            {
                var errorResponse = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
                throw new HttpResponseException(errorResponse);
            }
        }