Exemplo n.º 1
0
        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);
        }