Skip to content

Commit

Permalink
feat: tracer can use custom resolver for user ID (#37)
Browse files Browse the repository at this point in the history
Allow changing config('xray.user-resolver') with a custom class
  • Loading branch information
derekmd authored Mar 15, 2023
1 parent 1c266a7 commit 62d9a6a
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 5 deletions.
11 changes: 11 additions & 0 deletions config/xray.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
23 changes: 18 additions & 5 deletions src/Collectors/SegmentCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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())
Expand All @@ -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;
}
}
20 changes: 20 additions & 0 deletions src/Resolvers/AuthIdentifier.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

namespace Napp\Xray\Resolvers;

use Illuminate\Support\Facades\Auth;
use Napp\Xray\Resolvers\Contracts\ResolvesUser;

class AuthIdentifier implements ResolvesUser
{
public function getUser(): ?string
{
if (app()->bound('auth') && Auth::check()) {
return (string) Auth::user()->getAuthIdentifier();
}

return null;
}
}
10 changes: 10 additions & 0 deletions src/Resolvers/Contracts/ResolvesUser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace Napp\Xray\Resolvers\Contracts;

interface ResolvesUser
{
public function getUser(): ?string;
}
64 changes: 64 additions & 0 deletions tests/SegmentCollectorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

declare(strict_types=1);

namespace Napp\Xray\Tests;

use Illuminate\Support\Facades\Auth;
use Napp\Xray\Tests\Stubs\CustomUserResolver;
use Napp\Xray\Tests\Stubs\User;
use Napp\Xray\Collectors\SegmentCollector;
use Napp\Xray\XrayServiceProvider;
use Orchestra\Testbench\TestCase;

class SegmentCollectorTest extends TestCase
{
/**
* @param \Illuminate\Foundation\Application $app
* @return string[]
*/
protected function getPackageProviders($app)
{
return [
XrayServiceProvider::class,
];
}

public function test_get_user_when_logged_in()
{
Auth::login(new User());

$collector = new SegmentCollector();

$this->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());
}
}
15 changes: 15 additions & 0 deletions tests/Stubs/CustomUserResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace Napp\Xray\Tests\Stubs;

use Napp\Xray\Resolvers\Contracts\ResolvesUser;

class CustomUserResolver implements ResolvesUser
{
public function getUser(): ?string
{
return 'foo';
}
}
39 changes: 39 additions & 0 deletions tests/Stubs/User.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

namespace Napp\Xray\Tests\Stubs;

use Illuminate\Contracts\Auth\Authenticatable;

class User implements Authenticatable
{
public function getAuthIdentifierName(): string
{
return 'id';
}

public function getAuthIdentifier(): int
{
return 1;
}

public function getAuthPassword(): string
{
return 'foo';
}

public function getRememberToken(): string
{
return 'bar';
}

public function setRememberToken($value): void
{
}

public function getRememberTokenName(): string
{
return 'baz';
}
}

0 comments on commit 62d9a6a

Please sign in to comment.