public VoidDto DeriveRiskAssessment(RiskAssessmentDto riskAssessmentDto)
        {
            Dictionary <Guid, int> parentGuids = new Dictionary <Guid, int>();

            if (riskAssessmentDto == null ||
                riskAssessmentDto.ParentGuids == null ||
                riskAssessmentDto.Title == null)
            {
                throw new BizLogicException(StatusCodeDto.InvalidArgumentNull);
            }
            else if (riskAssessmentDto.Title.Length == 0)
            {
                throw new BizLogicException(StatusCodeDto.InvalidArgumentEmpty, "Title");
            }
            else if (riskAssessmentDto.Title.Length > 32)
            {
                throw new BizLogicException(StatusCodeDto.InvalidArgumentTooLong, "Title");
            }
            else
            {
                foreach (Guid guid in riskAssessmentDto.ParentGuids)
                {
                    if (parentGuids.ContainsKey(guid))
                    {
                        throw new BizLogicException(StatusCodeDto.InvalidArgument, "Dublicate Guid(s) detected");
                    }

                    if (_context.RiskAssessments
                        .Any(ra => ra.RiskAssessmentGuid == guid))
                    {
                        parentGuids.Add(guid, 1);
                    }
                    else
                    {
                        throw new BizLogicException(StatusCodeDto.InvalidArgument, "Provided Guid not found in database");
                    }
                }

                RiskAssessment newRiskAssessment = new RiskAssessment
                {
                    RiskAssessmentGuid = Guid.NewGuid(),
                    Title                = riskAssessmentDto.Title,
                    Description          = string.Empty,
                    IsCoreRiskAssessment = false,
                    Descendants          = new List <RiskAssessmentRelation>()
                };

                foreach (Guid guid in parentGuids.Keys)
                {
                    RiskAssessment parent = _context.RiskAssessments
                                            .Where(ra => ra.RiskAssessmentGuid == guid)
                                            .First();

                    newRiskAssessment.Ancestors.Add(new RiskAssessmentRelation()
                    {
                        DirectRelation = true,
                        Descendant     = newRiskAssessment,
                        Ancestor       = parent
                    });

                    foreach (RiskAssessmentRelation rar in parent.Ancestors)
                    {
                        newRiskAssessment.Ancestors.Add(new RiskAssessmentRelation()
                        {
                            DirectRelation = false,
                            Descendant     = newRiskAssessment,
                            Ancestor       = rar.Ancestor
                        });
                    }
                }

                _context.RiskAssessments
                .Add(newRiskAssessment);

                _context.SaveChanges();
            }

            return(new VoidDto());
        }
 public ValueTask <ReturnValueDto> DeleteRiskAssessmentAsync(RiskAssessmentDto riskAssessmentDto)
 => ServiceRunner(() => _riskAssessmentService !.DeleteRiskAssessment(riskAssessmentDto));
 public VoidDto DeleteRiskAssessment(RiskAssessmentDto riskAssessmentDto)
 {
     throw new BizLogicException(StatusCodeDto.NotImplemented);
 }