Skip to content

Commit

Permalink
Implement admin view with list of subscribers
Browse files Browse the repository at this point in the history
  • Loading branch information
mzur committed Oct 12, 2022
1 parent 459de01 commit 272f0ec
Show file tree
Hide file tree
Showing 10 changed files with 173 additions and 37 deletions.
6 changes: 6 additions & 0 deletions src/Http/Controllers/Api/NewsletterSubscriberController.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,11 @@ public function destroy($id)
$subscriber = NewsletterSubscriber::findOrFail($id);
$this->authorize('destroy', $subscriber);
$subscriber->delete();

if (!$this->isAutomatedRequest()) {
return $this->fuzzyRedirect()
->with('message', 'Subscriber deleted.')
->with('messageType', 'success');
}
}
}
36 changes: 36 additions & 0 deletions src/Http/Controllers/Views/AdminController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Biigle\Modules\Newsletter\Http\Controllers\Views;

use Biigle\Http\Controllers\Views\Controller;
use Biigle\Modules\Newsletter\NewsletterSubscriber;
use Illuminate\Http\Request;

class AdminController extends Controller
{

/**
* Shows the list of subscribers page.
*
* @param Request $request
* @return mixed
*/
public function index(Request $request)
{
$subscribers = NewsletterSubscriber::verified()
->select('id', 'email', 'created_at')
->when($request->has('q'), function ($query) use ($request) {
$q = $request->get('q');
$query->where(function ($query) use ($q) {
$query->where('email', 'ilike', "%$q%");
});
})
->orderBy('created_at', 'desc')
->paginate(100);

return view('newsletter::admin.index', [
'subscribers' => $subscribers,
'query' => $request->get('q'),
]);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace Biigle\Modules\Newsletter\Http\Controllers;
namespace Biigle\Modules\Newsletter\Http\Controllers\Views;

use Biigle\Http\Controllers\Views\Controller;
use Biigle\Modules\Newsletter\Http\Requests\DestroyNewsletterSubscriber;
Expand Down
77 changes: 43 additions & 34 deletions src/Http/routes.php
Original file line number Diff line number Diff line change
@@ -1,47 +1,56 @@
<?php

$router->get('newsletter', [
'uses' => 'NewsletterController@index',
]);
$router->group([
'namespace' => 'Api',
'prefix' => 'api/v1',
'middleware' => ['api', 'auth:web,api'],
], function ($router) {
$router->resource('newsletter-subscribers', 'NewsletterSubscriberController', [
'only' => ['destroy'],
'parameters' => ['newsletter-subscribers' => 'id'],
]);
});

$router->post('newsletter/subscribe', [
'uses' => 'NewsletterController@create',
]);
$router->group([
'namespace' => 'Views',
], function ($router) {
$router->get('admin/newsletter', [
'uses' => 'AdminController@index',
'middleware' => ['auth:web', 'can:sudo'],
'as' => 'newsletter.admin.index',
]);

$router->get('newsletter/verify', [
'uses' => 'NewsletterController@created',
]);
$router->get('newsletter', [
'uses' => 'NewsletterController@index',
]);

$router->get('newsletter/verify/{id}/{hash}', [
'uses' => 'NewsletterController@verify',
'middleware' => ['signed'],
'as' => 'newsletter.verify',
]);
$router->post('newsletter/subscribe', [
'uses' => 'NewsletterController@create',
]);

$router->get('newsletter/subscribed', [
'uses' => 'NewsletterController@subscribed',
]);
$router->get('newsletter/verify', [
'uses' => 'NewsletterController@created',
]);

$router->get('newsletter/unsubscribe', [
'uses' => 'NewsletterController@unsubscribe',
]);
$router->get('newsletter/verify/{id}/{hash}', [
'uses' => 'NewsletterController@verify',
'middleware' => ['signed'],
'as' => 'newsletter.verify',
]);

$router->post('newsletter/unsubscribe', [
'uses' => 'NewsletterController@destroy',
]);
$router->get('newsletter/subscribed', [
'uses' => 'NewsletterController@subscribed',
]);

$router->get('newsletter/unsubscribed', [
'uses' => 'NewsletterController@unsubscribed',
]);
$router->get('newsletter/unsubscribe', [
'uses' => 'NewsletterController@unsubscribe',
]);

$router->post('newsletter/unsubscribe', [
'uses' => 'NewsletterController@destroy',
]);

$router->group([
'namespace' => 'Api',
'prefix' => 'api/v1',
'middleware' => ['api', 'auth:web,api'],
], function ($router) {
$router->resource('newsletter-subscribers', 'NewsletterSubscriberController', [
'only' => ['destroy'],
'parameters' => ['newsletter-subscribers' => 'id'],
$router->get('newsletter/unsubscribed', [
'uses' => 'NewsletterController@unsubscribed',
]);
});
1 change: 1 addition & 0 deletions src/NewsletterServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public function boot(Modules $modules, Router $router)
$modules->register('newsletter', [
'viewMixins' => [
'adminIndex',
'adminMenu',
'registrationForm',
],
'controllerMixins' => [
Expand Down
55 changes: 55 additions & 0 deletions src/resources/views/admin/index.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
@extends('admin.base')

@section('title', 'Newsletter subscribers admin area')

@section('admin-content')
<form class="form-inline inline-block-form" action="{{route('newsletter.admin.index')}}" method="get">
<input class="form-control" type="text" name="q" placeholder="Search subscribers" value="{{$query}}">
</form>
@if ($query)
<a href="{{route('newsletter.admin.index')}}" class="btn btn-info" title="Clear filtering"><i class="fas fa-times"></i></a>
@endif

<table class="table table-hover">
<thead>
<tr>
<th>Email</th>
<th>Subscribed</th>
<th></th>
</tr>
</thead>
<tbody>
@forelse($subscribers as $s)
<tr>
<td>
<a href="mailto:{{$s->email}}">{{$s->email}}</a>
</td>
<td title="{{$s->created_at}}">
{{$s->created_at->diffForHumans()}}
</td>
<td>
<form class="form-inline clearfix" action="{{url('api/v1/newsletter-subscribers', $s->id)}}" method="post" onsubmit="return confirm('Are you sure you want to delete {{$s->email}}?')">
<button type="submit" class="btn btn-xs btn-default pull-right" title="Delete subscriber {{$s->email}}"><i class="fa fa-trash"></i></button>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="hidden" name="_method" value="delete">
<input type="hidden" name="_redirect" value="{{ route('newsletter.admin.index') }}">
</form>
</td>
</tr>
@empty
<tr>
<td colspan="5" class="text-muted">
@if ($query)
No subscribers found for query "{{$query}}".
@else
No subscribers found.
@endif
</td>
</tr>
@endforelse
</tbody>
</table>
<nav class="text-center">
{{$subscribers->links()}}
</nav>
@endsection
4 changes: 3 additions & 1 deletion src/resources/views/adminIndex.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
Newsletter subscribers
<a href="{{route('newsletter.admin.index')}}">
Newsletter subscribers
</a>
<span class="pull-right text-muted" title="Total subscribers">
{!! number_format(Biigle\Modules\Newsletter\NewsletterSubscriber::count()) !!}
</span>
Expand Down
1 change: 1 addition & 0 deletions src/resources/views/adminMenu.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<li role="presentation"@if(Request::is('admin/newsletter')) class="active" @endif><a href="{{route('newsletter.admin.index')}}">Newsletter</a></li>
26 changes: 26 additions & 0 deletions tests/Http/Controllers/Views/AdminControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace Biigle\Tests\Modules\Newsletter\Http\Controllers\Views;

use Biigle\Modules\Newsletter\NewsletterSubscriber;
use Biigle\Modules\Newsletter\Notifications\VerifyEmail;
use Biigle\Modules\Newsletter\Notifications\Unsubscribed;
use Biigle\Tests\UserTest;
use Honeypot;
use Illuminate\Support\Facades\Notification;
use ApiTestCase;
use View;

class AdminControllerTest extends ApiTestCase
{
public function testIndex()
{
$this->beUser();
$this->get('admin/newsletter')->assertStatus(403);

$this->beGlobalAdmin();
$this->get('admin/newsletter')
->assertSuccessful()
->assertViewIs('newsletter::admin.index');
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace Biigle\Tests\Modules\Newsletter\Http\Controllers;
namespace Biigle\Tests\Modules\Newsletter\Http\Controllers\Views;

use Biigle\Modules\Newsletter\NewsletterSubscriber;
use Biigle\Modules\Newsletter\Notifications\VerifyEmail;
Expand Down

0 comments on commit 272f0ec

Please sign in to comment.