Backend for songs.zachdecook.com
* Routes: Create edit route
| -rw-r--r-- | laravel/app/Http/Controllers/SongController.php | 25 | ||||
| -rw-r--r-- | laravel/app/Policies/SongPolicy.php | 86 | ||||
| -rw-r--r-- | laravel/app/Providers/AuthServiceProvider.php | 3 | ||||
| -rw-r--r-- | laravel/resources/views/editsong.blade.php | 17 | ||||
| -rw-r--r-- | laravel/resources/views/playlist.blade.php | 2 | ||||
| -rw-r--r-- | laravel/resources/views/song.blade.php | 6 | ||||
| -rw-r--r-- | laravel/resources/views/welcome.blade.php | 2 | ||||
| -rw-r--r-- | laravel/routes/web.php | 7 |
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(); |