# 8.1.4 Creando la Mutation

Para realizar las operaciones POST, PUT y DELETE se realizan mediante **Mutations.** Agregamos una carpeta **Mutation** a nuestro proyecto y una clase **CaducidadMutation**

### **Método para agregar**

En graphQL los servicios para agregar se realizan de la siguiente manera:

```graphql
mutation {
  addCaducidad(input: {
    id: 1,
    clienteId: 1,
    productoId: 1,
    cantidad: 10,
    fecha: "2021-07-01"
  })
}
```

Para el método agregar vamos a realizar lo siguiente a nuestra clase **CaducidadMutation.**

* Agrega un método **AddCaducidad** que recibirá igual como \[**Service**] nuestro contexto (caducaContext) el LocService y un parámetro llamado caducidad del Modelo Caducidad y regresará un Objeto de la clase Caducidad.
* Inicializamos nuestro objeto CaducidadDAO y llamamos al método AgregarAsync.
* Si todo es correcto regresamos el objeto caducidad.

{% code title="CaducidadMutation.cs" %}

```csharp
using System.Threading.Tasks;
using CaducaRest.DAO;
using CaducaRest.Models;
using CaducaRest.Resources;
using HotChocolate;

namespace CaducaRest.GraphQL.HotChocolate;

/// <summary>
/// Funciones para agregar, borrar o modificar
/// </summary>
public class CaducidadMutation
{
    public async Task<Caducidad> AddCaducidad(
                    [Service] CaducaContext caducaContext,
                    [Service] LocService locService, 
                    Caducidad caducidad)
    {
        CaducidadDAO caducidadDAO = new CaducidadDAO(caducaContext, locService);
        var correcto = await caducidadDAO.AgregarAsync(caducidad);
        if (correcto)
            return caducidad;
        else
            return new Caducidad();
    }
}
```

{% endcode %}

### Método para borrar

Para borrar es  similar, regresare un mensaje indicando que la información se borro correctamente.  Se regresa un string (StringGraphType) y se recibe como parámetro el id que es del tipo entero (IntGraphType) del registro a borrar.&#x20;

{% code title="CaducidadMutation.cs" %}

```csharp
public async Task<string> DeleteCaducidad(
                [Service] CaducaContext caducaContext, 
                [Service] LocService locService, 
                int id)
    {
        CaducidadDAO caducidadDAO = new CaducidadDAO(caducaContext, locService);
        var correcto = await caducidadDAO.BorraAsync(id);
        if (correcto)
            return $"La caducidad con el id: {id} fue borrada correctamente";
        else
           return caducidadDAO.customError.Message;
    }
}
```

{% endcode %}

### Método para actualizar

El método actualizar es una combinación de los métodos anteriores para pasar como parámetros el id del registro que deseamos modificar y los datos del registro a modificar.

{% code title="CaducidadMutation.cs" %}

```csharp
  public async Task<Caducidad> UpdateCaducidad(
                      [Service] CaducaContext caducaContext,
                      [Service] LocService locService,
                      Caducidad caducidad,
                      int id)
{
    if (id != caducidad.Id)
    {
        return null;
    }
    CaducidadDAO caducidadDAO = new CaducidadDAO(caducaContext, locService);
    var correcto = await caducidadDAO.ModificarAsync(caducidad);
    if (correcto)
        return caducidad;
    else
        return null;
}
```

{% endcode %}

### Configurando GraphQL

Por último lo agregamos a nuestra clase **Startup** con la función **AddMutation**

{% code title="Startup.cs" %}

```csharp
public void ConfigureServices(IServiceCollection services)
{
    services.AddGraphQLServer()
            .AddQueryType<Query>().AddProjections().AddFiltering().AddSorting()
            .AddMutationType<GraphQL.HotChocolate.CaducidadMutation>();
```

{% endcode %}
