2021-06-18 08:55:42 +00:00
< ? php
namespace App\Jobs\StatusPipeline ;
use App\Notification ;
use App\Status ;
use Cache ;
use DB ;
use Illuminate\Bus\Queueable ;
use Illuminate\Contracts\Queue\ShouldQueue ;
use Illuminate\Foundation\Bus\Dispatchable ;
use Illuminate\Queue\InteractsWithQueue ;
use Illuminate\Queue\SerializesModels ;
use Illuminate\Support\Facades\Redis ;
use App\Services\NotificationService ;
2023-01-29 13:50:01 +00:00
use App\Services\StatusService ;
2021-06-18 08:55:42 +00:00
class StatusReplyPipeline implements ShouldQueue
{
use Dispatchable , InteractsWithQueue , Queueable , SerializesModels ;
protected $status ;
/**
* Delete the job if its models no longer exist .
*
* @ var bool
*/
public $deleteWhenMissingModels = true ;
2022-08-06 06:19:27 +00:00
public $timeout = 60 ;
public $tries = 2 ;
2021-06-18 08:55:42 +00:00
/**
* Create a new job instance .
*
* @ return void
*/
public function __construct ( Status $status )
{
$this -> status = $status ;
}
/**
* Execute the job .
*
* @ return void
*/
public function handle ()
{
$status = $this -> status ;
$actor = $status -> profile ;
$reply = Status :: find ( $status -> in_reply_to_id );
if ( ! $actor || ! $reply ) {
return 1 ;
}
$target = $reply -> profile ;
$exists = Notification :: whereProfileId ( $target -> id )
-> whereActorId ( $actor -> id )
-> whereIn ( 'action' , [ 'mention' , 'comment' ])
-> whereItemId ( $status -> id )
-> whereItemType ( 'App\Status' )
-> count ();
if ( $actor -> id === $target || $exists !== 0 ) {
return 1 ;
}
2022-12-24 08:19:11 +00:00
if ( config ( 'database.default' ) === 'mysql' ) {
2023-04-20 06:00:55 +00:00
$exp = DB :: raw ( " select id, in_reply_to_id from statuses, (select @pv := :kid) initialisation where id > @pv and find_in_set(in_reply_to_id, @pv) > 0 and @pv := concat(@pv, ',', id) " );
$expQuery = $exp -> getValue ( DB :: connection () -> getQueryGrammar ());
$count = DB :: select ( $expQuery , [ 'kid' => $reply -> id ]);
2023-01-31 04:46:22 +00:00
$reply -> reply_count = count ( $count );
$reply -> save ();
} else {
2022-12-24 08:44:39 +00:00
$reply -> reply_count = $reply -> reply_count + 1 ;
2022-12-24 08:19:11 +00:00
$reply -> save ();
}
2023-01-29 13:50:01 +00:00
StatusService :: del ( $reply -> id );
StatusService :: del ( $status -> id );
Cache :: forget ( 'status:replies:all:' . $reply -> id );
Cache :: forget ( 'status:replies:all:' . $status -> id );
2021-06-18 08:55:42 +00:00
DB :: transaction ( function () use ( $target , $actor , $status ) {
$notification = new Notification ();
$notification -> profile_id = $target -> id ;
$notification -> actor_id = $actor -> id ;
$notification -> action = 'comment' ;
$notification -> item_id = $status -> id ;
$notification -> item_type = " App \ Status " ;
$notification -> save ();
NotificationService :: setNotification ( $notification );
NotificationService :: set ( $notification -> profile_id , $notification -> id );
});
2022-03-17 09:13:51 +00:00
if ( $exists = Cache :: get ( 'status:replies:all:' . $reply -> id )) {
if ( $exists && $exists -> count () == 3 ) {
} else {
Cache :: forget ( 'status:replies:all:' . $reply -> id );
}
} else {
Cache :: forget ( 'status:replies:all:' . $reply -> id );
}
2021-06-18 08:55:42 +00:00
return 1 ;
}
}