RuleSet.php 2.63 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
<?php

declare(strict_types=1);

namespace Kreait\Firebase\Database;

use JsonSerializable;

class RuleSet implements JsonSerializable
{
    /** @var array<string, array<mixed>> */
    private array $rules;

    /**
     * @param array<string, array<mixed>> $rules
     */
    private function __construct(array $rules)
    {
        if (!\array_key_exists('rules', $rules)) {
            $rules = ['rules' => $rules];
        }

        $this->rules = $rules;
    }

    /**
     * The default rules require Authentication. They allow full read and write access
     * to authenticated users of your app. They are useful if you want data open to
     * all users of your app but don't want it open to the world.
     *
     * @see https://firebase.google.com/docs/database/security/quickstart#sample-rules
     */
    public static function default(): self
    {
        return new self([
            'rules' => [
                '.read' => 'auth != null',
                '.write' => 'auth != null',
            ],
        ]);
    }

    /**
     * During development, you can use the public rules in place of the default rules to set
     * your files publicly readable and writable. This can be useful for prototyping,
     * as you can get started without setting up Authentication.
     *
     * This level of access means anyone can read or write to your database. You should
     * configure more secure rules before launching your app.
     *
     * @see https://firebase.google.com/docs/database/security/quickstart#sample-rules
     */
    public static function public(): self
    {
        return new self([
            'rules' => [
                '.read' => true,
                '.write' => true,
            ],
        ]);
    }

    /**
     * Private rules disable read and write access to your database by users. With these rules,
     * you can only access the database through the Firebase console and an Admin SDK.
     *
     * @see https://firebase.google.com/docs/database/security/quickstart#sample-rules
     */
    public static function private(): self
    {
        return new self([
            'rules' => [
                '.read' => false,
                '.write' => false,
            ],
        ]);
    }

    /**
     * @param array<string, array<mixed>> $rules
     */
    public static function fromArray(array $rules): self
    {
        return new self($rules);
    }

    /**
     * @return array<string, array<mixed>>
     */
    public function getRules(): array
    {
        return $this->rules;
    }

    /**
     * @return array<string, array<mixed>>
     */
    public function jsonSerialize(): array
    {
        return $this->rules;
    }
}