Backend for songs.zachdecook.com
* Routes: Create edit route
Zach DeCook 2018-12-27
parent ed8d234 · commit c095394
-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();