Ejercicio form

Crear un formulario que nos pida los siguientes datos:

Nombre
Edad
Email
Tipo de problema (urgente, muy urgente, para ayer)
Fecha
Es cliente o no
Es Premium o no
Observaciones

Elegid los tipos de objeto que creáis conveniente para cada dato.

JSON dnámico

 static async Task Main(string[] args)
    {
        // URL del JSON
        string url = "https://jsonplaceholder.typicode.com/posts";

        // Leer el JSON de la URL
        var json = await ObtenerJsonDesdeUrl(url);

        // Deserializar el JSON en un tipo anónimo
        var datos = JsonSerializer.Deserialize<dynamic>(json, new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        });

        // Iterar y mostrar datos
        foreach (var elemento in datos)
        {
            Console.WriteLine($"ID: {elemento.id}, Título: {elemento.title}");
        }
    }

    // Método para obtener el JSON desde una URL
    public static async Task<string> ObtenerJsonDesdeUrl(string url)
    {
        using HttpClient client = new HttpClient();
        var response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode(); // Lanza excepción si el estado no es 2xx
        return await response.Content.ReadAsStringAsync();
    }
}

Mockup

using CapaServicio.Controllers;
using CapaServicio.Models;
using CapaServicio.Repository;
using CapaServicio.Service;
using Microsoft.AspNetCore.Mvc;
using Moq;

namespace CapaTest
{

    public class UnitTest1
    {
        private Mock<IAlumnoService> _mockService;
        private AlumnoesController _controller;

        public UnitTest1()
        {
            // Crear el mock del servicio y configurar su comportamiento
            _mockService = new Mock<IAlumnoService>();
            // Esto son datos falsos de prueba que será lo que obtengamos cuando
            // El controlador llame al servicio
            _mockService.Setup(s => s.ObtenerTodos()).Returns(new List<Alumno> { new Alumno(), new Alumno() });
            _mockService.Setup(s => s.ObtenerPorId(2)).Returns(new Alumno());

            //// Crear una instancia del controlador con el mock del servicio
            _controller = new AlumnoesController(_mockService.Object);
        }

        [Fact]
        public async Task Test1Async()
        {
            // Aquí verifico el index
            var result = await _controller.Index() as ViewResult;

            // Verificar
            Assert.NotNull(result);
            // Compruebo, por ejemplo, que el modelo es una lista de alumnos
            Assert.IsType(typeof(List<Alumno>), result.Model);
            Assert.Equal(2, ((List<Alumno>)result.Model).Count);

            // Aquí verifico el Details con un id 2
            result = await _controller.Details(2) as ViewResult;
            Assert.NotNull(result);
            // Compruebo que el modelo sea alumno...
            Assert.IsType(typeof(Alumno), result.Model);


        }
    }
}

Ejercicio

Esta clase:

public static class Solver
    {
        public static (double? x1, double? x2) segundoGrado(double a, double b, double c)
        {
            if(a == 0 && b == 0)
            {
                return (null,null);
            }

            double discriminante = b * b - 4 * a * c;
            if (discriminante<0)
            {
                return (null, null);
            }
            return (0, 0);

        }
    }

Cread un proyecto que tenga esta clase y una clase de test que compruebe que funciona. Con Fact y con Theory

Ejercicio Pokemons

1.- En el mantenimiento de pokemons que pueda acceder cía el menú, que se vea el nombre de la categoría en el desplegable y que cuando acceda a una categoría vea todos sus pokemons relacionados (solo el nombre) pero que cada uno tenga un enlace pra poder ver el detalle

2.- Crear una API para categorias y pokemons

3.- Si da tiempo: Que en el pokemon salga en la  api todos los datos de su categoría y en la categoría una lista de los pokemons SIN la categoría

4.- Hacer un endpoint get categoria/{id}/pokemons que nos devuelva una lista de los pokemons de esa categoría

5.- En el endpoint categoria/{id}/pokemons si hacemos una petición post pasando los datos de un pokemon que nos añada ese pokemon nuevo con esa categoría

Swagger en API

Instalar el paquete siguiente:

Install-Package Swashbuckle.AspNetCore -Version 6.6.2

Habilitar esto en program:

builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}

APIs de ejemplo

https://jsonplaceholder.typicode.com/guide/

Vamos a consultar libros y artículos del nytimes. Aquí hay la lista de las apis:

https://developer.nytimes.com/apis

Yo me he creado una apikey: SFq0lnJwGzV4X8XyqV2kQvA3LgKAp3kN

Pero os podéis crear la vuestra.

Me gustaría que, desde el postman, accediéramos a la lista de los libros más vendidos y a los artículos de los tres últimos meses.

También podéis crear vuestra propia apikey y acceder, por ejemplo, a películas.

 

Ejercicio Pokemon

Vamos a crear una base de datos para almacenar mi colección de pokemons

Tendremos las siguientes tablas:

Categoría: id, nombre, descripcion

Pokemon: id, nombre,descripcion,tipo de energ´ía, categoría

Haremos un MVC que tenga un mantenimiento de la base de datos.

En el HomeController poned enlace al mantenimiento de categorías y al mantenimiento de pokemons.

Ejercicio controladores

using Microsoft.AspNetCore.Mvc;
using MVC01.Models;

namespace MVC01.Controllers
{
    public class CursoController : Controller
    {
        private readonly Contexto _context;

        public CursoController(Contexto context)
        {
            _context = context;
        }
        public IActionResult Index()
        {
            // Recuperar los datos de todos los cursos
            // Los vais a pasar a la vista
            // En la vista mostráis la información (id,nombre,descripcion)
            return View();
        }

        public IActionResult AddCurso()
            {
            // Llamar a una vista con un formulario
            // Para poner nombre y descripción
            return View();
        }
        public IActionResult NewCurso(Curso curso)
        {
            // Capturamos los datos del formulario
            // Y lo añadimos a la base de datos
            return View();
        }
    }
}