public ActionResult RemoveRole(string RemoveId, List<string> SelectedCurrentRoles)
        {
            if (ModelState.IsValid)
            {
                UserRolesHelper helper = new UserRolesHelper(db);
                var user = db.Users.Find(RemoveId);

                if (SelectedCurrentRoles != null)
                {
                    foreach (var role in SelectedCurrentRoles)
                    {
                        helper.RemoveUserFromRole(RemoveId, role);
                    }
                    db.Entry(user).State = EntityState.Modified;
                    db.Users.Attach(user);
                    db.SaveChanges();
                    return RedirectToAction("AdminDashboard");
                }
                else
                {
                    return RedirectToAction("AdminDashboard");
                }

            }
            return RedirectToAction("AdminDashboard");
        }
        public ActionResult Index()
        {
            // Find the user and a list of roles
            UserRolesHelper rolesHelper = new UserRolesHelper(db);
            var user = db.Users.Find(User.Identity.GetUserId());
            var userRoles = rolesHelper.ListUserRoles(user.Id);
            var tickets = db.Tickets.Include(t => t.AssignedToUser).Include(t => t.OwnerUser).Include(t => t.Project).Include(t => t.TicketPriority).Include(t => t.TicketStatus).Include(t => t.TicketType);

            if (userRoles.Contains("Admin"))
            {
                return View(tickets.ToList());
            }
            if (userRoles.Contains("Project Manager"))
            {
                return View(user.Projects.SelectMany(t => t.Tickets).ToList());
            }
            if (userRoles.Contains("Developer") && userRoles.Contains("Submitter"))
            {
                return View(tickets.Where(t => (t.AssignedToUserId == user.Id) || (t.OwnerUserId == user.Id)).ToList());
            }
            if (userRoles.Contains("Developer"))
            {
                return View(tickets.Where(t => t.AssignedToUserId == user.Id).ToList());
            }
            if (userRoles.Contains("Submitter"))
            {
                return View(tickets.Where(t => t.OwnerUserId == user.Id).ToList());
            }

            return RedirectToAction("Login", "Account");
        }
        public ActionResult EditUser(string id)
        {
            var user = db.Users.Find(id);
            AdminUserViewModel AdminModel = new AdminUserViewModel();
            UserRolesHelper helper = new UserRolesHelper(db);
            var currentRoles = helper.ListUserRoles(id);
            var absentRoles = helper.ListAbsentUserRoles(id);
            AdminModel.AbsentRoles = new MultiSelectList(absentRoles);
            AdminModel.Roles = new MultiSelectList(currentRoles);
            AdminModel.User = user;

            return View(AdminModel);
        }
        public ActionResult Index()
        {
            UserRolesHelper rolesHelper = new UserRolesHelper(db);
            var user = db.Users.Find(User.Identity.GetUserId());
            var userRoles = rolesHelper.ListUserRoles(user.Id);

            if (userRoles.Contains("Admin"))
            {
                return View(db.Projects.ToList());
            }
            if (userRoles.Contains("Project Manager") || (userRoles.Contains("Developer")) || (userRoles.Contains("Submitter")))
            {
                return View(user.Projects.ToList());
            }
            return RedirectToAction("Index");
        }
        public ActionResult Create(int? id)
        {
            ViewBag.TicketId = id;
            UserRolesHelper rolesHelper = new UserRolesHelper(db);
            var user = db.Users.Find(User.Identity.GetUserId());
            var userRoles = rolesHelper.ListUserRoles(user.Id);
            Ticket ticket = db.Tickets.Find(id);
            ViewBag.Author = user.DisplayName;

            if (userRoles.Contains("Admin"))
            {
                return View();
            }
            if (userRoles.Contains("Project Manager"))
            {
                if (ticket.Project.ApplicationUsers.Contains(user))
                {
                    return View();
                }
            }
            if (userRoles.Contains("Developer"))
            {
                if (ticket.AssignedToUserId == user.Id)
                {
                    return View();
                }
            }
            if (userRoles.Contains("Submitter"))
            {
                if (ticket.OwnerUserId == user.Id)
                {
                    return View();
                }
            }

            return RedirectToAction("Login", "Account");
        }
        public ActionResult Details(int? id)
        {

            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //Find the user, roles, and ticket Id
            UserRolesHelper rolesHelper = new UserRolesHelper(db);
            var user = db.Users.Find(User.Identity.GetUserId());
            var userRoles = rolesHelper.ListUserRoles(user.Id);
            Ticket ticket = db.Tickets.Find(id);


            if (ticket == null)
            {
                return HttpNotFound();
            }

            //Security for URL hacking
            //If user is submitter or developer related to ticket, return that ticket

            if (user.Id == ticket.AssignedToUserId || user.Id == ticket.OwnerUserId)
            {
                return View(ticket);
            }
            //if user is Admin, return the view
            if (userRoles.Contains("Admin"))
            {
                return View(ticket);
            }

            if (userRoles.Contains("Project Manager"))
            {
                if (ticket.Project.ApplicationUsers.Contains(user))
                {
                    return View(ticket);
                }
            }
            if (userRoles.Contains("Developer") && userRoles.Contains("Submitter"))
            {
                if (ticket.AssignedToUserId == user.Id)
                {
                    return View(ticket);
                }
                if (ticket.OwnerUserId == user.Id)
                {
                    return View(ticket);
                }
            }
            if (userRoles.Contains("Developer"))
            {
                if (ticket.AssignedToUserId == user.Id)
                {
                    return View(ticket);
                }
            }
            if (userRoles.Contains("Submitter"))
            {
                if (ticket.OwnerUserId == user.Id)
                {
                    return View(ticket);
                }
            }

            return RedirectToAction("Login", "Account");
        }
        public async Task<ActionResult> Edit([Bind(Include = "Id,Title,Description,Created,Updated,ProjectId,TicketTypeId,TicketPriorityId,TicketStatusId,AssignedToUserId,OwnerUserId")] Ticket ticket)
        {
            var user = db.Users.Find(User.Identity.GetUserId());

            UserRolesHelper rolesHelper = new UserRolesHelper(db);
            ProjectsHelper helper = new ProjectsHelper(db);
            StringBuilder sb = new StringBuilder();


            //var ticketHistory = db.TicketHistory.Where(t => t.TicketId == ticket.Id).ToList();
            var oldTicket = db.Tickets.AsNoTracking().FirstOrDefault(t => t.Id == ticket.Id);

            if (ModelState.IsValid)
            {
                ticket.Updated = DateTimeOffset.Now;
                db.Entry(ticket).State = EntityState.Modified;
                db.SaveChanges();

                //var oldTicket = db.Tickets.AsNoTracking().FirstOrDefault(t => t.Id == ticket.Id);

                var newTicket = db.Tickets.Find(ticket.Id);

                if (oldTicket != ticket)
                {
                    sb.AppendLine("Changes on " + DateTimeOffset.Now + ":");
                    sb.Append("<br />");

                    if (oldTicket.Title != ticket.Title)
                    {
                        sb.AppendLine("Title changed from " + oldTicket.Title + " to " + ticket.Title + ".");
                        sb.Append("<br />");
                    }
                    if (oldTicket.Description != ticket.Description)
                    {
                        sb.AppendLine("Description changed from " + oldTicket.Description + " to " + ticket.Description + ".");
                        sb.Append("<br />");
                    }
                    if (oldTicket.TicketStatusId != newTicket.TicketStatusId)
                    {
                        var newTicketStatus = db.TicketStatus.Where(s => s.Id == newTicket.TicketStatusId).Select(q => q.Name).FirstOrDefault();
                        sb.AppendLine("Status changed from " + oldTicket.TicketStatus.Name + " to " + newTicketStatus + ".");
                        sb.Append("<br />");
                    }
                    if (oldTicket.TicketPriorityId != ticket.TicketPriorityId)
                    {
                        var newTicketPriority = db.TicketPriority.Where(s => s.Id == newTicket.TicketPriorityId).Select(q => q.Name).FirstOrDefault();
                        sb.AppendLine("Priority changed from " + oldTicket.TicketPriority.Name + " to " + newTicketPriority + ".");
                        sb.Append("<br />");
                    }
                    if (oldTicket.TicketTypeId != ticket.TicketTypeId)
                    {
                        var newTicketType = db.TicketType.Where(s => s.Id == newTicket.TicketTypeId).Select(q => q.Name).FirstOrDefault();
                        sb.AppendLine("Type changed from " + oldTicket.TicketType.Name + " to " + newTicketType + ".");
                        sb.Append("<br />");
                    }
                    if (oldTicket.AssignedToUserId != ticket.AssignedToUserId)
                    {
                        var newTicketUserF = db.Users.Where(s => s.Id == newTicket.AssignedToUserId).Select(q => q.FirstName).FirstOrDefault();
                        var newTicketUserL = db.Users.Where(s => s.Id == newTicket.AssignedToUserId).Select(q => q.LastName).FirstOrDefault();
                        var oldTicketUserF = db.Users.Where(s => s.Id == oldTicket.AssignedToUserId).Select(q => q.FirstName).FirstOrDefault();
                        var oldTicketUserL = db.Users.Where(s => s.Id == oldTicket.AssignedToUserId).Select(q => q.LastName).FirstOrDefault();
                        sb.AppendLine("Assigned User changed from " + oldTicketUserF + " " + oldTicketUserL + " to " + newTicketUserF + " " + newTicketUserL + ".");
                        sb.Append("<br />");
                    }

                    var tHistory = new TicketHistory();
                    tHistory.TicketId = ticket.Id;
                    tHistory.Body = sb.ToString();

                    db.TicketHistory.Add(tHistory);
                    db.SaveChanges();

                }
                else
                {
                    db.SaveChanges();
                }
                              

                await UserManager.SendEmailAsync(ticket.AssignedToUserId, "Ticket Assigned/Modified", "You have been assigned a new ticket, or a ticket you are currently assigned to has been modified.");
                return RedirectToAction("Index");
            }

            ViewBag.AssignedToUserId = new SelectList(rolesHelper.UsersInRole("Developer"), "Id", "DisplayName", ticket.AssignedToUserId);
            //ViewBag.OwnerUserId = new SelectList(db.Users, "Id", "DisplayName", ticket.OwnerUserId);
            ViewBag.ProjectId = new SelectList(helper.AssignedProjects(user.Id), "Id", "Title", ticket.ProjectId);
            ViewBag.TicketPriorityId = new SelectList(db.TicketPriority, "Id", "Name", ticket.TicketPriorityId);
            ViewBag.TicketStatusId = new SelectList(db.TicketStatus, "Id", "Name", ticket.TicketStatusId);
            ViewBag.TicketTypeId = new SelectList(db.TicketType, "Id", "Name", ticket.TicketTypeId);
            return View(ticket);
                }
        public ActionResult Edit(int? id)
        {
            var user = db.Users.Find(User.Identity.GetUserId());
            ProjectsHelper projectHelper = new ProjectsHelper(db);
            UserRolesHelper rolesHelper = new UserRolesHelper(db);
            var userRoles = rolesHelper.ListUserRoles(user.Id);
            Ticket ticket = db.Tickets.Find(id);


            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (ticket == null)
            {
                return HttpNotFound();
            }





            //This line specifies the users that are in the role of Developer- only developers can be assigned to a ticket
            ViewBag.AssignedToUserId = new SelectList(rolesHelper.UsersInRole("Developer"), "Id", "DisplayName", ticket.AssignedToUserId);
            ViewBag.OwnerUserId = new SelectList(db.Users, "Id", "DisplayName", ticket.OwnerUserId);
            //if User is assigned to project, then he can make a ticket for that project;
            ViewBag.ProjectId = new SelectList(projectHelper.AssignedProjects(user.Id), "Id", "Title", ticket.ProjectId);
            ViewBag.TicketPriorityId = new SelectList(db.TicketPriority, "Id", "Name", ticket.TicketPriorityId);
            ViewBag.TicketStatusId = new SelectList(db.TicketStatus, "Id", "Name", ticket.TicketStatusId);
            ViewBag.TicketTypeId = new SelectList(db.TicketType, "Id", "Name", ticket.TicketTypeId);


            if (userRoles.Contains("Project Manager"))
            {
                if (ticket.Project.ApplicationUsers.Contains(user))
                {
                    return View(ticket);
                }
            }

            if (userRoles.Contains("Developer"))
            {
                if (ticket.AssignedToUserId == user.Id)
                {
                    return View(ticket);
                }
            }

            return RedirectToAction("Login", "Account");
        }