private bool SetReceivedUser(ProjectThread projectthread, int?selectAddingUserType, string selectedUserIds) { switch (selectAddingUserType.Value) { case 1: db.Projects.Attach(this.Project); var users = db.Entry(this.Project).Collection(p => p.ParticipantUsers).Query(); users.Load(); foreach (var user in users) { projectthread.ReceivedUsers.Add(new ParticipantUserThread { ParticipantUser = user.ParticipantUser }); } return(true); case 2: if (selectedUserIds == null) { ModelState.AddModelError("ProjectUsers", "配信先のユーザーが選択されていません。"); } List <string> userIdList = selectedUserIds.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (userIdList.Count() == 0) { ModelState.AddModelError("ProjectUsers", "配信先のユーザーが選択されていません。"); } foreach (var user in userIdList) { int userId; if (!int.TryParse(user, out userId)) { return(false); } ParticipantUser receivedUser = db.Users.OfType <ParticipantUser>().FirstOrDefault(pu => pu.ID == userId); if (receivedUser == null) { return(false); } projectthread.ReceivedUsers.Add(new ParticipantUserThread { ParticipantUser = receivedUser }); } return(true); default: return(false); } }
// GET: /CompanyProjectInformation/Details/5 public ActionResult Details(int?projectThreadId, bool?isError, string body) { if (projectThreadId == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } if (isError.HasValue && isError.Value) { if (string.IsNullOrEmpty(body)) { ModelState.AddModelError("Body", "本文を入力してください。"); } } ProjectThread projectthread = db.Threads.OfType <ProjectThread>().First(pt => pt.ID == projectThreadId); if (projectthread == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } IQueryable <Message> messages = db.Messages.Where(m => m.Thread.ID == projectThreadId).OrderBy(m => m.ID); if (messages == null || messages.Count() == 0) { //TODO 配信リスト作成時に必ずメッセージは1件作成されるので0件はシステムエラー return(HttpNotFound()); } Dictionary <int, string> receivedUserNames = new Dictionary <int, string>(); IQueryable <ParticipantUserThread> receivedUsers = db.ParticipantUserThreads.Where(rupt => rupt.Thread.ID == projectThreadId); if (receivedUsers == null || receivedUsers.Count() == 0) { //TODO 配信リスト作成時にユーザーを必ず指定するので0件はシステムエラー return(HttpNotFound()); } foreach (ParticipantUserThread receivedUser in receivedUsers) { receivedUserNames.Add(receivedUser.ParticipantUser.ID, receivedUser.ParticipantUser.DisplayName); } ViewBag.ReceivedUserNames = receivedUserNames; Dictionary <int, string> sentUserNames = new Dictionary <int, string>(); foreach (Message message in messages) { sentUserNames.Add(message.ID, message.SentUser.DisplayName); } ViewBag.SentUserNames = sentUserNames; Message information = messages.First(); ViewBag.Information = information; ViewBag.ResponseMessages = messages.Where(m => m.ID != information.ID).ToList(); ViewBag.Project = this.Project; return(View(projectthread)); }
public ActionResult Create( [Bind(Include = "ID,ThreadName")] ProjectThread projectthread, [Bind(Include = "From, To")] Duration duration, [Bind(Include = "Body")] Message message, int?selectAddingUserType, string selectedUserIds, HttpPostedFileBase uploadedFile) { if (selectAddingUserType == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } bool userSelected = SetReceivedUser(projectthread, selectAddingUserType, selectedUserIds); if (!userSelected) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } if (!ModelState.IsValid) { return(View(projectthread)); } // dbフィールドは親クラスのデータベース接続と異なるインスタンスなので、 // 関係するオブジェクトはAttachしておく必要がある。 // TODO: あとでdbフィールドを整理 var currentUser = ctx.CurrentUser as AccountUser; db.Users.Attach(currentUser); db.Companies.Attach(currentUser.Company); db.Projects.Attach(this.Project); AttachFile(message, uploadedFile); message.Sent = ctx.Now; ViewBag.Project = this.Project; IQueryable <ProjectGroup> groups = db.Groups.OfType <ProjectGroup>().Where(pg => pg.Project.ID == this.Project.ID); ViewBag.ProjectGroups = groups; ViewBag.ProjectUsers = db.ParticipantUserProjects.Where(pu => pu.Project.ID == this.Project.ID); projectthread.Duration = duration; message.SentUser = db.Users.Find(ctx.CurrentUser.ID); projectthread.Message.Add(message); projectthread.Project = this.Project; db.Threads.Add(projectthread); db.SaveChanges(); // 宛先の参加者のタイムラインを更新する // TODO: 非同期処理の検討 var summary = message.BodySummary; var participantsTimeLines = projectthread.ReceivedUsers .Select(put => put.ParticipantUser) .Select(pu => new Timeline { OwnerID = pu.ID, Timestamp = ctx.Now, Type = TimelineType.ProjectThread, SourceName = "「" + projectthread.Project.Name + "」(" + projectthread.Project.Company.CompanyName + ")", Summary = summary, ActionName = "Messages", ControllerName = "ProjectThread", RouteValuesJSON = Timeline.ToJSON(new { projectId = this.Project.ID, threadId = projectthread.ID }), }); using (var publisher = new Business.TimelinePublisher()) { publisher.Publish(participantsTimeLines); } return(RedirectToAction("Index")); }