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

3ab2668d67f16a84b931b1332741e6b2.png

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

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

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

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

363bf5fafe805aaef2814f2c6a6daea4.png

Также в проекте мы будем использовать 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, но в целом логика универсальна и для иных схожих по сути проектов.

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

© Habrahabr.ru