refactor model event again

This commit is contained in:
xiaomlove
2024-04-26 03:21:35 +08:00
parent ae29693549
commit 8a44a0a269
12 changed files with 136 additions and 31 deletions

View File

@@ -14,6 +14,8 @@ use App\Models\Torrent;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Model;
use Nexus\Database\NexusDB;
use Symfony\Component\Console\Command\Command as CommandAlias;
class FireEvent extends Command
{
@@ -22,14 +24,14 @@ class FireEvent extends Command
*
* @var string
*/
protected $signature = 'event:fire {--name=} {--id=}';
protected $signature = 'event:fire {--name=} {--idKey=} {--idKeyOld=""}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Fire a event, options: --name, --id';
protected $description = 'Fire a event, options: --name, --idKey --idKeyOld';
protected array $eventMaps = [
"torrent_created" => ['event' => TorrentCreated::class, 'model' => Torrent::class],
@@ -49,18 +51,32 @@ class FireEvent extends Command
public function handle()
{
$name = $this->option('name');
$id = $this->option('id');
$log = "FireEvent, name: $name, id: $id";
$idKey = $this->option('idKey');
$idKeyOld = $this->option('idKeyOld');
$log = "FireEvent, name: $name, idKey: $idKey, idKeyOld: $idKeyOld";
if (isset($this->eventMaps[$name])) {
$eventName = $this->eventMaps[$name]['event'];
$modelName = $this->eventMaps[$name]['model'];
/** @var Model $model */
$model = new $modelName();
$result = call_user_func([$eventName, "dispatch"], $model::query()->find($id));
$this->info("$log, success call dispatch, result: " . var_export($result, true));
$model = unserialize(NexusDB::cache_get($idKey));
if ($model instanceof Model) {
$params = [$model];
if ($idKeyOld) {
$modelOld = unserialize(NexusDB::cache_get($idKeyOld));
if ($modelOld instanceof Model) {
$params[] = $modelOld;
} else {
$log .= ", invalid idKeyOld";
}
}
$result = call_user_func_array([$eventName, "dispatch"], $params);
$log .= ", success call dispatch, result: " . var_export($result, true);
} else {
$log .= ", invalid argument to call, it should be instance of: " . Model::class;
}
} else {
$this->error("$log, no event match this name");
$log .= ", no event match this name";
}
return Command::SUCCESS;
$this->info($log);
do_log($log);
return CommandAlias::SUCCESS;
}
}

View File

@@ -17,14 +17,17 @@ class TorrentUpdated
public ?Model $model = null;
public ?Model $modelOld = null;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Model $model)
public function __construct(Model $model, Model $modelOld)
{
$this->model = $model;
$this->modelOld = $modelOld;
}
/**

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class DeductUserBonusWhenTorrentDeleted
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle($event)
{
/**
* Just a test
*/
$torrent = $event->model;
do_log(sprintf("torrent: %d is deleted, and it's pieces_hash is: %s", $torrent->id, $torrent->pieces_hash));
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class TestTorrentUpdated
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle($event)
{
/**
* Just a test
*/
$torrentNew = $event->model;
$torrentOld = $event->modelOld;
do_log(sprintf(
"torrent: %d is updated, old descr: %s, new descr: %s",
$torrentNew->id, $torrentOld->descr, $torrentNew->descr
));
}
}

View File

@@ -4,13 +4,16 @@ namespace App\Providers;
use App\Events\SeedBoxRecordUpdated;
use App\Events\TorrentCreated;
use App\Events\TorrentDeleted;
use App\Events\TorrentUpdated;
use App\Events\UserDestroyed;
use App\Events\UserDisabled;
use App\Listeners\DeductUserBonusWhenTorrentDeleted;
use App\Listeners\FetchTorrentImdb;
use App\Listeners\RemoveOauthTokens;
use App\Listeners\RemoveSeedBoxRecordCache;
use App\Listeners\SyncTorrentToEs;
use App\Listeners\TestTorrentUpdated;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
@@ -27,15 +30,19 @@ class EventServiceProvider extends ServiceProvider
Registered::class => [
SendEmailVerificationNotification::class,
],
TorrentUpdated::class => [
SyncTorrentToEs::class,
],
SeedBoxRecordUpdated::class => [
RemoveSeedBoxRecordCache::class,
],
TorrentUpdated::class => [
SyncTorrentToEs::class,
TestTorrentUpdated::class,
],
TorrentCreated::class => [
FetchTorrentImdb::class,
],
TorrentDeleted::class => [
DeductUserBonusWhenTorrentDeleted::class,
],
UserDisabled::class => [
RemoveOauthTokens::class,
],

View File

@@ -20,6 +20,7 @@ use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Nexus\Database\NexusDB;
class UserRepository extends BaseRepository
@@ -199,7 +200,7 @@ class UserRepository extends BaseRepository
});
do_log("user: $uid, $modCommentText");
$this->clearCache($targetUser);
fire_event("user_disabled", $uid);
fire_event("user_disabled", $targetUser);
return true;
}
@@ -226,7 +227,7 @@ class UserRepository extends BaseRepository
$targetUser->updateWithModComment($update, $modCommentText);
do_log("user: $uid, $modCommentText, update: " . nexus_json_encode($update));
$this->clearCache($targetUser);
fire_event("user_enabled", $uid);
fire_event("user_enabled", $targetUser);
return true;
}
@@ -631,11 +632,10 @@ class UserRepository extends BaseRepository
}
if (is_int($id)) {
$uidArr = Arr::wrap($id);
$users = User::query()->with('language')->whereIn('id', $uidArr)->get(['id', 'username', 'lang']);
} else {
$users = $id;
$uidArr = $users->pluck('id')->toArray();
$uidArr = $id->pluck('id')->toArray();
}
$users = User::query()->with('language')->whereIn('id', $uidArr)->get();
if (empty($uidArr)) {
return;
}
@@ -668,7 +668,7 @@ class UserRepository extends BaseRepository
UserBanLog::query()->insert($userBanLogs);
if (is_int($id)) {
do_action("user_delete", $id);
fire_event("user_destroyed", $id);
fire_event("user_destroyed", $users->first());
}
return true;
}

View File

@@ -1,6 +1,6 @@
<?php
defined('VERSION_NUMBER') || define('VERSION_NUMBER', '1.8.12');
defined('RELEASE_DATE') || define('RELEASE_DATE', '2024-04-25');
defined('RELEASE_DATE') || define('RELEASE_DATE', '2024-04-26');
defined('IN_TRACKER') || define('IN_TRACKER', false);
defined('PROJECTNAME') || define("PROJECTNAME","NexusPHP");
defined('NEXUSPHPURL') || define("NEXUSPHPURL","https://nexusphp.org");

View File

@@ -3114,9 +3114,9 @@ function loggedinorreturn($mainpage = false) {
function deletetorrent($id, $notify = false) {
$idArr = is_array($id) ? $id : [$id];
$torrentInfo = \Nexus\Database\NexusDB::table("torrents")
$torrentInfo = \App\Models\Torrent::query()
->whereIn("id", $idArr)
->get(['id', 'pieces_hash'])
->get()
->KeyBy("id")
;
$torrentRep = new \App\Repositories\TorrentRepository();
@@ -3146,7 +3146,7 @@ function deletetorrent($id, $notify = false) {
$meiliSearchRep->deleteDocuments($idArr);
if (is_int($id)) {
do_action("torrent_delete", $id);
fire_event("torrent_deleted", $id);
fire_event("torrent_deleted", $torrentInfo->get($id));
}
}

View File

@@ -1237,7 +1237,14 @@ function get_snatch_info($torrentId, $userId)
return mysql_fetch_assoc(sql_query(sprintf('select * from snatched where torrentid = %s and userid = %s order by id desc limit 1', $torrentId, $userId)));
}
function fire_event(string $name, int $id): void
function fire_event(string $name, \Illuminate\Database\Eloquent\Model $model, \Illuminate\Database\Eloquent\Model $oldModel = null): void
{
executeCommand("event:fire --name=$name --id=$id", "string", true, false);
$idKey = \Illuminate\Support\Str::random();
$idKeyOld = "";
\Nexus\Database\NexusDB::cache_put($idKey, serialize($model));
if ($oldModel) {
$idKeyOld = \Illuminate\Support\Str::random();
\Nexus\Database\NexusDB::cache_put($idKeyOld, serialize($oldModel));
}
executeCommand("event:fire --name=$name --idKey=$idKey --idKeyOld=$idKeyOld", "string", true, false);
}

View File

@@ -51,7 +51,7 @@ if ($action == 'add')
if (mysql_affected_rows() != 1) {
stderr($lang_news['std_error'], $lang_news['std_something_weird_happened']);
}
fire_event("news_created", mysql_insert_id());
fire_event("news_created", \App\Models\News::query()->find(mysql_insert_id()));
header("Location: " . get_protocol_prefix() . "$BASEURL/index.php");
}

View File

@@ -30,7 +30,7 @@ $row = mysql_fetch_array($res);
$torrentAddedTimeString = $row['added'];
if (!$row)
die();
$torrentOld = \App\Models\Torrent::query()->find($id);
if ($CURUSER["id"] != $row["owner"] && !user_can('torrentmanage'))
bark($lang_takeedit['std_not_owner']);
$oldcatmode = get_single_value("categories","mode","WHERE id=".sqlesc($row['category']));
@@ -232,7 +232,7 @@ if (user_can('torrent-set-price') && $paidTorrentEnabled) {
$sql = "UPDATE torrents SET " . join(",", $updateset) . " WHERE id = $id";
do_log("[UPDATE_TORRENT]: $sql");
$affectedRows = sql_query($sql) or sqlerr(__FILE__, __LINE__);
fire_event("torrent_updated", $id);
fire_event("torrent_updated", \App\Models\Torrent::query()->find($id), $torrentOld);
$dateTimeStringNow = date("Y-m-d H:i:s");
/**

View File

@@ -448,7 +448,7 @@ $meiliSearch = new \App\Repositories\MeiliSearchRepository();
$meiliSearch->doImportFromDatabase($id);
//trigger event
fire_event("torrent_created", $id);
fire_event("torrent_created", \App\Models\Torrent::query()->find($id));
//===notify people who voted on offer thanks CoLdFuSiOn :)
if ($is_offer)