public ActionResult <TaskDto> CreateTask([FromBody] CreateTaskCommand cmd) { var category = _db.TaskCategories.Find(cmd.TaskCategoryId); if (category == null) { return(BadRequest($"Task category with Id={cmd.TaskCategoryId} not found")); } var skillIds = cmd.Skills.Select(y => y.Id).ToList(); var existingSkills = _db.Skills.Where(x => skillIds.Contains(x.Id)).ToList(); var maxPos = _db.Tasks.Where(x => x.CategoryId == category.Id).Max(x => (int?)x.Position); if (maxPos == null) { maxPos = 0; } else { ++maxPos; } using var trn = _db.Database.BeginTransaction(); StpTask newTask = new StpTask() { CategoryId = category.Id, Name = cmd.Name, Points = cmd.Points, DurationMinutes = cmd.DurationMinutes, Type = cmd.Type, Position = maxPos.Value, Complexity = cmd.Complexity }; _db.Tasks.Add(newTask); newTask.TaskAndSkills = new List <TaskAndSkill>(); foreach (var skill in cmd.Skills) { if (skill.State != SkillState.Added && skill.State != SkillState.New) { return(BadRequest($"Unexpected SkillState: {skill.State}")); } Skill skillToAdd = null; if (skill.State == SkillState.New) { skillToAdd = new Skill() { Name = skill.Name }; _db.Skills.Add(skillToAdd); _db.SaveChanges(); } else { var dbSkill = existingSkills.Find(x => x.Id == skill.Id); if (dbSkill == null) { return(BadRequest($"Skill with Id={skill.Id} not found")); } skillToAdd = dbSkill; } TaskAndSkill link = new TaskAndSkill() { SkillId = skillToAdd.Id, //TaskId = newTask.Id }; newTask.TaskAndSkills.Add(link); //_db.TaskAndSkills.Add(link); } _db.SaveChanges(); trn.Commit(); var result = new TaskDto() { TaskSummary = new TaskSummaryDto() { Id = newTask.Id, Complexity = newTask.Complexity, DurationMinutes = newTask.DurationMinutes, Name = newTask.Name, Points = newTask.Points, Position = newTask.Position, Type = newTask.Type, Skills = newTask.TaskAndSkills.Select(x => new SkillDto() { Id = x.Skill.Id, Name = x.Skill.Name }).ToList(), }, MultichoiceTaskInfo = new MultichoiceTaskInfoDto() { Question = "", Answers = new List <MultichoiceTaskAnswerDto>() } }; return(Created(nameof(CreateTask), result)); }
public ActionResult <List <SkillDto> > UpdateSkills(long taskId, [FromBody] List <SkillStateDto> skills) { //return BadRequest($"Failed to add the skill. The task already contains it."); //StpTask task = _db.Tasks.Find(taskId); StpTask task = _db.Tasks .Include(x => x.TaskAndSkills) .Where(x => x.Id == taskId) .FirstOrDefault(); if (task == null) { return(NotFound($"Task with id={taskId} doesn't exist")); } //var dbSkills = task.TaskAndSkills; ////.Include(x => x.Skill) //.Where(x => x.TaskId == taskId) //.ToList(); using var trn = _db.Database.BeginTransaction(); foreach (var skill in skills) { var st = skill.State; TaskAndSkill newLink; switch (skill.State) { case SkillState.Added: var duplicate = task.TaskAndSkills.FirstOrDefault(x => x.SkillId == skill.Id); if (duplicate != null) { return(BadRequest($"Failed to add the skill '{skill.Name}'. The task already contains it.")); } newLink = new TaskAndSkill() { TaskId = task.Id, SkillId = skill.Id.Value }; task.TaskAndSkills.Add(newLink); break; case SkillState.Removed: var skillToRemove = task.TaskAndSkills.FirstOrDefault(x => x.SkillId == skill.Id); task.TaskAndSkills.Remove(skillToRemove); break; case SkillState.New: // TODO: add unique name check var skillToAdd = new Skill() { Name = skill.Name }; _db.Skills.Add(skillToAdd); _db.SaveChanges(); newLink = new TaskAndSkill() { TaskId = task.Id, SkillId = skillToAdd.Id }; task.TaskAndSkills.Add(newLink); break; default: return(BadRequest($"Unexpected SkillState: {skill.State}")); } } _db.SaveChanges(); trn.Commit(); var res = _db.TaskAndSkills .Where(x => x.TaskId == task.Id) .Select(ts => new SkillDto() { Id = ts.Skill.Id, Name = ts.Skill.Name }).ToList(); return(res); }