Как встроить систему приглашений в свое приложение с помощью Laravel и GraphQL

от автора

Привет, Хабр! Меня зовут Екатерина Саяпина, я Product Owner личного кабинета платформы МТС Exolve. В этом посте расскажу, как встроить систему приглашений в приложение с помощью Laravel и GraphQL. Эту задачу можно выполнить не только по привычным каналам вроде email, но и через SMS API. Мы разберем процесс интеграции от создания модели на Laravel и работы с GraphQL до отправки сообщений через API Exolve.

Система приглашений — это еще один вариант взаимодействия, когда пользователи могут отправить кому-нибудь из вашего приложения уникальный код или ссылку. Например, вы разрабатываете социальную платформу или продукт и хотите, чтобы люди делились ключами для него. Такая система улучшает пользовательский опыт и может повысить качество ваших сервисов.

Laravel — мощный инструмент для создания бекенда

Laravel давно зарекомендовал себя как отличный фреймворк для PHP-разработчиков. У него удобный синтаксис, четкая структура кода и огромное количество встроенных возможностей — все это делает его идеальным выбором для создания API у приложений. В нашем кейсе задействуем маршруты, контроллеры, модели и интеграцию с GraphQL.

Также в проекте мы будем использовать GraphQL: в отличие от традиционного REST API, он позволяет получить ровно те данные, которые нам нужны, без избыточных данных. Мы применим GraphQL для взаимодействия между нашим клиентом и сервером, чтобы передавать информацию о приглашениях и пользователях. Запросы через GraphQL более гибкие и мощные, а их настройка под Laravel проста и логична.

Шаг 1: Настраиваем Laravel

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

Модель Invite будет содержать поля для хранения информации об отправителе, о получателе, а также о статусе приглашения. Для начала создадим миграцию:

php artisan make:model Invite -m

Добавляем в нее поля:

Schema::create('invites', function (Blueprint $table) {     $table->id();     $table->foreignId('sender_id')->constrained('users')->onDelete('cascade');     $table->string('invitee_phone');     $table->string('invite_code')->unique();     $table->enum('status', ['pending', 'accepted', 'declined'])->default('pending');     $table->timestamps(); });

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

Шаг 2: GraphQL-запросы для приглашений

Теперь, когда у нас есть модель, необходимо интегрировать ее с GraphQL. Если вы еще не подключили GraphQL к Laravel, рекомендую использовать библиотеку laravel-graphq — она значительно упростит жизнь.

Сначала создадим несколько мутаций, через которые будем создавать новые приглашения:

use GraphQL\Type\Definition\Type; use Rebing\GraphQL\Support\Mutation; use App\Models\Invite;  class CreateInviteMutation extends Mutation {     protected $attributes = [         'name' => 'createInvite'     ];      public function type(): Type     {         return Type::boolean();     }      public function args(): array     {         return [             'invitee_phone' => ['name' => 'invitee_phone', 'type' => Type::string()],         ];     }      public function resolve($root, $args)     {         $invite = Invite::create([             'sender_id' => auth()->id(),             'invitee_phone' => $args['invitee_phone'],             'invite_code' => Str::random(10),         ]);          return $invite ? true : false;     } }

Эта мутация добавит новую запись в таблицу приглашений и сгенерирует уникальный код, который в дальнейшем мы перешлем по SMS.

Шаг 3: Интеграция с API Exolve

Теперь самое интересное — отправка сообщений через SMS. Для этого мы будем использовать API Exolve. Если вы еще не знакомы с ним, то рекомендую обратиться к документации — там все достаточно просто и понятно.

В нашем случае нужно отправить POST-запрос с телефоном приглашенного и текстом сообщения. Чтобы это сделать, мы напишем службу, которая будет отвечать за интеграцию с Exolve API.

Создадим новый сервисный класс:

namespace App\Services;  use Illuminate\Support\Facades\Http;  class SmsService {     protected $apiUrl = 'https://api.exolve.com/send';      public function sendInvite($phone, $message)     {         $response = Http::post($this->apiUrl, [             'phone' => $phone,             'message' => $message,         ]);          return $response->successful();     } }

Теперь нам нужно вызывать этот сервис в момент создания приглашения, чтобы отправить его по SMS. Мы можем сделать это прямо в нашей мутации GraphQL:

use App\Services\SmsService;  class CreateInviteMutation extends Mutation {     public function resolve($root, $args)     {         $invite = Invite::create([             'sender_id' => auth()->id(),             'invitee_phone' => $args['invitee_phone'],             'invite_code' => Str::random(10),         ]);          $smsService = new SmsService();         $smsService->sendInvite($args['invitee_phone'], 'Ваш код приглашения: ' . $invite->invite_code);          return $invite ? true : false;     } }

Как видите, это простой и удобный способ интеграции с Exolve. В этом варианте мы передаем по SMS уникальный код, но можем взять вместо него, например, ссылки.

Заключение

Интеграция системы приглашений с использованием Laravel и GraphQL — это не только функционально, но и гибко. Можно добавлять новые виды сообщений, менять логику рассылки или интегрировать другие API. В этом примере мы использовали Exolve для отправки SMS, но в целом логика универсальна и для иных схожих по сути проектов.

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


ссылка на оригинал статьи https://habr.com/ru/articles/847938/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *