예제 #1
0
        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));
        }
예제 #2
0
        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);
        }