Dodano panel administratora oraz oraz powiadomienia mailowe.

This commit is contained in:
LissioR 2020-02-27 15:21:08 +01:00
parent b709b66655
commit c7fb23bedd
14 changed files with 380 additions and 5 deletions

View File

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\NotifiUserVerified;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Facades\Auth;
class AdminController extends Controller
{
public function __construct()
{
$this->middleware('AdminPermission', ['only' => ['show', 'destroy', 'accept']]);
}
public function show(User $user)
{
return view('admin.show', [
'user' => Auth::user(),
'acceptableUsers' => User::where('admin', null)->where('avatar_rating', '>', 6)->orderBy('avatar_rating', 'asc')->get(),
'unacceptableUsers' => User::where('admin', null)->where('avatar_rating', '<=', 6)->orderBy('avatar_rating', 'asc')->get(),
]);
}
public function deactivate(User $user)
{
$user->update([
'avatar_rating' => 0,
'user_verified_at' => null,
]);
Notification::send($user, new NotifiUserVerified([
'subject' => 'Library - zdjęcie zaakceptowane',
'title' => 'Twoje zdjęcie pomyślnie przeszło weryfikację.',
'description' => 'Twoje konto jest teraz w pełni aktywne.'
]));
return redirect()->route('admin.show', Auth::User());
}
public function accept(User $user)
{
$user->update([
'avatar_rating' => 10,
'user_verified_at' => now(),
]);
Notification::send($user, new NotifiUserVerified([
'subject' => 'Library - profil zdegradowany',
'title' => 'Zostałeś zdegradowany.',
'description' => 'Twoje konto na czas ponownej weryfikacji nie bedzie posiadało prawa do komentowania i dodawania książek.',
]));
return redirect()->route('admin.show', Auth::User());
}
public function destroy(User $user)
{
$user->delete();
Notification::send($user, new NotifiUserVerified([
'subject' => 'Library - konto usunięte',
'title' => 'Twoje konto zostało skasowane.',
'description' => 'Twoje konto zostało usunięte przez naruszenie regulaminu. W celu zapozanania się z powodem usunięcia konta skontaktuj się z administracją.',
]));
return redirect()->route('admin.show', Auth::User());
}
}

View File

@ -74,13 +74,13 @@ class RegisterController extends Controller
'password' => bcrypt($data['password']),
]);
if ($request->avatar_rating > 6) {
if ($data['avatar_rating'] > 6) {
$user->update([
'user_verified_at' => now(),
]);
}
if ($request->avatar_rating && $request->avatar_rating <= 6) {
if ($data['avatar_rating'] && $data['avatar_rating'] <= 6) {
$user->update([
'user_verified_at' => null,
]);

View File

@ -51,6 +51,7 @@ class Kernel extends HttpKernel
* @var array
*/
protected $routeMiddleware = [
'AdminPermission' => \App\Http\Middleware\AdminPermission::class,
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,

View File

@ -0,0 +1,21 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class AdminPermission
{
/**
* Handle an incoming request.
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!Auth::check() || Auth::user()->admin !== 1) {
abort(403, 'Access denied');
}
return $next($request);
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Auth;
class NotifiUserVerified extends Notification
{
use Queueable;
private $content;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($content)
{
$this->content = $content;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
$user = Auth::user()->name;
return (new MailMessage)
->subject($this->content['subject'])
->greeting($user . ' - ' . $this->content['title'])
->line($this->content['description'])
->action('Przejdź do strony', url('/'))
->line('Dziękujemy za używanie naszej aplikacji!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
'message' => $this->content['name'] . ' add You to follow',
];
}
}

View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNotificationsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('notifications', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('type');
$table->morphs('notifiable');
$table->text('data');
$table->timestamp('read_at')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('notifications');
}
}

View File

@ -9,6 +9,7 @@
// Sections
@import 'global.scss';
@import 'sections/admin.scss';
@import 'sections/book.scss';
@import 'sections/books.scss';
@import 'sections/comments.scss';

View File

@ -0,0 +1,14 @@
.admin{
.users{
.user{
img{
width: 100%;
}
&:not(:last-child){
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
}
}
}
}

View File

@ -0,0 +1,14 @@
@extends('layouts.app')
@section('content')
<section id="user">
<div class="container">
<div class="row">
<div class="col-12">
@yield('admin-content')
</div>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,143 @@
@extends('admin.layout')
@section('admin-content')
<div class="card admin">
<div class="card-header">Użytkownicy niezaakceptowani</div>
<div class="card-body users">
<div class="row">
<div class="col-md-4">
<p>Zdjęcie</p>
</div>
<div class="col-md-2">
<p>Ocena zdjęcia</p>
</div>
<div class="col-md-2">
<p>Imię i nazwisko</p>
</div>
<div class="col-md-2">
<p>Utworzono</p>
</div>
<div class="col-md-2">
<p>Czynność</p>
</div>
@if(count($unacceptableUsers))
@foreach($unacceptableUsers as $unacceptableUser)
<div class="col-12 user">
<div class="row">
<div class="col-md-4">
<a href="{{ route('user.show', $unacceptableUser) }}">
<img src="{{ url(Storage::url($unacceptableUser->avatar)) }}" alt="">
</a>
</div>
<div class="col-md-2">
<p>{{ $unacceptableUser->avatar_rating }}</p>
</div>
<div class="col-md-2">
<a href="{{ route('user.show', $unacceptableUser) }}">
<p>{{ $unacceptableUser->name }}</p>
</a>
</div>
<div class="col-md-2">
<p>{{ $unacceptableUser->created_at }}</p>
</div>
<div class="col-md-2">
<div class="float-left">
<form action="{{ route('admin.accept', $unacceptableUser) }}"
method="POST" enctype="multipart/form-data">
{{csrf_field()}}
{{method_field('POST')}}
<input type="hidden" value="1"
name="accept" class="form-control comment-input">
<button type="submit" class="btn btn-primary btn-sm pull-right">Akceptuj
</button>
</form>
</div>
<form class="float-right destroy-comment"
action="{{ route('admin.destroy', $unacceptableUser) }}"
method="POST"
enctype="multipart/form-data">
{{csrf_field()}}
{{method_field('DELETE')}}
<button type="submit">Usuń</button>
</form>
</div>
</div>
</div>
@endforeach
@else
<div class="col-md-12">
<p class="no-margin">Brak użytkowników</p>
</div>
@endif
</div>
</div>
</div>
<div class="card admin mt-5">
<div class="card-header">Użytkownicy zaakceptowani</div>
<div class="card-body users">
<div class="row">
<div class="col-md-4">
<p>Zdjęcie</p>
</div>
<div class="col-md-2">
<p>Ocena zdjęcia</p>
</div>
<div class="col-md-2">
<p>Imię i nazwisko</p>
</div>
<div class="col-md-2">
<p>Utworzono</p>
</div>
<div class="col-md-2">
<p>Czynność</p>
</div>
@if(count($acceptableUsers))
@foreach($acceptableUsers as $acceptableUser)
<div class="col-12 user">
<div class="row">
<div class="col-md-4">
<a href="{{ route('user.show', $acceptableUser) }}">
<img src="{{ url(Storage::url($acceptableUser->avatar)) }}" alt="">
</a>
</div>
<div class="col-md-2">
<p>{{ $acceptableUser->avatar_rating }}</p>
</div>
<div class="col-md-2">
<a href="{{ route('user.show', $acceptableUser) }}">
<p>{{ $acceptableUser->name }}</p>
</a>
</div>
<div class="col-md-2">
<p>{{ $acceptableUser->created_at }}</p>
</div>
<div class="col-md-2">
<form class="float-left" action="{{ route('admin.deactivate', $acceptableUser) }}"
method="POST" enctype="multipart/form-data">
{{csrf_field()}}
{{method_field('PATCH')}}
<button type="submit" class="btn btn-primary btn-sm pull-right">Degraduj
</button>
</form>
<form class="float-right destroy-comment"
action="{{ route('admin.destroy', $acceptableUser) }}"
method="POST"
enctype="multipart/form-data">
{{csrf_field()}}
{{method_field('DELETE')}}
<button type="submit">Usuń</button>
</form>
</div>
</div>
</div>
@endforeach
@else
<div class="col-md-12">
<p class="no-margin">Brak użytkowników</p>
</div>
@endif
</div>
</div>
</div>
@endsection

View File

@ -48,7 +48,7 @@
@else
@if (Auth::user()->admin)
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">Panel admina</a>
<a class="nav-link" href="{{ route('admin.show', Auth::user()) }}">Panel admina</a>
</li>
@endif
<li class="nav-item {{ Auth::user()->user_verified_at ? null : 'not-verified' }}">

View File

@ -7,7 +7,7 @@
@endsection
@section('user-content')
<div class="card comments">
<div class="card">
<div class="card-header">Edytuj profil</div>
<div class="card-body books">
<div class="row">

View File

@ -1,7 +1,7 @@
@extends('user.layout')
@section('user-content')
<div class="card comments">
<div class="card">
<div class="card-header">Książki</div>
<div class="card-body books">
<div class="row">

View File

@ -15,6 +15,13 @@ Auth::routes();
Route::get('/', 'HomeController@index')->name('home');
Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () {
Route::get('/{user}', 'AdminController@show')->name('show');
Route::delete('/{user}', 'AdminController@destroy')->name('destroy');
Route::post('/{user}', 'AdminController@accept')->name('accept');
Route::patch('/{user}', 'AdminController@deactivate')->name('deactivate');
});
Route::group(['prefix' => 'user', 'as' => 'user.'], function () {
Route::get('/{user}', 'UserController@show')->name('show');
Route::patch('/{user}', 'UserController@update')->name('update');