2013-07-25 23:33:04 +02:00
< ? php
namespace Commands ;
2013-07-28 19:45:21 +02:00
use Entities\Album ;
2013-07-27 02:15:07 +02:00
use Entities\Image ;
2013-07-25 23:33:04 +02:00
use Entities\Track ;
2013-08-21 22:45:33 +02:00
use Entities\User ;
2013-07-27 02:15:07 +02:00
use External ;
use Illuminate\Support\Facades\Auth ;
2013-08-21 22:45:33 +02:00
use Illuminate\Support\Facades\DB ;
2013-07-27 02:15:07 +02:00
use Illuminate\Support\Facades\Log ;
2013-07-25 23:33:04 +02:00
class EditTrackCommand extends CommandBase {
private $_trackId ;
private $_track ;
private $_input ;
function __construct ( $trackId , $input ) {
$this -> _trackId = $trackId ;
$this -> _track = Track :: find ( $trackId );
$this -> _input = $input ;
}
/**
* @ return bool
*/
public function authorize () {
$user = \Auth :: user ();
return $this -> _track && $user != null && $this -> _track -> user_id == $user -> id ;
}
/**
* @ throws \Exception
* @ return CommandResponse
*/
public function execute () {
2013-08-31 03:46:35 +02:00
$isVocal = ( isset ( $this -> _input [ 'is_vocal' ]) && $this -> _input [ 'is_vocal' ] == 'true' ) ? true : false ;
2013-07-25 23:33:04 +02:00
2013-07-28 08:07:25 +02:00
$rules = [
'title' => 'required|min:3|max:80' ,
'released_at' => 'before:today' . ( $this -> _input [ 'released_at' ] != " " ? '|date' : '' ),
'license_id' => 'required|exists:licenses,id' ,
'genre_id' => 'required|exists:genres,id' ,
'cover' => 'image|mimes:png|min_width:350|min_height:350' ,
'track_type_id' => 'required|exists:track_types,id' ,
'songs' => 'required_when:track_type,2|exists:songs,id' ,
'cover_id' => 'exists:images,id' ,
2013-07-28 19:45:21 +02:00
'album_id' => 'exists:albums,id'
2013-07-28 08:07:25 +02:00
];
2013-08-31 03:46:35 +02:00
if ( $isVocal )
$rules [ 'lyrics' ] = 'required' ;
2013-07-28 08:07:25 +02:00
if ( $this -> _input [ 'track_type_id' ] == 2 )
$rules [ 'show_song_ids' ] = 'required|exists:show_songs,id' ;
$validator = \Validator :: make ( $this -> _input , $rules );
2013-07-25 23:33:04 +02:00
if ( $validator -> fails ())
return CommandResponse :: fail ( $validator );
$track = $this -> _track ;
$track -> title = $this -> _input [ 'title' ];
$track -> released_at = $this -> _input [ 'released_at' ] != " " ? strtotime ( $this -> _input [ 'released_at' ]) : null ;
$track -> description = $this -> _input [ 'description' ];
$track -> lyrics = $this -> _input [ 'lyrics' ];
$track -> license_id = $this -> _input [ 'license_id' ];
$track -> genre_id = $this -> _input [ 'genre_id' ];
$track -> track_type_id = $this -> _input [ 'track_type_id' ];
$track -> is_explicit = $this -> _input [ 'is_explicit' ] == 'true' ;
$track -> is_downloadable = $this -> _input [ 'is_downloadable' ] == 'true' ;
$track -> is_vocal = $isVocal ;
2013-07-28 19:45:21 +02:00
if ( isset ( $this -> _input [ 'album_id' ]) && strlen ( trim ( $this -> _input [ 'album_id' ]))) {
if ( $track -> album_id != null && $track -> album_id != $this -> _input [ 'album_id' ])
$this -> removeTrackFromAlbum ( $track );
if ( $track -> album_id != $this -> _input [ 'album_id' ]) {
$album = Album :: find ( $this -> _input [ 'album_id' ]);
$track -> track_number = $album -> tracks () -> count () + 1 ;
$track -> album_id = $this -> _input [ 'album_id' ];
2013-08-21 22:45:33 +02:00
Album :: whereId ( $album -> id ) -> update ([
2013-08-31 03:46:35 +02:00
'track_count' => DB :: raw ( '(SELECT COUNT(id) FROM tracks WHERE album_id = ' . $album -> id . ')' )
2013-08-21 22:45:33 +02:00
]);
2013-07-28 19:45:21 +02:00
}
} else {
if ( $track -> album_id != null ) {
$this -> removeTrackFromAlbum ( $track );
}
$track -> track_number = null ;
$track -> album_id = null ;
}
2013-07-28 08:07:25 +02:00
if ( $track -> track_type_id == 2 ) {
$track -> showSongs () -> sync ( explode ( ',' , $this -> _input [ 'show_song_ids' ]));
} else
$track -> showSongs () -> sync ([]);
2013-07-25 23:33:04 +02:00
if ( $track -> published_at == null ) {
$track -> published_at = new \DateTime ();
}
2013-07-27 05:00:45 +02:00
if ( isset ( $this -> _input [ 'cover_id' ])) {
$track -> cover_id = $this -> _input [ 'cover_id' ];
}
else if ( isset ( $this -> _input [ 'cover' ])) {
2013-07-27 02:15:07 +02:00
$cover = $this -> _input [ 'cover' ];
2013-07-28 06:37:32 +02:00
$track -> cover_id = Image :: upload ( $cover , Auth :: user ()) -> id ;
2013-07-27 05:00:45 +02:00
} else if ( $this -> _input [ 'remove_cover' ] == 'true' )
2013-07-27 02:15:07 +02:00
$track -> cover_id = null ;
2013-07-28 19:45:21 +02:00
$track -> updateTags ();
2013-07-25 23:33:04 +02:00
$track -> save ();
2013-08-21 22:45:33 +02:00
User :: whereId ( $this -> _track -> user_id ) -> update ([
'track_count' => DB :: raw ( '(SELECT COUNT(id) FROM tracks WHERE deleted_at IS NULL AND published_at IS NOT NULL AND user_id = ' . $this -> _track -> user_id . ')' )
]);
2013-07-30 06:53:57 +02:00
return CommandResponse :: succeed ([ 'real_cover_url' => $track -> getCoverUrl ( Image :: NORMAL )]);
2013-07-25 23:33:04 +02:00
}
2013-07-28 19:45:21 +02:00
private function removeTrackFromAlbum ( $track ) {
$album = $track -> album ;
$index = 0 ;
foreach ( $album -> tracks as $track ) {
if ( $track -> id == $this -> _trackId )
continue ;
$track -> track_number = ++ $index ;
$track -> updateTags ();
$track -> save ();
}
2013-08-21 22:45:33 +02:00
Album :: whereId ( $album -> id ) -> update ([
'track_count' => DB :: raw ( '(SELECT COUNT(id) FROM tracks WHERE album_id = ' . $album -> id . ')' )
]);
2013-07-28 19:45:21 +02:00
}
2013-07-25 23:33:04 +02:00
}