diff --git a/app/Http/Controllers/VideoController.php b/app/Http/Controllers/VideoController.php new file mode 100644 index 0000000..e4b2792 --- /dev/null +++ b/app/Http/Controllers/VideoController.php @@ -0,0 +1,44 @@ +findOrFail($showId); + return view('shows.videos', compact('show')); + } + + public function store(Request $request, $showId) + { + $request->validate([ + 'title' => 'required|max:255', + 'video_url' => 'required|url|unique:videos,video_url', + ]); + + $show = Show::findOrFail($showId); + + if ($show->representations->isEmpty()) { + return redirect()->back()->withErrors(['error' => 'pas de representation pour ce show']); + } + + $video = new Video($request->all()); + $video->show_id = $showId; + $video->save(); + + return redirect()->route('show.videos', $showId); + } + public function showArtistVideos($name) + { + $artist = Artist::where('name', $name)->firstOrFail(); + $shows = $artist->shows()->with('videos')->get(); + + return view('artists.videos', compact('artist', 'shows')); + } +} diff --git a/app/Models/Show.php b/app/Models/Show.php index 6013c1a..5f5268e 100644 --- a/app/Models/Show.php +++ b/app/Models/Show.php @@ -31,7 +31,11 @@ public function representations() { return $this->hasMany(Representation::class); } - + // relation video examen + public function videos() + { + return $this->hasMany(Video::class); + } public function location() { return $this->belongsTo(Location::class); diff --git a/app/Models/Video.php b/app/Models/Video.php new file mode 100644 index 0000000..0ae3082 --- /dev/null +++ b/app/Models/Video.php @@ -0,0 +1,18 @@ +belongsTo(Show::class); + } +} diff --git a/app/Policies/AdminPolicy.php b/app/Policies/AdminPolicy.php index bbb0902..5373ad4 100644 --- a/app/Policies/AdminPolicy.php +++ b/app/Policies/AdminPolicy.php @@ -4,9 +4,20 @@ use App\Models\User; use Illuminate\Auth\Access\Response; - +use Illuminate\Auth\Access\HandlesAuthorization; +use Illuminate\Support\Facades\Log; class AdminPolicy { + + public function admin(User $user) + { + return $user->isAdmin() + ? Response::allow() + : Response::deny('Vous devez être administrateur pour ajouter une video'); + + Log::info('User is admin'); + } + /** * Determine whether the user can view any models. */ diff --git a/database/migrations/2024_05_31_074314_create_videos_table.php b/database/migrations/2024_05_31_074314_create_videos_table.php new file mode 100644 index 0000000..bec1d1d --- /dev/null +++ b/database/migrations/2024_05_31_074314_create_videos_table.php @@ -0,0 +1,30 @@ +id(); + $table->string('title', 255); + $table->string('video_url', 255)->unique(); + $table->foreignId('show_id')->constrained()->onUpdate('cascade')->onDelete('restrict'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('videos'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d3986b0..babe3e2 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -38,6 +38,8 @@ public function run(): void ReviewSeeder::class, TagSeeder::class, ShowTagSeeder::class, + VideoSeeder::class, + ]); } } diff --git a/database/seeders/VideoSeeder.php b/database/seeders/VideoSeeder.php new file mode 100644 index 0000000..2f2bd2f --- /dev/null +++ b/database/seeders/VideoSeeder.php @@ -0,0 +1,26 @@ + 'Tintin Video', + 'video_url' => 'https://youtu.be/ERA14Xjjtlk', + 'show_id' => $show->id, + ]); + } +} diff --git a/public/posters/dd.png b/public/posters/dd.png deleted file mode 100644 index 1355996..0000000 Binary files a/public/posters/dd.png and /dev/null differ diff --git a/resources/views/artists/videos.blade.php b/resources/views/artists/videos.blade.php new file mode 100644 index 0000000..00c12c4 --- /dev/null +++ b/resources/views/artists/videos.blade.php @@ -0,0 +1,18 @@ + +

Vidéos des spectacles de {{ $artist->name }}

+ + @foreach ($shows as $show) +

{{ $show->title }}

+ @if ($show->videos->isEmpty()) +

Aucune vidéo pour ce spectacle.

+ @else + @foreach ($show->videos as $video) +
+

{{ $video->title }}

+ +
+ @endforeach + @endif + @endforeach +
+ diff --git a/resources/views/show/show.blade.php b/resources/views/show/show.blade.php index 27b330a..87faa3b 100644 --- a/resources/views/show/show.blade.php +++ b/resources/views/show/show.blade.php @@ -9,6 +9,9 @@ class="text-indigo-600 font-semibold text-sm dark:text-indigo-400 hover:text-ind Retour +
+

{{ $show->title }}

+
@if ($show->poster_url) @@ -16,6 +19,27 @@ class="text-indigo-600 font-semibold text-sm dark:text-indigo-400 hover:text-ind class="object-cover w-full h-auto"> @endif
+

{{ $show->title }} - Videos

+ + @if ($show->videos->isEmpty()) +

Aucune vidéo pour ce spectacle.

+ @else + @foreach ($show->videos as $video) +
+

{{ $video->title }}

+ +
+ @endforeach + @endif + + @can('addTag', App\Models\Tag::class) +
+ @csrf + + + +
+ @endcan

{{ $show->title }}

@@ -108,7 +132,8 @@ class="text-indigo-600 font-semibold text-sm dark:text-indigo-400 hover:text-ind Réserver @else - Non réservable + Non + réservable @endif @@ -128,4 +153,3 @@ class="text-indigo-600 font-semibold text-sm dark:text-indigo-400 hover:text-ind
- diff --git a/resources/views/show/videos.blade.php b/resources/views/show/videos.blade.php new file mode 100644 index 0000000..b8bac1a --- /dev/null +++ b/resources/views/show/videos.blade.php @@ -0,0 +1,25 @@ + + +

{{ $show->title }} - Videos

+ + @if ($show->videos->isEmpty()) +

Aucune vidéo pour ce spectacle.

+ @else + @foreach ($show->videos as $video) +
+

{{ $video->title }}

+ +
+ @endforeach + @endif + + @can('admin') +
+ @csrf + + + +
+ @endcan +
+ diff --git a/routes/web.php b/routes/web.php index fce9c04..89cdaa1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,6 +18,17 @@ use App\Http\Controllers\ScheduleController; use App\Http\Controllers\Admin\AdminRepresentationController; use App\Http\Controllers\ContactFormController; +use App\Http\Controllers\VideoController; +/* +|-------------------------------------------------------------------------- +| Routes Video - Examen +|-------------------------------------------------------------------------- +*/ +Route::get('show/{showId}/videos', [VideoController::class, 'showVideos'])->name('show.videos'); +Route::post('show/{showId}/videos', [VideoController::class, 'store'])->middleware('can:admin')->name('video.store'); + +Route::get('artist/{name}/videos', [VideoController::class, 'showArtistVideos'])->name('artist.videos'); + /* |-------------------------------------------------------------------------- | Routes home