public IActionResult LibrosPorCriterio(CriterioViewModel criterio, SegundoViewModel modelo) { // en este momento, el binder no solamente enlazo las propiedades sino que validó el modelo con los datos // disponibles ==> data annotations!!! // if (ModelState.IsValid) { // quiero que el modelo TAMBIEN sea invalido si AMBAS propiedades estan vacias... // if (string.IsNullOrWhiteSpace(criterio.Editorial) && string.IsNullOrWhiteSpace(criterio.Titulo)) { ModelState.AddModelError <CriterioViewModel>(model => model, "[ERROR MODELO] No podemos buscar sin ningun criterio..."); return(View()); } var resultado = _stock.GetLibrosFromCriterio($"{criterio.Titulo} {criterio.Editorial}"); return(View("ListaLibros", resultado)); } else { ModelState.Clear(); if (TryValidateModel(criterio)) { if (TryValidateModel(modelo)) { var resultado = _stock.GetLibrosFromCriterio($"{criterio.Titulo} {criterio.Editorial}"); return(View("ListaLibros", resultado)); } // quiere decir que el error esta en el segundo... // iteramos en la coleccion de errores... foreach (var campo in ModelState.Keys) { // ojo cada campo puede tener mas de un error diferente... var errores = ModelState[campo].Errors; foreach (var error in errores) { ModelState.AddModelError <SegundoViewModel>(model => model, $"Campo {campo} ==> {error.ErrorMessage} - Valor actual: {ModelState[campo].AttemptedValue}"); } } return(View()); } return(View()); } }
public ActionResult <IEnumerable <LibroDTO> > Get(string criterio, [FromServices] IMapper mapper) { // sin atributos en el metodo... // // http://localhost:5000/api/libros?editorial=apress // // [Route("{criterio:alpha}")] // // http://localhost:5000/api/libros/apress // LibroDTO dto = mapper.Map<LibroDTO>(new Libro()); // var resultado = mapper.Map <IEnumerable <LibroDTO> >(_stock.GetLibrosFromCriterio(criterio)); // el ToList() es una restriccion del tipo generico ActionResult<T> // return(resultado.ToList()); }
public void Run() { Console.Clear(); Header("biblioZ-cli", "Interface de linea de comando para BiblioZone"); try { int opcion = Prompt.Menu("Seleccionar una de las acciones que queres realizar", new[] { "Importar Libros desde --file y ejecutar las pruebas en memoria", "Importar Libros desde --file y guardar en la DB", "Importar Autores desde --file y mostrar en pantalla", "Importar Autores desde --file y guardar en la DB", "Consultas varias desde el contexto", "Pruebas ingresando Libros" }); // TODO_HECHO obtener archivo desde la configuracion // // --file=D:\CURSOS\libros.csv --tipo=libros // // --file=D:\CURSOS\autores.csv --tipo=autores // // NOTA: cuando ponemos el menu, no tiene sentido usar la opcion --tipo // // string file = @"D:\CURSOS\PTR2020_Avanzado\listados\libros.csv"; string file = _config["file"]; if (opcion.In(0, 2, 1, 3) && file == null) { throw new ApplicationException("La opcion seleccionada necesita que se pase un archivo en --file"); } switch (opcion) { case 0: { if (Prompt.Confirm($"Es el archivo correcto? ==> {file}")) { _logger.LogInformation("Iniciando el procesamiento del archivo de Libros {archivo}", file); IEnumerable <Libro> lista = _imp.ImportarCSV(file); _logger.LogInformation("Ejecutando pruebas en memoria..."); // ejecutamos las pruebas sobre la lista importada (memoria) // Pruebas(lista); } } break; case 1: { if (Prompt.Confirm($"Es el archivo correcto? ==> {file}")) { _logger.LogInformation("Iniciando el procesamiento del archivo de Libros {archivo}", file); IEnumerable <Libro> lista = _imp.ImportarCSV(file); _logger.LogInformation("Iniciando el proceso de exportacion"); // eliminamos los datos previos?? if (Prompt.Confirm("Eliminamos datos previos?", true, "WARNING Esta operacion eliminara todos los datos de las 3 tablas de Articulos!!")) { _exp.ClearDatabase(); } // pasamos la responsabilidad de la exportacion al componente adecuado... // _exp.ExportarListaDeLibros(lista); } } break; case 2: { if (Prompt.Confirm($"Es el archivo correcto? ==> {file}")) { _logger.LogInformation("Iniciando el procesamiento del archivo de Autores {archivo}", file); var autoresTemp = _imp.ImportarAutores(file); Console.WriteLine("Lista de autores importados..."); foreach (var item in autoresTemp) { Console.WriteLine($"Se importo el siguiente par (idLibro, autor) ==> {item}"); _logger.LogDebug("Se importo el siguiente par (idLibro, autor) ==> {tupla}", item); } } } break; case 3: { if (Prompt.Confirm($"Es el archivo correcto? ==> {file}")) { _logger.LogInformation("Iniciando el procesamiento del archivo de Autores {archivo}", file); var autoresTemp = _imp.ImportarAutores(file); Console.WriteLine("Lista de autores importados..."); foreach (var item in autoresTemp) { Console.WriteLine($"Se importo el siguiente par (idLibro, autor) ==> {item}"); _logger.LogDebug("Se importo el siguiente par (idLibro, autor) ==> {tupla}", item); } _exp.ExportarListaDeAutores(autoresTemp); } } break; case 13: { string editorial = Prompt.Input <string>("Ingresar el nombre de una editorial"); Console.WriteLine($"Titulos para la Editorial {editorial}:\n"); // foreach (string titulo in _exp.ObtenerTitulosDeEditorial(editorial)) { Console.WriteLine(titulo); } } break; case 4: { Console.WriteLine($"Pruebas de consultas e ingresos varios para libros y autores:\n"); string criterio = Prompt.Input <string>("Ingresar criterio (titulo, editorial o autor)... "); var libros = _stock.GetLibrosFromCriterio(criterio); foreach (Libro libro in libros) { Console.WriteLine($"Titulo: {libro.Titulo} - Clave: {libro.ID_Real} - ISBN: {libro.ISBN13}"); Console.WriteLine("Autor(es) del libro..."); foreach (Autor autor in libro.Autores) { Console.WriteLine($"Nombre: {autor.Nombre} - Libros Escritos: {autor.Libros.Count}"); } } string editorial = Prompt.Input <string>("Ingresar un nombre de editorial (exacto) "); var titulos = _stock.ObtenerTitulosDeEditorial(editorial); Console.WriteLine($"Titulos editados por {editorial}"); foreach ((Guid id, string titulo)item in titulos) { Console.WriteLine($"Titulo: {item.titulo} - ID: {item.id}"); } //if (libroResultado == null) //{ // // crear nuevo libro... // libroResultado = new Libro() // { // ID = "1234", // Titulo = titulo, // Publicacion = null // }; //} //else //{ // Console.WriteLine($"Autores del libro: {libroResultado.Titulo}"); // foreach (var au in libroResultado.LibroAutores) // Console.WriteLine($"ID={au.ID_Autor} ; Nombre={au.Autor.Nombre}"); //} //string autor = Prompt.Input<string>("Ingresar nombre del autor (exacto)"); //var autorResultado = _exp.GetAutor(autor); //if (autorResultado == null) //{ // autorResultado = new Autor() // { // Nombre = autor // }; //} //else //{ // Console.WriteLine($"Libros escritos por {autor}"); // foreach (var li in autorResultado.AutorLibros) // Console.WriteLine($"{li.Libro.Titulo}"); //} //// PARA MEDITAR -- De que manera podemos evitar el UPDATE del Libro que no esta modificado?? //// //libroResultado.LibroAutores.Add(new LibroAutor() { Libro = libroResultado, Autor = autorResultado }); //_exp.AgregarLibro(libroResultado); //// _exp.AgregarLibroAutor(new LibroAutor() { Libro = libroResultado, Autor = autorResultado }); //Console.WriteLine($"GUID: {libroResultado.ID_Real} Fecha: {libroResultado.Publicacion}"); } break; } } catch (ApplicationException ex) when(ex.Data.Contains("archivo")) { Console.WriteLine($"Se produjo una excepcion {ex.Message} Archivo: {ex.Data["archivo"]}"); } catch (NullReferenceException ex) { Console.WriteLine(ex.Message); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { Console.WriteLine(); Console.WriteLine("[finally] ==> programa terminado!!"); } }