2021-06-18 02:55:42 -06: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 06:50:01 -07:00
use App\Services\StatusService ;
2021-06-18 02:55:42 -06: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 00:19:27 -06:00
public $timeout = 60 ;
public $tries = 2 ;
2021-06-18 02:55:42 -06: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 01:19:11 -07:00
if ( config ( 'database.default' ) === 'mysql' ) {
2023-01-30 21:46:22 -07:00
$count = DB :: select ( 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) " ), [ 'kid' => $reply -> id ]);
$reply -> reply_count = count ( $count );
$reply -> save ();
} else {
2022-12-24 01:44:39 -07:00
$reply -> reply_count = $reply -> reply_count + 1 ;
2022-12-24 01:19:11 -07:00
$reply -> save ();
}
2023-01-29 06:50:01 -07: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 02:55:42 -06: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 -> message = $status -> replyToText ();
$notification -> rendered = $status -> replyToHtml ();
$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 03:13:51 -06: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 02:55:42 -06:00
return 1 ;
}
}