From e29ab0cde823a62e1afde4b29f9ee3d25ac4e50e Mon Sep 17 00:00:00 2001 From: Htet Phone Aung Date: Sun, 24 Sep 2023 22:24:08 +0630 Subject: [PATCH] adding genres to the manga --- app/Http/Controllers/GenreController.php | 49 ++++++++++++++- app/Http/Controllers/MangaController.php | 33 +++++++--- app/Http/Controllers/PageController.php | 20 +----- app/Http/Middleware/AdminAccess.php | 2 +- app/Http/Requests/StoreMangaRequest.php | 6 +- app/Http/Requests/UpdateMangaRequest.php | 6 +- app/Models/Genre.php | 8 +++ app/Models/Manga.php | 21 ++++++- app/Models/User.php | 5 ++ ..._09_23_092634_create_genre_manga_table.php | 27 ++++++++ .../views/components/inner-manga.blade.php | 18 ++++-- .../views/components/latest-chapter.blade.php | 2 +- .../views/components/manga-list.blade.php | 14 ++++- resources/views/genres/create.blade.php | 17 ++++++ resources/views/genres/edit.blade.php | 20 ++++++ resources/views/genres/index.blade.php | 61 +++++++++++++++++++ resources/views/layouts/app.blade.php | 1 + resources/views/manga.blade.php | 2 +- resources/views/manga/create.blade.php | 18 +++++- resources/views/manga/detail.blade.php | 11 +++- resources/views/manga/edit.blade.php | 32 ++++++++-- .../views/partials/chapter-paginate.blade.php | 14 ++--- .../partials/chapter-select-box.blade.php | 6 +- resources/views/partials/discussion.blade.php | 2 +- resources/views/partials/hot-manga.blade.php | 4 +- resources/views/partials/side-bar.blade.php | 36 +++++++---- resources/views/user/index.blade.php | 10 ++- routes/web.php | 21 +++++-- 28 files changed, 384 insertions(+), 82 deletions(-) create mode 100644 database/migrations/2023_09_23_092634_create_genre_manga_table.php create mode 100644 resources/views/genres/create.blade.php create mode 100644 resources/views/genres/edit.blade.php create mode 100644 resources/views/genres/index.blade.php diff --git a/app/Http/Controllers/GenreController.php b/app/Http/Controllers/GenreController.php index b11a546..3e37a50 100644 --- a/app/Http/Controllers/GenreController.php +++ b/app/Http/Controllers/GenreController.php @@ -2,9 +2,56 @@ namespace App\Http\Controllers; +use App\Models\Genre; use Illuminate\Http\Request; class GenreController extends Controller { - // + public function index() + { + $genres = Genre::latest()->paginate(10)->withQueryString(); + return view('genres.index', compact('genres')); + } + + public function create() + { + return view('genres.create'); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|min:1|max:255|unique:genres,name' + ], [ + 'name.required' => 'Genre name is required' + ]); + + $request->user()->genres()->create($request->only('name')); + return back()->with(['message' => 'New genre has been added!!']); + } + + public function edit(Genre $genre) + { + return view('genres.edit',['genre' => $genre]); + } + + public function update(Request $request, Genre $genre) + { + $request->validate([ + 'name' => 'required|min:1|max:255|unique:genres,name,'.$genre->id + ],[ + 'name.required' => 'Genre field is required!', + 'name.unique' => 'Genre already exists!' + + ]); + + $genre->update(['name' => $request->name]); + return redirect()->route('genres.index')->with(['message' => 'Genre has been updated!']); + } + + public function destroy(Genre $genre) + { + $genre->delete(); + return back()->with(['message' => 'Genre has been deleted']); + } } diff --git a/app/Http/Controllers/MangaController.php b/app/Http/Controllers/MangaController.php index 1fc104e..0124ff6 100644 --- a/app/Http/Controllers/MangaController.php +++ b/app/Http/Controllers/MangaController.php @@ -8,6 +8,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Requests\StoreMangaRequest; use App\Http\Requests\UpdateMangaRequest; +use App\Models\Genre; use Illuminate\Support\Facades\Request as FacadesRequest; class MangaController extends Controller @@ -17,13 +18,13 @@ class MangaController extends Controller */ public function index() { - $mangas = Manga::when(auth()->user()->role != 'admin', function($q) { + $mangas = Manga::when(auth()->user()->role != 'admin', function ($q) { $user_id = auth()->id(); $q->where('author_id', $user_id); }) - ->latest('id') - ->paginate(10) - ->withQueryString(); + ->latest('id') + ->paginate(10) + ->withQueryString(); return view('manga.index', compact('mangas')); } @@ -32,7 +33,8 @@ class MangaController extends Controller */ public function create() { - return view('manga.create'); + $genres = Genre::latest('id')->get(); + return view('manga.create', ['genres' => $genres]); } /** @@ -47,9 +49,14 @@ class MangaController extends Controller if ($request->hasFile('cover')) { $formData['cover'] = $request->file('cover')->store('covers', 'public'); } - Manga::create($formData); - + //genres + $genres = []; + foreach ($request->genres as $genre) { + $genres[] = $genre; + } + $manga = Manga::latest()->first(); + $manga->genres()->attach($genres); return redirect()->route('manga.index')->with(['message' => 'A New Manga is created']); } @@ -68,7 +75,7 @@ class MangaController extends Controller public function edit(Manga $manga) { $this->authorize('update', $manga); - + // dd($manga->genres->contains('id','1')); return view('manga.edit', compact('manga')); } @@ -85,8 +92,15 @@ class MangaController extends Controller if ($request->hasFile('cover')) { $formData['cover'] = $request->file('cover')->store('covers', 'public'); } - $manga->update($formData); + //adding data to medium table for many to many rs + if ($request->genres) { + $genres = []; + foreach ($request->genres as $genre) { + $genres[] = $genre; + } + $manga->genres()->sync($genres); + } return redirect()->back()->with(['message' => 'Manga has been updated!']); } @@ -100,5 +114,4 @@ class MangaController extends Controller $manga->delete(); return redirect()->back()->with(['message' => 'Manga has been deleted!']); } - } diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 7655824..0ea51c4 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -29,35 +29,21 @@ class PageController extends Controller $chapters = $manga->chapters() ->latest('chapter_no') ->paginate(10); - $firstChapter = $manga->chapters() - ->orderBy('chapter_no', 'asc')->first(); - $lastChapter = $manga->chapters() - ->latest('chapter_no') - ->first(); $hotMangas = Manga::with(['chapters']) ->latest('id')->limit('3')->get(); return view('manga',[ 'manga' => $manga, - 'hotMangas' => $hotMangas, 'chapters' => $chapters, - 'firstChapter' => $firstChapter, - 'lastChapter' => $lastChapter + 'hotMangas' => $hotMangas, ]); } public function chapter(Manga $manga,Chapter $chapter) { - $firstChapter = $manga->chapters() - ->orderBy('chapter_no', 'asc') - ->first(); - $lastChapter = $manga->chapters() - ->latest('chapter_no') - ->first(); return view('chapter_page', [ - 'chapter' => $chapter, 'manga' => $manga, - 'firstChapter' => $firstChapter, - 'lastChapter' => $lastChapter + 'chapter' => $chapter, + 'comments' => $chapter->comments()->latest('id')->get() ]); } diff --git a/app/Http/Middleware/AdminAccess.php b/app/Http/Middleware/AdminAccess.php index 2d019d2..4af1ffc 100644 --- a/app/Http/Middleware/AdminAccess.php +++ b/app/Http/Middleware/AdminAccess.php @@ -18,7 +18,7 @@ class AdminAccess { //prevent normal users form accessing admin dashboard if(Auth::user()) { - if(Auth::user()->role == "user") { + if(Auth::user()->role === "user") { return redirect()->route('page.index')->with(['message' => 'You are not an admin!!']); } } diff --git a/app/Http/Requests/StoreMangaRequest.php b/app/Http/Requests/StoreMangaRequest.php index 17e453e..265c531 100644 --- a/app/Http/Requests/StoreMangaRequest.php +++ b/app/Http/Requests/StoreMangaRequest.php @@ -24,7 +24,8 @@ class StoreMangaRequest extends FormRequest return [ 'title' => 'required|min:3|max:100', 'summary' => 'required|min:3', - 'cover' => 'file|required|mimes:png,jpg' + 'cover' => 'file|required|mimes:png,jpg', + 'genres' => 'required' ]; } @@ -32,7 +33,8 @@ class StoreMangaRequest extends FormRequest public function messages() { return [ - 'cover.required' => 'Please Select Cover Image' + 'cover.required' => 'Please Select Cover Image', + 'genres.required' => 'A single genre is requied at least' ]; } } diff --git a/app/Http/Requests/UpdateMangaRequest.php b/app/Http/Requests/UpdateMangaRequest.php index 13a6ff9..e184beb 100644 --- a/app/Http/Requests/UpdateMangaRequest.php +++ b/app/Http/Requests/UpdateMangaRequest.php @@ -24,7 +24,8 @@ class UpdateMangaRequest extends FormRequest return [ 'title' => 'required|min:3', 'summary' => 'required|min:3|max:2000', - 'cover' => 'file|required|mimes:png,jpg' + 'cover' => 'file|mimes:png,jpg', + 'genres' => 'required' ]; } @@ -32,7 +33,8 @@ class UpdateMangaRequest extends FormRequest public function messages() { return [ - 'cover.required' => 'Please Select Cover Image' + 'cover.required' => 'Please Select Cover Image', + 'genres.required' => 'A single genre is requied at least' ]; } } diff --git a/app/Models/Genre.php b/app/Models/Genre.php index 91b1725..c8e2cfe 100644 --- a/app/Models/Genre.php +++ b/app/Models/Genre.php @@ -8,4 +8,12 @@ use Illuminate\Database\Eloquent\Model; class Genre extends Model { use HasFactory; + + protected $fillable = ['name', 'user_id']; + + public function manga() + { + return $this->belongsToMany(Manga::class); + } } + diff --git a/app/Models/Manga.php b/app/Models/Manga.php index 0650d24..a1b4a5c 100644 --- a/app/Models/Manga.php +++ b/app/Models/Manga.php @@ -11,7 +11,6 @@ class Manga extends Model protected $fillable = ['title', 'slug', 'summary', 'excerpt', 'cover', 'author_id']; - public function user() { return $this->belongsTo(User::class, 'author_id'); @@ -21,4 +20,24 @@ class Manga extends Model { return $this->hasMany(Chapter::class); } + + //latest and oldest chapter + // public function latestChap() + // { + // return $this->chapters()->one()->latestOfMany(); + // } + public function lastChap() + { + return $this->chapters()->one()->ofMany('chapter_no', 'max'); + } + + public function firstChap() + { + return $this->chapters()->one()->ofMany('chapter_no', 'min'); + } + + public function genres() + { + return $this->belongsToMany(Genre::class); + } } diff --git a/app/Models/User.php b/app/Models/User.php index b2014aa..0396784 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -57,4 +57,9 @@ class User extends Authenticatable { return $this->hasMany(Reply::class); } + + public function genres() + { + return $this->hasMany(Genre::class); + } } diff --git a/database/migrations/2023_09_23_092634_create_genre_manga_table.php b/database/migrations/2023_09_23_092634_create_genre_manga_table.php new file mode 100644 index 0000000..b892c70 --- /dev/null +++ b/database/migrations/2023_09_23_092634_create_genre_manga_table.php @@ -0,0 +1,27 @@ +foreignId('genre_id')->constrained()->cascadeOnDelete(); + $table->foreignId('manga_id')->constrained()->cascadeOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('genre_manga'); + } +}; diff --git a/resources/views/components/inner-manga.blade.php b/resources/views/components/inner-manga.blade.php index e38bdd0..e2b6a7e 100644 --- a/resources/views/components/inner-manga.blade.php +++ b/resources/views/components/inner-manga.blade.php @@ -1,6 +1,7 @@ -@props(['manga', 'chapters', 'firstChapter', 'lastChapter']) +@props(['manga', 'chapters'])
{{ $manga->title }}
+
@@ -9,25 +10,32 @@

Author - {{ $manga->user->name }}

-

Genre -

+

+ Genre - + @foreach ($manga->genres as $genre) + {{$genre->name}} / + @endforeach +

- Read First - Read Last + Read First + Read Last

+
Summary

{{ $manga->summary }}

+
    Latest Chapter Release
    @forelse ($chapters as $chapter) -

    Chapter {{ $chapter->chapter_no }} - {{ $chapter->title ?? '' }}

    diff --git a/resources/views/components/latest-chapter.blade.php b/resources/views/components/latest-chapter.blade.php index 59b7615..1f67d17 100644 --- a/resources/views/components/latest-chapter.blade.php +++ b/resources/views/components/latest-chapter.blade.php @@ -1,7 +1,7 @@ @props(['manga', 'chapter'])
    - Chapter {{ $chapter->chapter_no }} diff --git a/resources/views/components/manga-list.blade.php b/resources/views/components/manga-list.blade.php index 372a75e..1f61567 100644 --- a/resources/views/components/manga-list.blade.php +++ b/resources/views/components/manga-list.blade.php @@ -1,6 +1,9 @@ @props(['mangas']) -
    Manga List
    +
    +
    Manga List
    + Create Manga +

    @@ -8,7 +11,8 @@ - + + @@ -21,6 +25,11 @@

    {{ $manga->title }}

    {{ $manga->excerpt }} + @@ -52,7 +61,6 @@ action="{{ route('manga.destroy', $manga->id) }}" class="d-inline-block"> @csrf @method('delete') - diff --git a/resources/views/genres/create.blade.php b/resources/views/genres/create.blade.php new file mode 100644 index 0000000..f2bfa94 --- /dev/null +++ b/resources/views/genres/create.blade.php @@ -0,0 +1,17 @@ +@extends('layouts.app') +@section('content') + +
    + @csrf +
    + + + @error('name') +

    {{ $message }}

    + @enderror +
    + + + +
    +@endsection diff --git a/resources/views/genres/edit.blade.php b/resources/views/genres/edit.blade.php new file mode 100644 index 0000000..61ae3a7 --- /dev/null +++ b/resources/views/genres/edit.blade.php @@ -0,0 +1,20 @@ +@extends('layouts.app') +@section('content') + +
    Edit Genre
    +
    +
    + @csrf + @method('PUT') +
    + + + @error('name') +

    {{ $message }}

    + @enderror +
    + + + +
    +@endsection diff --git a/resources/views/genres/index.blade.php b/resources/views/genres/index.blade.php new file mode 100644 index 0000000..624d0bc --- /dev/null +++ b/resources/views/genres/index.blade.php @@ -0,0 +1,61 @@ +@extends('layouts.app') + +@section('content') + +
    Genres List
    +
    +
    +
    # TitleAuthorGenreAuthor/Creator Total Chapters Handle
    + @foreach ($manga->genres as $genre) + {{$genre->name}} / + @endforeach + {{ $manga->user->name }}
    + + + + + + + + + + + @forelse ($genres as $key => $genre) + + + + + + + @empty + + + + + + @endforelse + +
    #Genre NameCreated_atOption
    {{ $key }} {{ $genre->name }} +

    + {{ $genre->created_at->format('H:i a') }}

    +

    + {{ $genre->created_at->format('d-m-Y') }}

    +
    +
    + +
    + @csrf + @method('DELETE') + +
    +
    +
    +
    +

    No genre Yet

    + + + +
    +
    +
    +
    + {{ $genres->links() }} +
    + +@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index f5f2a4c..ad6ff68 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -93,6 +93,7 @@
    + @include('components.footer') diff --git a/resources/views/manga.blade.php b/resources/views/manga.blade.php index 00d0f37..cf6deaf 100644 --- a/resources/views/manga.blade.php +++ b/resources/views/manga.blade.php @@ -6,7 +6,7 @@
    - +
    diff --git a/resources/views/manga/create.blade.php b/resources/views/manga/create.blade.php index 882612f..144d7b4 100644 --- a/resources/views/manga/create.blade.php +++ b/resources/views/manga/create.blade.php @@ -5,7 +5,7 @@ @csrf
    - + @error('title')

    {{ $message }}

    @enderror @@ -17,11 +17,24 @@

    {{ $message }}

    @enderror
    +
    + + @forelse ($genres as $genre) + + + + + @empty + @endforelse + @error('genres') +

    {{ $message }}

    + @enderror +
    @error('summary')

    {{ $message }}

    @@ -31,3 +44,4 @@ @endsection + diff --git a/resources/views/manga/detail.blade.php b/resources/views/manga/detail.blade.php index eccd634..7174842 100644 --- a/resources/views/manga/detail.blade.php +++ b/resources/views/manga/detail.blade.php @@ -2,12 +2,19 @@ @section('content')
    - Back + Home

    Title : {{ $manga->title }}


    -

    Cover Image :

    +

    + Genres : + @foreach ($manga->genres as $genre) + {{$genre->name}} / + @endforeach +

    +
    +

    Cover Image :

    diff --git a/resources/views/manga/edit.blade.php b/resources/views/manga/edit.blade.php index 31b01f1..6e6e238 100644 --- a/resources/views/manga/edit.blade.php +++ b/resources/views/manga/edit.blade.php @@ -1,7 +1,9 @@ @extends('layouts.app') @section('content') - Home + Home +
    +
    Editing Manga

    @csrf @@ -14,10 +16,28 @@ @enderror
    - - - + +
    + @foreach (App\Models\Genre::all() as $genre) + genres->contains('id', $genre->id) ? 'checked' : '' }}> + + @endforeach +
    + @error('genres') +

    {{ $message }}

    + @enderror
    + +
    + + + + @error('cover') +

    {{ $message }}

    + @enderror +
    +