public async Task<HttpResponseMessage> Post(ThreadPostContent post)
        {
            logger.Begin();
            var user = Request
                .GetUser()
                .LogSome(u => logger.Trace("Retrieved user {0}", u.Username))
                .ValueOrFailure("No user found");

            logger.Trace("Setting author to user");
            post.Header.Author = user;

            logger.Trace("Setting created date to now for post");
            post.Header.CreatedOn = DateTime.Now;

            var titleCreated = await titleRepository
                .Create(post.Header, (t) => Task.FromResult(true))
                .LogSomeAsync(t => logger.Trace("Created post header with id: {0}", t.ThreadID));

            var onCreate = new Func<ThreadPostContent, Task<bool>>(async p =>
           {
               logger.Trace("Converting post model to dto");
               var dto = Converters.ToThreadPostContentDTO(p, null, 0);

               logger.Trace("Broadcasting on websocket, new forum thread created");
               webSocketService.NewForumThread(dto);

               logger.Trace("Adding forum thread to latest news");
               return await whatsNew.AddItem(p.ThreadID, NewsType.ThreadPost) > 0;
           });

            var result = await titleCreated
                .FlatMapAsync(async t => await postRepository.Create(post, onCreate))
                .LogSomeAsync(r => logger.Trace("Created post content"));

            logger.End();
            return result
                .ReturnMessage(Request.CreateResponse, HttpStatusCode.Created, HttpStatusCode.InternalServerError);
        }
        public async Task<HttpResponseMessage> Put([FromUri] int id, ThreadPostContent content)
        {
            logger.Debug("Class: ForumPostController, Method: Put, BEGIN");
            var title = await titleRepository.GetByID(id);

            var updateHeader = await title
                .Map(t =>
                {
                    content.Header.CreatedOn = t.CreatedOn;
                    content.Header.ThreadID = t.ThreadID;
                    content.ThreadID = t.ThreadID;
                    return t;
                })
                .Filter(t => t.ThreadID > 0)
                .LogSome(t => logger.Trace("Updating header id {0}", t.ThreadID))
                .LogNone(() => logger.Error("No post header found with id: {0}", id))
                .FlatMapAsync(async t =>
                {
                    var success = await titleRepository.Update(t.ThreadID, t);
                    if(success)
                    {
                        return t.Some();
                    }

                    return Option.None<ThreadPostTitle>();
                });

            var post = content
                .Some()
                .Combine(updateHeader, (c, h) =>
                {
                    c.Header = h;
                    return c;
                })
                .LogNone(() => logger.Error("Could not combine header and content"))
                .LogSome(c => logger.Trace("Combined header and content"));

            var updateContent = await post
                .FlatMapAsync(async c =>
                {
                    var success = await postRepository.Update(c.ThreadID, c);
                    if (success)
                        return c.Some();

                    return Option.None<ThreadPostContent>();
                })
                .LogNoneAsync(() => logger.Error("Could not update post content. Internal server error."))
                .LogSomeAsync(c => logger.Trace("Updated post content: {0}", c.ThreadID));

            logger.Debug("Class: ForumPostController, Method: Put, END");
            return updateContent
                .ReturnMessage(Request.CreateResponse, HttpStatusCode.NoContent, HttpStatusCode.InternalServerError);
        }
Beispiel #3
0
 public static ThreadPostContentDTO ToThreadPostContentDTO(ThreadPostContent threadContent, Comment latest, int commentCount)
 {
     var header = ToThreadPostTitleDTO(threadContent.Header, latest, commentCount);
     return new ThreadPostContentDTO
     {
         Text = threadContent.Text,
         ThreadID = threadContent.ThreadID,
         Header = header
     };
 }