about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--laravel/app/Http/Controllers/SongController.php25
-rw-r--r--laravel/app/Policies/SongPolicy.php86
-rw-r--r--laravel/app/Providers/AuthServiceProvider.php3
-rw-r--r--laravel/resources/views/editsong.blade.php17
-rw-r--r--laravel/resources/views/playlist.blade.php2
-rw-r--r--laravel/resources/views/song.blade.php6
-rw-r--r--laravel/resources/views/welcome.blade.php2
-rw-r--r--laravel/routes/web.php7
8 files changed, 139 insertions, 9 deletions
diff --git a/laravel/app/Http/Controllers/SongController.php b/laravel/app/Http/Controllers/SongController.php
index 8d6c497..8206bca 100644
--- a/laravel/app/Http/Controllers/SongController.php
+++ b/laravel/app/Http/Controllers/SongController.php
@@ -8,10 +8,13 @@ use Illuminate\Http\Request;
 
 class SongController extends Controller
 {
-
-    public function show( $songNumber )
+    public function oldShow( $song )
+    {
+        $song = Song::where('number', $song );
+        return $this->show( $song );
+    }
+    public function show( Song $song )
     {
-        $song = Song::where('number', $songNumber )->first();
         $lines = explode( "\n", $song['text'] );
         $newText = '';
         $transp = $_GET['transp'] ?? 0;
@@ -165,7 +168,7 @@ class SongController extends Controller
                 $song->playlists()->attach( $_POST['playlist'] );
             }
             return redirect()->route('song.show', [
-                'song' => $song->number,
+                'song' => $song,
                 'playlist' => $_POST['playlist']
             ] );
         }
@@ -174,4 +177,18 @@ class SongController extends Controller
         }
         return redirect('/');
     }
+
+    public function edit(Song $song)
+    {
+        return view('editsong', ['song' => $song]);
+    }
+    public function update(Song $song, Request $request)
+    {
+        $song->title  = $request->title;
+        $song->author = $request->author;
+        $song->key    = $request->key;
+        $song->text   = $request->text;
+        $song->save();
+        return redirect()->route( 'song.show', ['song' => $song->number ] );
+    }
 }
diff --git a/laravel/app/Policies/SongPolicy.php b/laravel/app/Policies/SongPolicy.php
new file mode 100644
index 0000000..2f92bfb
--- /dev/null
+++ b/laravel/app/Policies/SongPolicy.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace App\Policies;
+
+use App\User;
+use App\Song;
+use Illuminate\Auth\Access\HandlesAuthorization;
+
+class SongPolicy
+{
+    use HandlesAuthorization;
+
+    /**
+     * Determine whether the user can view the song.
+     *
+     * @param  \App\User  $user
+     * @param  \App\Song  $song
+     * @return mixed
+     */
+    public function view(User $user, Song $song)
+    {
+        return true;
+        //
+    }
+
+    /**
+     * Determine whether the user can create songs.
+     *
+     * @param  \App\User  $user
+     * @return mixed
+     */
+    public function create(User $user)
+    {
+        // TODO: Make it harder to create songs.
+        return true;
+    }
+
+    /**
+     * Determine whether the user can update the song.
+     *
+     * @param  \App\User  $user
+     * @param  \App\Song  $song
+     * @return mixed
+     */
+    public function update(User $user, Song $song)
+    {
+        // Allow all logged in users to update songs.
+        return true;
+    }
+
+    /**
+     * Determine whether the user can delete the song.
+     *
+     * @param  \App\User  $user
+     * @param  \App\Song  $song
+     * @return mixed
+     */
+    public function delete(User $user, Song $song)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can restore the song.
+     *
+     * @param  \App\User  $user
+     * @param  \App\Song  $song
+     * @return mixed
+     */
+    public function restore(User $user, Song $song)
+    {
+        //
+    }
+
+    /**
+     * Determine whether the user can permanently delete the song.
+     *
+     * @param  \App\User  $user
+     * @param  \App\Song  $song
+     * @return mixed
+     */
+    public function forceDelete(User $user, Song $song)
+    {
+        //
+    }
+}
diff --git a/laravel/app/Providers/AuthServiceProvider.php b/laravel/app/Providers/AuthServiceProvider.php
index 9784b1a..8192094 100644
--- a/laravel/app/Providers/AuthServiceProvider.php
+++ b/laravel/app/Providers/AuthServiceProvider.php
@@ -2,6 +2,8 @@
 
 namespace App\Providers;
 
+use App\Song;
+use App\Policies\SongPolicy;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
 
@@ -14,6 +16,7 @@ class AuthServiceProvider extends ServiceProvider
      */
     protected $policies = [
         'App\Model' => 'App\Policies\ModelPolicy',
+        Song::class => SongPolicy::class,
     ];
 
     /**
diff --git a/laravel/resources/views/editsong.blade.php b/laravel/resources/views/editsong.blade.php
new file mode 100644
index 0000000..ae0060d
--- /dev/null
+++ b/laravel/resources/views/editsong.blade.php
@@ -0,0 +1,17 @@
+@extends('layouts.app')
+@section('title', "Editing $song[title]")
+
+@section('content')
+
+    <form method="POST" action="{{ route('song.show',['song'=>$song]) }}">
+        @csrf
+        <input name='title' placeholder='title' type='text' value='{{$song->title}}'/>
+        <input name='author' placeholder='author' type='text' value='{{$song->author}}'/>
+        <input name='key' placeholder='Key (e.g. Am)' type='text' value='{{$song->key}}'/>
+        <br/>
+        <textarea name='text' placeholder='song lyrics/chords'
+        style='width: 100%; height: 200px; font-family: monospace;' >{{$song->text}}</textarea>
+        <button type='submit'>Save!</button>
+    </form>
+
+@endsection
diff --git a/laravel/resources/views/playlist.blade.php b/laravel/resources/views/playlist.blade.php
index 0793176..7f6bed5 100644
--- a/laravel/resources/views/playlist.blade.php
+++ b/laravel/resources/views/playlist.blade.php
@@ -6,7 +6,7 @@
     <h2>Playlist "<i>{{$playlist->name}}</i>"</h2>
     <ul>
     @foreach($playlist->songs as $song)
-        <li><a href='/song/{{$song->number}}?playlist={{$playlist->id}}'>{{$song->title}}</a>
+        <li><a href='{{ route('song.show', ['song' => $song, 'playlist' => $playlist]) }}'>{{$song->title}}</a>
     @endforeach
     </ul>
 
diff --git a/laravel/resources/views/song.blade.php b/laravel/resources/views/song.blade.php
index 7029871..3d8cf2a 100644
--- a/laravel/resources/views/song.blade.php
+++ b/laravel/resources/views/song.blade.php
@@ -8,8 +8,12 @@
         Back to "<i>{{$playlist->name}}</i>" playlist
     </a>
     @endif
-
     <h2>{{$song['title']}}</h2>
+
+    @can('update', $song )
+        <a href='{{ route( 'song.edit', $song->number ) }}'>edit this song</a>
+    @endcan
+
     <form>
     <select name="transp" id="transp"
         value = "<?php echo $transp;?>"
diff --git a/laravel/resources/views/welcome.blade.php b/laravel/resources/views/welcome.blade.php
index 4e57621..3f95380 100644
--- a/laravel/resources/views/welcome.blade.php
+++ b/laravel/resources/views/welcome.blade.php
@@ -9,7 +9,7 @@
                 <ul>
                     @foreach( App\Song::all() as $song )
                         <li>
-                            <a href='{{ route('song.show', ['song' => $song['number']]) }}'>
+                            <a href='{{ route('song.show', ['song' => $song]) }}'>
                                 {{ $song['title'] }}
                             </a>
                     @endforeach
diff --git a/laravel/routes/web.php b/laravel/routes/web.php
index 730f622..6493350 100644
--- a/laravel/routes/web.php
+++ b/laravel/routes/web.php
@@ -14,9 +14,12 @@
 Route::get('/', function () {
     return view('welcome');
 });
-Route::get('/song/{song}', 'SongController@show')->name('song.show');
+Route::post('/new/song', 'SongController@post')->name('song.postnew')/*->middleware('can:create,App\Song')*/;
 Route::get('/playlist/{playlist}', 'PlaylistController@show')->name('playlist.show');
-Route::post('/new/song', 'SongController@post')->name('song.postnew');
+Route::get('/s/{song}', 'SongController@show')->name('song.show');
+Route::post('/s/{song}', 'SongController@update')->name('song.update')->middleware('can:update,song');
+Route::get('/s/{song}/edit', 'SongController@edit')->name('song.edit')->middleware('can:update,song');
+Route::get('/song/{song}', 'SongController@oldShow')->name('song.oldShow');
 
 Auth::routes();