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); }
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 }; }