diff --git a/app/Http/Controllers/Dashboard/AllUrlController.php b/app/Http/Controllers/Dashboard/AllUrlController.php index ad3fc5b6a..80527c333 100644 --- a/app/Http/Controllers/Dashboard/AllUrlController.php +++ b/app/Http/Controllers/Dashboard/AllUrlController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use App\Models\Url; +use App\Models\User; use Illuminate\Routing\Controllers\{HasMiddleware, Middleware}; class AllUrlController extends Controller implements HasMiddleware @@ -23,6 +24,19 @@ public function view() return view('backend.url-list'); } + /** + * Show all short links from specific user. + * + * @return \Illuminate\Contracts\View\View + */ + public function userLinkView(string $author) + { + return view('backend.url-list-of-user', [ + 'authorName' => $author, + 'authorId' => User::where('name', $author)->first()->id, + ]); + } + /** * Show all short URLs created by guest. * diff --git a/app/Livewire/Table/UrlListOfUsersTable.php b/app/Livewire/Table/UrlListOfUsersTable.php new file mode 100644 index 000000000..563f81b96 --- /dev/null +++ b/app/Livewire/Table/UrlListOfUsersTable.php @@ -0,0 +1,100 @@ +showToggleColumns() + ->showSearchInput(), + Footer::make() + ->showPerPage($this->perPage) + ->showRecordCount('full'), + ]; + } + + public function datasource(): Builder + { + return Url::where('user_id', $this->user_id); + } + + public function fields(): PowerGridFields + { + return PowerGrid::fields() + ->add('keyword', function (Url $url) { + return view('components.table.keyword', ['url' => $url]) + ->render(); + }) + ->add('destination', function (Url $url) { + return view('components.table.destination', [ + 'url' => $url, + 'limit' => self::STR_LIMIT, + ])->render(); + }) + ->add('t_clicks', function (Url $url) { + return view('components.table.visit', ['url' => $url]) + ->render(); + }) + ->add('created_at_formatted', function (Url $url) { + return view('components.table.date-created', ['url' => $url]) + ->render(); + }) + ->add('action', function (Url $url) { + return view('components.table.action-button', ['url' => $url]) + ->render(); + }); + } + + /** + * @return array<\PowerComponents\LivewirePowerGrid\Column> + */ + public function columns(): array + { + return [ + Column::make('Short URL', 'keyword') + ->sortable() + ->searchable(), + + Column::make('Destination URL', 'destination') + ->sortable() + ->searchable(), + Column::make('title', 'title') + ->searchable() + ->hidden(), + + Column::make('CLICKS', 't_clicks'), + + Column::make('CREATED AT', 'created_at_formatted', 'created_at') + ->searchable() + ->sortable(), + + Column::make('ACTIONS', 'action') + ->bodyAttribute(styleAttr: ';padding-left: 8px'), + ]; + } +} diff --git a/app/Livewire/Table/UrlListTable.php b/app/Livewire/Table/UrlListTable.php index 81998a8a9..b4362703e 100644 --- a/app/Livewire/Table/UrlListTable.php +++ b/app/Livewire/Table/UrlListTable.php @@ -45,7 +45,8 @@ public function fields(): PowerGridFields { return PowerGrid::fields() ->add('author', function (Url $url) { - return ''.$url->author->name.''; + return view('components.table.author', ['url' => $url]) + ->render(); }) ->add('keyword', function (Url $url) { return view('components.table.keyword', ['url' => $url]) diff --git a/resources/views/backend/url-list-of-user.blade.php b/resources/views/backend/url-list-of-user.blade.php new file mode 100644 index 000000000..4f97ddaea --- /dev/null +++ b/resources/views/backend/url-list-of-user.blade.php @@ -0,0 +1,21 @@ +@extends('layouts.backend') + +@section('title', __('Links').' > '. $authorName) + +@section('content') +
+
+
+
+ + {{__('Links created by')}} {{$authorName}} + +
+
+ + @include('partials/messages') + + @livewire('table.UrlListOfUsersTable', ['user_id' => $authorId]) +
+
+@endsection diff --git a/resources/views/components/table/author.blade.php b/resources/views/components/table/author.blade.php new file mode 100644 index 000000000..72c1a05b8 --- /dev/null +++ b/resources/views/components/table/author.blade.php @@ -0,0 +1,5 @@ + + + {{ $url->author->name }} + + diff --git a/routes/web.php b/routes/web.php index efa1386b5..72697b100 100644 --- a/routes/web.php +++ b/routes/web.php @@ -26,6 +26,7 @@ Route::get('/allurl', [AllUrlController::class, 'view'])->name('dashboard.allurl'); Route::get('/allurl/delete/{url:keyword}', [AllUrlController::class, 'delete'])->name('dashboard.allurl.su_delete'); Route::get('/allurl/u/guest', [AllUrlController::class, 'guestLinkView'])->name('dashboard.allurl.u-guest'); + Route::get('/allurl/u/{user:name}', [AllUrlController::class, 'userLinkView'])->name('dashboard.allurl.u-user'); // User Route::namespace('User')->prefix('user')->group(function () { diff --git a/tests/Feature/AuthPage/AllUrlsPageTest.php b/tests/Feature/AuthPage/AllUrlsPageTest.php index 77ba464a1..2a47c12aa 100644 --- a/tests/Feature/AuthPage/AllUrlsPageTest.php +++ b/tests/Feature/AuthPage/AllUrlsPageTest.php @@ -16,10 +16,6 @@ public function auAdminCanAccessThisPage(): void $response = $this->actingAs($this->adminUser()) ->get(route('dashboard.allurl')); $response->assertOk(); - - $response = $this->actingAs($this->adminUser()) - ->get(route('dashboard.allurl.u-guest')); - $response->assertOk(); } #[Test] @@ -29,8 +25,38 @@ public function auNormalUserCantAccessThisPage(): void $response = $this->actingAs($this->normalUser()) ->get(route('dashboard.allurl')); $response->assertForbidden(); + } - $response = $this->actingAs($this->normalUser()) + /** + * Admin can access user links and guest links table page + */ + #[Group('f-allurl')] + public function testAdminCanAccessUserLinksTablePage(): void + { + $user = $this->adminUser(); + + $response = $this->actingAs($user) + ->get(route('dashboard.allurl.u-user', $user->name)); + $response->assertOk(); + + $response = $this->actingAs($user) + ->get(route('dashboard.allurl.u-guest')); + $response->assertOk(); + } + + /** + * Non admin users can't access user links and guest links table page + */ + #[Group('f-allurl')] + public function testNonAdminUsersCantAccessUserLinksTablePage(): void + { + $user = $this->normalUser(); + + $response = $this->actingAs($user) + ->get(route('dashboard.allurl.u-user', $this->adminUser()->name)); + $response->assertForbidden(); + + $response = $this->actingAs($user) ->get(route('dashboard.allurl.u-guest')); $response->assertForbidden(); }