Раскройте контент с помощью Strapi и GraphQL в системе запросов функций на GSOC’20.

Вы определенно получили именно то, что хотели, и вам понравилось пользоваться этим. Теперь вы просто хотите знать, как это на самом деле работает под капотом. Это настоящая магия? Бог только что сформировал его в соответствии с вашими потребностями и послал его с небес? Пойдемте со мной, и я отвечу на все ваши GraphQL вопросы.

Что я делал на этой неделе?

Мне потребовалось некоторое время, чтобы понять, что GraphQL — это не другой язык программирования. Это спецификация или технический стандарт. Это означает, что он может иметь несколько реализаций и вариаций. GraphQL.js — эталонная реализация JavaScript. Такие легенды, как Strapi, реализовали полностью настраиваемый GraphQL плагин, который создает новую конечную точку /graphql и интерфейс GraphiQL. Плагин добавляет новый слой, позволяющий легко запрашивать API с помощью GraphQL, не нарушая существующие конечные точки.

GraphQL по умолчанию защищает все запросы, и плагин хорошо сочетается с плагином пользователей и разрешений. Когда мы делаем запрос с GraphQL, мы выполняем те же действия контроллера, что и с конечными точками REST.

Я использовал систему самоанализа GraphQL, чтобы получить все категории, доступные нашему пользователю, при создании новой истории.

Я также использовал мутацию для создания новой пользовательской истории, которая принимает все данные, введенные пользователем, в качестве параметра. Я пропускаю все свои запросы GraphQL через набор настраиваемых политик, прежде чем они попадут в мои настраиваемые контроллеры проверки подлинности в настроенной серверной части Strapi. На этом функция создания новой пользовательской истории завершена.

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

Следующей большой особенностью недели было добавление функциональности для отображения всех историй на главной странице в соответствии с их текущим статусом. Функция Shadow CRUD плагина Strapi GraphQL автоматически генерирует определение типа, запросы, мутации и преобразователи на основе наших моделей. Эта функция также позволяет нам создавать сложные запросы с множеством аргументов, таких как limit, sort, start и where. Это помогло мне реализовать запрос GraphQL для получения необходимой информации обо всех пользовательских историях и сортировки их по наибольшему количеству голосов и последним созданным историям. Я использовал ответ на запрос, чтобы отобразить заголовок, описание и номер. голосов и комментариев для всех историй на главной странице.

Все эти функции за неделю помогли мне очень быстро догнать GraphQL. Это было совершенно новым для меня, и я чувствовал себя застрявшим всего за неделю до этого. Теперь, к концу недели, я счастлив, что могу понять, как это работает так эффективно в глубине слоев.

Что будет дальше?

Я буду работать над отображением всей информации о каждой пользовательской истории на отдельной странице. Для этого требуется запрос для получения всех деталей истории по идентификатору истории. Дата публикации и сведения об авторе также будут доступны на этой странице.

Системе нужна функция редактирования, которая может позволить нашим любимым пользователям добавлять информацию в свою историю. Однако им не будет разрешено редактировать существующее описание.

Я где-нибудь застрял?

Иногда бывает трудно обнаружить редкие ошибки, и вы можете застрять, пытаясь их решить. На этой неделе я столкнулся с чем-то странным.

Весь мой код и функциональность успешно работали в моей среде разработки. После слияния Gitlab CI развернул его на наших промежуточных серверах, и все приложение рухнуло, как на стороне клиента, так и на стороне сервера.

Наконец-то я решил все ошибки и узнал, что Strapi хранит в базе данных все роли и разрешения, которые мы назначаем нашим пользователям. В этом случае наши серверы разработки и подготовки используют разные базы данных. Простой :)

Мы только что экспортировали данные всех наших моделей из тестовой базы данных в ту, которая используется нашим промежуточным сервером.

Еще одна ошибка заключалась в том, чтобы указать точное cors происхождение, которое может получить доступ к нашему серверу, поскольку я использовал withCredentials : true в моей конфигурации Axios для хранения файлов cookie в браузере и отправки их обратно в будущих запросах.

На этом неделя завершилась первыми оценками, в ходе которых я получил потрясающие отзывы от своих наставников и с честью прошел их. Я поблагодарил их за всю их поддержку и руководство. Впереди большое путешествие :)