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

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

Комментарии (2)


  1. famer
    03.10.2024 23:28

    Интересно узнать, что прекрасный laravel используется такими гигантами


  1. milinsky
    03.10.2024 23:28
    +5

    Не совсем понятно, а причём тут собственно GraphQL? По сути, для статьи достаточно было описать SmsService, всё остальное детали для конкретного проекта. Полагаю что GraphQL притянут за уши, что бы статья совсем уж не выглядела голой рекламой вашего сервиса (впрочем это не помогло).

    Ну и конечно же, не могу не отметить "качество" представленного кода, например:

    return $invite ? true : false;