diff --git a/config/xray.php b/config/xray.php index 6176e04..ebf5eeb 100755 --- a/config/xray.php +++ b/config/xray.php @@ -16,6 +16,17 @@ */ 'submitter' => \Napp\Xray\Submission\APISegmentSubmitter::class, + /* + |-------------------------------------------------------------------------- + | User resolver method + |-------------------------------------------------------------------------- + | + | Here you can set a class to find the logged-in user identifier. + | Supported classes: "AuthIdentifier" + | + */ + 'user-resolver' => \Napp\Xray\Resolvers\AuthIdentifier::class, + /* |-------------------------------------------------------------------------- | Enable Database Query diff --git a/src/Collectors/SegmentCollector.php b/src/Collectors/SegmentCollector.php index cf7faf2..77f6ddd 100644 --- a/src/Collectors/SegmentCollector.php +++ b/src/Collectors/SegmentCollector.php @@ -4,7 +4,7 @@ namespace Napp\Xray\Collectors; -use Illuminate\Support\Facades\Auth; +use Napp\Xray\Resolvers\AuthIdentifier; use Napp\Xray\Segments\TimeSegment; use Napp\Xray\Segments\Trace; use Pkerrigan\Xray\Segment; @@ -126,9 +126,10 @@ public function submitHttpTracer($response): void { $submitterClass = config('xray.submitter'); $tracer = $this->tracer(); + $user = $this->getUser(); - if (app()->bound('auth') && Auth::check()) { - $tracer->setUser((string) Auth::user()->getAuthIdentifier()); + if ($user) { + $tracer->setUser($user); } $tracer->end() ->setResponseCode($response->getStatusCode()) @@ -139,12 +140,24 @@ public function submitCliTracer(): void { $submitterClass = config('xray.submitter'); $tracer = $this->tracer(); + $user = $this->getUser(); - if (app()->bound(Auth::class) && Auth::check()) { - $tracer->setUser((string) Auth::user()->getAuthIdentifier()); + if ($user) { + $tracer->setUser($user); } $tracer->end()->submit(new $submitterClass()); $tracer::flush(); } + + public function getUser(): ?string + { + $resolver = config('xray.user-resolver', AuthIdentifier::class); + + if ($resolver) { + return app($resolver)->getUser(); + } + + return null; + } } diff --git a/src/Resolvers/AuthIdentifier.php b/src/Resolvers/AuthIdentifier.php new file mode 100644 index 0000000..efae920 --- /dev/null +++ b/src/Resolvers/AuthIdentifier.php @@ -0,0 +1,20 @@ +bound('auth') && Auth::check()) { + return (string) Auth::user()->getAuthIdentifier(); + } + + return null; + } +} diff --git a/src/Resolvers/Contracts/ResolvesUser.php b/src/Resolvers/Contracts/ResolvesUser.php new file mode 100644 index 0000000..ef7cea7 --- /dev/null +++ b/src/Resolvers/Contracts/ResolvesUser.php @@ -0,0 +1,10 @@ +assertSame('1', $collector->getUser()); + } + + public function test_get_user_when_guest() + { + $collector = new SegmentCollector(); + + $this->assertNull($collector->getUser()); + } + + public function test_get_user_when_config_is_missing() + { + $config = config('xray'); + unset($config['user-resolver']); + config()->set('xray', $config); + + Auth::login(new User()); + + $collector = new SegmentCollector(); + + $this->assertSame('1', $collector->getUser()); + } + + public function test_get_user_when_custom_resolver_is_configured() + { + config()->set('xray.user-resolver', CustomUserResolver::class); + + $collector = new SegmentCollector(); + + $this->assertSame('foo', $collector->getUser()); + } +} diff --git a/tests/Stubs/CustomUserResolver.php b/tests/Stubs/CustomUserResolver.php new file mode 100644 index 0000000..4d333bf --- /dev/null +++ b/tests/Stubs/CustomUserResolver.php @@ -0,0 +1,15 @@ +