diff --git a/src/Database/Concerns/InvalidatesResolverCache.php b/src/Database/Concerns/InvalidatesResolverCache.php index 7dff35ad..de3bd9b4 100644 --- a/src/Database/Concerns/InvalidatesResolverCache.php +++ b/src/Database/Concerns/InvalidatesResolverCache.php @@ -14,6 +14,7 @@ trait InvalidatesResolverCache Resolvers\DomainTenantResolver::class, Resolvers\PathTenantResolver::class, Resolvers\RequestDataTenantResolver::class, + Resolvers\RequestOriginTenantResolver::class ]; public static function bootInvalidatesResolverCache() diff --git a/src/Database/Concerns/InvalidatesTenantsResolverCache.php b/src/Database/Concerns/InvalidatesTenantsResolverCache.php index 555aceeb..47f3a725 100644 --- a/src/Database/Concerns/InvalidatesTenantsResolverCache.php +++ b/src/Database/Concerns/InvalidatesTenantsResolverCache.php @@ -17,6 +17,7 @@ trait InvalidatesTenantsResolverCache Resolvers\DomainTenantResolver::class, Resolvers\PathTenantResolver::class, Resolvers\RequestDataTenantResolver::class, + Resolvers\RequestOriginTenantResolver::class ]; public static function bootInvalidatesTenantsResolverCache() diff --git a/src/Exceptions/TenantCouldNotBeIdentifiedByRequestOriginException.php b/src/Exceptions/TenantCouldNotBeIdentifiedByRequestOriginException.php new file mode 100644 index 00000000..7f5dd98a --- /dev/null +++ b/src/Exceptions/TenantCouldNotBeIdentifiedByRequestOriginException.php @@ -0,0 +1,24 @@ +setSolutionDescription('The request needs to originate from the same domain as the tenant.'); + } +} diff --git a/src/Middleware/InitializeTenancyByRequestOrigin.php b/src/Middleware/InitializeTenancyByRequestOrigin.php new file mode 100644 index 00000000..1b2f9419 --- /dev/null +++ b/src/Middleware/InitializeTenancyByRequestOrigin.php @@ -0,0 +1,50 @@ +tenancy = $tenancy; + $this->resolver = $resolver; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + return $this->initializeTenancy($request, $next, $this->getPayload($request)); + } + + protected function getPayload(Request $request): ?string + { + $tenant = null; + if ($request->hasHeader('origin')) { + $tenant = optional(parse_url($request->headers->get('origin')))['host']; + } + + return $tenant; + } +} diff --git a/src/Resolvers/RequestOriginTenantResolver.php b/src/Resolvers/RequestOriginTenantResolver.php new file mode 100644 index 00000000..4aedb241 --- /dev/null +++ b/src/Resolvers/RequestOriginTenantResolver.php @@ -0,0 +1,40 @@ +first(); + + if ($domain) { + return $domain->tenant; + } + + throw new TenantCouldNotBeIdentifiedByRequestOriginException($payload); + } + + public function getArgsForTenant(Tenant $tenant): array + { + return [ + [$tenant->id], + ]; + } +}