Persist application state
Persist application state sẽ giúp việc đồng bộ cấu hình giữa application của bạn với Hasura metadata (ví dụ: remote schema permissions roles, inherited roles, remote schema SDL), việc đồng bộ này sẽ giúp đảm bảo tính consistent giữa application với Hasura.
Để persist application state bạn cần thực thi command sau:
- Đối với Laravel users
- Đối với Symfony users
php artisan hasura:metadata:persist-state
Command trên sẽ persist application state giúp bạn.
php bin/console hasura:metadata:persist-state
Command trên sẽ persist application state giúp bạn.
Cách thức hoạt động
- Đối với Laravel framework
- Đối với Symfony framework
Giả sử như application của bạn có mutation field registration
dành cho anonymous
như sau:
namespace App\Http\GraphQL\RegistrationMutation;
use App\Models\User;
use Hasura\GraphQLiteBridge\Attribute\Roles;
use Hasura\Laravel\GraphQLite\Attribute\ValidateObject;
use Illuminate\Support\Facades\Hash;
use TheCodingMachine\GraphQLite\Annotations as GQL;
class Resolver
{
#[GQL\Mutation(name: 'registration', outputType: 'registration_output')]
#[ValidateObject(for: 'input')]
#[Roles('anonymous')]
public function __invoke(Input $input): User
{
$user = new User();
$user->name = $input->name;
$user->email = $input->email;
$user->password = Hash::make($input->password);
$user->saveOrFail();
return $user;
}
}
và inherited roles như sau:
'auth' => [
'inherited_roles' => [
'admin' => ['manager', 'user'],
'manager' => ['user']
],
]
Để persist các application state trên lên Hasura metadata thì bạn cần thực thi Artisan console command sau:
php artisan hasura:metadata:persist-state
Sau khi persist xong ngay bây giờ bạn hãy thử kiểm tra lại application remote schema permissions trên Hasura sẽ thấy kết quả sau:
Và tiếp đến hãy thử kiểm tra inherited roles trên Hasura sẽ thấy kết quả sau:
Vậy là bạn đã hoàn tất việc persist application state lên Hasura rồi đấy.
Giả sử như application của bạn có mutation field user_registration
dành cho ROLE_ANONYMOUS
như sau:
namespace App\GraphQL\User\RegistrationMutation;
use App\Entity\User;
use App\Security\SystemRoles;
use Hasura\Bundle\GraphQLite\Attribute\ObjectAssertion;
use Hasura\Bundle\GraphQLite\Attribute\Transactional;
use Hasura\GraphQLiteBridge\Attribute\ArgNaming;
use Hasura\GraphQLiteBridge\Attribute\Roles;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use TheCodingMachine\GraphQLite\Annotations as GQL;
final class Resolver
{
public function __construct(private UserPasswordHasherInterface $hasher)
{
}
#[GQL\Mutation(name: 'user_registration', outputType: 'user_registration_mutation_output!')]
#[Roles(SystemRoles::ROLE_ANONYMOUS)]
#[ArgNaming(for: 'inputObj', name: 'input_obj')]
#[ObjectAssertion(for: 'inputObj')]
#[Transactional]
public function __invoke(Input $inputObj): User
{
$user = new User();
$user->setName($inputObj->name);
$user->setEmail($inputObj->email);
$user->setPassword($this->hasher->hashPassword($user, $inputObj->password));
return $user;
}
}
và role hierarchy như sau:
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
Để persist các application state trên lên Hasura metadata thì bạn cần thực thi Symfony console command sau:
php bin/console hasura:metadata:persist-state
Sau khi persist xong ngay bây giờ bạn hãy thử kiểm tra lại application remote schema permissions trên Hasura sẽ thấy kết quả sau:
Và tiếp đến hãy thử kiểm tra inherited roles trên Hasura sẽ thấy kết quả sau:
Vậy là bạn đã hoàn tất việc persist application state lên Hasura rồi đấy.