From 8a44a0a269d43a928efe6ba0fa76e7cb5b0cfdd8 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Fri, 26 Apr 2024 03:21:35 +0800 Subject: [PATCH] refactor model event again --- app/Console/Commands/FireEvent.php | 38 +++++++++++++------ app/Events/TorrentUpdated.php | 5 ++- .../DeductUserBonusWhenTorrentDeleted.php | 34 +++++++++++++++++ app/Listeners/TestTorrentUpdated.php | 38 +++++++++++++++++++ app/Providers/EventServiceProvider.php | 13 +++++-- app/Repositories/UserRepository.php | 12 +++--- include/constants.php | 2 +- include/functions.php | 6 +-- include/globalfunctions.php | 11 +++++- public/news.php | 2 +- public/takeedit.php | 4 +- public/takeupload.php | 2 +- 12 files changed, 136 insertions(+), 31 deletions(-) create mode 100644 app/Listeners/DeductUserBonusWhenTorrentDeleted.php create mode 100644 app/Listeners/TestTorrentUpdated.php diff --git a/app/Console/Commands/FireEvent.php b/app/Console/Commands/FireEvent.php index 7bb35382..5d2772ce 100644 --- a/app/Console/Commands/FireEvent.php +++ b/app/Console/Commands/FireEvent.php @@ -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; } } diff --git a/app/Events/TorrentUpdated.php b/app/Events/TorrentUpdated.php index 1f42f0b1..d832964d 100644 --- a/app/Events/TorrentUpdated.php +++ b/app/Events/TorrentUpdated.php @@ -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; } /** diff --git a/app/Listeners/DeductUserBonusWhenTorrentDeleted.php b/app/Listeners/DeductUserBonusWhenTorrentDeleted.php new file mode 100644 index 00000000..403987ab --- /dev/null +++ b/app/Listeners/DeductUserBonusWhenTorrentDeleted.php @@ -0,0 +1,34 @@ +model; + do_log(sprintf("torrent: %d is deleted, and it's pieces_hash is: %s", $torrent->id, $torrent->pieces_hash)); + } +} diff --git a/app/Listeners/TestTorrentUpdated.php b/app/Listeners/TestTorrentUpdated.php new file mode 100644 index 00000000..6a88f74a --- /dev/null +++ b/app/Listeners/TestTorrentUpdated.php @@ -0,0 +1,38 @@ +model; + $torrentOld = $event->modelOld; + do_log(sprintf( + "torrent: %d is updated, old descr: %s, new descr: %s", + $torrentNew->id, $torrentOld->descr, $torrentNew->descr + )); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index cb9e776a..6b6e599a 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -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, ], diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 38b67183..d8c15f1e 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -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; } diff --git a/include/constants.php b/include/constants.php index 01685d1d..77a68df1 100644 --- a/include/constants.php +++ b/include/constants.php @@ -1,6 +1,6 @@ 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)); } } diff --git a/include/globalfunctions.php b/include/globalfunctions.php index 2e9bf4ed..2f3b7ad9 100644 --- a/include/globalfunctions.php +++ b/include/globalfunctions.php @@ -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); } diff --git a/public/news.php b/public/news.php index 336a7670..d23b049e 100644 --- a/public/news.php +++ b/public/news.php @@ -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"); } diff --git a/public/takeedit.php b/public/takeedit.php index e9735b56..e2612438 100644 --- a/public/takeedit.php +++ b/public/takeedit.php @@ -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"); /** diff --git a/public/takeupload.php b/public/takeupload.php index 92d3df3d..a9fce26d 100644 --- a/public/takeupload.php +++ b/public/takeupload.php @@ -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)