public async Task <IActionResult> Create(TodoSaveModel todoSaveModel)
        {
            if (ModelState.IsValid)
            {
                //Init todo
                var todo = new Todo()
                {
                    Title          = todoSaveModel.Title,
                    Content        = todoSaveModel.Content,
                    StartDate      = todoSaveModel.StartDate,
                    DueDate        = todoSaveModel.DueDate,
                    Scope          = todoSaveModel.Scope,
                    Status         = TodoStatus.New,
                    Created        = DateTime.Now,
                    CreatedBy      = _currentUserService.UserId,
                    LastModified   = DateTime.Now,
                    LastModifiedBy = _currentUserService.UserId,
                };
                //Add file
                if (todoSaveModel.File != null)
                {
                    todo.FileName = await _fileStorageService.SaveFileAsync(todoSaveModel.File);
                }
                //Add Assignment
                var listAssignment = new List <Assignment>();
                if (todoSaveModel.SelectedListUserId != null)
                {
                    listAssignment = todoSaveModel.SelectedListUserId.Select(ele => new Assignment {
                        UserId         = ele.ToString(),
                        AssignmentDate = DateTime.UtcNow
                    }).ToList();
                }

                listAssignment.Add(new Assignment {
                    UserId         = _currentUserService.UserId,
                    AssignmentDate = DateTime.UtcNow,
                }); // add self to todo
                todo.Assignments = listAssignment;

                _context.Add(todo);
                var successCreateTodo = await _context.SaveChangesAsync() > 0;

                if (successCreateTodo)
                {
                    //Get user entity
                    //var currentUser = await _context.Users.FindAsync(_currentUserService.UserId);
                    var todoHistory = new TodoHistory {
                        TodoId     = todo.Id,
                        LogContent = $"Khởi tạo công việc",
                    };
                    _context.Add(todoHistory);
                    await _context.SaveChangesAsync();
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(todoSaveModel));
        }
        public async Task <IActionResult> Edit(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var todo = await _context.Todos.Include(t => t.Assignments).FirstOrDefaultAsync(t => t.Id == id);

            if (todo == null)
            {
                return(NotFound());
            }

            var todoSaveModel = new TodoSaveModel {
                Title     = todo.Title,
                Content   = todo.Content,
                StartDate = todo.StartDate,
                DueDate   = todo.DueDate,
                Scope     = todo.Scope,
                Status    = todo.Status,
            };

            //Get selectlist
            todoSaveModel.SelectedListUserId = todo.Assignments.Select(a => a.UserId).ToList();
            //load all
            var listUser = await _context.Users.Distinct().ToListAsync();

            var selectListUser = listUser.Select(u => new SelectListItem()
            {
                Text  = u.UserName,
                Value = u.Id,
            });

            ViewBag.ListUsers = selectListUser;
            return(View(todoSaveModel));
        }
        public async Task <IActionResult> Edit(int id, [FromForm] TodoSaveModel todoSaveModel)
        {
            if (id != todoSaveModel.Id)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    var todo = await _context.Todos.FindAsync(id);

                    var oldTodo = await _context.Todos.AsNoTracking().Where(t => t.Id == id).FirstOrDefaultAsync();

                    todo.Title     = todoSaveModel.Title;
                    todo.Content   = todoSaveModel.Content;
                    todo.StartDate = todoSaveModel.StartDate;
                    todo.DueDate   = todoSaveModel.DueDate;
                    todo.Scope     = todoSaveModel.Scope;
                    todo.Status    = todoSaveModel.Status;
                    if (todoSaveModel.File != null)
                    {
                        todo.FileName = await _fileStorageService.SaveFileAsync(todoSaveModel.File);
                    }
                    var newListAssignments = todoSaveModel.SelectedListUserId.Select(ele => new Assignment {
                        TodoId         = id,
                        UserId         = ele,
                        AssignmentDate = DateTime.UtcNow,
                    }).ToList();

                    var oldListAssignments = await _context.Assignments.Where(t => t.TodoId == id).ToListAsync();

                    var listToRemove = oldListAssignments.Where(o => !newListAssignments.Any(n => n.UserId == o.UserId)).ToList();
                    var listToAdd    = newListAssignments.Where(o => !oldListAssignments.Any(n => n.UserId == o.UserId)).ToList();

                    _context.RemoveRange(listToRemove);
                    _context.AddRange(listToAdd);

                    _context.Update(todo);
                    var successUpdateTodo = await _context.SaveChangesAsync() > 0;

                    if (successUpdateTodo)
                    {
                        //Get user entity
                        //var currentUser = await _context.Users.FindAsync(_currentUserService.UserId);
                        var LogContent = "";

                        if (todo.Title != oldTodo.Title)
                        {
                            LogContent += $"+ Sửa tiêu để từ {oldTodo.Title} thành {todo.Title} \n";
                        }
                        if (todo.Content != oldTodo.Content)
                        {
                            LogContent += $"+ Sửa nội dung từ {oldTodo.Content} thành {todo.Content} \n";
                        }

                        if (todo.Status != oldTodo.Status)
                        {
                            LogContent += $"+ Sửa trạng thái từ {oldTodo.Status} thành {todo.Status} \n";
                        }

                        if (todo.FileName != oldTodo.FileName)
                        {
                            LogContent += $"+ Sửa file từ {oldTodo.FileName} thành {todo.FileName} \n";
                        }

                        if (todo.StartDate != oldTodo.StartDate)
                        {
                            LogContent += $"+ Sửa thời gian bắt đầu từ {oldTodo.StartDate} thành {todo.StartDate} \n";
                        }

                        if (todo.DueDate != oldTodo.DueDate)
                        {
                            LogContent += $"+ Sửa thời gian kết thúc từ {oldTodo.DueDate} thành {todo.DueDate} \n";
                        }

                        var newAssignmentUserString = await newListAssignments.ToUserStringAsync(_context);

                        var oldAssignmentUserString = await oldListAssignments.ToUserStringAsync(_context);

                        if (newAssignmentUserString != oldAssignmentUserString)
                        {
                            LogContent += $"+ Sửa thành viên từ {oldAssignmentUserString} thành {newAssignmentUserString} \n";
                        }

                        if (LogContent != "")
                        {
                            var todoHistory = new TodoHistory {
                                TodoId     = todo.Id,
                                LogContent = LogContent,
                            };
                            _context.Add(todoHistory);
                            await _context.SaveChangesAsync();
                        }
                    }
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!TodoExists(todoSaveModel.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(todoSaveModel));
        }