Dodano panel administratora oraz oraz powiadomienia mailowe.
This commit is contained in:
parent
b709b66655
commit
c7fb23bedd
71
Library/app/Http/Controllers/AdminController.php
Normal file
71
Library/app/Http/Controllers/AdminController.php
Normal 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());
|
||||
}
|
||||
}
|
@ -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,
|
||||
]);
|
||||
|
@ -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,
|
||||
|
21
Library/app/Http/Middleware/AdminPermission.php
Normal file
21
Library/app/Http/Middleware/AdminPermission.php
Normal 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);
|
||||
}
|
||||
}
|
68
Library/app/Notifications/NotifiUserVerified.php
Normal file
68
Library/app/Notifications/NotifiUserVerified.php
Normal 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',
|
||||
];
|
||||
}
|
||||
}
|
@ -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');
|
||||
}
|
||||
}
|
1
Library/resources/sass/app.scss
vendored
1
Library/resources/sass/app.scss
vendored
@ -9,6 +9,7 @@
|
||||
|
||||
// Sections
|
||||
@import 'global.scss';
|
||||
@import 'sections/admin.scss';
|
||||
@import 'sections/book.scss';
|
||||
@import 'sections/books.scss';
|
||||
@import 'sections/comments.scss';
|
||||
|
14
Library/resources/sass/sections/admin.scss
vendored
Normal file
14
Library/resources/sass/sections/admin.scss
vendored
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
14
Library/resources/views/admin/layout.blade.php
Normal file
14
Library/resources/views/admin/layout.blade.php
Normal 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
|
143
Library/resources/views/admin/show.blade.php
Normal file
143
Library/resources/views/admin/show.blade.php
Normal 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
|
||||
|
@ -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' }}">
|
||||
|
@ -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">
|
||||
|
@ -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">
|
||||
|
@ -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');
|
||||
|
Loading…
Reference in New Issue
Block a user