2015-08-31 16:19:23 +02:00
< ? php
2015-10-25 06:17:45 +01:00
/**
* Pony . fm - A community for pony fan music .
2021-02-14 03:39:15 +01:00
* Copyright ( C ) 2015 Feld0 .
2015-10-25 06:17:45 +01:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*/
2021-02-14 03:34:58 +01:00
namespace App\Commands ;
2015-08-31 16:19:23 +02:00
2021-02-14 03:34:58 +01:00
use App\Models\Album ;
use App\Models\Image ;
2021-02-14 03:39:15 +01:00
use App\Models\Playlist ;
2021-02-14 03:34:58 +01:00
use App\Models\Track ;
use App\Models\TrackType ;
use App\Models\User ;
2015-12-27 11:36:49 +01:00
use DB ;
2021-02-14 03:39:15 +01:00
use Gate ;
use Notification ;
2015-08-31 16:19:23 +02:00
class EditTrackCommand extends CommandBase
{
private $_trackId ;
2016-05-27 21:12:40 +02:00
/**
* @ var Track
*/
2015-08-31 16:19:23 +02:00
private $_track ;
private $_input ;
2016-06-06 08:15:56 +02:00
public function __construct ( $trackId , $input )
2015-08-31 16:19:23 +02:00
{
$this -> _trackId = $trackId ;
$this -> _track = Track :: find ( $trackId );
$this -> _input = $input ;
}
/**
* @ return bool
*/
public function authorize ()
{
2016-02-25 20:00:12 +01:00
return $this -> _track && Gate :: allows ( 'edit' , $this -> _track );
2015-08-31 16:19:23 +02:00
}
/**
* @ throws \Exception
* @ return CommandResponse
*/
public function execute ()
{
$isVocal = ( isset ( $this -> _input [ 'is_vocal' ]) && $this -> _input [ 'is_vocal' ] == 'true' ) ? true : false ;
$rules = [
'title' => 'required|min:3|max:80' ,
2021-02-14 03:39:15 +01:00
'released_at' => 'before:' .
( date ( 'Y-m-d' , time () + ( 86400 * 2 ))) . (
isset ( $this -> _input [ 'released_at' ]) && $this -> _input [ 'released_at' ] != ''
2016-02-14 10:29:02 +01:00
? '|date'
: '' ),
2015-08-31 16:19:23 +02:00
'license_id' => 'required|exists:licenses,id' ,
'genre_id' => 'required|exists:genres,id' ,
2015-12-27 10:43:43 +01:00
'cover' => 'image|mimes:png,jpeg|min_width:350|min_height:350' ,
2015-11-05 03:47:11 +01:00
'track_type_id' => 'required|exists:track_types,id|not_in:' . TrackType :: UNCLASSIFIED_TRACK ,
2015-08-31 16:19:23 +02:00
'cover_id' => 'exists:images,id' ,
2016-05-16 00:22:29 +02:00
'album_id' => 'exists:albums,id' ,
2021-02-14 03:39:15 +01:00
'username' => 'exists:users,username' ,
2015-08-31 16:19:23 +02:00
];
2016-08-08 01:31:09 +02:00
if ( isset ( $this -> _input [ 'track_type_id' ]) && $this -> _input [ 'track_type_id' ] == TrackType :: OFFICIAL_TRACK_REMIX ) {
2015-08-31 16:19:23 +02:00
$rules [ 'show_song_ids' ] = 'required|exists:show_songs,id' ;
2016-08-08 01:31:09 +02:00
$this -> _input [ 'show_song_ids' ] = json_decode ( $this -> _input [ 'show_song_ids' ]);
2015-08-31 16:19:23 +02:00
}
$validator = \Validator :: make ( $this -> _input , $rules );
if ( $validator -> fails ()) {
return CommandResponse :: fail ( $validator );
}
$track = $this -> _track ;
$track -> title = $this -> _input [ 'title' ];
2021-02-14 03:39:15 +01:00
$track -> released_at = isset ( $this -> _input [ 'released_at' ]) && $this -> _input [ 'released_at' ] != '' ? strtotime ( $this -> _input [ 'released_at' ]) : null ;
2015-08-31 16:19:23 +02:00
$track -> description = isset ( $this -> _input [ 'description' ]) ? $this -> _input [ 'description' ] : '' ;
$track -> lyrics = isset ( $this -> _input [ '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_listed = $this -> _input [ 'is_listed' ] == 'true' ;
$track -> is_vocal = $isVocal ;
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' ]) {
2016-12-20 00:49:22 +01:00
$this -> addTrackToAlbum ( $track , $this -> _input [ 'album_id' ]);
2015-08-31 16:19:23 +02:00
}
} else {
if ( $track -> album_id != null ) {
$this -> removeTrackFromAlbum ( $track );
}
$track -> track_number = null ;
$track -> album_id = null ;
}
2015-11-05 03:47:11 +01:00
if ( $track -> track_type_id == TrackType :: OFFICIAL_TRACK_REMIX ) {
2016-08-08 01:31:09 +02:00
$track -> showSongs () -> sync ( $this -> _input [ 'show_song_ids' ]);
2015-08-31 16:19:23 +02:00
} else {
$track -> showSongs () -> sync ([]);
}
if ( $track -> published_at == null ) {
$track -> published_at = new \DateTime ();
DB :: table ( 'tracks' ) -> whereUserId ( $track -> user_id ) -> update ([ 'is_latest' => false ]);
$track -> is_latest = true ;
2016-11-21 01:42:43 +01:00
2016-05-27 21:12:40 +02:00
Notification :: publishedNewTrack ( $track );
2015-08-31 16:19:23 +02:00
}
if ( isset ( $this -> _input [ 'cover_id' ])) {
$track -> cover_id = $this -> _input [ 'cover_id' ];
} else {
if ( isset ( $this -> _input [ 'cover' ])) {
$cover = $this -> _input [ 'cover' ];
2016-03-06 13:27:53 +01:00
$track -> cover_id = Image :: upload ( $cover , $track -> user_id ) -> id ;
2015-08-31 16:19:23 +02:00
} else {
if ( $this -> _input [ 'remove_cover' ] == 'true' ) {
$track -> cover_id = null ;
}
}
}
2016-05-16 00:03:49 +02:00
$oldid = null ;
2016-05-16 00:22:29 +02:00
if ( isset ( $this -> _input [ 'username' ])) {
2016-06-06 08:29:37 +02:00
$newid = User :: where ( 'username' , $this -> _input [ 'username' ]) -> first () -> id ;
2016-05-16 00:22:29 +02:00
2016-06-06 08:29:37 +02:00
if ( $track -> user_id != $newid ) {
2016-09-30 00:26:31 +02:00
$oldid = $track -> user_id ;
$track -> user_id = $newid ;
2016-06-06 08:29:37 +02:00
}
2016-05-16 00:03:49 +02:00
}
2015-08-31 16:19:23 +02:00
$track -> updateTags ();
$track -> save ();
User :: whereId ( $this -> _track -> user_id ) -> update ([
2021-02-14 03:39:15 +01:00
'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 . ')' ),
2015-08-31 16:19:23 +02:00
]);
2016-05-16 00:03:49 +02:00
if ( $oldid != null ) {
2016-06-06 08:29:37 +02:00
User :: whereId ( $oldid ) -> update ([
2021-02-14 03:39:15 +01:00
'track_count' => DB :: raw ( '(SELECT COUNT(id) FROM tracks WHERE deleted_at IS NULL AND published_at IS NOT NULL AND user_id = ' . $oldid . ')' ),
2016-06-06 08:29:37 +02:00
]);
2016-05-16 00:03:49 +02:00
}
2021-02-14 03:39:15 +01:00
if ( isset ( $this -> _input [ 'hwc_submit' ]) && new \DateTime () < new \DateTime ( '2016-12-20 23:59:59' )) {
2016-11-21 02:33:30 +01:00
$playlist = Playlist :: where ( 'user_id' , 22549 ) -> first ();
2016-11-21 01:42:43 +01:00
2016-11-21 18:08:34 +01:00
if ( $this -> _input [ 'hwc_submit' ] == 'true' ) {
2021-02-14 03:39:15 +01:00
if ( ! $playlist -> tracks () -> get () -> contains ( $track )) {
2016-11-21 01:42:43 +01:00
$songIndex = $playlist -> trackCount () + 1 ;
$playlist -> tracks () -> attach ( $track , [ 'position' => $songIndex ]);
$playlist -> touch ();
Playlist :: where ( 'id' , $playlist -> id ) -> update ([
2021-02-14 03:39:15 +01:00
'track_count' => DB :: raw ( '(SELECT COUNT(id) FROM playlist_track WHERE playlist_id = ' . $playlist -> id . ')' ),
2016-11-21 01:42:43 +01:00
]);
}
2016-11-21 02:33:30 +01:00
} else {
if ( $playlist -> tracks () -> get () -> contains ( $track )) {
$playlist -> tracks () -> detach ( $track );
Playlist :: whereId ( $playlist -> id ) -> update ([
2021-02-14 03:39:15 +01:00
'track_count' => DB :: raw ( '(SELECT COUNT(id) FROM playlist_track WHERE playlist_id = ' . $playlist -> id . ')' ),
2016-11-21 02:33:30 +01:00
]);
}
2016-11-21 01:42:43 +01:00
}
}
2021-02-14 03:39:15 +01:00
2015-08-31 16:19:23 +02:00
return CommandResponse :: succeed ([ 'real_cover_url' => $track -> getCoverUrl ( Image :: NORMAL )]);
}
2016-05-27 21:12:40 +02:00
private function removeTrackFromAlbum ( Track $track )
2015-08-31 16:19:23 +02:00
{
$album = $track -> album ;
$index = 0 ;
foreach ( $album -> tracks as $track ) {
2016-05-27 21:12:40 +02:00
/** @var $track Track */
2015-08-31 16:19:23 +02:00
if ( $track -> id == $this -> _trackId ) {
continue ;
}
$track -> track_number = ++ $index ;
$track -> updateTags ();
$track -> save ();
}
Album :: whereId ( $album -> id ) -> update ([
2021-02-14 03:39:15 +01:00
'track_count' => DB :: table ( 'tracks' ) -> where ( 'album_id' , '=' , $album -> id ) -> count (),
2016-12-20 00:49:22 +01:00
]);
}
private function addTrackToAlbum ( Track $track , $album_id )
{
$album = Album :: whereId ( $album_id ) -> first ();
$count = $album -> track_count + 1 ;
$track -> track_number = $count ;
$track -> album_id = $album -> id ;
$track -> updateTags ();
$track -> save ();
$album -> update ([
2021-02-14 03:39:15 +01:00
'track_count' => DB :: table ( 'tracks' ) -> where ( 'album_id' , '=' , $album -> id ) -> count (),
2015-08-31 16:19:23 +02:00
]);
}
2015-10-25 06:17:45 +01:00
}