Разработка веб-API!

О, смотрите, кто вернулся. Надеюсь, вы уже являетесь подписчиком, потому что если нет… вы выглядите как сталкер…

Добро пожаловать в следующую часть нашей серии статей. Господи, часть двенадцатая, мне нужно связаться с Нетфликс и поработать с ними. Упоминая Netflix, кстати, вы смотрели новый сезон Ведьмака? Феноменальный! Я просто обожаю такие шоу. Если вы знаете что-то, что я должен попробовать, напишите мне в комментариях.

Давайте приступим к делу.

Сегодня мы добавим оружие в наш OrcTheGood.

DTO

namespace WebApplication2.DTOs
{
    public record struct WeaponCreateDTO(string Name);
}

Во-первых, мы хотим определить объект WeaponCreateDTO, который мы будем использовать так же, как мы использовали другие.

Поскольку мы создадим нашего персонажа с некоторым набором оружия (он может держать их несколько), мы также хотим изменить CharacterCreateDTO.

namespace WebApplication2.DTOs
{
    public record struct CharacterCreateDTO(string Name, 
        BackpackCreateDTO Backpack,
        List<WeaponCreateDTO> Weapons);
}

Я добавил список оружия в этом классе. Когда мы создаем персонажа, у нас должна быть возможность назначить ему оружие.

Контроллер

Теперь пришло время изменить наш MediumController, который является контроллером, отвечающим за наш текущий API персонажей.

Вот две строки, которые я добавил.

var weapons = request.Weapons.Select(w => new Weapon { Name = w.Name, Character = newCharacter }).ToList();

Используя запрос, как CharacterCreateDTO, поскольку он был изменен, у нас есть возможность коснуться там Weaponsсегмента. Оттуда мы будем перебирать каждый элемент и создадим новый Weapon. Теперь, поскольку Weapon должен быть связан с конкретным Character, конечно, этот символ у нас уже есть выше, поэтому мы поместим его в качестве ссылки.

После этого мы должны сказать, что текущий набор оружия этого персонажа будет равен оружию, которое мы только что произвели.

Это потому, что у каждого персонажа есть список оружия внутри него.

Наконец, нам нужно вернуть все, включая оружие и рюкзаки. По этой причине мы также изменили последнюю строку.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WebApplication2.Data;
using WebApplication2.Data.Models;
using WebApplication2.DTOs;

namespace WebApplication2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MediumController : ControllerBase
    {
        private readonly DataContext _dataContext;

        public MediumController(DataContext context)
        {
            _dataContext = context;
        }

        [HttpPost]
        public async Task<ActionResult<Character>> CreateCharacter(CharacterCreateDTO request)
        {
            var newCharacter = new Character
            {
                Name = request.Name
            };

            var backpack = new Backpack { Description = request.Backpack.Description, Character = newCharacter };
            var weapons = request.Weapons.Select(w => new Weapon { Name = w.Name, Character = newCharacter }).ToList();

            newCharacter.Backpack = backpack;
            newCharacter.Weapons = weapons;

            _dataContext.Characters.Add(newCharacter);

            await _dataContext.SaveChangesAsync();

            return Ok(await _dataContext.Characters.Include(c => c.Backpack).Include(c => c.Weapons).ToListAsync());
        }


    }
}

Вот полный код контроллера.

Время тестирования

Тестирование этого дает мне ту же ошибку, что и раньше.

Вот почему нам нужно изменить нашу сущность Weapon следующим образом, как мы это делали раньше.

с атрибутом JsonIgnore.

using System.Text.Json.Serialization;

namespace WebApplication2.Data.Models
{
    public class Weapon
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CharacterId { get; set; }
        [JsonIgnore]
        public Character Character { get; set; }
    }
}

Давайте попробуем еще раз.

Это будет мой тестовый JSON.

{
  "name": "OrcTheGood",
  "backpack": {
    "description": "a Good orc"
  },
  "weapons": [
    {
      "name": "Sword"
    },
    {
      "name": "Arrow"
    }
  ]
}

И вот мы идем.

Мы только что дали OrcTheGood меч и стрелу. Что он будет с ней делать без лука… Не знаю!

Я надеюсь, что вы нашли эту статью полезной, и в следующей мы также добавим фракции. Спасибо, что вы со мной! Пока!