From b2e3c2cce36075e355af5f76d454f5dd8cbe6911 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Tue, 19 Jul 2022 14:15:35 +0800 Subject: [PATCH] swip admin torrent --- .../InsufficientPermissionException.php | 9 +++ .../Resources/Torrent/TorrentResource.php | 40 ++++++------- app/Repositories/TorrentRepository.php | 58 ++++++++++++++++--- 3 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 app/Exceptions/InsufficientPermissionException.php diff --git a/app/Exceptions/InsufficientPermissionException.php b/app/Exceptions/InsufficientPermissionException.php new file mode 100644 index 00000000..3d999e52 --- /dev/null +++ b/app/Exceptions/InsufficientPermissionException.php @@ -0,0 +1,9 @@ +icon('heroicon-o-arrow-circle-up') ->action(function (Collection $records, array $data) { $idArr = $records->pluck('id')->toArray(); - Torrent::query()->whereIn('id', $idArr)->update(['pos_state' => $data['pos_state']]); + try { + $torrentRep = new TorrentRepository(); + $torrentRep->setPosState($idArr, $data['pos_state']); + } catch (\Exception $exception) { + Filament::notify('danger', class_basename($exception)); + } }) ->deselectRecordsAfterCompletion(); } @@ -161,7 +167,12 @@ class TorrentResource extends Resource ->icon('heroicon-o-minus-circle') ->action(function (Collection $records) { $idArr = $records->pluck('id')->toArray(); - TorrentTag::query()->whereIn('torrent_id', $idArr)->delete(); + try { + $torrentRep = new TorrentRepository(); + $torrentRep->syncTags($idArr); + } catch (\Exception $exception) { + Filament::notify('danger', class_basename($exception)); + } }) ->deselectRecordsAfterCompletion(); @@ -179,32 +190,21 @@ class TorrentResource extends Resource if (empty($data['tags'])) { return; } - $insert = $torrentIdArr = []; - $time = now()->toDateTimeString(); - foreach ($records as $torrent) { - $torrentIdArr[] = $torrent->id; - foreach ($data['tags'] as $tagId) { - $insert[] = [ - 'torrent_id' => $torrent->id, - 'tag_id' => $tagId, - 'created_at' => $time, - 'updated_at' => $time, - ]; - } + $idArr = $records->pluck('id')->toArray(); + try { + $torrentRep = new TorrentRepository(); + $torrentRep->syncTags($idArr, $data['tags']); + } catch (\Exception $exception) { + Filament::notify('danger', class_basename($exception)); } - TorrentTag::query()->whereIn('torrent_id', $torrentIdArr)->delete(); - TorrentTag::query()->insert($insert); }) ->deselectRecordsAfterCompletion(); } - return $actions; - - } - private static function getActions() + private static function getActions(): array { $actions = []; $userClass = Auth::user()->class; diff --git a/app/Repositories/TorrentRepository.php b/app/Repositories/TorrentRepository.php index fc146a99..400ea639 100644 --- a/app/Repositories/TorrentRepository.php +++ b/app/Repositories/TorrentRepository.php @@ -2,6 +2,7 @@ namespace App\Repositories; +use App\Exceptions\InsufficientPermissionException; use App\Exceptions\NexusException; use App\Models\AudioCodec; use App\Models\Category; @@ -22,10 +23,13 @@ use App\Models\Team; use App\Models\Torrent; use App\Models\TorrentOperationLog; use App\Models\TorrentSecret; +use App\Models\TorrentTag; use App\Models\User; use Carbon\Carbon; use Hashids\Hashids; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; use Nexus\Database\NexusDB; @@ -89,7 +93,7 @@ class TorrentRepository extends BaseRepository $with = ['user', 'tags']; $torrents = $query->with($with)->paginate(); $userArr = $user->toArray(); - foreach($torrents as &$item) { + foreach ($torrents as &$item) { $item->download_url = $this->getDownloadUrl($item->id, $userArr); } return $torrents; @@ -99,8 +103,12 @@ class TorrentRepository extends BaseRepository { $with = [ 'user', 'basic_audio_codec', 'basic_category', 'basic_codec', 'basic_media', 'basic_source', 'basic_standard', 'basic_team', - 'thanks' => function ($query) use ($user) {$query->where('userid', $user->id);}, - 'reward_logs' => function ($query) use ($user) {$query->where('userid', $user->id);}, + 'thanks' => function ($query) use ($user) { + $query->where('userid', $user->id); + }, + 'reward_logs' => function ($query) use ($user) { + $query->where('userid', $user->id); + }, ]; $result = Torrent::query()->with($with)->withCount(['peers', 'thank_users', 'reward_logs'])->visible()->findOrFail($id); $result->download_url = $this->getDownloadUrl($id, $user->toArray()); @@ -201,8 +209,7 @@ class TorrentRepository extends BaseRepository ->groupBy('peer_id') ->with(['user', 'relative_torrent']) ->get() - ->groupBy('seeder') - ; + ->groupBy('seeder'); if ($peers->has(Peer::SEEDER_YES)) { $seederList = $peers->get(Peer::SEEDER_YES)->sort(function ($a, $b) { $x = $a->uploaded; @@ -300,7 +307,7 @@ class TorrentRepository extends BaseRepository public function getSnatchUploadSpeed($snatch) { if ($snatch->seedtime <= 0) { - $speed = mksize(0); + $speed = mksize(0); } else { $speed = mksize($snatch->uploaded / ($snatch->seedtime + $snatch->leechtime)); } @@ -450,7 +457,7 @@ class TorrentRepository extends BaseRepository $formId = "$id-form"; $rows[] = sprintf( '
%s:
%s
', - $id, $rowStyle, $labelStyle,nexus_trans('torrent.approval.status_label'), implode('', $radios) + $id, $rowStyle, $labelStyle, nexus_trans('torrent.approval.status_label'), implode('', $radios) ); $rows[] = sprintf( '
%s:
', @@ -566,5 +573,42 @@ class TorrentRepository extends BaseRepository return false; } + public function syncTags($id, array $tagIdArr = []) + { + if (Auth::user()->class < Setting::get('authority.torrentmanage')) { + throw new InsufficientPermissionException(); + } + $idArr = Arr::wrap($id); + return NexusDB::transaction(function () use ($idArr, $tagIdArr) { + $insert = []; + $time = now()->toDateTimeString(); + foreach ($idArr as $torrentId) { + foreach ($tagIdArr as $tagId) { + $insert[] = [ + 'torrent_id' => $torrentId, + 'tag_id' => $tagId, + 'created_at' => $time, + 'updated_at' => $time, + ]; + } + } + TorrentTag::query()->whereIn('torrent_id', $idArr)->delete(); + if (!empty($insert)) { + TorrentTag::query()->insert($insert); + } + return count($insert); + }); + + } + + public function setPosState($id, $posState): int + { + if (Auth::user()->class < Setting::get('authority.torrentsticky')) { + throw new InsufficientPermissionException(); + } + $idArr = Arr::wrap($id); + return Torrent::query()->whereIn('id', $idArr)->update(['pos_state' => $posState]); + } + }