From 02e049b59e2fdcf11581af880751333b27a8c9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Sun, 28 Jun 2020 11:45:08 +0200 Subject: [PATCH] Convert domains to lowercase, persist current domain model on resolver --- CONTRIBUTING.md | 9 +++------ .../Concerns/ConvertsDomainsToLowercase.php | 13 +++++++++++++ src/Database/Models/Domain.php | 1 + src/Resolvers/DomainTenantResolver.php | 7 +++++++ src/TenancyServiceProvider.php | 5 +++++ tests/DomainTest.php | 13 +++++++++++++ 6 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/Database/Concerns/ConvertsDomainsToLowercase.php diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 82f7aa5d..6363edd7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,11 @@ # Contributing ## Code style + StyleCI will flag code style violations in your pull requests. ## Running tests -### With Docker -If you have Docker installed, simply run ./fulltest. When you're done testing, run docker-compose down to shut down the containers. +Run `docker-compose up-d` to start the containers. Then run `./test` to run the tests. -### Without Docker -If you run the tests of this package, please make sure you don't store anything in Redis @ 127.0.0.1:6379 db#14. The contents of this database are flushed everytime the tests are run. - -Some tests are run only if the `CONTINUOUS_INTEGRATION` or `DOCKER` environment variables are set to true. This is to avoid things like bloating your MySQL instance with test databases. +When you're done testing, run `docker-compose down` to shut down the containers. diff --git a/src/Database/Concerns/ConvertsDomainsToLowercase.php b/src/Database/Concerns/ConvertsDomainsToLowercase.php new file mode 100644 index 00000000..fc15cb2c --- /dev/null +++ b/src/Database/Concerns/ConvertsDomainsToLowercase.php @@ -0,0 +1,13 @@ +domain = strtolower($model->domain); + }); + } +} \ No newline at end of file diff --git a/src/Database/Models/Domain.php b/src/Database/Models/Domain.php index 7c0e0596..261918c4 100644 --- a/src/Database/Models/Domain.php +++ b/src/Database/Models/Domain.php @@ -20,6 +20,7 @@ class Domain extends Model implements Contracts\Domain { use Concerns\CentralConnection, Concerns\EnsuresDomainIsNotOccupied, + Concerns\ConvertsDomainsToLowercase, Concerns\InvalidatesTenantsResolverCache; protected $guarded = []; diff --git a/src/Resolvers/DomainTenantResolver.php b/src/Resolvers/DomainTenantResolver.php index 94d649d2..3c749668 100644 --- a/src/Resolvers/DomainTenantResolver.php +++ b/src/Resolvers/DomainTenantResolver.php @@ -10,6 +10,13 @@ use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException; class DomainTenantResolver extends Contracts\CachedTenantResolver { + /** + * The model representing the domain that the tenant was identified on. + * + * @var Domain + */ + public static $currentDomain; + /** @var bool */ public static $shouldCache = false; diff --git a/src/TenancyServiceProvider.php b/src/TenancyServiceProvider.php index 533d2b64..3e4936ef 100644 --- a/src/TenancyServiceProvider.php +++ b/src/TenancyServiceProvider.php @@ -8,6 +8,7 @@ use Illuminate\Cache\CacheManager; use Illuminate\Support\ServiceProvider; use Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper; use Stancl\Tenancy\Contracts\Tenant; +use Stancl\Tenancy\Resolvers\DomainTenantResolver; class TenancyServiceProvider extends ServiceProvider { @@ -39,6 +40,10 @@ class TenancyServiceProvider extends ServiceProvider return $app[Tenancy::class]->tenant; }); + $this->app->bind(Domain::class, function () { + return DomainTenantResolver::$currentDomain; + }); + // Make sure bootstrappers are stateful (singletons). foreach ($this->app['config']['tenancy.bootstrappers'] ?? [] as $bootstrapper) { if (method_exists($bootstrapper, '__constructStatic')) { diff --git a/tests/DomainTest.php b/tests/DomainTest.php index f793aad2..9c1bac28 100644 --- a/tests/DomainTest.php +++ b/tests/DomainTest.php @@ -7,6 +7,7 @@ namespace Stancl\Tenancy\Tests; use Illuminate\Support\Facades\Route; use Stancl\Tenancy\Database\Concerns\HasDomains; use Stancl\Tenancy\Database\Models; +use Stancl\Tenancy\Database\Models\Domain; use Stancl\Tenancy\Exceptions\DomainOccupiedByOtherTenantException; use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException; use Stancl\Tenancy\Middleware\InitializeTenancyByDomain; @@ -103,6 +104,18 @@ class DomainTest extends TestCase ->get('http://foo.localhost/foo/abc/xyz') ->assertSee('foo'); } + + /** @test */ + public function domains_are_always_lowercase() + { + $tenant = DomainTenant::create(); + + $tenant->domains()->create([ + 'domain' => 'CAPITALS', + ]); + + $this->assertSame('capitals', Domain::first()->domain); + } } class DomainTenant extends Models\Tenant