Пример #1
0
        public async Task <IActionResult> AddField(CreateTableFieldViewModel field)
        {
            var entitiesList = _entityService.Tables;
            var table        = entitiesList.FirstOrDefault(x => x.Id == field.TableId);
            var tableName    = table?.Name;
            var schema       = table?.EntityType;

            field.EntitiesList = entitiesList.Select(x => x.Name).ToList();
            if (table == null)
            {
                ModelState.AddModelError(string.Empty, "Table not found");
                return(View(field));
            }

            var baseEntityProps = BaseModel.GetPropsName().Select(x => x.ToLower()).ToList();

            if (baseEntityProps.Contains(field.Name.Trim().ToLower()))
            {
                ModelState.AddModelError(string.Empty, "This field name can't be used, is system name!");
                return(View(field));
            }

            var configurationsRq = await _entityService.RetrieveConfigurationsOnAddNewTableFieldAsyncTask(field);

            if (configurationsRq.IsSuccess)
            {
                field.Configurations = configurationsRq.Result.ToList();
            }

            field = field.CreateSqlField();
            var insertField = _tablesService.AddFieldSql(field, tableName, ConnectionString, true, schema);

            // Save field model in the dataBase
            if (!insertField.Result)
            {
                ModelState.AddModelError(string.Empty, "Fail to apply changes to database!");
                return(View(field));
            }

            if (!table.IsCommon)
            {
                var isDynamic         = true;
                var isReference       = false;
                var referenceIsCommon = true;
                var tenants           = _organizationService.GetAllTenants().Where(x => x.MachineName != GearSettings.DEFAULT_ENTITY_SCHEMA).ToList();
                if (field.Parameter == FieldType.EntityReference)
                {
                    isReference = true;
                    var referenceTableName = field.Configurations
                                             .FirstOrDefault(x => x.Name == nameof(TableFieldConfigCode.Reference.ForeingTable))?.Value;

                    if (!referenceTableName.IsNullOrEmpty())
                    {
                        var refTable = await Context.Table.FirstOrDefaultAsync(x =>
                                                                               x.Name.Equals(referenceTableName) && x.EntityType.Equals(GearSettings.DEFAULT_ENTITY_SCHEMA) ||
                                                                               x.Name.Equals(referenceTableName) && x.IsPartOfDbContext);

                        if (refTable.IsPartOfDbContext)
                        {
                            isDynamic = false;
                        }
                        else if (!refTable.IsCommon)
                        {
                            referenceIsCommon = false;
                        }
                    }
                }

                foreach (var tenant in tenants)
                {
                    if (isDynamic && isReference && !referenceIsCommon)
                    {
                        var schemaConf = field.Configurations?.FirstOrDefault(x =>
                                                                              x.ConfigCode.Equals(TableFieldConfigCode.Reference.ForeingSchemaTable));
                        if (schemaConf != null)
                        {
                            var index = field.Configurations.IndexOf(schemaConf);
                            schemaConf.Value     = tenant.MachineName;
                            field.Configurations = field.Configurations.Replace(index, schemaConf).ToList();
                        }
                    }
                    _tablesService.AddFieldSql(field, tableName, ConnectionString, true, tenant.MachineName);
                }
            }

            var configs = field.Configurations.Select(item => new TableFieldConfigValue
            {
                TableFieldConfigId = item.ConfigId,
                Value = item.Value,
            }).ToList();

            var model = new TableModelField
            {
                DataType               = field.DataType,
                TableId                = field.TableId,
                Description            = field.Description,
                Name                   = field.Name,
                DisplayName            = field.DisplayName,
                AllowNull              = field.AllowNull,
                Synchronized           = true,
                TableFieldTypeId       = field.TableFieldTypeId,
                TableFieldConfigValues = configs
            };

            Context.TableFields.Add(model);
            var result = await Context.SaveAsync();

            if (result.IsSuccess)
            {
                RefreshRuntimeTypes();
                return(RedirectToAction("Edit", "Table", new { id = field.TableId, tab = "two" }));
            }

            ModelState.AppendResultModelErrors(result.Errors);

            return(View(field));
        }