Домашнее задание №11

Тема: Сервис ShopQL на основе GraphQL

В этом задании мы делаем мини-маркетплейс. 

Все сущности, запросы, мутаторы и директивы есть в `schema.graphql` внутри архива `schema_and_config.zip` с детальным описанием и комментариями. Но туда не смотрите для начала и попробуйте сделать через реверс-инжиниринг тестов.

В рамках этого задания вы поработаете:

1. Написание graphql-схемы для проекта (в случае если вы попробуете пойти сложным путем - реверсить тесты и написать `schema.graphql` с нуля)
2. Работе с gqlgen - генерация всей обвязки, правки конфига gqlgen.yml 
3. Написание кода резолверов и всей основной бизнес-логики
4. Написание директив
5. Для тех кто хочет еще - есть hw11_advanced.md, где описаны фичи, которые можно поделать, но они выходят за рамки обязательного набора знаний по graphql

Работаем без БД, все храним в памяти. Это сделано для того чтобы вы больше времени уделяли именно graphql, а не вычитыванию сущностей из БД. Если хотите базу - см. п.5.

В некоторых местах надо будет использовать forceResolver, чтобы данные получать не из поля структуры, не из метода структуры, а чтобы у вас был доступ к резолверу и всех данных в нем:
1. Товар - каталог, продавец, в корзине, текст наличия
2. Каталог - родитель, подкаталоги, список товаров
3. Продавец - список товаров

Данные, с которыми надо работать - находятся в файле testdata.json, можете подгружать их при старте. Вам необходимо будет разаместить эти данные в каких-то внутренних структурах.

Схема проекта и конфиг gqlgen включены в отдельном архиве в папке с заданием. Попробуйте сначала самостоятельно написать схему (на основе запросов из тестов и test_queries.md), конфиг сгенерится при запуске и потом доправьте его. Благодаря этому вы научитесь делать это все с нуля. Если у вас не получается, или лень, или нет времени - смотрите мои файлы в архиве.

Для объявления объекта (структуры) в качесте входного параметра надо объявить его как `input SomeName`, а не `type SomeName`. Почитать: https://graphql.org/learn/schema/#input-types

Порядок выполнения задания:
1. Смотрим тесты, пытаемся сопоставить сущности с тем что написано в этом файле, накидываем схему
2. Пишем схему (или сразу смотрим мою в архиве)
3. Инициализируем gqlgen-проект через make init (или берем мой конфиг их архива)
4. Генерируем gqlgen-обвязку через make gen
4. Пишем сервис - подгрузка тестовых данных, всякая обвязка, структуры, резолверы
5. Запускаем, проверяем запросы из test_queries.md в playgroud
6. Проходим тесты 

Процесс итерационен, если вы не берете мою схему (а я очень рекомендую ее не брать и не смотреть туда вообще, делать сначала все самостоятельно, так вы сильнее прокачаетесь) - то наверняка у вас сразу не получится.

Для вашего удобства есть мейк-файл, которы упростит некоторые команды.