Exemple #1
0
        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);
            }
        }
Exemple #2
0
        // 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));
        }
Exemple #3
0
        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"));
        }