/// <inheritdoc /> /// <summary> /// Add or update dashboard configuration /// </summary> /// <returns></returns> public virtual async Task <ResultModel <IEnumerable <DashboardRowViewModel> > > AddOrUpdateDashboardConfigurationAsync(DashBoardConfigurationViewModel configuration) { var result = new ResultModel <IEnumerable <DashboardRowViewModel> >(); if (configuration == null || configuration.DashboardId.HasValue.Negate()) { result.Errors.Add(new ErrorModel(string.Empty, nameof(ArgumentNullException))); return(result); } var dashboard = await _context.Dashboards .Include(x => x.Rows) .FirstOrDefaultAsync(x => x.Id.Equals(configuration.DashboardId)); if (dashboard == null) { result.Errors.Add(new ErrorModel(string.Empty, nameof(NotFoundObjectResult))); return(result); } if (configuration.Rows.Any().Negate()) { result.IsSuccess = true; return(result); } var rowsConf = new List <DashboardRowViewModel>(); foreach (var row in configuration.Rows) { var existentRow = dashboard.Rows.FirstOrDefault(x => x.Id.Equals(row.RowId)); if (row.RowId.HasValue && existentRow != null) { existentRow.Order = row.Order; _context.Update(existentRow); await AddOrUpdateWidgetsToRowAsync(row); } else { var newRow = new Row { Order = row.Order, DashboardId = dashboard.Id }; rowsConf.Add(new DashboardRowViewModel { RowId = newRow.Id, Order = newRow.Order }); await _context.Rows.AddAsync(newRow); await _context.PushAsync(); row.RowId = newRow.Id; await AddOrUpdateWidgetsToRowAsync(row, true); } } var dbResult = await _context.PushAsync(); if (dbResult.IsSuccess.Negate()) { result.Errors = dbResult.Errors; return(result); } result.Result = rowsConf; result.IsSuccess = true; return(result); }