From 392a9b9a6281e50e89c50add5329c43e6ec9a6a4 Mon Sep 17 00:00:00 2001 From: a231995gn <a231995gn@h32.informatica.escoladeltreball.org> Date: Wed, 5 Mar 2025 17:40:15 +0100 Subject: [PATCH] feat: films logic and view --- app/Http/Controllers/FilmsController.php | 19 +++ app/Models/Film.php | 34 ++++ app/Models/User.php | 44 ----- aq | 24 +++ .../2014_10_12_000000_create_users_table.php | 36 ---- .../2025_02_19_182924_create_films_table.php | 42 +++++ database/seeders/DatabaseSeeder.php | 15 +- database/seeders/FilmsSeeder.php | 51 ++++++ docs/diagrams/gen.sh | 4 + docs/diagrams/netflix_er.dot | 85 ++++++++++ docs/diagrams/netflix_er.png | Bin 0 -> 40378 bytes docs/diagrams/netflix_er.svg | 155 ++++++++++++++++++ resources/views/film.blade.php | 21 +++ resources/views/home.blade.php | 35 ++++ resources/views/layouts/app.blade.php | 83 ++++++++++ routes/web.php | 12 +- 16 files changed, 562 insertions(+), 98 deletions(-) create mode 100644 app/Http/Controllers/FilmsController.php create mode 100644 app/Models/Film.php delete mode 100644 app/Models/User.php create mode 100644 aq delete mode 100644 database/migrations/2014_10_12_000000_create_users_table.php create mode 100644 database/migrations/2025_02_19_182924_create_films_table.php create mode 100644 database/seeders/FilmsSeeder.php create mode 100755 docs/diagrams/gen.sh create mode 100644 docs/diagrams/netflix_er.dot create mode 100644 docs/diagrams/netflix_er.png create mode 100644 docs/diagrams/netflix_er.svg create mode 100644 resources/views/film.blade.php create mode 100644 resources/views/home.blade.php create mode 100644 resources/views/layouts/app.blade.php diff --git a/app/Http/Controllers/FilmsController.php b/app/Http/Controllers/FilmsController.php new file mode 100644 index 00000000..c44901e0 --- /dev/null +++ b/app/Http/Controllers/FilmsController.php @@ -0,0 +1,19 @@ +<?php + +namespace App\Http\Controllers; + +use Illuminate\Http\Request; +use App\Models\Film; + +class FilmsController extends Controller { + public function index() { + $filmsSciFi = Film::where("genre", "Sci-Fi")->get(); + $filmsDrama = Film::where("genre", "Drama")->get(); + return view("home", compact("filmsSciFi", "filmsDrama")); + } + + public function show($id) { + $film = Film::findOrFail($id); + return view("film", compact("film")); + } +} \ No newline at end of file diff --git a/app/Models/Film.php b/app/Models/Film.php new file mode 100644 index 00000000..6e6e45f7 --- /dev/null +++ b/app/Models/Film.php @@ -0,0 +1,34 @@ +<?php + +namespace App\Models; + +use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; + +class Film extends Model +{ + use HasFactory; + + protected $fillable = [ + "genre", + "director", + "sinopsis", + "duration", + "year", + "casting", + "image", + "recommended_id" + ]; + + protected $casts = [ + "casting" => "array" + ]; + + public function recommendedFilm() { + return $this->belongsTo(Film::class, "recommended_id"); + } + + public function recommendedBy() { + return $this->hasMany(Film::class, "recommended_id"); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php deleted file mode 100644 index 23b40634..00000000 --- a/app/Models/User.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -namespace App\Models; - -// use Illuminate\Contracts\Auth\MustVerifyEmail; -use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Foundation\Auth\User as Authenticatable; -use Illuminate\Notifications\Notifiable; -use Laravel\Sanctum\HasApiTokens; - -class User extends Authenticatable -{ - use HasApiTokens, HasFactory, Notifiable; - - /** - * The attributes that are mass assignable. - * - * @var array<int, string> - */ - protected $fillable = [ - 'name', - 'email', - 'password', - ]; - - /** - * The attributes that should be hidden for serialization. - * - * @var array<int, string> - */ - protected $hidden = [ - 'password', - 'remember_token', - ]; - - /** - * The attributes that should be cast. - * - * @var array<string, string> - */ - protected $casts = [ - 'email_verified_at' => 'datetime', - ]; -} diff --git a/aq b/aq new file mode 100644 index 00000000..d684d6f4 --- /dev/null +++ b/aq @@ -0,0 +1,24 @@ +[33m52320bf[m[33m ([m[1;36mHEAD -> [m[1;32m6-view-listmovies[m[33m, [m[1;31morigin/main[m[33m, [m[1;31morigin/6-view-listmovies[m[33m)[m HEAD@{0}: checkout: moving from feature/films to 6-view-listmovies +[33mb64c149[m[33m ([m[1;32mfeature/films[m[33m)[m HEAD@{1}: checkout: moving from feature/films to feature/films +[33mb64c149[m[33m ([m[1;32mfeature/films[m[33m)[m HEAD@{2}: checkout: moving from 6-view-listmovies to feature/films +[33m52320bf[m[33m ([m[1;36mHEAD -> [m[1;32m6-view-listmovies[m[33m, [m[1;31morigin/main[m[33m, [m[1;31morigin/6-view-listmovies[m[33m)[m HEAD@{3}: checkout: moving from 24-layout to 6-view-listmovies +[33m6612e64[m[33m ([m[1;31morigin/24-layout[m[33m, [m[1;32m24-layout[m[33m)[m HEAD@{4}: commit: done +[33m52320bf[m[33m ([m[1;36mHEAD -> [m[1;32m6-view-listmovies[m[33m, [m[1;31morigin/main[m[33m, [m[1;31morigin/6-view-listmovies[m[33m)[m HEAD@{5}: checkout: moving from films to 24-layout +[33m8ad5b6c[m[33m ([m[1;31morigin/films[m[33m, [m[1;32mfilms[m[33m)[m HEAD@{6}: checkout: moving from 22-create_upload_dir_and_upload_form to films +[33m017ef6e[m[33m ([m[1;31morigin/22-create_upload_dir_and_upload_form[m[33m, [m[1;32m22-create_upload_dir_and_upload_form[m[33m)[m HEAD@{7}: commit: done +[33mfe28a40[m HEAD@{8}: checkout: moving from main to 22-create_upload_dir_and_upload_form +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{9}: reset: moving to HEAD +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{10}: reset: moving to HEAD +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{11}: checkout: moving from create_upload_dir_and_upload_form to main +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{12}: Branch: renamed refs/heads/feature/create_upload_dir to refs/heads/create_upload_dir_and_upload_form +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{14}: checkout: moving from main to feature/create_upload_dir +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{15}: checkout: moving from films to main +[33m8ad5b6c[m[33m ([m[1;31morigin/films[m[33m, [m[1;32mfilms[m[33m)[m HEAD@{16}: commit: test +[33m8961381[m HEAD@{17}: commit (merge): Fusionando feature/films en films +[33m39eb140[m[33m ([m[1;31morigin/6-view-listmovies-3[m[33m)[m HEAD@{18}: checkout: moving from feature/films to films +[33mb64c149[m[33m ([m[1;32mfeature/films[m[33m)[m HEAD@{19}: checkout: moving from feature/films to feature/films +[33mb64c149[m[33m ([m[1;32mfeature/films[m[33m)[m HEAD@{20}: checkout: moving from films to feature/films +[33m39eb140[m[33m ([m[1;31morigin/6-view-listmovies-3[m[33m)[m HEAD@{21}: checkout: moving from feature/films to films +[33mb64c149[m[33m ([m[1;32mfeature/films[m[33m)[m HEAD@{22}: commit: Saving in stage +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{23}: checkout: moving from main to feature/films +[33m74d1464[m[33m ([m[1;31morigin/feature/films[m[33m, [m[1;31morigin/create_upload_dir_and_upload_form[m[33m, [m[1;32mrm[m[33m, [m[1;32mmain[m[33m, [m[1;32mcreate_upload_dir_and_upload_form[m[33m)[m HEAD@{24}: clone: from https://gitlab.inf.edt.cat/daw/m7/laravel/laravel-9.0.git diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php deleted file mode 100644 index cf6b7766..00000000 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -use Illuminate\Database\Migrations\Migration; -use Illuminate\Database\Schema\Blueprint; -use Illuminate\Support\Facades\Schema; - -return new class extends Migration -{ - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('users', function (Blueprint $table) { - $table->id(); - $table->string('name'); - $table->string('email')->unique(); - $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); - $table->rememberToken(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('users'); - } -}; diff --git a/database/migrations/2025_02_19_182924_create_films_table.php b/database/migrations/2025_02_19_182924_create_films_table.php new file mode 100644 index 00000000..f18e0642 --- /dev/null +++ b/database/migrations/2025_02_19_182924_create_films_table.php @@ -0,0 +1,42 @@ +<?php + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('films', function (Blueprint $table) { + $table->id(); + $table->string('title'); + $table->string('genre'); + $table->string('director'); + $table->text('sinopsis'); + $table->integer('duration'); // minutes + $table->year('year'); + $table->json('casting'); + $table->string("image")->nullable(); + $table->unsignedBigInteger('recommended_id')->nullable(); + $table->timestamps(); + + $table->foreign("recommended_id")->references("id")->on("films")->onDelete("set null"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('films'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 76d96dc7..1d61543f 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,7 +2,6 @@ namespace Database\Seeders; -// use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder @@ -12,13 +11,9 @@ class DatabaseSeeder extends Seeder * * @return void */ - public function run() - { - // \App\Models\User::factory(10)->create(); - - // \App\Models\User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', - // ]); + public function run() { + $this->call([ + FilmsSeeder::class + ]); } -} +} \ No newline at end of file diff --git a/database/seeders/FilmsSeeder.php b/database/seeders/FilmsSeeder.php new file mode 100644 index 00000000..cb006223 --- /dev/null +++ b/database/seeders/FilmsSeeder.php @@ -0,0 +1,51 @@ +<?php + +namespace Database\Seeders; + +use Illuminate\Database\Console\Seeds\WithoutModelEvents; +use Illuminate\Database\Seeder; +use App\Models\Film; + +class FilmsSeeder extends Seeder +{ + /** + * Run the database seeds. + * + * @return void + */ + public function run() { + $film1 = Film::create([ + "title" => "Inception", + "genre" => "Sci-Fi", + "director" => "Christopher Nolan", + "sinopsis" => "A thief who enters the dreams of others to steal secrets.", + "duration" => 148, + "year" => 2010, + "casting" => json_encode(["Leonardo DiCaprio", "Joseph Gordon-Levitt", "Elliot Page"]), + "image" => "inception.jpg" + ]); + + $film2 = Film::create([ + "title" => "Interstellar", + "genre" => "Sci-Fi", + "director" => "Christopher Nolan", + "sinopsis" => "A team of explorers travel through a wormhole in space.", + "duration" => 169, + "year" => 2014, + "casting" => json_encode(["Matthew McConaughey", "Anne Hathaway", "Jessica Chastain"]), + "image" => "interstellar.jpg", + "recommended_id" => $film1->id + ]); + + $film3 = Film::create([ + "title" => "The Godfather", + "genre" => "Drama", + "director" => "Francis Ford Coppola", + "sinopsis" => "La historia de una familia mafiosa en Nueva York.", + "duration" => 175, + "year" => 1972, + "casting" => json_encode(["Marlon Brando", "Al Pacino"]), + "image" => "godfather.jpg" + ]); + } +} \ No newline at end of file diff --git a/docs/diagrams/gen.sh b/docs/diagrams/gen.sh new file mode 100755 index 00000000..084eb0eb --- /dev/null +++ b/docs/diagrams/gen.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +dot -Tpng ./netflix_er.dot -o ./netflix_er.png +dot -Tsvg ./netflix_er.dot -o ./netflix_er.svg \ No newline at end of file diff --git a/docs/diagrams/netflix_er.dot b/docs/diagrams/netflix_er.dot new file mode 100644 index 00000000..2fc5111a --- /dev/null +++ b/docs/diagrams/netflix_er.dot @@ -0,0 +1,85 @@ +digraph NetflixER { + rankdir=TB; + node [shape=plaintext, fontname="Helvetica Neue", fontsize=10]; + edge [fontname="Helvetica Neue", fontsize=9, arrowsize=0.8, color="#606060"]; + + /* ================= TABLAS PRINCIPALES ================= */ + Users [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#ffffff"> + <tr><td bgcolor="#2c3e50" colspan="2"><font color="white"><b>Users</b></font></td></tr> + <tr><td align="left" port="user_id">π user_id</td></tr> + <tr><td align="left">π§ email</td></tr> + <tr><td align="left">π password_hash</td></tr> + <tr><td align="left">π registration_date</td></tr> + <tr><td align="left" port="plan_id">π plan_id (FK)</td></tr> + </table>>]; + + Profiles [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#ffffff"> + <tr><td bgcolor="#2c3e50" colspan="2"><font color="white"><b>Profiles</b></font></td></tr> + <tr><td align="left" port="profile_id">π profile_id</td></tr> + <tr><td align="left" port="user_id">π₯ user_id (FK)</td></tr> + <tr><td align="left">π€ name</td></tr> + <tr><td align="left">πΌ avatar</td></tr> + </table>>]; + + Content [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#ffffff"> + <tr><td bgcolor="#2c3e50" colspan="2"><font color="white"><b>Content</b></font></td></tr> + <tr><td align="left" port="content_id">π content_id</td></tr> + <tr><td align="left">π¬ title</td></tr> + <tr><td align="left">π description</td></tr> + <tr><td align="left">β± duration</td></tr> + <tr><td align="left">π type</td></tr> + </table>>]; + + Genres [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#ffffff"> + <tr><td bgcolor="#2c3e50" colspan="2"><font color="white"><b>Genres</b></font></td></tr> + <tr><td align="left" port="genre_id">π genre_id</td></tr> + <tr><td align="left">π· name</td></tr> + </table>>]; + + /* ================= TABLAS DE RELACIΓN ================= */ + ContentGenres [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#f8f9fa"> + <tr><td bgcolor="#95a5a6" colspan="2"><font color="white"><b>ContentGenres</b></font></td></tr> + <tr><td align="left" port="content_id">π¬ content_id (FK)</td></tr> + <tr><td align="left" port="genre_id">π· genre_id (FK)</td></tr> + </table>>]; + + /* ================= ESTRUCTURA JERΓRQUICA ================= */ + subgraph cluster_media { + label="Estructura de Contenido"; + bgcolor="transparent"; + + Seasons [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#ffffff"> + <tr><td bgcolor="#34495e" colspan="2"><font color="white"><b>Seasons</b></font></td></tr> + <tr><td align="left" port="season_id">π season_id</td></tr> + <tr><td align="left" port="content_id">π¬ content_id (FK)</td></tr> + <tr><td align="left">#οΈβ£ number</td></tr> + </table>>]; + + Episodes [label=< + <table border="0" cellborder="1" cellspacing="0" cellpadding="4" bgcolor="#ffffff"> + <tr><td bgcolor="#34495e" colspan="2"><font color="white"><b>Episodes</b></font></td></tr> + <tr><td align="left" port="episode_id">π episode_id</td></tr> + <tr><td align="left" port="season_id">πΌ season_id (FK)</td></tr> + <tr><td align="left">πΊ title</td></tr> + </table>>]; + } + + /* ================= RELACIONES PRINCIPALES ================= */ + Users -> Profiles [label="1:N", headlabel="<<has>>", fontcolor="#2980b9"]; + Content -> Seasons [label="1:N", headlabel="<<has>>", fontcolor="#2980b9"]; + Seasons -> Episodes [label="1:N", headlabel="<<has>>", fontcolor="#2980b9"]; + + Content -> ContentGenres [label="N:M", dir=both, arrowtail=crow, arrowhead=crow]; + ContentGenres -> Genres [label="N:1", dir=back, arrowtail=none, arrowhead=normal]; + + /* ================= ALINEACIΓN VISUAL ================= */ + { rank=same; Users; Content; Genres } + { rank=same; Profiles; ContentGenres } + { rank=same; Seasons; Episodes } +} \ No newline at end of file diff --git a/docs/diagrams/netflix_er.png b/docs/diagrams/netflix_er.png new file mode 100644 index 0000000000000000000000000000000000000000..dd63f6f11967ba36fa05c7b83d2bd705a1b3bc93 GIT binary patch literal 40378 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/netflix_er.svg b/docs/diagrams/netflix_er.svg new file mode 100644 index 00000000..7f5f0d0e --- /dev/null +++ b/docs/diagrams/netflix_er.svg @@ -0,0 +1,155 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.43.0 (0) + --> +<!-- Title: NetflixER Pages: 1 --> +<svg width="514pt" height="301pt" + viewBox="0.00 0.00 514.00 301.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 297)"> +<title>NetflixER</title> +<polygon fill="white" stroke="transparent" points="-4,4 -4,-297 510,-297 510,4 -4,4"/> +<!-- Users --> +<g id="node1" class="node"> +<title>Users</title> +<polygon fill="#ffffff" stroke="transparent" points="8,-163 8,-289 112,-289 112,-163 8,-163"/> +<polygon fill="#2c3e50" stroke="transparent" points="8,-268 8,-289 112,-289 112,-268 8,-268"/> +<polygon fill="none" stroke="black" points="8,-268 8,-289 112,-289 112,-268 8,-268"/> +<text text-anchor="start" x="45.5" y="-277" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">Users</text> +<polygon fill="none" stroke="black" points="8,-247 8,-268 112,-268 112,-247 8,-247"/> +<text text-anchor="start" x="13" y="-255" font-family="Helvetica Neue" font-size="10.00">π user_id</text> +<polygon fill="none" stroke="black" points="8,-226 8,-247 112,-247 112,-226 8,-226"/> +<text text-anchor="start" x="13" y="-234" font-family="Helvetica Neue" font-size="10.00">π§ email</text> +<polygon fill="none" stroke="black" points="8,-205 8,-226 112,-226 112,-205 8,-205"/> +<text text-anchor="start" x="13" y="-213" font-family="Helvetica Neue" font-size="10.00">π password_hash</text> +<polygon fill="none" stroke="black" points="8,-184 8,-205 112,-205 112,-184 8,-184"/> +<text text-anchor="start" x="13" y="-192" font-family="Helvetica Neue" font-size="10.00">π registration_date</text> +<polygon fill="none" stroke="black" points="8,-163 8,-184 112,-184 112,-163 8,-163"/> +<text text-anchor="start" x="13" y="-171" font-family="Helvetica Neue" font-size="10.00">π plan_id (FK)</text> +</g> +<!-- Profiles --> +<g id="node2" class="node"> +<title>Profiles</title> +<polygon fill="#ffffff" stroke="transparent" points="20.5,-4 20.5,-109 99.5,-109 99.5,-4 20.5,-4"/> +<polygon fill="#2c3e50" stroke="transparent" points="21,-87.5 21,-108.5 100,-108.5 100,-87.5 21,-87.5"/> +<polygon fill="none" stroke="black" points="21,-87.5 21,-108.5 100,-108.5 100,-87.5 21,-87.5"/> +<text text-anchor="start" x="41.5" y="-96.5" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">Profiles</text> +<polygon fill="none" stroke="black" points="21,-66.5 21,-87.5 100,-87.5 100,-66.5 21,-66.5"/> +<text text-anchor="start" x="26" y="-74.5" font-family="Helvetica Neue" font-size="10.00">π profile_id</text> +<polygon fill="none" stroke="black" points="21,-45.5 21,-66.5 100,-66.5 100,-45.5 21,-45.5"/> +<text text-anchor="start" x="26" y="-53.5" font-family="Helvetica Neue" font-size="10.00">π₯ user_id (FK)</text> +<polygon fill="none" stroke="black" points="21,-24.5 21,-45.5 100,-45.5 100,-24.5 21,-24.5"/> +<text text-anchor="start" x="26" y="-32.5" font-family="Helvetica Neue" font-size="10.00">π€ name</text> +<polygon fill="none" stroke="black" points="21,-3.5 21,-24.5 100,-24.5 100,-3.5 21,-3.5"/> +<text text-anchor="start" x="26" y="-11.5" font-family="Helvetica Neue" font-size="10.00">πΌ avatar</text> +</g> +<!-- Users->Profiles --> +<g id="edge1" class="edge"> +<title>Users->Profiles</title> +<path fill="none" stroke="#606060" d="M60,-158.8C60,-146.54 60,-133.76 60,-121.56"/> +<polygon fill="#606060" stroke="#606060" points="62.8,-121.23 60,-113.23 57.2,-121.23 62.8,-121.23"/> +<text text-anchor="middle" x="67.5" y="-133.8" font-family="Helvetica Neue" font-size="9.00" fill="#2980b9">1:N</text> +<text text-anchor="middle" x="41.5" y="-116.03" font-family="Helvetica Neue" font-size="9.00" fill="#2980b9"><<has>></text> +</g> +<!-- Content --> +<g id="node3" class="node"> +<title>Content</title> +<polygon fill="#ffffff" stroke="transparent" points="226.5,-163 226.5,-289 303.5,-289 303.5,-163 226.5,-163"/> +<polygon fill="#2c3e50" stroke="transparent" points="227,-268 227,-289 304,-289 304,-268 227,-268"/> +<polygon fill="none" stroke="black" points="227,-268 227,-289 304,-289 304,-268 227,-268"/> +<text text-anchor="start" x="245" y="-277" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">Content</text> +<polygon fill="none" stroke="black" points="227,-247 227,-268 304,-268 304,-247 227,-247"/> +<text text-anchor="start" x="232" y="-255" font-family="Helvetica Neue" font-size="10.00">π content_id</text> +<polygon fill="none" stroke="black" points="227,-226 227,-247 304,-247 304,-226 227,-226"/> +<text text-anchor="start" x="232" y="-234" font-family="Helvetica Neue" font-size="10.00">π¬ title</text> +<polygon fill="none" stroke="black" points="227,-205 227,-226 304,-226 304,-205 227,-205"/> +<text text-anchor="start" x="232" y="-213" font-family="Helvetica Neue" font-size="10.00">π description</text> +<polygon fill="none" stroke="black" points="227,-184 227,-205 304,-205 304,-184 227,-184"/> +<text text-anchor="start" x="232" y="-192" font-family="Helvetica Neue" font-size="10.00">β± duration</text> +<polygon fill="none" stroke="black" points="227,-163 227,-184 304,-184 304,-163 227,-163"/> +<text text-anchor="start" x="232" y="-171" font-family="Helvetica Neue" font-size="10.00">π type</text> +</g> +<!-- ContentGenres --> +<g id="node5" class="node"> +<title>ContentGenres</title> +<polygon fill="#f8f9fa" stroke="transparent" points="404,-25 404,-88 498,-88 498,-25 404,-25"/> +<polygon fill="#95a5a6" stroke="transparent" points="404,-66.5 404,-87.5 498,-87.5 498,-66.5 404,-66.5"/> +<polygon fill="none" stroke="black" points="404,-66.5 404,-87.5 498,-87.5 498,-66.5 404,-66.5"/> +<text text-anchor="start" x="412.5" y="-75.5" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">ContentGenres</text> +<polygon fill="none" stroke="black" points="404,-45.5 404,-66.5 498,-66.5 498,-45.5 404,-45.5"/> +<text text-anchor="start" x="409" y="-53.5" font-family="Helvetica Neue" font-size="10.00">π¬ content_id (FK)</text> +<polygon fill="none" stroke="black" points="404,-24.5 404,-45.5 498,-45.5 498,-24.5 404,-24.5"/> +<text text-anchor="start" x="409" y="-32.5" font-family="Helvetica Neue" font-size="10.00">π· genre_id (FK)</text> +</g> +<!-- Content->ContentGenres --> +<g id="edge4" class="edge"> +<title>Content->ContentGenres</title> +<path fill="none" stroke="#606060" d="M318.25,-177.05C346.11,-151.96 379.83,-121.59 406.31,-97.74"/> +<polygon fill="#606060" stroke="#606060" points="317.88,-177.38 309.53,-180.06 314.91,-180.06 311.94,-182.73 311.94,-182.73 311.94,-182.73 314.91,-180.06 314.34,-185.41 317.88,-177.38 317.88,-177.38"/> +<polygon fill="#606060" stroke="#606060" points="406.59,-97.49 414.95,-94.81 409.57,-94.81 412.54,-92.14 412.54,-92.14 412.54,-92.14 409.57,-94.81 410.13,-89.46 406.59,-97.49 406.59,-97.49"/> +<text text-anchor="middle" x="378" y="-133.8" font-family="Helvetica Neue" font-size="9.00">N:M</text> +</g> +<!-- Seasons --> +<g id="node6" class="node"> +<title>Seasons</title> +<polygon fill="#ffffff" stroke="transparent" points="134,-14.5 134,-98.5 228,-98.5 228,-14.5 134,-14.5"/> +<polygon fill="#34495e" stroke="transparent" points="134,-77.5 134,-98.5 228,-98.5 228,-77.5 134,-77.5"/> +<polygon fill="none" stroke="black" points="134,-77.5 134,-98.5 228,-98.5 228,-77.5 134,-77.5"/> +<text text-anchor="start" x="160.5" y="-86.5" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">Seasons</text> +<polygon fill="none" stroke="black" points="134,-56.5 134,-77.5 228,-77.5 228,-56.5 134,-56.5"/> +<text text-anchor="start" x="139" y="-64.5" font-family="Helvetica Neue" font-size="10.00">π season_id</text> +<polygon fill="none" stroke="black" points="134,-35.5 134,-56.5 228,-56.5 228,-35.5 134,-35.5"/> +<text text-anchor="start" x="139" y="-43.5" font-family="Helvetica Neue" font-size="10.00">π¬ content_id (FK)</text> +<polygon fill="none" stroke="black" points="134,-14.5 134,-35.5 228,-35.5 228,-14.5 134,-14.5"/> +<text text-anchor="start" x="139" y="-22.5" font-family="Helvetica Neue" font-size="10.00">#οΈβ£ number</text> +</g> +<!-- Content->Seasons --> +<g id="edge2" class="edge"> +<title>Content->Seasons</title> +<path fill="none" stroke="#606060" d="M231.8,-158.8C223.68,-142.61 215.1,-125.51 207.36,-110.06"/> +<polygon fill="#606060" stroke="#606060" points="209.71,-108.51 203.62,-102.61 204.71,-111.02 209.71,-108.51"/> +<text text-anchor="middle" x="228.5" y="-133.8" font-family="Helvetica Neue" font-size="9.00" fill="#2980b9">1:N</text> +<text text-anchor="middle" x="185.12" y="-105.41" font-family="Helvetica Neue" font-size="9.00" fill="#2980b9"><<has>></text> +</g> +<!-- Genres --> +<g id="node4" class="node"> +<title>Genres</title> +<polygon fill="#ffffff" stroke="transparent" points="418,-194.5 418,-257.5 484,-257.5 484,-194.5 418,-194.5"/> +<polygon fill="#2c3e50" stroke="transparent" points="418,-236 418,-257 484,-257 484,-236 418,-236"/> +<polygon fill="none" stroke="black" points="418,-236 418,-257 484,-257 484,-236 418,-236"/> +<text text-anchor="start" x="432.5" y="-245" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">Genres</text> +<polygon fill="none" stroke="black" points="418,-215 418,-236 484,-236 484,-215 418,-215"/> +<text text-anchor="start" x="423" y="-223" font-family="Helvetica Neue" font-size="10.00">π genre_id</text> +<polygon fill="none" stroke="black" points="418,-194 418,-215 484,-215 484,-194 418,-194"/> +<text text-anchor="start" x="423" y="-202" font-family="Helvetica Neue" font-size="10.00">π· name</text> +</g> +<!-- ContentGenres->Genres --> +<g id="edge5" class="edge"> +<title>ContentGenres->Genres</title> +<path fill="none" stroke="#606060" d="M451,-92.16C451,-120.9 451,-161.55 451,-190.29"/> +<text text-anchor="middle" x="458.5" y="-133.8" font-family="Helvetica Neue" font-size="9.00">N:1</text> +</g> +<!-- Episodes --> +<g id="node7" class="node"> +<title>Episodes</title> +<polygon fill="#ffffff" stroke="transparent" points="280,-14.5 280,-98.5 370,-98.5 370,-14.5 280,-14.5"/> +<polygon fill="#34495e" stroke="transparent" points="280,-77.5 280,-98.5 370,-98.5 370,-77.5 280,-77.5"/> +<polygon fill="none" stroke="black" points="280,-77.5 280,-98.5 370,-98.5 370,-77.5 280,-77.5"/> +<text text-anchor="start" x="303.5" y="-86.5" font-family="Helvetica Neue" font-weight="bold" font-size="10.00" fill="white">Episodes</text> +<polygon fill="none" stroke="black" points="280,-56.5 280,-77.5 370,-77.5 370,-56.5 280,-56.5"/> +<text text-anchor="start" x="285" y="-64.5" font-family="Helvetica Neue" font-size="10.00">π episode_id</text> +<polygon fill="none" stroke="black" points="280,-35.5 280,-56.5 370,-56.5 370,-35.5 280,-35.5"/> +<text text-anchor="start" x="285" y="-43.5" font-family="Helvetica Neue" font-size="10.00">πΌ season_id (FK)</text> +<polygon fill="none" stroke="black" points="280,-14.5 280,-35.5 370,-35.5 370,-14.5 280,-14.5"/> +<text text-anchor="start" x="285" y="-22.5" font-family="Helvetica Neue" font-size="10.00">πΊ title</text> +</g> +<!-- Seasons->Episodes --> +<g id="edge3" class="edge"> +<title>Seasons->Episodes</title> +<path fill="none" stroke="#606060" d="M236.26,-56.5C245.13,-56.5 254.35,-56.5 263.36,-56.5"/> +<polygon fill="#606060" stroke="#606060" points="263.55,-59.3 271.55,-56.5 263.55,-53.7 263.55,-59.3"/> +<text text-anchor="middle" x="254" y="-62.3" font-family="Helvetica Neue" font-size="9.00" fill="#2980b9">1:N</text> +<text text-anchor="middle" x="253.05" y="-49.3" font-family="Helvetica Neue" font-size="9.00" fill="#2980b9"><<has>></text> +</g> +</g> +</svg> diff --git a/resources/views/film.blade.php b/resources/views/film.blade.php new file mode 100644 index 00000000..bd38690a --- /dev/null +++ b/resources/views/film.blade.php @@ -0,0 +1,21 @@ +@extends('layouts.app') + +@section('title', $film->title) + +@section('content') + + {{-- Film's banner --}} + <div class="text-center"> + <img src="{{ asset('images/' . $film->image) }}" class="img-fluid" alt="{{ $film->title }}"> + </div> + + {{-- Film's info --}} + <div class="mt-4 p-4"> + <h2>{{ $film->title }}</h2> + <p><strong>AΓ±o:</strong> {{ $film->year }} | <strong>DuraciΓ³n:</strong> {{ $film->duration }} min</p> + <p>{{ $film->sinopsis }}</p> + <p><strong>Director:</strong> {{ $film->director }}</p> + <p><strong>Reparto:</strong> {{ implode(', ', json_decode($film->casting)) }}</p> + </div> + +@endsection \ No newline at end of file diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php new file mode 100644 index 00000000..77fdae8b --- /dev/null +++ b/resources/views/home.blade.php @@ -0,0 +1,35 @@ +@extends('layouts.app') + +@section('title', 'Home') + +@section('content') + + {{-- Main banner --}} + <div class="text-center"> + <img src="{{ asset('images/banner.jpg') }}" class="img-fluid" alt="Banner"> + </div> + + {{-- Carrousel of categories --}} + <div class="mt-4"> + <h3>Ciencia FicciΓ³n</h3> + <div class="d-flex overflow-auto"> + @foreach($filmsSciFi as $film) + <div class="p-2 film-card" onclick="location.href='{{ route('films.show', $film->id) }}'"> + <img src="{{ asset('images/' . $film->image) }}" alt="{{ $film->title }}"> + </div> + @endforeach + </div> + </div> + + <div class="mt-4"> + <h3>Drama</h3> + <div class="d-flex overflow-auto"> + @foreach($filmsDrama as $film) + <div class="p-2 film-card" onclick="location.href='{{ route('films.show', $film->id) }}'"> + <img src="{{ asset('images/' . $film->image) }}" alt="{{ $film->title }}"> + </div> + @endforeach + </div> + </div> + +@endsection \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 00000000..4d7a73d1 --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html lang="es"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>@yield('title')</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> + <style> + body { + background-color: #000; + color: white; + } + .film-card img { + width: 100%; + height: 300px; + object-fit: cover; + border-radius: 10px; + } + .film-card { + cursor: pointer; + } + .side-menu { + position: fixed; + top: 0; + left: -250px; + width: 250px; + height: 100%; + background-color: rgba(0, 0, 0, 0.9); + padding-top: 60px; + transition: 0.3s; + } + .side-menu a { + padding: 10px 20px; + text-decoration: none; + font-size: 18px; + color: white; + display: block; + } + .side-menu a:hover { + background-color: #333; + } + .menu-toggle { + cursor: pointer; + font-size: 24px; + } + </style> +</head> +<body> + + {{-- Lateral menu --}} + <div class="side-menu" id="sideMenu"> + <a href="javascript:void(0)" class="closebtn" onclick="closeMenu()">Γ</a> + <a href="#">Buscar</a> + <a href="#">Inicio</a> + <a href="#">PelΓculas</a> + <a href="#">Series</a> + <a href="#">Favoritos</a> + <a href="#">Perfil</a> + </div> + + {{-- Button to open the menu --}} + <div class="p-3"> + <span class="menu-toggle" onclick="openMenu()">β°</span> + </div> + + {{-- Page's content --}} + <div class="container"> + @yield('content') + </div> + + <script> + function openMenu() { + document.getElementById("sideMenu").style.left = "0"; + } + + function closeMenu() { + document.getElementById("sideMenu").style.left = "-250px"; + } + </script> + +</body> +</html> \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 52173c06..e991c0a3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,19 +2,15 @@ use Illuminate\Support\Facades\Route; use App\Http\Controllers\UpdateController; +use App\Http\Controllers\FilmsController; Route::get("/upload-image", [UploadController::class, "showForm"])->name("image.form"); Route::post("/upload-image", [UploadController::class, "upload"])->name("image.upload"); -Route::get('/', function () { - return view('welcome'); -}); - +Route::get("/", [FilmsController::class, "index"])->name("home"); +Route::get("/films/{id}", [FilmsController::class, "show"])->name("films.show"); Route::get("/series", [SeriesController::class, "index"])->name("series.index"); - Route::get('/series/create', [SeriesController::class, 'create'])->name('series.create'); - -Route::post('/series/crear', [SeriesController::class, 'store'])->name('series.store'); ->>>>>>> routes/web.php +Route::post('/series/crear', [SeriesController::class, 'store'])->name('series.store'); \ No newline at end of file -- GitLab