public async Task <Result <SurveyCoreModel> > Edit(UpdateSurveyModel model) => await _surveyBiz.Edit(model);
public Task <Result <SurveyCoreModel> > Edit(UpdateSurveyModel model) => Result <SurveyCoreModel> .TryAsync(async() => { var userSurvey = await _repository.FirstOrDefaultAsNoTrackingAsync <UserSurvey>(us => us.SurveyId == model.Id); var result = await _repository.FirstOrDefaultAsync <Survey>(s => s.Id == model.Id, s => s.Question.Select( q => q.Answer.Select(a => a.Action))); if (!result.Success || result.Data == null) { return(Result <SurveyCoreModel> .Failed(Error.WithData(1000, new[] { "Survey not found " }))); } var survey = result.Data; if (survey.Enabled != model.Enabled) { survey.Enabled = model.Enabled; survey.Name = model.Name; survey.Description = model.Description; if (userSurvey.Success && userSurvey.Data != null) { await _repository.CommitAsync(); return(Result <SurveyCoreModel> .Failed(Error.WithData(1000, new[] { "After a Survey done by user ! you cant edit survey , only enable or disable would work " }))); } } _repository.RemoveRange(survey.Question.SelectMany(q => q.Answer.SelectMany(a => a.Action)).ToList()); _repository.RemoveRange(survey.Question.SelectMany(q => q.Answer.SelectMany(a => a.MustAnswered)) .ToList()); _repository.RemoveRange(survey.Question.SelectMany(q => q.MustAnswered).ToList()); _repository.RemoveRange(survey.Question.SelectMany(q => q.Answer).ToList()); _repository.RemoveRange(survey.Question); survey.Question = model.Questions.Select(q => { var questionId = Guid.NewGuid(); return(new Question { Id = questionId, Text = q.Text, Number = q.Number, Answer = q.Answers.Select(a => new Answer { Id = Guid.NewGuid(), Number = a.Number, Type = (byte)a.Type, QuestionId = questionId, Text = a.Text, Action = a.Actions.Select(action => new DataAccess.EFModels.Action { Id = Guid.NewGuid(), Type = (byte)action.Type, Value = action.Value }) .ToList(), }).ToList() }); }).ToList(); survey.Question?.ToList().ForEach(question => { var mustAnsweredNumber = model.Questions?.FirstOrDefault(q => q.Number == question.Number)? .MustAnsweredNumber.Where(a => question.Number - a > 0).ToList(); question.MustAnswered = survey.Question.SelectMany(q => q.Answer) .Where(a => mustAnsweredNumber != null && mustAnsweredNumber.Contains(a.Number)).Select(ma => new MustAnswered { Id = Guid.NewGuid(), AnswerId = ma.Id, QuestionId = question.Id }).ToList(); }); survey.Enabled = model.Enabled; survey.Name = model.Name; survey.Description = model.Description; await _repository.CommitAsync(); return(Result <SurveyCoreModel> .Successful(_autoMapper.Map <SurveyCoreModel>(survey))); });