public async Task <ActionResult <ApiResponse> > UpdateEntity(int id, NewAppEntityModel model) { try { var entity = await _repo.GetEntityByIdAsync(id, true); if (entity == null) { return(NotFound(new ApiResponse(StatusCodes.Status404NotFound, "Erro! Essa entidade não existe."))); } entity.Type = await _repo.GetEntityTypeByIdAsync(model.TypeId); if (entity.Type == null) { return(NotFound(new ApiResponse(StatusCodes.Status404NotFound, "Erro! Essa tipo de entidade não existe."))); } if (model.Fields == null || model.Fields.Count == 0) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! Entidade precisa de pelo menos um campo."))); } if (model.Fields.Where(t => t.Name == "Nome").Count() == 0) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! É obrigatório ter um campo com o nome de campo: 'Nome'."))); } foreach (var item in entity.Fields) { if (item.GetType().Name == "AppEntityDataFieldCombobox") { _repo.RemoveDataFieldComboboxOptionsRange(await _repo.GetDataFieldComboboxOptionsAsync(item.Id)); } } bool modelErrors = false; entity.Fields = new List <AppEntityDataField>(); foreach (var field in model.Fields) { if (field.FieldType < 0 || field.FieldType > DataFieldTypeEnum.Boolean || string.IsNullOrWhiteSpace(field.Name) || string.IsNullOrWhiteSpace(field.Section)) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! Verifique o modelo e tente novamente."))); } if (field.FieldType == DataFieldTypeEnum.Text) { if (string.IsNullOrWhiteSpace(field.TextValue)) { modelErrors = true; break; } entity.Fields.Add(new AppEntityDataFieldText() { Entity = entity, Name = field.Name, Section = field.Section, Value = field.TextValue }); } else if (field.FieldType == DataFieldTypeEnum.Number) { if (field.NumberValue == decimal.MinValue) { modelErrors = true; break; } entity.Fields.Add(new AppEntityDataFieldNumber() { Entity = entity, Name = field.Name, Section = field.Section, Value = field.NumberValue }); } else if (field.FieldType == DataFieldTypeEnum.Date) { if (field.DateValue == null) { modelErrors = true; break; } entity.Fields.Add(new AppEntityDataFieldDate() { Entity = entity, Name = field.Name, Section = field.Section, Value = new DateTime(int.Parse(field.DateValue.Split("-")[0]), int.Parse(field.DateValue.Split("-")[1]), int.Parse(field.DateValue.Split("-")[2])) }); } else if (field.FieldType == DataFieldTypeEnum.Combobox) { var newField = new AppEntityDataFieldCombobox() { Entity = entity, Name = field.Name, Section = field.Section, Options = new List <AppEntityDataFieldComboboxOption>(), SelectedOption = field.ComboboxSelected }; if (field.ComboboxOptions == null || field.ComboboxOptions.Length == 0 || field.ComboboxSelected < 0) { modelErrors = true; break; } for (int i = 0; i < field.ComboboxOptions.Length; i++) { var newOption = new AppEntityDataFieldComboboxOption() { Name = field.ComboboxOptions[i], Combobox = newField }; newField.Options.Add(newOption); } entity.Fields.Add(newField); } else if (field.FieldType == DataFieldTypeEnum.Boolean) { entity.Fields.Add(new AppEntityDataFieldBoolean() { Entity = entity, Name = field.Name, Section = field.Section, Value = field.BooleanValue }); } } if (entity.Fields.Count >= 20) { return(Conflict(new ApiResponse(StatusCodes.Status409Conflict, "Erro! Limite artificial atingido."))); } _repo.RemoveRelationsRange(await _repo.GetEntityRelationsAsync(entity.Id)); entity.Relations = new List <AppEntityRelation>(); foreach (var relation in model.Relations) { var relatedEntity = await _repo.GetEntityByIdAsync(relation.RelatedEntity.Id, false); if (relatedEntity == null) { modelErrors = true; break; } AppEntityRelation newRelation = new AppEntityRelation() { Description = relation.Description, Entity = entity, relatedEntityId = relatedEntity.Id }; entity.Relations.Add(newRelation); } if (modelErrors) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! Verifique o modelo e tente novamente."))); } _repo.UpdateEntity(entity); bool saved = await _repo.SaveChangesAsync(); if (!saved) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro ao tentar atualizar entidade. Verifique o modelo e tente novamente."))); } return(Ok(new ApiResponse(StatusCodes.Status200OK, "Sucesso! Entidade foi atualizada."))); } catch (Exception) { return(this.StatusCode(StatusCodes.Status500InternalServerError, "Erro interno do servidor.")); } }
public async Task <ActionResult <ApiResponse> > AddEntity(NewAppEntityModel model) { try { if (model.TypeId <= 0 || model.Fields == null || model.Fields.Count == 0) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! Verifique o modelo e tente novamente."))); } if (model.Fields.Where(t => t.Name == "Nome").Count() == 0) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! É obrigatório ter um campo com o nome de campo: 'Nome'."))); } if (_repo.GetEntityExistsByName(model.Fields.First(t => t.Name == "Nome").TextValue)) { return(Conflict(new ApiResponse(StatusCodes.Status409Conflict, "Erro! Uma entidade com esse nome já existe."))); } if ((await _repo.GetAllEntitiesAsync()).Count() >= 50) { return(Conflict(new ApiResponse(StatusCodes.Status409Conflict, "Erro! Limite artificial atingido."))); } AppEntity newEntity = new AppEntity(); newEntity.Type = await _repo.GetEntityTypeByIdAsync(model.TypeId); if (newEntity.Type == null) { return(NotFound(new ApiResponse(StatusCodes.Status404NotFound, "Erro! Esse tipo de entidade não existe."))); } newEntity.Fields = new List <AppEntityDataField>(); bool modelErrors = false; foreach (var field in model.Fields) { if (field.FieldType < 0 || field.FieldType > DataFieldTypeEnum.Boolean || string.IsNullOrWhiteSpace(field.Name) || string.IsNullOrWhiteSpace(field.Section)) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! Verifique o modelo e tente novamente."))); } if (field.FieldType == DataFieldTypeEnum.Text) { if (string.IsNullOrWhiteSpace(field.TextValue)) { modelErrors = true; break; } newEntity.Fields.Add(new AppEntityDataFieldText() { Entity = newEntity, Name = field.Name, Section = field.Section, Value = field.TextValue }); } else if (field.FieldType == DataFieldTypeEnum.Number) { if (field.NumberValue == decimal.MinValue) { modelErrors = true; break; } newEntity.Fields.Add(new AppEntityDataFieldNumber() { Entity = newEntity, Name = field.Name, Section = field.Section, Value = field.NumberValue }); } else if (field.FieldType == DataFieldTypeEnum.Date) { if (field.DateValue == null) { modelErrors = true; break; } newEntity.Fields.Add(new AppEntityDataFieldDate() { Entity = newEntity, Name = field.Name, Section = field.Section, Value = new DateTime(int.Parse(field.DateValue.Split("-")[0]), int.Parse(field.DateValue.Split("-")[1]), int.Parse(field.DateValue.Split("-")[2])) }); } else if (field.FieldType == DataFieldTypeEnum.Combobox) { var newField = new AppEntityDataFieldCombobox() { Entity = newEntity, Name = field.Name, Section = field.Section, Options = new List <AppEntityDataFieldComboboxOption>(), SelectedOption = field.ComboboxSelected }; if (field.ComboboxOptions == null || field.ComboboxOptions.Length == 0 || field.ComboboxSelected < 0) { modelErrors = true; break; } for (int i = 0; i < field.ComboboxOptions.Length; i++) { var newOption = new AppEntityDataFieldComboboxOption() { Name = field.ComboboxOptions[i], Combobox = newField }; newField.Options.Add(newOption); } newEntity.Fields.Add(newField); } else if (field.FieldType == DataFieldTypeEnum.Boolean) { newEntity.Fields.Add(new AppEntityDataFieldBoolean() { Entity = newEntity, Name = field.Name, Section = field.Section, Value = field.BooleanValue }); } } if (modelErrors) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro! Verifique o modelo e tente novamente."))); } _repo.AddEntity(newEntity); bool saved = await _repo.SaveChangesAsync(); if (!saved) { return(BadRequest(new ApiResponse(StatusCodes.Status400BadRequest, "Erro ao tentar criar uma nova entidade. Verifique o modelo e tente novamente."))); } return(Created("", new ApiResponse(StatusCodes.Status201Created, "Sucesso! Nova entidade criada com sucesso."))); } catch (Exception) { return(this.StatusCode(StatusCodes.Status500InternalServerError, "Erro interno do servidor.")); } }