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 }}

+