diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c4bf928e45..3e8b5a618f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,27 +1,40 @@ name: PHP Lint (Pint) on: [push, pull_request] jobs: - phplint: - strategy: - matrix: - operating-system: - - ubuntu-22.04 - name: ${{ matrix.operating-system }} - runs-on: ${{ matrix.operating-system }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Run Pint - uses: aglipanci/laravel-pint-action@2.0.0 - with: - preset: psr12 - verboseMode: true - - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: PHP Style Change (Laravel Pint CI) - commit_user_name: HDVinne - commit_user_email: hdinnovations@protonmail.com - commit_author: HDVinnie \ No newline at end of file + build-assets: + strategy: + matrix: + operating-system: + - ubuntu-22.04 + php-version: + - '8.3' + name: ${{ matrix.operating-system }} + runs-on: ${{ matrix.operating-system }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup PHP 8.3 + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + extensions: curl, dom, gd, libxml, mbstring, zip, mysql, xml, intl, bcmath, redis-phpredis/phpredis@6.0.1 + ini-values: error_reporting=E_ALL + coverage: pcov + tools: composer:v2 + env: + REDIS_CONFIGURE_OPTS: --enable-redis + - name: Install Composer Dependencies + env: + COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} + run: composer install --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --optimize-autoloader + - name: Run Pint + run: ./vendor/bin/pint + - name: Commit Changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: PHP Style Change (Laravel Pint CI) + commit_user_name: HDVinne + commit_user_email: hdinnovations@protonmail.com + commit_author: HDVinnie diff --git a/.github/workflows/phpunit-test.yml b/.github/workflows/phpunit-test.yml index 6b1a5b8c5d..7bf54c9ba0 100644 --- a/.github/workflows/phpunit-test.yml +++ b/.github/workflows/phpunit-test.yml @@ -70,6 +70,7 @@ jobs: DB_USERNAME: root DB_DATABASE: unit3d DB_PASSWORD: null + CACHE_STORE: array - name: Cache phpunit cache directory uses: actions/cache@v4 with: diff --git a/.github/workflows/prettier-blade.yml b/.github/workflows/prettier-blade.yml index 31397bfea7..4da3b0d724 100644 --- a/.github/workflows/prettier-blade.yml +++ b/.github/workflows/prettier-blade.yml @@ -22,9 +22,9 @@ jobs: - name: Run Prettier run: bunx prettier -w * - name: Commit Changes - uses: stefanzweifel/git-auto-commit-action@v4 + uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Blade Style Change (Prettier Blade CI) commit_user_name: HDVinne commit_user_email: hdinnovations@protonmail.com - commit_author: HDVinnie \ No newline at end of file + commit_author: HDVinnie diff --git a/app/Achievements/UserUploadedFirstSubtitle.php b/app/Achievements/UserUploadedFirstSubtitle.php index 7afce2ecd9..3b763939d5 100644 --- a/app/Achievements/UserUploadedFirstSubtitle.php +++ b/app/Achievements/UserUploadedFirstSubtitle.php @@ -17,7 +17,6 @@ namespace App\Achievements; use Assada\Achievements\Achievement; -use Assada\Achievements\Model\AchievementProgress; class UserUploadedFirstSubtitle extends Achievement { diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php index ffbf798958..1e2979a048 100644 --- a/app/Actions/Fortify/CreateNewUser.php +++ b/app/Actions/Fortify/CreateNewUser.php @@ -19,7 +19,6 @@ use App\Models\Group; use App\Models\Invite; use App\Models\User; -use App\Repositories\ChatRepository; use App\Rules\EmailBlacklist; use Exception; use Illuminate\Http\RedirectResponse; @@ -33,10 +32,6 @@ class CreateNewUser implements CreatesNewUsers { use PasswordValidationRules; - public function __construct(private readonly ChatRepository $chatRepository) - { - } - /** * Validate and create a newly registered user. * @@ -93,34 +88,19 @@ public function create(array $input): RedirectResponse | User $user->emailUpdates()->create(); if (config('other.invite-only') === true) { - Invite::where('code', '=', $input['code'])->update([ + $invite = Invite::where('code', '=', $input['code'])->first(); + $invite->update([ 'accepted_by' => $user->id, 'accepted_at' => now(), ]); - } - // Select A Random Welcome Message - $profileUrl = href_profile($user); - - $welcomeArray = [ - \sprintf('[url=%s]%s[/url], Welcome to ', $profileUrl, $user->username).config('other.title').'! Hope you enjoy the community.', - \sprintf("[url=%s]%s[/url], We've been expecting you.", $profileUrl, $user->username), - \sprintf("[url=%s]%s[/url] has arrived. Party's over.", $profileUrl, $user->username), - \sprintf("It's a bird! It's a plane! Nevermind, it's just [url=%s]%s[/url].", $profileUrl, $user->username), - \sprintf('Ready player [url=%s]%s[/url].', $profileUrl, $user->username), - \sprintf('A wild [url=%s]%s[/url] appeared.', $profileUrl, $user->username), - 'Welcome to '.config('other.title').\sprintf(' [url=%s]%s[/url]. We were expecting you.', $profileUrl, $user->username), - ]; - - $this->chatRepository->systemMessage( - $welcomeArray[array_rand($welcomeArray)] - ); - - // Send Welcome PM - $user->sendSystemNotification( - subject: config('welcomepm.subject'), - message: config('welcomepm.message'), - ); + if ($invite->internal_note !== null) { + $user->notes()->create([ + 'message' => $invite->internal_note, + 'staff_id' => $invite->user_id, + ]); + } + } return $user; } diff --git a/app/Console/Commands/AutoCacheUserLeechCounts.php b/app/Console/Commands/AutoCacheUserLeechCounts.php index 13fa5416ae..8795c970ac 100644 --- a/app/Console/Commands/AutoCacheUserLeechCounts.php +++ b/app/Console/Commands/AutoCacheUserLeechCounts.php @@ -45,8 +45,8 @@ class AutoCacheUserLeechCounts extends Command final public function handle(): void { $peerCounts = User::withoutGlobalScopes() - ->selectRaw("CONCAT('user-leeching-count:', id) as cacheKey") - ->selectRaw('(select COUNT(*) from peers where peers.user_id = users.id and seeder = 0 and active = 1 and visible = 1) as count') + ->selectRaw("'user-leeching-count:' || id as cacheKey") + ->selectRaw('(select COUNT(*) from peers where peers.user_id = users.id and seeder = FALSE and active = TRUE and visible = TRUE) as count') ->pluck('count', 'cacheKey') ->toArray(); diff --git a/app/Console/Commands/AutoDeactivateWarning.php b/app/Console/Commands/AutoDeactivateWarning.php index 335334cffd..c464189294 100644 --- a/app/Console/Commands/AutoDeactivateWarning.php +++ b/app/Console/Commands/AutoDeactivateWarning.php @@ -82,7 +82,7 @@ final public function handle(): void // Calculate User Warning Count and Enable DL Priv If Required. Warning::with('warneduser') - ->select(DB::raw('user_id, SUM(active = 1) as value')) + ->select(DB::raw('user_id, SUM(active = TRUE) as value')) ->groupBy('user_id') ->having('value', '<', config('hitrun.max_warnings')) ->whereRelation('warneduser', 'can_download', '=', false) diff --git a/app/Console/Commands/AutoHighspeedTag.php b/app/Console/Commands/AutoHighspeedTag.php index b362cbd192..4295a3dcba 100644 --- a/app/Console/Commands/AutoHighspeedTag.php +++ b/app/Console/Commands/AutoHighspeedTag.php @@ -64,7 +64,7 @@ final public function handle(): void fn ($join) => $join->on('torrents.id', '=', 'highspeed_torrents.torrent_id') ) ->update([ - 'highspeed' => DB::raw('CASE WHEN highspeed_torrents.torrent_id IS NOT NULL THEN 1 ELSE 0 END'), + 'highspeed' => DB::raw('CASE WHEN highspeed_torrents.torrent_id IS NOT NULL THEN TRUE ELSE FALSE END'), 'updated_at' => DB::raw('updated_at'), ]); diff --git a/app/Console/Commands/AutoRewardResurrection.php b/app/Console/Commands/AutoRewardResurrection.php index 14e7044a5e..0fd065edc2 100644 --- a/app/Console/Commands/AutoRewardResurrection.php +++ b/app/Console/Commands/AutoRewardResurrection.php @@ -17,7 +17,6 @@ namespace App\Console\Commands; use App\Models\Resurrection; -use App\Models\Torrent; use App\Repositories\ChatRepository; use App\Services\Unit3dAnnounce; use Exception; diff --git a/app/Console/Commands/AutoUpsertHistories.php b/app/Console/Commands/AutoUpsertHistories.php index 1f5cdf3d5a..e63e58981e 100644 --- a/app/Console/Commands/AutoUpsertHistories.php +++ b/app/Console/Commands/AutoUpsertHistories.php @@ -97,7 +97,7 @@ final public function handle(): void // We need to make sure seeder and active are updated after seedtime, otherwise the seedtime logic for ensuring it's not a new announce and the left was 0 in the last announce breaks. // Unfortunately, laravel sorts the keys in this array alphabetically when inserting so reordering the keys themselves in this array doesn't work. // This leaves us with this hacky fix. - 'seedtime' => DB::raw('IF(DATE_ADD(updated_at, INTERVAL 5400 SECOND) > VALUES(updated_at) AND seeder = 1 AND active = 1 AND VALUES(seeder) = 1, seedtime + TIMESTAMPDIFF(SECOND, updated_at, VALUES(updated_at)), seedtime), seeder = VALUES(seeder), active = VALUES(active)'), + 'seedtime' => DB::raw('CASE WHEN DATE_ADD(updated_at, INTERVAL 5400 SECOND) > VALUES(updated_at) AND seeder = TRUE AND active = TRUE AND VALUES(seeder) = TRUE THEN seedtime + TIMESTAMPDIFF(SECOND, updated_at, VALUES(updated_at)) ELSE seedtime END, seeder = VALUES(seeder), active = VALUES(active)'), 'immune' => DB::raw('immune AND VALUES(immune)'), 'completed_at' => DB::raw('COALESCE(completed_at, VALUES(completed_at))'), ], diff --git a/app/Console/Commands/SyncPeers.php b/app/Console/Commands/SyncPeers.php index ad67a10409..8650ce41c3 100644 --- a/app/Console/Commands/SyncPeers.php +++ b/app/Console/Commands/SyncPeers.php @@ -53,8 +53,8 @@ final public function handle(): void ->leftJoinSub( Peer::query() ->select('torrent_id') - ->addSelect(DB::raw('SUM(peers.left = 0 AND peers.active = 1 AND peers.visible = 1) AS updated_seeders')) - ->addSelect(DB::raw('SUM(peers.left != 0 AND peers.active = 1 AND peers.visible = 1) AS updated_leechers')) + ->addSelect(DB::raw('SUM(peers.left = 0 AND peers.active = TRUE AND peers.visible = TRUE) AS updated_seeders')) + ->addSelect(DB::raw('SUM(peers.left != 0 AND peers.active = TRUE AND peers.visible = TRUE) AS updated_leechers')) ->groupBy('torrent_id'), 'seeders_leechers', fn ($join) => $join->on('torrents.id', '=', 'seeders_leechers.torrent_id') diff --git a/app/DTO/TorrentSearchFiltersDTO.php b/app/DTO/TorrentSearchFiltersDTO.php index 0a1511facc..c49d096965 100644 --- a/app/DTO/TorrentSearchFiltersDTO.php +++ b/app/DTO/TorrentSearchFiltersDTO.php @@ -16,14 +16,15 @@ namespace App\DTO; +use App\Models\PlaylistTorrent; use App\Models\User; -use App\Traits\TorrentFilter; +use App\Models\Wish; use Illuminate\Database\Eloquent\Builder; use Closure; +use Illuminate\Support\Facades\DB; readonly class TorrentSearchFiltersDTO { - use TorrentFilter; private ?User $user; public function __construct( @@ -103,56 +104,299 @@ final public function toSqlQueryBuilder(): Closure && @preg_match($field, 'Validate regex') !== false; return fn ($query) => $query - ->when($this->name !== '', fn ($query) => $query->ofName($this->name, $isRegex($this->name))) - ->when($this->description !== '', fn ($query) => $query->ofDescription($this->description, $isRegex($this->description))) - ->when($this->mediainfo !== '', fn ($query) => $query->ofMediainfo($this->mediainfo, $isRegex($this->mediainfo))) - ->when($this->uploader !== '', fn ($query) => $query->ofUploader($this->uploader)) - ->when($this->keywords !== [], fn ($query) => $query->ofKeyword($this->keywords)) - ->when($this->startYear !== null, fn ($query) => $query->releasedAfterOrIn($this->startYear)) - ->when($this->endYear !== null, fn ($query) => $query->releasedBeforeOrIn($this->endYear)) - ->when($this->minSize !== null, fn ($query) => $query->ofSizeGreaterOrEqualto($this->minSize)) - ->when($this->maxSize !== null, fn ($query) => $query->ofSizeLesserOrEqualTo($this->maxSize)) - ->when($this->categoryIds !== [], fn ($query) => $query->ofCategory($this->categoryIds)) - ->when($this->typeIds !== [], fn ($query) => $query->ofType($this->typeIds)) - ->when($this->resolutionIds !== [], fn ($query) => $query->ofResolution($this->resolutionIds)) - ->when($this->genreIds !== [], fn ($query) => $query->ofGenre($this->genreIds)) - ->when($this->regionIds !== [], fn ($query) => $query->ofRegion($this->regionIds)) - ->when($this->distributorIds !== [], fn ($query) => $query->ofDistributor($this->distributorIds)) - ->when($this->tmdbId !== null, fn ($query) => $query->ofTmdb($this->tmdbId)) - ->when($this->imdbId !== null, fn ($query) => $query->ofImdb($this->imdbId)) - ->when($this->tvdbId !== null, fn ($query) => $query->ofTvdb($this->tvdbId)) - ->when($this->malId !== null, fn ($query) => $query->ofMal($this->malId)) - ->when($this->episodeNumber !== null, fn ($query) => $query->ofEpisode($this->episodeNumber)) - ->when($this->seasonNumber !== null, fn ($query) => $query->ofSeason($this->seasonNumber)) - ->when($this->playlistId !== null, fn ($query) => $query->ofPlaylist($this->playlistId)) - ->when($this->collectionId !== null, fn ($query) => $query->ofCollection($this->collectionId)) - ->when($this->companyId !== null, fn ($query) => $query->ofCompany($this->companyId)) - ->when($this->networkId !== null, fn ($query) => $query->ofNetwork($this->networkId)) - ->when($this->primaryLanguageNames !== [], fn ($query) => $query->ofPrimaryLanguage($this->primaryLanguageNames)) - ->when($this->free !== [], fn ($query) => $query->ofFreeleech($this->free)) - ->when($this->filename !== '', fn ($query) => $query->ofFilename($this->filename)) - ->when($this->adult === true, fn ($query) => $query->ofAdult(true)) - ->when($this->adult === false, fn ($query) => $query->ofAdult(false)) - ->when($this->doubleup, fn ($query) => $query->doubleup()) - ->when($this->featured, fn ($query) => $query->featured()) - ->when($this->refundable, fn ($query) => $query->refundable()) - ->when($this->stream, fn ($query) => $query->streamOptimized()) - ->when($this->sd, fn ($query) => $query->sd()) - ->when($this->highspeed, fn ($query) => $query->highspeed()) - ->when($this->userBookmarked, fn ($query) => $query->bookmarkedBy($this->user)) - ->when($this->userWished, fn ($query) => $query->wishedBy($this->user)) - ->when($this->internal, fn ($query) => $query->internal()) - ->when($this->personalRelease, fn ($query) => $query->personalRelease()) - ->when($this->trumpable, fn ($query) => $query->trumpable()) - ->when($this->alive, fn ($query) => $query->alive()) - ->when($this->dying, fn ($query) => $query->dying()) - ->when($this->dead, fn ($query) => $query->dead()) - ->when($this->graveyard, fn ($query) => $query->graveyard()) - ->when($this->userDownloaded === false, fn ($query) => $query->notDownloadedBy($this->user)) - ->when($this->userDownloaded === true, fn ($query) => $query->downloadedBy($this->user)) - ->when($this->userSeeder === true && $this->userActive === true, fn ($query) => $query->seededBy($this->user)) - ->when($this->userSeeder === false && $this->userActive === true, fn ($query) => $query->leechedBy($this->user)) - ->when($this->userSeeder === false && $this->userActive === false, fn ($query) => $query->uncompletedBy($this->user)); + ->when( + $this->name !== '', + fn ($query) => $query + ->when( + $isRegex($this->name), + fn ($query) => $query->where('name', 'REGEXP', substr($this->name, 1, -1)), + fn ($query) => $query->where('name', 'LIKE', '%'.str_replace(' ', '%', $this->name).'%') + ) + ) + ->when( + $this->description !== '', + fn ($query) => $query + ->when( + $isRegex($this->description), + fn ($query) => $query->where('description', 'REGEXP', substr($this->description, 1, -1)), + fn ($query) => $query->where('description', 'LIKE', '%'.$this->description.'%') + ) + ) + ->when( + $this->mediainfo !== '', + fn ($query) => $query + ->when( + $isRegex($this->mediainfo), + fn ($query) => $query->where('mediainfo', 'REGEXP', substr($this->mediainfo, 1, -1)), + fn ($query) => $query->where('mediainfo', 'LIKE', '%'.$this->mediainfo.'%') + ) + ) + ->when( + $this->uploader !== '', + fn ($query) => $query + ->whereRelation('user', 'username', '=', $this->uploader) + ->when( + $this->user === null, + fn ($query) => $query->where('anon', '=', false), + fn ($query) => $query + ->when( + !$this->user->group->is_modo, + fn ($query) => $query + ->where( + fn ($query) => $query + ->where('anon', '=', false) + ->orWhere('user_id', '=', $this->user->id) + ) + ) + ) + ) + ->when( + $this->keywords !== [], + fn ($query) => $query->whereHas('keywords', fn ($query) => $query->whereIn('name', $this->keywords)) + ) + ->when( + $this->startYear !== null, + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('movie', 'release_date', '>=', $this->startYear.'-01-01 00:00:00') + ->whereRelation('category', 'movie_meta', '=', true) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('tv', 'first_air_date', '>=', $this->startYear.'-01-01 00:00:00') + ->whereRelation('category', 'tv_meta', '=', true) + ) + ) + ) + ->when( + $this->endYear !== null, + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('movie', 'release_date', '<=', $this->endYear.'-12-31 23:59:59') + ->whereRelation('category', 'movie_meta', '=', true) + ) + ->orWhere( + fn ($query) => $query + ->orWhereRelation('tv', 'first_air_date', '<=', $this->endYear.'-12-31 23:59:59') + ->whereRelation('category', 'tv_meta', '=', true) + ) + ) + ) + ->when($this->minSize !== null, fn ($query) => $query->where('size', '>=', $this->minSize)) + ->when($this->maxSize !== null, fn ($query) => $query->where('size', '<=', $this->maxSize)) + ->when($this->categoryIds !== [], fn ($query) => $query->whereIntegerInRaw('category_id', $this->categoryIds)) + ->when($this->typeIds !== [], fn ($query) => $query->whereIntegerInRaw('type_id', $this->typeIds)) + ->when($this->resolutionIds !== [], fn ($query) => $query->whereIntegerInRaw('resolution_id', $this->resolutionIds)) + ->when( + $this->genreIds !== [], + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereIn('tmdb', DB::table('genre_movie')->select('movie_id')->whereIn('genre_id', $this->genreIds)) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('category', 'tv_meta', '=', true) + ->whereIn('tmdb', DB::table('genre_tv')->select('tv_id')->whereIn('genre_id', $this->genreIds)) + ) + ) + ) + ->when( + $this->regionIds !== [], + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereIntegerInRaw('region_id', $this->regionIds) + ->when(\in_array(0, $this->regionIds), fn ($query) => $query->orWhereNull('region_id')) + ) + ) + ->when( + $this->distributorIds !== [], + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereIntegerInRaw('distributor_id', $this->distributorIds) + ->when(\in_array(0, $this->distributorIds), fn ($query) => $query->orWhereNull('distributor_id')) + ) + ) + ->when($this->tmdbId !== null, fn ($query) => $query->where('tmdb', '=', $this->tmdbId)) + ->when($this->imdbId !== null, fn ($query) => $query->where('imdb', '=', $this->imdbId)) + ->when($this->tvdbId !== null, fn ($query) => $query->where('tvdb', '=', $this->tvdbId)) + ->when($this->malId !== null, fn ($query) => $query->where('mal', '=', $this->malId)) + ->when($this->episodeNumber !== null, fn ($query) => $query->where('episode_number', '=', $this->episodeNumber)) + ->when($this->seasonNumber !== null, fn ($query) => $query->where('season_number', '=', $this->seasonNumber)) + ->when( + $this->playlistId !== null, + fn ($query) => $query + ->whereIn( + 'id', + PlaylistTorrent::select('torrent_id') + ->where('playlist_id', '=', $this->playlistId) + ->when( + $this->user === null, + fn ($query) => $query->whereRelation('playlist', 'is_private', '=', false), + fn ($query) => $query->when( + ! $this->user->group->is_modo, + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('playlist', 'is_private', '=', false) + ->orWhereRelation('playlist', 'user_id', '=', $this->user->id) + ) + ) + ) + ) + ) + ->when( + $this->collectionId !== null, + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereIn('tmdb', DB::table('collection_movie')->select('movie_id')->where('collection_id', '=', $this->collectionId)) + ) + ->when( + $this->companyId !== null, + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereIn('tmdb', DB::table('company_movie')->select('movie_id')->where('company_id', '=', $this->companyId)) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('category', 'tv_meta', '=', true) + ->whereIn('tmdb', DB::table('company_tv')->select('tv_id')->where('company_id', '=', $this->companyId)) + ) + ) + ) + ->when( + $this->networkId !== null, + fn ($query) => $query + ->whereRelation('category', 'tv_meta', '=', true) + ->whereIn('tmdb', DB::table('network_tv')->select('tv_id')->where('network_id', '=', $this->networkId)) + ) + ->when( + $this->primaryLanguageNames !== [], + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereHas('movie', fn ($query) => $query->whereIn('original_language', $this->primaryLanguageNames)) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('category', 'tv_meta', '=', true) + ->whereHas('tv', fn ($query) => $query->whereIn('original_language', $this->primaryLanguageNames)) + ) + ) + ) + ->when( + $this->free !== [], + fn ($query) => $query + ->when( + config('other.freeleech'), + fn ($query) => $query->whereBetween('free', [0, 100]), + fn ($query) => $query->whereIntegerInRaw('free', (array) $this->free) + ) + ) + ->when($this->filename !== '', fn ($query) => $query->whereRelation('files', 'name', '=', $this->filename)) + ->when( + $this->adult === true, + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereRelation('movie', 'adult', '=', true) + ) + // Currently, only movies have an `adult` column. + ->when( + $this->adult === false, + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereRelation('movie', 'adult', '=', false) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', false) + ) + ) + ) + ->when($this->doubleup, fn ($query) => $query->where('doubleup', '=', 1)) + ->when($this->featured, fn ($query) => $query->where('featured', '=', 1)) + ->when($this->refundable, fn ($query) => $query->where('refundable', '=', true)) + ->when($this->stream, fn ($query) => $query->where('stream', '=', 1)) + ->when($this->sd, fn ($query) => $query->where('sd', '=', 1)) + ->when($this->highspeed, fn ($query) => $query->where('highspeed', '=', 1)) + ->when($this->userBookmarked, fn ($query) => $query->whereRelation('bookmarks', 'user_id', '=', $this->user->id)) + ->when($this->userWished, fn ($query) => $query->whereIn('tmdb', Wish::select('tmdb')->where('user_id', '=', $this->user->id))) + ->when($this->internal, fn ($query) => $query->where('internal', '=', 1)) + ->when($this->personalRelease, fn ($query) => $query->where('personal_release', '=', 1)) + ->when($this->trumpable, fn ($query) => $query->has('trump')) + ->when($this->alive, fn ($query) => $query->where('seeders', '>', 0)) + ->when($this->dying, fn ($query) => $query->where('seeders', '=', 1)->where('times_completed', '>=', 3)) + ->when($this->dead, fn ($query) => $query->where('seeders', '=', 0)) + ->when($this->graveyard, fn ($query) => $query->where('seeders', '=', 0)->where('created_at', '<', now()->subDays(30))) + ->when( + $this->userDownloaded === false, + fn ($query) => $query + ->whereDoesntHave( + 'history', + fn ($query) => $query + ->where('user_id', '=', $this->user->id) + ) + ) + ->when( + $this->userDownloaded === true, + fn ($query) => $query->whereRelation('history', 'user_id', '=', $this->user->id) + ) + ->when( + $this->userSeeder === true && $this->userActive === true, + fn ($query) => $query + ->whereHas( + 'history', + fn ($query) => $query + ->where('user_id', '=', $this->user->id) + ->where('active', '=', 1) + ->where('seeder', '=', 1) + ) + ) + ->when( + $this->userSeeder === false && $this->userActive === true, + fn ($query) => $query + ->whereHas( + 'history', + fn ($query) => $query + ->where('user_id', '=', $this->user->id) + ->where('active', '=', 1) + ->where('seeder', '=', 0) + ) + ) + ->when( + $this->userSeeder === false && $this->userActive === false, + fn ($query) => $query + ->whereHas( + 'history', + fn ($query) => $query + ->where('user_id', '=', $this->user->id) + ->where('active', '=', 0) + ->where('seeder', '=', 0) + ->where('seedtime', '=', 0) + ) + ); } /** diff --git a/app/Helpers/MarkdownExtra.php b/app/Helpers/MarkdownExtra.php index 55776a6d7f..7ef3bb06cc 100644 --- a/app/Helpers/MarkdownExtra.php +++ b/app/Helpers/MarkdownExtra.php @@ -20,6 +20,9 @@ use DOMDocument; use DOMElement; +/** + * @deprecated Use \GrahamCampbell\Markdown\Facades\Markdown instead + */ class MarkdownExtra extends Markdown { public function __construct() @@ -550,13 +553,17 @@ protected function processTag($elementMarkup) // recursive // http://stackoverflow.com/q/1148928/200145 libxml_use_internal_errors(true); - $DOMDocument = new DOMDocument(); + $DOMDocument = new DOMDocument('1.0', 'utf-8'); + + $DOMDocument->loadHTML(''.$elementMarkup); // http://stackoverflow.com/q/11309194/200145 - $elementMarkup = mb_convert_encoding((string) $elementMarkup, 'HTML-ENTITIES', 'UTF-8'); + foreach ($DOMDocument->childNodes as $item) { + if ($item->nodeType == XML_PI_NODE) { + $DOMDocument->removeChild($item); + } + } - // http://stackoverflow.com/q/4879946/200145 - $DOMDocument->loadHTML($elementMarkup); $DOMDocument->removeChild($DOMDocument->doctype); $DOMDocument->replaceChild($DOMDocument->firstChild->firstChild->firstChild, $DOMDocument->firstChild); diff --git a/app/Http/Controllers/API/QuickSearchController.php b/app/Http/Controllers/API/QuickSearchController.php index 2fccf05053..52ad0dc7fd 100644 --- a/app/Http/Controllers/API/QuickSearchController.php +++ b/app/Http/Controllers/API/QuickSearchController.php @@ -19,7 +19,6 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Meilisearch\Client; -use Meilisearch\Contracts\FederationOptions; use Meilisearch\Contracts\MultiSearchFederation; use Meilisearch\Contracts\SearchQuery; diff --git a/app/Http/Controllers/API/TorrentController.php b/app/Http/Controllers/API/TorrentController.php index f8b4a30db5..2618d1a205 100644 --- a/app/Http/Controllers/API/TorrentController.php +++ b/app/Http/Controllers/API/TorrentController.php @@ -323,10 +323,17 @@ public function store(Request $request): \Illuminate\Http\JsonResponse // Populate the status/seeders/leechers/times_completed fields for the external tracker $torrent->refresh(); - Unit3dAnnounce::addTorrent($torrent); + // Backup the files contained in the torrent + $files = TorrentTools::getTorrentFiles($decodedTorrent); - if ($torrent->getAttribute('featured')) { - Unit3dAnnounce::addFeaturedTorrent($torrent->id); + foreach ($files as &$file) { + $file['torrent_id'] = $torrent->id; + } + + // Can't insert them all at once since some torrents have more files than mysql supports placeholders. + // Divide by 3 since we're inserting 3 fields: name, size and torrent_id + foreach (collect($files)->chunk(intdiv(65_000, 3)) as $files) { + TorrentFile::insert($files->toArray()); } // Set torrent to featured @@ -337,19 +344,16 @@ public function store(Request $request): \Illuminate\Http\JsonResponse $featuredTorrent->save(); } - // Backup the files contained in the torrent - $files = TorrentTools::getTorrentFiles($decodedTorrent); + // Tracker updates come after database updates in case tracker's offline - foreach ($files as &$file) { - $file['torrent_id'] = $torrent->id; - } + Unit3dAnnounce::addTorrent($torrent); - // Can't insert them all at once since some torrents have more files than mysql supports placeholders. - // Divide by 3 since we're inserting 3 fields: name, size and torrent_id - foreach (collect($files)->chunk(intdiv(65_000, 3)) as $files) { - TorrentFile::insert($files->toArray()); + if ($torrent->getAttribute('featured')) { + Unit3dAnnounce::addFeaturedTorrent($torrent->id); } + // TMDB updates come after tracker updates in case TMDB's offline + $tmdbScraper = new TMDBScraper(); if ($torrent->category->tv_meta && $torrent->tmdb) { diff --git a/app/Http/Controllers/API/UserController.php b/app/Http/Controllers/API/UserController.php new file mode 100644 index 0000000000..9452074894 --- /dev/null +++ b/app/Http/Controllers/API/UserController.php @@ -0,0 +1,31 @@ + + * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 + */ + +namespace App\Http\Controllers\API; + +use App\Http\Resources\UserResource; + +class UserController extends BaseController +{ + final public function show(): UserResource + { + $user = auth()->user(); + + UserResource::withoutWrapping(); + + return new UserResource($user); + } +} diff --git a/app/Http/Controllers/AnnounceController.php b/app/Http/Controllers/AnnounceController.php index a92349d934..bfdc3e05f3 100644 --- a/app/Http/Controllers/AnnounceController.php +++ b/app/Http/Controllers/AnnounceController.php @@ -27,6 +27,7 @@ use App\Models\Peer; use App\Models\Scopes\ApprovedScope; use App\Models\Torrent; +use App\Models\UnregisteredInfoHash; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -98,7 +99,7 @@ public function index(Request $request, string $passkey): ?Response $group = $this->checkGroup($user); // Get Torrent Info Array from queries and judge if user can reach it. - $torrent = $this->checkTorrent($queries->getInfoHash()); + $torrent = $this->checkTorrent($queries->getInfoHash(), $user); // Check if a user is announcing a torrent as completed but no peer is in db. $this->checkPeer($torrent, $queries, $user); @@ -385,7 +386,7 @@ private function checkGroup(User $user): Group * @throws TrackerException * @throws Throwable */ - private function checkTorrent(string $infoHash): Torrent + private function checkTorrent(string $infoHash, User $user): Torrent { $torrent = cache()->remember( 'announce-torrents:by-infohash:'.$infoHash, @@ -396,8 +397,13 @@ private function checkTorrent(string $infoHash): Torrent ->firstOr(fn (): string => '-1') ); - // If Torrent Doesn't Exsist Return Error to Client + // If Torrent Doesn't Exist Return Error to Client if ($torrent === '-1') { + UnregisteredInfoHash::upsert([ + 'user_id' => $user->id, + 'info_hash' => $infoHash, + ], ['info_hash', 'user_id']); + throw new TrackerException(150); } diff --git a/app/Http/Controllers/ApprovedRequestFillController.php b/app/Http/Controllers/ApprovedRequestFillController.php index 56aa1e6324..093b3b0d03 100644 --- a/app/Http/Controllers/ApprovedRequestFillController.php +++ b/app/Http/Controllers/ApprovedRequestFillController.php @@ -20,7 +20,6 @@ use App\Achievements\UserFilled25Requests; use App\Achievements\UserFilled50Requests; use App\Achievements\UserFilled75Requests; -use App\Models\Torrent; use App\Models\TorrentRequest; use App\Notifications\NewRequestFillApprove; use App\Repositories\ChatRepository; diff --git a/app/Http/Controllers/BountyController.php b/app/Http/Controllers/BountyController.php index ac87f5e5e5..dd7db814a5 100644 --- a/app/Http/Controllers/BountyController.php +++ b/app/Http/Controllers/BountyController.php @@ -22,7 +22,6 @@ use App\Models\TorrentRequestBounty; use App\Notifications\NewRequestBounty; use App\Repositories\ChatRepository; -use Illuminate\Http\Request; /** * @see \Tests\Todo\Feature\Http\Controllers\RequestControllerTest diff --git a/app/Http/Controllers/ClaimedPrizeController.php b/app/Http/Controllers/ClaimedPrizeController.php index 163bada7ae..755f60a433 100644 --- a/app/Http/Controllers/ClaimedPrizeController.php +++ b/app/Http/Controllers/ClaimedPrizeController.php @@ -32,7 +32,9 @@ public function store(Request $request, Event $event): \Illuminate\Http\Redirect return back()->withErrors('Event is not active.'); } - if (!now()->isBetween($event->starts_at, $event->ends_at)) { + $isAvailable = now()->isBetween($event->starts_at->startOfDay(), $event->ends_at->endOfDay()); + + if (!$isAvailable) { return back()->withErrors('Prizes are not currently available.'); } diff --git a/app/Http/Controllers/ForumController.php b/app/Http/Controllers/ForumController.php index c646a8ec61..85293479a4 100644 --- a/app/Http/Controllers/ForumController.php +++ b/app/Http/Controllers/ForumController.php @@ -42,9 +42,21 @@ public function index(Request $request): \Illuminate\Contracts\View\Factory|\Ill ->orderBy('position') ->get() ->filter(fn ($category) => $category->forums->isNotEmpty()), - 'num_posts' => Post::count(), - 'num_forums' => Forum::count(), - 'num_topics' => Topic::count(), + 'num_posts' => cache()->remember( + 'post-count:by-group-id:'.$request->user()->group_id, + 3600, + fn () => Post::query()->authorized(canReadTopic: true)->count() + ), + 'num_forums' => cache()->remember( + 'forum-count:by-group-id:'.$request->user()->group_id, + 3600, + fn () => Forum::query()->authorized(canReadTopic: true)->count() + ), + 'num_topics' => cache()->remember( + 'topic-count:by-group-id:'.$request->user()->group_id, + 3600, + fn () => Topic::query()->authorized(canReadTopic: true)->count() + ), ]); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 3f41e093f9..d41a5d7792 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -64,7 +64,7 @@ public function index(Request $request): \Illuminate\Contracts\View\Factory|\Ill }, ]) ->where('last_action', '>', now()->subMinutes(60)) - ->orderByRaw('(select position from `groups` where `groups`.id = users.group_id), group_id, username') + ->orderByRaw('(select position from "groups" where "groups".id = users.group_id), group_id, username') ->get() ->sortBy(fn ($user) => $user->privacy?->hidden || ! $user->isVisible($user, 'other', 'show_online')), ), diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index b1934a884f..fb471b19f8 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -54,8 +54,7 @@ public function staff(): \Illuminate\Contracts\View\Factory|\Illuminate\View\Vie return view('page.staff', [ 'staff' => Group::query() ->with('users.group') - ->where('is_modo', '=', 1) - ->orWhere('is_admin', '=', 1) + ->where('is_torrent_modo', '=', 1) ->orderByDesc('position') ->get(), ]); diff --git a/app/Http/Controllers/PlaylistController.php b/app/Http/Controllers/PlaylistController.php index 9b7961f7b6..8cf76ee913 100644 --- a/app/Http/Controllers/PlaylistController.php +++ b/app/Http/Controllers/PlaylistController.php @@ -94,21 +94,21 @@ public function store(StorePlaylistRequest $request): \Illuminate\Http\RedirectR */ public function show(Request $request, Playlist $playlist): \Illuminate\Contracts\View\Factory|\Illuminate\View\View { - abort_if($playlist->is_private && $playlist->user_id !== $request->user()->id, 403, trans('playlist.private-error')); + abort_if($playlist->is_private && $playlist->user_id !== $request->user()->id && !$request->user()->group->is_modo, 403, trans('playlist.private-error')); $randomTorrent = $playlist->torrents()->inRandomOrder()->with('category')->first(); $torrents = $playlist->torrents() ->select('*') - ->selectRaw(" + ->selectRaw(<<<'SQL' CASE - WHEN category_id IN (SELECT `id` from `categories` where `movie_meta` = 1) THEN 'movie' - WHEN category_id IN (SELECT `id` from `categories` where `tv_meta` = 1) THEN 'tv' - WHEN category_id IN (SELECT `id` from `categories` where `game_meta` = 1) THEN 'game' - WHEN category_id IN (SELECT `id` from `categories` where `music_meta` = 1) THEN 'music' - WHEN category_id IN (SELECT `id` from `categories` where `no_meta` = 1) THEN 'no' + WHEN category_id IN (SELECT id from categories where movie_meta = TRUE) THEN 'movie' + WHEN category_id IN (SELECT id from categories where tv_meta = TRUE) THEN 'tv' + WHEN category_id IN (SELECT id from categories where game_meta = TRUE) THEN 'game' + WHEN category_id IN (SELECT id from categories where music_meta = TRUE) THEN 'music' + WHEN category_id IN (SELECT id from categories where no_meta = TRUE) THEN 'no' END as meta - ") + SQL) ->with(['category', 'resolution', 'type', 'user.group']) ->orderBy('name') ->paginate(26); @@ -154,9 +154,11 @@ public function update(UpdatePlaylistRequest $request, Playlist $playlist): \Ill $filename = 'playlist-cover_'.uniqid('', true).'.'.$image->getClientOriginalExtension(); $path = public_path('/files/img/'.$filename); Image::make($image->getRealPath())->fit(400, 225)->encode('png', 100)->save($path); - } - $playlist->update(['cover_image' => $filename ?? null] + $request->validated()); + $playlist->update(['cover_image' => $filename] + $request->validated()); + } else { + $playlist->update($request->validated()); + } return to_route('playlists.show', ['playlist' => $playlist]) ->withSuccess(trans('playlist.update-success')); @@ -172,6 +174,7 @@ public function destroy(Request $request, Playlist $playlist): \Illuminate\Http\ abort_unless($request->user()->id == $playlist->user_id || $request->user()->group->is_modo, 403); $playlist->torrents()->detach(); + $playlist->comments()->delete(); $playlist->delete(); return to_route('playlists.index') diff --git a/app/Http/Controllers/RequestController.php b/app/Http/Controllers/RequestController.php index 2641bcf062..8e1cb8de43 100644 --- a/app/Http/Controllers/RequestController.php +++ b/app/Http/Controllers/RequestController.php @@ -21,7 +21,6 @@ use App\Models\Category; use App\Models\Movie; use App\Models\Resolution; -use App\Models\Torrent; use App\Models\TorrentRequest; use App\Models\TorrentRequestBounty; use App\Models\Tv; diff --git a/app/Http/Controllers/Staff/DonationController.php b/app/Http/Controllers/Staff/DonationController.php index 64f59e6263..ee4c27630b 100644 --- a/app/Http/Controllers/Staff/DonationController.php +++ b/app/Http/Controllers/Staff/DonationController.php @@ -34,7 +34,9 @@ public function index(Request $request): \Illuminate\Contracts\View\View|\Illumi { abort_unless($request->user()->group->is_owner, 403); - $donations = Donation::with('package')->latest()->paginate(25); + $donations = Donation::with(['package' => function ($query): void { + $query->withTrashed(); + }])->latest()->paginate(25); $dailyDonations = Donation::selectRaw('DATE(donations.created_at) as date, SUM(donation_packages.cost) as total') ->join('donation_packages', 'donations.package_id', '=', 'donation_packages.id') @@ -43,7 +45,7 @@ public function index(Request $request): \Illuminate\Contracts\View\View|\Illumi ->orderBy('date') ->get(); - $monthlyDonations = Donation::selectRaw('YEAR(donations.created_at) as year, MONTH(donations.created_at) as month, SUM(donation_packages.cost) as total') + $monthlyDonations = Donation::selectRaw('EXTRACT(YEAR FROM donations.created_at) as year, EXTRACT(MONTH FROM donations.created_at) as month, SUM(donation_packages.cost) as total') ->join('donation_packages', 'donations.package_id', '=', 'donation_packages.id') ->where('donations.status', '=', Donation::APPROVED) ->groupBy('year', 'month') diff --git a/app/Http/Controllers/Staff/HomeController.php b/app/Http/Controllers/Staff/HomeController.php index b923adb19d..0003a671ec 100644 --- a/app/Http/Controllers/Staff/HomeController.php +++ b/app/Http/Controllers/Staff/HomeController.php @@ -53,23 +53,23 @@ public function index(Request $request): \Illuminate\Contracts\View\Factory|\Ill return view('Staff.dashboard.index', [ 'users' => cache()->remember('dashboard_users', 300, fn () => DB::table('users') - ->selectRaw('count(*) as total') - ->selectRaw(\sprintf('count(case when group_id = %s then 1 end) as banned', $bannedGroup[0])) - ->selectRaw(\sprintf('count(case when group_id = %s then 1 end) as validating', $validatingGroup[0])) + ->selectRaw('COUNT(*) AS total') + ->selectRaw('SUM(group_id = ?) AS banned', [$bannedGroup[0]]) + ->selectRaw('SUM(group_id = ?) AS validating', [$validatingGroup[0]]) ->first()), 'torrents' => cache()->remember('dashboard_torrents', 300, fn () => DB::table('torrents') - ->selectRaw('count(*) as total') - ->selectRaw('count(case when status = 0 then 1 end) as pending') - ->selectRaw('count(case when status = 1 then 1 end) as approved') - ->selectRaw('count(case when status = 2 then 1 end) as rejected') - ->selectRaw('count(case when status = 3 then 1 end) as postponed') + ->selectRaw('COUNT(*) AS total') + ->selectRaw('SUM(status = 0) AS pending') + ->selectRaw('SUM(status = 1) AS approved') + ->selectRaw('SUM(status = 2) AS rejected') + ->selectRaw('SUM(status = 3) AS postponed') ->first()), 'peers' => cache()->remember('dashboard_peers', 300, fn () => DB::table('peers') - ->selectRaw('count(*) as total') - ->selectRaw('sum(active = 1) as active') - ->selectRaw('sum(active = 0) as inactive') - ->selectRaw('sum(seeder = 0 AND active = 1) as leechers') - ->selectRaw('sum(seeder = 1 AND active = 1) as seeders') + ->selectRaw('COUNT(*) AS total') + ->selectRaw('SUM(active = TRUE) AS active') + ->selectRaw('SUM(active = FALSE) AS inactive') + ->selectRaw('SUM(seeder = FALSE AND active = TRUE) AS leechers') + ->selectRaw('SUM(seeder = TRUE AND active = TRUE) AS seeders') ->first()), 'unsolvedReportsCount' => DB::table('reports')->whereNull('snoozed_until')->where('solved', '=', false)->count(), 'pendingApplicationsCount' => DB::table('applications')->where('status', '=', 0)->count(), diff --git a/app/Http/Controllers/Staff/InternalController.php b/app/Http/Controllers/Staff/InternalController.php index d326079d52..7e63b8774b 100644 --- a/app/Http/Controllers/Staff/InternalController.php +++ b/app/Http/Controllers/Staff/InternalController.php @@ -19,7 +19,6 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Staff\StoreInternalRequest; use App\Http\Requests\Staff\UpdateInternalRequest; -use App\Models\Group; use App\Models\Internal; use App\Models\User; diff --git a/app/Http/Controllers/Staff/ModerationController.php b/app/Http/Controllers/Staff/ModerationController.php index f50316fe5a..d91005aa53 100644 --- a/app/Http/Controllers/Staff/ModerationController.php +++ b/app/Http/Controllers/Staff/ModerationController.php @@ -43,6 +43,8 @@ public function __construct(private readonly ChatRepository $chatRepository) */ public function index(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View { + abort_unless(auth()->user()->group->is_torrent_modo, 403); + return view('Staff.moderation.index', [ 'current' => now(), 'pending' => Torrent::withoutGlobalScope(ApprovedScope::class) @@ -65,6 +67,8 @@ public function index(): \Illuminate\Contracts\View\Factory|\Illuminate\View\Vie */ public function update(UpdateModerationRequest $request, int $id): \Illuminate\Http\RedirectResponse { + abort_unless(auth()->user()->group->is_torrent_modo, 403); + $torrent = Torrent::withoutGlobalScope(ApprovedScope::class)->with('user')->findOrFail($id); if ($request->integer('old_status') !== $torrent->status) { diff --git a/app/Http/Controllers/Staff/UnregisteredInfoHashController.php b/app/Http/Controllers/Staff/UnregisteredInfoHashController.php new file mode 100644 index 0000000000..0b7a8b7133 --- /dev/null +++ b/app/Http/Controllers/Staff/UnregisteredInfoHashController.php @@ -0,0 +1,30 @@ + + * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 + */ + +namespace App\Http\Controllers\Staff; + +use App\Http\Controllers\Controller; + +class UnregisteredInfoHashController extends Controller +{ + /** + * Show unregistered info hashes. + */ + public function index(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View + { + return view('Staff.unregistered-info-hash.index'); + } +} diff --git a/app/Http/Controllers/Staff/WatchlistController.php b/app/Http/Controllers/Staff/WatchlistController.php index 06382e6616..447987b434 100644 --- a/app/Http/Controllers/Staff/WatchlistController.php +++ b/app/Http/Controllers/Staff/WatchlistController.php @@ -18,7 +18,6 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Staff\StoreWatchedUserRequest; -use App\Models\User; use App\Models\Watchlist; use Exception; diff --git a/app/Http/Controllers/TopicReadController.php b/app/Http/Controllers/TopicReadController.php index c65f3b5555..65bb02b8af 100644 --- a/app/Http/Controllers/TopicReadController.php +++ b/app/Http/Controllers/TopicReadController.php @@ -17,7 +17,6 @@ namespace App\Http\Controllers; use App\Models\Forum; -use App\Models\Topic; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; diff --git a/app/Http/Controllers/TorrentController.php b/app/Http/Controllers/TorrentController.php index 3050088cad..d6118e4204 100644 --- a/app/Http/Controllers/TorrentController.php +++ b/app/Http/Controllers/TorrentController.php @@ -82,7 +82,7 @@ public function show(Request $request, int|string $id): \Illuminate\Contracts\Vi $user = $request->user(); $torrent = Torrent::withoutGlobalScope(ApprovedScope::class) - ->with(['user', 'comments', 'category', 'type', 'resolution', 'subtitles', 'playlists']) + ->with(['user', 'comments', 'category', 'type', 'resolution', 'subtitles', 'playlists', 'reports']) ->withCount([ 'bookmarks', 'seeds' => fn ($query) => $query->where('active', '=', true)->where('visible', '=', true), @@ -415,12 +415,6 @@ public function store(StoreTorrentRequest $request): \Illuminate\Http\RedirectRe // Populate the status/seeders/leechers/times_completed fields for the external tracker $torrent->refresh(); - Unit3dAnnounce::addTorrent($torrent); - - if ($torrent->getAttribute('featured')) { - Unit3dAnnounce::addFeaturedTorrent($torrent->id); - } - $category = Category::findOrFail($request->integer('category_id')); // Backup the files contained in the torrent @@ -436,6 +430,38 @@ public function store(StoreTorrentRequest $request): \Illuminate\Http\RedirectRe TorrentFile::insert($files->toArray()); } + // Cover Image for No-Meta Torrents + if ($request->hasFile('torrent-cover')) { + $image_cover = $request->file('torrent-cover'); + + abort_if(\is_array($image_cover), 400); + + $filename_cover = 'torrent-cover_'.$torrent->id.'.jpg'; + $path_cover = public_path('/files/img/'.$filename_cover); + Image::make($image_cover->getRealPath())->fit(400, 600)->encode('jpg', 90)->save($path_cover); + } + + // Banner Image for No-Meta Torrents + if ($request->hasFile('torrent-banner')) { + $image_cover = $request->file('torrent-banner'); + + abort_if(\is_array($image_cover), 400); + + $filename_cover = 'torrent-banner_'.$torrent->id.'.jpg'; + $path_cover = public_path('/files/img/'.$filename_cover); + Image::make($image_cover->getRealPath())->fit(960, 540)->encode('jpg', 90)->save($path_cover); + } + + // Tracker updates come after initial database updates in case tracker's offline + + Unit3dAnnounce::addTorrent($torrent); + + if ($torrent->getAttribute('featured')) { + Unit3dAnnounce::addFeaturedTorrent($torrent->id); + } + + // TMDB updates come after tracker updates in case TMDB's offline + // TMDB Meta if ($torrent->tmdb != 0) { switch (true) { @@ -461,28 +487,6 @@ public function store(StoreTorrentRequest $request): \Illuminate\Http\RedirectRe Keyword::upsert($keywords->toArray(), ['torrent_id', 'name']); } - // Cover Image for No-Meta Torrents - if ($request->hasFile('torrent-cover')) { - $image_cover = $request->file('torrent-cover'); - - abort_if(\is_array($image_cover), 400); - - $filename_cover = 'torrent-cover_'.$torrent->id.'.jpg'; - $path_cover = public_path('/files/img/'.$filename_cover); - Image::make($image_cover->getRealPath())->fit(400, 600)->encode('jpg', 90)->save($path_cover); - } - - // Banner Image for No-Meta Torrents - if ($request->hasFile('torrent-banner')) { - $image_cover = $request->file('torrent-banner'); - - abort_if(\is_array($image_cover), 400); - - $filename_cover = 'torrent-banner_'.$torrent->id.'.jpg'; - $path_cover = public_path('/files/img/'.$filename_cover); - Image::make($image_cover->getRealPath())->fit(960, 540)->encode('jpg', 90)->save($path_cover); - } - // check for trusted user and update torrent if ($user->group->is_trusted && !$request->boolean('mod_queue_opt_in')) { $appurl = config('app.url'); diff --git a/app/Http/Controllers/User/InviteController.php b/app/Http/Controllers/User/InviteController.php index 3aae294952..1191adabbb 100644 --- a/app/Http/Controllers/User/InviteController.php +++ b/app/Http/Controllers/User/InviteController.php @@ -101,8 +101,9 @@ public function store(Request $request, User $user): \Illuminate\Http\RedirectRe $request->validate([ 'bail', - 'message' => 'required', - 'email' => [ + 'message' => 'required', + 'internal_note' => Rule::unless($user->group->is_modo, 'missing'), + 'email' => [ 'required', 'string', 'email', @@ -117,11 +118,12 @@ public function store(Request $request, User $user): \Illuminate\Http\RedirectRe $user->decrement('invites'); $invite = Invite::create([ - 'user_id' => $user->id, - 'email' => $request->input('email'), - 'code' => Uuid::uuid4()->toString(), - 'expires_on' => now()->addDays(config('other.invite_expire')), - 'custom' => $request->input('message'), + 'user_id' => $user->id, + 'email' => $request->input('email'), + 'code' => Uuid::uuid4()->toString(), + 'internal_note' => $request->input('internal_note'), + 'expires_on' => now()->addDays(config('other.invite_expire')), + 'custom' => $request->input('message'), ]); Mail::to($request->input('email'))->send(new InviteUser($invite)); diff --git a/app/Http/Controllers/User/InviteTreeController.php b/app/Http/Controllers/User/InviteTreeController.php index 0827626cff..dc17d42df4 100644 --- a/app/Http/Controllers/User/InviteTreeController.php +++ b/app/Http/Controllers/User/InviteTreeController.php @@ -34,28 +34,32 @@ public function index(Request $request, User $user): \Illuminate\Contracts\View\ $inviters = User::query() ->withTrashed() ->join( - DB::raw(' + DB::raw(<<<'SQL' ( WITH RECURSIVE cte AS ( SELECT invites.user_id FROM invites - WHERE invites.user_id != '.(int) User::SYSTEM_USER_ID.' - AND invites.accepted_by = '.(int) $user->id.' + WHERE invites.user_id != ? + AND invites.accepted_by = ? UNION ALL SELECT invites.user_id FROM invites JOIN cte ON cte.user_id = invites.accepted_by - WHERE invites.user_id != '.(int) User::SYSTEM_USER_ID.' + WHERE invites.user_id != ? AND invites.accepted_by IS NOT NULL - AND invites.accepted_by != '.(int) User::SYSTEM_USER_ID.' + AND invites.accepted_by != ? ) SELECT cte.* FROM cte ) AS tree - '), + SQL), fn ($join) => $join->on('users.id', '=', 'tree.user_id') ) + ->addBinding(User::SYSTEM_USER_ID, 'join') + ->addBinding($user->id, 'join') + ->addBinding(User::SYSTEM_USER_ID, 'join') + ->addBinding(User::SYSTEM_USER_ID, 'join') ->with('group') ->withCount([ 'warnings' => function ($query): void { @@ -66,30 +70,34 @@ public function index(Request $request, User $user): \Illuminate\Contracts\View\ $invites = Invite::query() ->join( - DB::raw(' + DB::raw(<<<'SQL' ( WITH RECURSIVE cte AS ( SELECT invites.id, invites.accepted_by, 0 as depth, CAST(invites.accepted_by AS CHAR(200)) AS path FROM invites - WHERE invites.user_id = '.(int) $user->id.' + WHERE invites.user_id = ? AND invites.accepted_by IS NOT NULL - AND invites.accepted_by != '.(int) User::SYSTEM_USER_ID.' + AND invites.accepted_by != ? UNION ALL - SELECT invites.id, invites.accepted_by, cte.depth + 1, CONCAT(cte.path, ", ", invites.accepted_by) + SELECT invites.id, invites.accepted_by, cte.depth + 1, CONCAT(cte.path, ', ', invites.accepted_by) FROM invites JOIN cte ON cte.accepted_by = invites.user_id - WHERE invites.user_id != '.(int) User::SYSTEM_USER_ID.' + WHERE invites.user_id != ? AND invites.accepted_by IS NOT NULL - AND invites.accepted_by != '.(int) User::SYSTEM_USER_ID.' + AND invites.accepted_by != ? ) SELECT cte.* FROM cte ORDER BY path ) AS tree - '), + SQL), fn ($join) => $join->on('invites.id', '=', 'tree.id') ) + ->addBinding($user->id, 'join') + ->addBinding(User::SYSTEM_USER_ID, 'join') + ->addBinding(User::SYSTEM_USER_ID, 'join') + ->addBinding(User::SYSTEM_USER_ID, 'join') ->with([ 'receiver' => fn ($query) => $query ->withTrashed() diff --git a/app/Http/Controllers/User/PasskeyController.php b/app/Http/Controllers/User/PasskeyController.php index d8f548bdb6..25344534af 100644 --- a/app/Http/Controllers/User/PasskeyController.php +++ b/app/Http/Controllers/User/PasskeyController.php @@ -17,7 +17,6 @@ namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; -use App\Models\Passkey; use App\Models\User; use App\Services\Unit3dAnnounce; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/User/TransactionController.php b/app/Http/Controllers/User/TransactionController.php index fb371ba404..5a7c60cef6 100644 --- a/app/Http/Controllers/User/TransactionController.php +++ b/app/Http/Controllers/User/TransactionController.php @@ -71,6 +71,10 @@ public function store(StoreTransactionRequest $request, User $user): \Illuminate switch (true) { case $bonExchange->upload: + if (config('other.bon.max-buffer-to-buy-upload') !== null && $user->uploaded - $user->downloaded > config('other.bon.max-buffer-to-buy-upload')) { + return back()->withErrors('You already have enough buffer.'); + } + $user->increment('uploaded', $bonExchange->value); break; diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php index 0eec210095..15dc43db4f 100644 --- a/app/Http/Controllers/User/UserController.php +++ b/app/Http/Controllers/User/UserController.php @@ -44,7 +44,7 @@ public function show(Request $request, User $user): \Illuminate\Contracts\View\F 'application', 'privacy', 'userban' => ['banneduser', 'staffuser'], - 'tickets' => fn ($query) => $query->orderByRaw('ISNULL(closed_at) desc')->orderByDesc('id'), + 'tickets' => fn ($query) => $query->orderByRaw('CASE WHEN closed_at IS NULL THEN 1 ELSE 0 END DESC')->orderByDesc('id'), ]) ->loadCount([ 'torrents as anon_uploads_count' => fn ($query) => $query->where('anon', '=', true), @@ -94,8 +94,14 @@ public function show(Request $request, User $user): \Illuminate\Contracts\View\F // 'boughtDownload' => BonTransactions::where('sender_id', '=', $user->id)->where([['name', 'like', '%Download%']])->sum('cost'), 'invitedBy' => Invite::where('accepted_by', '=', $user->id)->first(), 'clients' => $user->peers() + ->join('torrents', 'torrents.id', '=', 'peers.torrent_id') ->select('agent', 'port') - ->selectRaw('INET6_NTOA(ip) as ip, MIN(created_at) as created_at, MAX(updated_at) as updated_at, COUNT(*) as num_peers, MAX(connectable) as connectable') + ->selectRaw('INET6_NTOA(peers.ip) as ip') + ->selectRaw('MIN(peers.created_at) as created_at') + ->selectRaw('MAX(peers.updated_at) as updated_at') + ->selectRaw('SUM(torrents.size) as size') + ->selectRaw('COUNT(*) as num_peers') + ->selectRaw('MAX(peers.connectable) as connectable') ->groupBy(['ip', 'port', 'agent']) ->where('active', '=', true) ->get(), @@ -104,9 +110,9 @@ public function show(Request $request, User $user): \Illuminate\Contracts\View\F ->whereNotNull('unlocked_at') ->get(), 'peers' => Peer::query() - ->selectRaw('SUM(seeder = 0 AND active = 1) as leeching') - ->selectRaw('SUM(seeder = 1 AND active = 1) as seeding') - ->selectRaw('SUM(active = 0) as inactive') + ->selectRaw('SUM(seeder = FALSE AND active = TRUE) as leeching') + ->selectRaw('SUM(seeder = TRUE AND active = TRUE) as seeding') + ->selectRaw('SUM(active = FALSE) as inactive') ->where('user_id', '=', $user->id) ->first(), 'watch' => $user->watchlist, diff --git a/app/Http/Livewire/BookmarkButton.php b/app/Http/Livewire/BookmarkButton.php index 5e4e01986a..3c5c617c05 100644 --- a/app/Http/Livewire/BookmarkButton.php +++ b/app/Http/Livewire/BookmarkButton.php @@ -42,6 +42,8 @@ final public function store(): void $this->isBookmarked = true; $this->bookmarksCount++; $this->dispatch('success', type: 'success', message: 'Torrent Has Been Bookmarked Successfully!'); + + Torrent::query()->whereKey($this->torrent->id)->searchable(); } final public function destroy(): void @@ -50,6 +52,8 @@ final public function destroy(): void $this->isBookmarked = false; $this->bookmarksCount--; $this->dispatch('success', type: 'success', message: 'Torrent Has Been Unbookmarked Successfully!'); + + Torrent::query()->whereKey($this->torrent->id)->searchable(); } final public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Contracts\Foundation\Application diff --git a/app/Http/Livewire/HistorySearch.php b/app/Http/Livewire/HistorySearch.php index f2d3339145..d9301867b7 100644 --- a/app/Http/Livewire/HistorySearch.php +++ b/app/Http/Livewire/HistorySearch.php @@ -118,8 +118,8 @@ final public function histories(): \Illuminate\Pagination\LengthAwarePaginator DB::raw('SUM(active AND seeder) AS seeding_count'), DB::raw('SUM(active AND NOT seeder) AS leeching_count'), DB::raw('SUM(prewarned_at IS NOT NULL) AS prewarn_count'), - DB::raw('SUM(hitrun = 1) AS hitrun_count'), - DB::raw('SUM(immune = 1) AS immune_count'), + DB::raw('SUM(hitrun = TRUE) AS hitrun_count'), + DB::raw('SUM(immune = TRUE) AS immune_count'), ]) ->withCasts([ 'created_at_min' => 'datetime', diff --git a/app/Http/Livewire/PeerSearch.php b/app/Http/Livewire/PeerSearch.php index 23585f8a32..396853860d 100644 --- a/app/Http/Livewire/PeerSearch.php +++ b/app/Http/Livewire/PeerSearch.php @@ -132,15 +132,15 @@ final public function peers(): \Illuminate\Contracts\Pagination\LengthAwarePagin ->selectRaw('INET6_NTOA(peers.ip) as ip') ->selectRaw('SUM(peers.uploaded) as uploaded') ->selectRaw('SUM(peers.downloaded) as downloaded') - ->selectRaw('SUM(peers.`left`) as `left`') + ->selectRaw('SUM(peers."left") as "left"') ->selectRaw('MIN(peers.created_at) as created_at') ->selectRaw('MAX(peers.updated_at) as updated_at') ->selectRaw('COUNT(DISTINCT peers.torrent_id, peers.user_id, peers.peer_id) as peer_count') - ->selectRaw('SUM(peers.connectable = 1) as connectable_count') - ->selectRaw('SUM(peers.connectable = 0) as unconnectable_count') - ->selectRaw('SUM(peers.active = 1) as active_count') - ->selectRaw('SUM(peers.active = 0) as inactive_count') - ->selectRaw('ROUND(COALESCE(SUM(peers.active = 0) / SUM(peers.active = 1), 0), 2) as inactive_ratio') + ->selectRaw('SUM(peers.connectable = TRUE) as connectable_count') + ->selectRaw('SUM(peers.connectable = FALSE) as unconnectable_count') + ->selectRaw('SUM(peers.active = TRUE) as active_count') + ->selectRaw('SUM(peers.active = FALSE) as inactive_count') + ->selectRaw('ROUND(COALESCE(SUM(peers.active = FALSE) / SUM(peers.active = TRUE), 0), 2) as inactive_ratio') ->groupBy(['peers.user_id', 'peers.agent', 'peers.ip', 'peers.port']) ->with(['user', 'user.group']) ) @@ -154,15 +154,15 @@ final public function peers(): \Illuminate\Contracts\Pagination\LengthAwarePagin ->selectRaw('COUNT(DISTINCT peers.port) as port') ->selectRaw('SUM(peers.uploaded) as uploaded') ->selectRaw('SUM(peers.downloaded) as downloaded') - ->selectRaw('SUM(`left`) as `left`') + ->selectRaw('SUM("left") as "left"') ->selectRaw('MIN(peers.created_at) as created_at') ->selectRaw('MAX(peers.updated_at) as updated_at') ->selectRaw('COUNT(*) as peer_count') - ->selectRaw('SUM(peers.connectable = 1) as connectable_count') - ->selectRaw('SUM(peers.connectable = 0) as unconnectable_count') - ->selectRaw('SUM(peers.active = 1) as active_count') - ->selectRaw('SUM(peers.active = 0) as inactive_count') - ->selectRaw('ROUND(COALESCE(SUM(peers.active = 0) / SUM(peers.active = 1), 0), 2) as inactive_ratio') + ->selectRaw('SUM(peers.connectable = TRUE) as connectable_count') + ->selectRaw('SUM(peers.connectable = FALSE) as unconnectable_count') + ->selectRaw('SUM(peers.active = TRUE) as active_count') + ->selectRaw('SUM(peers.active = FALSE) as inactive_count') + ->selectRaw('ROUND(COALESCE(SUM(peers.active = FALSE) / SUM(peers.active = TRUE), 0), 2) as inactive_ratio') ->groupBy(['peers.user_id', 'peers.ip']) ->with(['user', 'user.group']) ) @@ -176,15 +176,15 @@ final public function peers(): \Illuminate\Contracts\Pagination\LengthAwarePagin ->selectRaw('COUNT(DISTINCT peers.port) as port') ->selectRaw('SUM(peers.uploaded) as uploaded') ->selectRaw('SUM(peers.downloaded) as downloaded') - ->selectRaw('SUM(`left`) as `left`') + ->selectRaw('SUM("left") as "left"') ->selectRaw('MIN(peers.created_at) as created_at') ->selectRaw('MAX(peers.updated_at) as updated_at') ->selectRaw('COUNT(*) as peer_count') - ->selectRaw('SUM(peers.connectable = 1) as connectable_count') - ->selectRaw('SUM(peers.connectable = 0) as unconnectable_count') - ->selectRaw('SUM(peers.active = 1) as active_count') - ->selectRaw('SUM(peers.active = 0) as inactive_count') - ->selectRaw('ROUND(COALESCE(SUM(peers.active = 0) / SUM(peers.active = 1), 0), 2) as inactive_ratio') + ->selectRaw('SUM(peers.connectable = TRUE) as connectable_count') + ->selectRaw('SUM(peers.connectable = FALSE) as unconnectable_count') + ->selectRaw('SUM(peers.active = TRUE) as active_count') + ->selectRaw('SUM(peers.active = FALSE) as inactive_count') + ->selectRaw('ROUND(COALESCE(SUM(peers.active = FALSE) / SUM(peers.active = TRUE), 0), 2) as inactive_ratio') ->groupBy(['peers.user_id']) ->with(['user', 'user.group']) ) @@ -220,12 +220,12 @@ final public function peers(): \Illuminate\Contracts\Pagination\LengthAwarePagin $this->groupBy === 'none', fn ($query) => $query ->selectRaw('torrents.size as size') - ->selectRaw('IF(peers.connectable = 1, torrents.size, 0) as connectable_size') - ->selectRaw('IF(peers.connectable = 0, torrents.size, 0) as unconnectable_size'), + ->selectRaw('CASE WHEN peers.connectable = TRUE THEN torrents.size ELSE 0 END as connectable_size') + ->selectRaw('CASE WHEN peers.connectable = FALSE THEN torrents.size ELSE 0 END as unconnectable_size'), fn ($query) => $query ->selectRaw('SUM(torrents.size) as size') - ->selectRaw('SUM(IF(peers.connectable = 1, torrents.size, 0)) as connectable_size') - ->selectRaw('SUM(IF(peers.connectable = 0, torrents.size, 0)) as unconnectable_size') + ->selectRaw('SUM(CASE WHEN peers.connectable = TRUE THEN torrents.size ELSE 0 END) as connectable_size') + ->selectRaw('SUM(CASE WHEN peers.connectable = FALSE THEN torrents.size ELSE 0 END) as unconnectable_size') ) ) ->when($this->ip !== '', fn ($query) => $query->where(DB::raw('INET6_NTOA(ip)'), 'LIKE', $this->ip.'%')) diff --git a/app/Http/Livewire/PlaylistSearch.php b/app/Http/Livewire/PlaylistSearch.php index 5fc2a521a5..992362a957 100644 --- a/app/Http/Livewire/PlaylistSearch.php +++ b/app/Http/Livewire/PlaylistSearch.php @@ -43,7 +43,7 @@ class PlaylistSearch extends Component public string $username = ''; #[Url(history: true)] - public string $sortDirection = 'desc'; + public string $sortDirection = 'asc'; final public function updatingName(): void { @@ -70,7 +70,7 @@ final public function playlists() ) ) ->when($this->name !== '', fn ($query) => $query->where('name', 'LIKE', '%'.str_replace(' ', '%', $this->name).'%')) - ->when($this->username !== '', fn ($query) => $query->whereRelation('user', 'username', '=', $this->username)) + ->when($this->username !== '', fn ($query) => $query->whereRelation('user', 'username', 'LIKE', '%'.$this->username.'%')) ->orderBy($this->sortField, $this->sortDirection) ->paginate(min($this->perPage, 100)); } diff --git a/app/Http/Livewire/Top10.php b/app/Http/Livewire/Top10.php index dd890ade6a..d4fd87c55c 100644 --- a/app/Http/Livewire/Top10.php +++ b/app/Http/Livewire/Top10.php @@ -17,8 +17,10 @@ namespace App\Http\Livewire; use App\Models\Category; +use App\Models\History; use App\Models\Torrent; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; use Livewire\Attributes\Computed; @@ -40,7 +42,7 @@ class Top10 extends Component public string $metaType = 'movie_meta'; #[Url(history: true)] - #[Validate('in:day,week,month,year,all,custom')] + #[Validate('in:day,week,weekly,month,year,all,custom')] public string $interval = 'day'; #[Url(history: true)] @@ -109,6 +111,50 @@ final public function works(): Collection ); } + /** + * @return \Illuminate\Database\Eloquent\Collection> + * @phpstan-ignore generics.notSubtype (I can't figure out the correct return type to silence this error) + */ + #[Computed] + final public function weekly(): Collection + { + $this->validate(); + + return cache()->remember( + 'weekly-charts:'.$this->metaType, + 24 * 3600, + fn () => Torrent::query() + ->withoutGlobalScopes() + ->with($this->metaType === 'movie_meta' ? 'movie' : 'tv') + ->fromSub( + History::query() + ->withoutGlobalScopes() + ->join('torrents', 'torrents.id', '=', 'history.torrent_id') + ->join('categories', fn (JoinClause $join) => $join->on('torrents.category_id', '=', 'categories.id')->where($this->metaType, '=', true)) + ->select([ + DB::raw('FROM_DAYS(TO_DAYS(history.created_at) - MOD(TO_DAYS(history.created_at) - 1, 7)) AS week_start'), + 'tmdb', + DB::raw('MIN(categories.id) as category_id'), + DB::raw('COUNT(*) AS download_count'), + DB::raw('ROW_NUMBER() OVER (PARTITION BY FROM_DAYS(TO_DAYS(history.created_at) - MOD(TO_DAYS(history.created_at) - 1, 7)) ORDER BY COUNT(*) DESC) AS place'), + ]) + ->where('tmdb', '!=', 0) + // Small torrents screw the stats since users download them only to farm bon. + ->where('torrents.size', '>', 1024 * 1024 * 1024) + ->groupBy('week_start', 'tmdb'), + 'ranked_groups', + ) + ->where('place', '<=', 10) + ->orderByDesc('week_start') + ->orderBy('place') + ->withCasts([ + 'week_start' => 'datetime', + ]) + ->get() + ->groupBy('week_start') + ); + } + /** * @return array */ @@ -142,7 +188,7 @@ final public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\C { return view('livewire.top10', [ 'user' => auth()->user(), - 'works' => $this->works, + 'works' => $this->interval === 'weekly' ? $this->weekly : $this->works, 'metaTypes' => $this->metaTypes, ]); } diff --git a/app/Http/Livewire/TopTorrents.php b/app/Http/Livewire/TopTorrents.php index f9eb40bdae..b67695e72d 100644 --- a/app/Http/Livewire/TopTorrents.php +++ b/app/Http/Livewire/TopTorrents.php @@ -64,15 +64,15 @@ final public function torrents(): \Illuminate\Support\Collection ->orWhereNotNull('completed_at') ), ]) - ->selectRaw(" + ->selectRaw(<<withCount(['thanks', 'comments']) ->when($this->tab === 'newest', fn ($query) => $query->orderByDesc('id')) ->when($this->tab === 'seeded', fn ($query) => $query->orderByDesc('seeders')) diff --git a/app/Http/Livewire/TorrentRequestSearch.php b/app/Http/Livewire/TorrentRequestSearch.php index 36198144a2..0e6391d031 100644 --- a/app/Http/Livewire/TorrentRequestSearch.php +++ b/app/Http/Livewire/TorrentRequestSearch.php @@ -209,17 +209,75 @@ final public function torrentRequests(): \Illuminate\Pagination\LengthAwarePagin return TorrentRequest::with(['user:id,username,group_id', 'user.group', 'category', 'type', 'resolution']) ->withCount(['comments']) - ->when($this->name !== '', fn ($query) => $query->ofName($this->name, $isRegex($this->name))) - ->when($this->requestor !== '', fn ($query) => $query->ofUploader($this->requestor)) - ->when($this->categoryIds !== [], fn ($query) => $query->ofCategory($this->categoryIds)) - ->when($this->typeIds !== [], fn ($query) => $query->ofType($this->typeIds)) - ->when($this->resolutionIds !== [], fn ($query) => $query->ofResolution($this->resolutionIds)) - ->when($this->tmdbId !== null, fn ($query) => $query->ofTmdb($this->tmdbId)) - ->when($this->imdbId !== '', fn ($query) => $query->ofImdb((int) (preg_match('/tt0*(?=(\d{7,}))/', $this->imdbId, $matches) ? $matches[1] : $this->imdbId))) - ->when($this->tvdbId !== null, fn ($query) => $query->ofTvdb((int) $this->tvdbId)) - ->when($this->malId !== null, fn ($query) => $query->ofMal((int) $this->malId)) - ->when($this->genreIds !== [], fn ($query) => $query->ofGenre($this->genreIds)) - ->when($this->primaryLanguageNames !== [], fn ($query) => $query->ofPrimaryLanguage($this->primaryLanguageNames)) + ->when( + $this->name !== '', + fn ($query) => $query + ->when( + $isRegex($this->name), + fn ($query) => $query->where('name', 'REGEXP', substr($this->name, 1, -1)), + fn ($query) => $query->where('name', 'LIKE', '%'.str_replace(' ', '%', $this->name).'%') + ) + ) + ->when( + $this->requestor !== '', + fn ($query) => $query + ->whereRelation('user', 'username', '=', $this->requestor) + ->when( + $user === null, + fn ($query) => $query->where('anon', '=', false), + fn ($query) => $query + ->when( + !$user->group->is_modo, + fn ($query) => $query + ->where( + fn ($query) => $query + ->where('anon', '=', false) + ->orWhere('user_id', '=', $user->id) + ) + ) + ) + ) + ->when($this->categoryIds !== [], fn ($query) => $query->whereIntegerInRaw('category_id', $this->categoryIds)) + ->when($this->typeIds !== [], fn ($query) => $query->whereIntegerInRaw('type_id', $this->typeIds)) + ->when($this->resolutionIds !== [], fn ($query) => $query->whereIntegerInRaw('resolution_id', $this->resolutionIds)) + ->when($this->tmdbId !== null, fn ($query) => $query->where('tmdb', '=', $this->tmdbId)) + ->when($this->imdbId !== '', fn ($query) => $query->where('imdb', '=', (preg_match('/tt0*(?=(\d{7,}))/', $this->imdbId, $matches) ? $matches[1] : $this->imdbId))) + ->when($this->tvdbId !== null, fn ($query) => $query->where('tvdb', '=', $this->tvdbId)) + ->when($this->malId !== null, fn ($query) => $query->where('mal', '=', $this->malId)) + ->when( + $this->genreIds !== [], + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereIn('tmdb', DB::table('genre_movie')->select('movie_id')->whereIn('genre_id', $this->genreIds)) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('category', 'tv_meta', '=', true) + ->whereIn('tmdb', DB::table('genre_tv')->select('tv_id')->whereIn('genre_id', $this->genreIds)) + ) + ) + ) + ->when( + $this->primaryLanguageNames !== [], + fn ($query) => $query + ->where( + fn ($query) => $query + ->where( + fn ($query) => $query + ->whereRelation('category', 'movie_meta', '=', true) + ->whereHas('movie', fn ($query) => $query->whereIn('original_language', $this->primaryLanguageNames)) + ) + ->orWhere( + fn ($query) => $query + ->whereRelation('category', 'tv_meta', '=', true) + ->whereHas('tv', fn ($query) => $query->whereIn('original_language', $this->primaryLanguageNames)) + ) + ) + ) ->when($this->unfilled || $this->claimed || $this->pending || $this->filled, function ($query): void { $query->where(function ($query): void { $query->where(function ($query): void { diff --git a/app/Http/Livewire/TorrentSearch.php b/app/Http/Livewire/TorrentSearch.php index 29c82398bf..ff9f7e2eec 100644 --- a/app/Http/Livewire/TorrentSearch.php +++ b/app/Http/Livewire/TorrentSearch.php @@ -467,15 +467,15 @@ final public function torrents(): \Illuminate\Contracts\Pagination\LengthAwarePa ), 'trump', ]) - ->selectRaw(" + ->selectRaw(<<<'SQL' CASE - WHEN category_id IN (SELECT `id` from `categories` where `movie_meta` = 1) THEN 'movie' - WHEN category_id IN (SELECT `id` from `categories` where `tv_meta` = 1) THEN 'tv' - WHEN category_id IN (SELECT `id` from `categories` where `game_meta` = 1) THEN 'game' - WHEN category_id IN (SELECT `id` from `categories` where `music_meta` = 1) THEN 'music' - WHEN category_id IN (SELECT `id` from `categories` where `no_meta` = 1) THEN 'no' - END as meta - "); + WHEN category_id IN (SELECT id FROM categories WHERE movie_meta = 1) THEN 'movie' + WHEN category_id IN (SELECT id FROM categories WHERE tv_meta = 1) THEN 'tv' + WHEN category_id IN (SELECT id FROM categories WHERE game_meta = 1) THEN 'game' + WHEN category_id IN (SELECT id FROM categories WHERE music_meta = 1) THEN 'music' + WHEN category_id IN (SELECT id FROM categories WHERE no_meta = 1) THEN 'no' + END AS meta + SQL); if ($isSqlAllowed) { $torrents = Torrent::query() @@ -539,7 +539,12 @@ final public function groupedTorrents() ->selectRaw('MAX(sticky) as sticky') ->selectRaw('MAX(bumped_at) as bumped_at') ->selectRaw('SUM(times_completed) as times_completed') - ->selectRaw("CASE WHEN category_id IN (SELECT `id` from `categories` where `movie_meta` = 1) THEN 'movie' WHEN category_id IN (SELECT `id` from `categories` where `tv_meta` = 1) THEN 'tv' END as meta") + ->selectRaw(<<<'SQL' + CASE + WHEN category_id IN (SELECT id FROM categories WHERE movie_meta = 1) THEN 'movie' + WHEN category_id IN (SELECT id FROM categories WHERE tv_meta = 1) THEN 'tv' + END AS meta + SQL) ->havingNotNull('meta') ->where('tmdb', '!=', 0) ->where($this->filters()->toSqlQueryBuilder()) @@ -608,7 +613,12 @@ final public function groupedTorrents() 'resolution_id', 'personal_release', ]) - ->selectRaw("CASE WHEN category_id IN (SELECT `id` from `categories` where `movie_meta` = 1) THEN 'movie' WHEN category_id IN (SELECT `id` from `categories` where `tv_meta` = 1) THEN 'tv' END as meta") + ->selectRaw(<<<'SQL' + CASE + WHEN category_id IN (SELECT id FROM categories WHERE movie_meta = 1) THEN 'movie' + WHEN category_id IN (SELECT id FROM categories WHERE tv_meta = 1) THEN 'tv' + END AS meta + SQL) ->where( fn ($query) => $query ->where( @@ -751,7 +761,12 @@ final public function groupedPosters() ->selectRaw('MAX(bumped_at) as bumped_at') ->selectRaw('SUM(times_completed) as times_completed') ->selectRaw('MIN(category_id) as category_id') - ->selectRaw("CASE WHEN category_id IN (SELECT `id` from `categories` where `movie_meta` = 1) THEN 'movie' WHEN category_id IN (SELECT `id` from `categories` where `tv_meta` = 1) THEN 'tv' END as meta") + ->selectRaw(<<<'SQL' + CASE + WHEN category_id IN (SELECT id FROM categories WHERE movie_meta = 1) THEN 'movie' + WHEN category_id IN (SELECT id FROM categories WHERE tv_meta = 1) THEN 'tv' + END AS meta + SQL) ->havingNotNull('meta') ->where('tmdb', '!=', 0) ->where($this->filters()->toSqlQueryBuilder()) diff --git a/app/Http/Livewire/UnregisteredInfoHashSearch.php b/app/Http/Livewire/UnregisteredInfoHashSearch.php new file mode 100644 index 0000000000..f83d4029be --- /dev/null +++ b/app/Http/Livewire/UnregisteredInfoHashSearch.php @@ -0,0 +1,93 @@ + + * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 + */ + +namespace App\Http\Livewire; + +use App\Models\Scopes\ApprovedScope; +use App\Models\UnregisteredInfoHash; +use App\Traits\CastLivewireProperties; +use App\Traits\LivewireSort; +use Illuminate\Support\Facades\DB; +use Livewire\Attributes\Computed; +use Livewire\Attributes\Url; +use Livewire\Component; +use Livewire\WithPagination; + +class UnregisteredInfoHashSearch extends Component +{ + use CastLivewireProperties; + use LivewireSort; + use WithPagination; + + #TODO: Update URL attributes once Livewire 3 fixes upstream bug. See: https://github.com/livewire/livewire/discussions/7746 + + #[Url(history: true)] + public int $perPage = 25; + + #[Url(history: true)] + public string $username = ''; + + #[Url(history: true)] + public bool $excludeSoftDeletedTorrents = true; + + #[Url(history: true)] + public string $groupBy = 'none'; + + #[Url(history: true)] + public string $sortField = 'created_at'; + + #[Url(history: true)] + public string $sortDirection = 'desc'; + + final public function updatingSearch(): void + { + $this->resetPage(); + } + + /** + * @return \Illuminate\Pagination\LengthAwarePaginator + */ + #[Computed] + final public function unregisteredInfoHashes(): \Illuminate\Pagination\LengthAwarePaginator + { + return UnregisteredInfoHash::query() + ->with('user') + ->when($this->username !== '', fn ($query) => $query->whereRelation('user', 'username', 'LIKE', '%'.$this->username.'%')) + ->when( + $this->groupBy === 'info_hash', + fn ($query) => $query->groupBy('info_hash') + ->select([ + 'info_hash', + DB::raw('MIN(created_at) as created_at'), + DB::raw('MAX(updated_at) as updated_at'), + DB::raw('COUNT(*) as amount'), + ]) + ) + ->when( + $this->excludeSoftDeletedTorrents, + fn ($query) => $query->whereDoesntHave('torrent', fn ($query) => $query->onlyTrashed()->withoutGlobalScope(ApprovedScope::class)) + ) + ->orderBy($this->sortField, $this->sortDirection) + ->paginate($this->perPage); + } + + final public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Contracts\Foundation\Application + { + return view('livewire.unregistered-info-hash-search', [ + 'unregisteredInfoHashes' => $this->unregisteredInfoHashes, + ]); + } +} diff --git a/app/Http/Livewire/UserActive.php b/app/Http/Livewire/UserActive.php index b0c183a228..c7e0bf71f0 100644 --- a/app/Http/Livewire/UserActive.php +++ b/app/Http/Livewire/UserActive.php @@ -108,7 +108,7 @@ final public function actives(): \Illuminate\Pagination\LengthAwarePaginator 'torrents.times_completed', ) ->selectRaw('INET6_NTOA(ip) as ip') - ->selectRaw('(1 - (peers.left / NULLIF(torrents.size, 0))) AS progress') + ->selectRaw('(1 - (peers.left / COALESCE(torrents.size, 0))) AS progress') ->where('peers.user_id', '=', $this->user->id) ->when( $this->name, diff --git a/app/Http/Livewire/UserTorrents.php b/app/Http/Livewire/UserTorrents.php index d67e289e8d..db7a16bf6f 100644 --- a/app/Http/Livewire/UserTorrents.php +++ b/app/Http/Livewire/UserTorrents.php @@ -124,7 +124,7 @@ final public function history(): \Illuminate\Contracts\Pagination\LengthAwarePag 'torrents.user_id', 'torrents.status', ) - ->selectRaw('IF(torrents.user_id = ?, 1, 0) AS uploader', [$this->user->id]) + ->selectRaw('torrents.user_id = ? AS uploader', [$this->user->id]) ->selectRaw('history.active AND history.seeder AS seeding') ->selectRaw('history.active AND NOT history.seeder AS leeching') ->selectRaw('TIMESTAMPDIFF(SECOND, history.created_at, history.completed_at) AS leechtime') diff --git a/app/Http/Requests/MassUpsertPlaylistTorrentRequest.php b/app/Http/Requests/MassUpsertPlaylistTorrentRequest.php index ed31fe8fe0..f5a1fd0b17 100644 --- a/app/Http/Requests/MassUpsertPlaylistTorrentRequest.php +++ b/app/Http/Requests/MassUpsertPlaylistTorrentRequest.php @@ -17,7 +17,6 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Http\Request; use Illuminate\Validation\Rule; /** diff --git a/app/Http/Requests/Staff/StoreEventRequest.php b/app/Http/Requests/Staff/StoreEventRequest.php index 0e5328641f..3293183278 100644 --- a/app/Http/Requests/Staff/StoreEventRequest.php +++ b/app/Http/Requests/Staff/StoreEventRequest.php @@ -51,10 +51,6 @@ public function rules(): array 'required', 'date', ], - 'active' => [ - 'required', - 'boolean', - ], ]; } } diff --git a/app/Http/Requests/Staff/StoreForumRequest.php b/app/Http/Requests/Staff/StoreForumRequest.php index a9f3782f52..b185876d55 100644 --- a/app/Http/Requests/Staff/StoreForumRequest.php +++ b/app/Http/Requests/Staff/StoreForumRequest.php @@ -17,7 +17,6 @@ namespace App\Http\Requests\Staff; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Http\Request; use Illuminate\Support\Str; use Illuminate\Validation\Rule; diff --git a/app/Http/Requests/Staff/StoreGroupRequest.php b/app/Http/Requests/Staff/StoreGroupRequest.php index 55d9a190c9..11a5e520a0 100644 --- a/app/Http/Requests/Staff/StoreGroupRequest.php +++ b/app/Http/Requests/Staff/StoreGroupRequest.php @@ -79,6 +79,10 @@ public function rules(Request $request): array 'required', 'boolean', ], + 'is_torrent_modo' => [ + 'required', + 'boolean', + ], 'is_modo' => [ 'required', 'boolean', diff --git a/app/Http/Requests/Staff/UpdateGroupRequest.php b/app/Http/Requests/Staff/UpdateGroupRequest.php index 3135d43065..bc59cd071e 100644 --- a/app/Http/Requests/Staff/UpdateGroupRequest.php +++ b/app/Http/Requests/Staff/UpdateGroupRequest.php @@ -85,6 +85,10 @@ public function rules(Request $request): array 'required', 'boolean', ], + 'is_torrent_modo' => [ + 'required', + 'boolean', + ], 'is_modo' => [ 'required', 'boolean', diff --git a/app/Http/Requests/StoreRequestFillRequest.php b/app/Http/Requests/StoreRequestFillRequest.php index f91932016a..acccdf4179 100644 --- a/app/Http/Requests/StoreRequestFillRequest.php +++ b/app/Http/Requests/StoreRequestFillRequest.php @@ -17,7 +17,6 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Http\Request; class StoreRequestFillRequest extends FormRequest { diff --git a/app/Http/Requests/StoreTicketRequest.php b/app/Http/Requests/StoreTicketRequest.php index 0258391f5f..b412d9f216 100644 --- a/app/Http/Requests/StoreTicketRequest.php +++ b/app/Http/Requests/StoreTicketRequest.php @@ -17,7 +17,6 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Http\Request; use Illuminate\Validation\Rule; class StoreTicketRequest extends FormRequest diff --git a/app/Http/Requests/UpdatePlaylistRequest.php b/app/Http/Requests/UpdatePlaylistRequest.php index 68cc38c636..09e89e2c8a 100644 --- a/app/Http/Requests/UpdatePlaylistRequest.php +++ b/app/Http/Requests/UpdatePlaylistRequest.php @@ -17,7 +17,6 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Http\Request; /** * @see \Tests\Todo\Unit\Http\Requests\VoteOnPollTest diff --git a/app/Http/Requests/UpdateSubtitleRequest.php b/app/Http/Requests/UpdateSubtitleRequest.php index 48b3683a11..209cce4924 100644 --- a/app/Http/Requests/UpdateSubtitleRequest.php +++ b/app/Http/Requests/UpdateSubtitleRequest.php @@ -17,7 +17,6 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Http\Request; use Illuminate\Validation\Rule; class UpdateSubtitleRequest extends FormRequest diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php index f77e64c6a3..4d081d7404 100644 --- a/app/Http/Resources/UserResource.php +++ b/app/Http/Resources/UserResource.php @@ -17,15 +17,28 @@ namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; -use JsonSerializable; +/** + * @mixin \App\Models\User + */ class UserResource extends JsonResource { /** * Transform the resource into an array. */ - public function toArray($request): array|\Illuminate\Contracts\Support\Arrayable|JsonSerializable + public function toArray($request): array { - return parent::toArray($request); + return [ + 'username' => $this->username, + 'group' => $this->group->name, + 'uploaded' => str_replace("\u{00A0}", ' ', $this->formatted_uploaded), + 'downloaded' => str_replace("\u{00A0}", ' ', $this->formatted_downloaded), + 'ratio' => $this->formatted_ratio, + 'buffer' => str_replace("\u{00A0}", ' ', $this->formatted_buffer), + 'seeding' => \count($this->seedingTorrents) ? $this->seedingTorrents : 0, + 'leeching' => \count($this->leechingTorrents) ? $this->leechingTorrents : 0, + 'seedbonus' => $this->seedbonus, + 'hit_and_runs' => $this->hitandruns, + ]; } } diff --git a/app/Listeners/RegisteredListener.php b/app/Listeners/RegisteredListener.php new file mode 100644 index 0000000000..27c399e35b --- /dev/null +++ b/app/Listeners/RegisteredListener.php @@ -0,0 +1,47 @@ +user; + + $this->chatRepository->systemMessage($this->getWelcomeMessage($user)); + + // Send Welcome PM + $user->sendSystemNotification( + subject: config('welcomepm.subject'), + message: config('welcomepm.message'), + ); + } + + private function getWelcomeMessage(User $user): string + { + // Select A Random Welcome Message + $profileUrl = href_profile($user); + + return Arr::random([ + \sprintf('[url=%s]%s[/url], Welcome to ', $profileUrl, $user->username).config('other.title').'! Hope you enjoy the community.', + \sprintf("[url=%s]%s[/url], We've been expecting you.", $profileUrl, $user->username), + \sprintf("[url=%s]%s[/url] has arrived. Party's over.", $profileUrl, $user->username), + \sprintf("It's a bird! It's a plane! Nevermind, it's just [url=%s]%s[/url].", $profileUrl, $user->username), + \sprintf('Ready player [url=%s]%s[/url].', $profileUrl, $user->username), + \sprintf('A wild [url=%s]%s[/url] appeared.', $profileUrl, $user->username), + 'Welcome to '.config('other.title').\sprintf(' [url=%s]%s[/url]. We were expecting you.', $profileUrl, $user->username), + ]); + } +} diff --git a/app/Models/Donation.php b/app/Models/Donation.php index 9df52059e5..1c69db7d85 100644 --- a/app/Models/Donation.php +++ b/app/Models/Donation.php @@ -96,6 +96,6 @@ public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function package(): \Illuminate\Database\Eloquent\Relations\BelongsTo { - return $this->belongsTo(DonationPackage::class); + return $this->belongsTo(DonationPackage::class)->withTrashed(); } } diff --git a/app/Models/DonationPackage.php b/app/Models/DonationPackage.php index 373b3912d3..39662de054 100644 --- a/app/Models/DonationPackage.php +++ b/app/Models/DonationPackage.php @@ -18,6 +18,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; /** * App\Models\DonationPackage. @@ -39,6 +40,7 @@ class DonationPackage extends Model { /** @use HasFactory<\Database\Factories\DonationPackagefactory> */ use HasFactory; + use SoftDeletes; /** * The attributes that aren't mass assignable. diff --git a/app/Models/Group.php b/app/Models/Group.php index 7589aa1489..b2cecab66d 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -36,6 +36,7 @@ * @property bool $is_uploader * @property bool $is_internal * @property bool $is_editor + * @property bool $is_torrent_modo * @property bool $is_owner * @property bool $is_admin * @property bool $is_modo @@ -73,6 +74,7 @@ class Group extends Model * is_uploader: 'bool', * is_internal: 'bool', * is_editor: 'bool', + * is_torrent_modo: 'bool', * is_owner: 'bool', * is_admin: 'bool', * is_modo: 'bool', @@ -98,6 +100,7 @@ protected function casts(): array 'is_uploader' => 'bool', 'is_internal' => 'bool', 'is_editor' => 'bool', + 'is_torrent_modo' => 'bool', 'is_owner' => 'bool', 'is_admin' => 'bool', 'is_modo' => 'bool', diff --git a/app/Models/Invite.php b/app/Models/Invite.php index 2e24ab958b..952ff310bb 100644 --- a/app/Models/Invite.php +++ b/app/Models/Invite.php @@ -32,6 +32,7 @@ * @property int|null $accepted_by * @property string|null $accepted_at * @property string|null $custom + * @property string|null $internal_note * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $deleted_at diff --git a/app/Models/Page.php b/app/Models/Page.php index e81fabff50..0a366f9646 100644 --- a/app/Models/Page.php +++ b/app/Models/Page.php @@ -17,8 +17,8 @@ namespace App\Models; use App\Helpers\Bbcode; -use App\Helpers\MarkdownExtra; use App\Traits\Auditable; +use GrahamCampbell\Markdown\Facades\Markdown; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -56,8 +56,8 @@ public function setContentAttribute(?string $value): void /** * Parse Content And Return Valid HTML. */ - public function getContentHtml(): ?string + public function getContentHtml(): string { - return (new MarkdownExtra())->text((new Bbcode())->parse($this->content, false)); + return Markdown::convert((new Bbcode())->parse($this->content, false))->getContent(); } } diff --git a/app/Models/Torrent.php b/app/Models/Torrent.php index 3d569595b9..0230b3dfab 100644 --- a/app/Models/Torrent.php +++ b/app/Models/Torrent.php @@ -18,14 +18,12 @@ use App\Helpers\Bbcode; use App\Helpers\Linkify; -use App\Helpers\MediaInfo; use App\Helpers\StringHelper; use App\Models\Scopes\ApprovedScope; use App\Notifications\NewComment; use App\Notifications\NewThank; use App\Traits\Auditable; use App\Traits\GroupedLastScope; -use App\Traits\TorrentFilter; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -95,7 +93,6 @@ class Torrent extends Model use HasFactory; use Searchable; use SoftDeletes; - use TorrentFilter; protected $guarded = []; @@ -140,7 +137,7 @@ protected function casts(): array * The fields it returns are used by Meilisearch to power the advanced * torrent search, quick search, RSS, and the API. */ - public const string SEARCHABLE = " + public const string SEARCHABLE = <<<'SQL' torrents.id, torrents.name, torrents.description, @@ -234,13 +231,13 @@ protected function casts(): array 'username', users.username, 'group', ( SELECT JSON_OBJECT( - 'name', `groups`.name, - 'color', `groups`.color, - 'icon', `groups`.icon, - 'effect', `groups`.effect + 'name', "groups".name, + 'color', "groups".color, + 'icon', "groups".icon, + 'effect', "groups".effect ) - FROM `groups` - WHERE `groups`.id = users.group_id + FROM "groups" + WHERE "groups".id = users.group_id LIMIT 1 ) ) @@ -463,7 +460,7 @@ protected function casts(): array FROM keywords WHERE torrents.id = keywords.torrent_id ) AS json_keywords - "; + SQL; protected static function booted(): void { @@ -725,7 +722,7 @@ public function bookmarks(): \Illuminate\Database\Eloquent\Relations\HasMany } /** - * Bookmarks. + * Resurrections. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ @@ -734,6 +731,16 @@ public function resurrections(): \Illuminate\Database\Eloquent\Relations\HasMany return $this->hasMany(Resurrection::class); } + /** + * Reports. + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function reports(): \Illuminate\Database\Eloquent\Relations\HasMany + { + return $this->hasMany(Report::class); + } + /** * Trump. * diff --git a/app/Models/TorrentRequest.php b/app/Models/TorrentRequest.php index 62e2bd237f..269f189c25 100644 --- a/app/Models/TorrentRequest.php +++ b/app/Models/TorrentRequest.php @@ -19,7 +19,6 @@ use App\Helpers\Bbcode; use App\Helpers\Linkify; use App\Traits\Auditable; -use App\Traits\TorrentFilter; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use voku\helper\AntiXSS; @@ -58,7 +57,6 @@ class TorrentRequest extends Model /** @use HasFactory<\Database\Factories\TorrentRequestFactory> */ use HasFactory; - use TorrentFilter; /** * The Database Table Used By The Model. diff --git a/app/Models/UnregisteredInfoHash.php b/app/Models/UnregisteredInfoHash.php new file mode 100644 index 0000000000..b08bcfe105 --- /dev/null +++ b/app/Models/UnregisteredInfoHash.php @@ -0,0 +1,57 @@ + + * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 + */ + +namespace App\Models; + +use Illuminate\Database\Eloquent\Model; + +/** + * App\Models\Note. + * + * @property int $user_id + * @property string $info_hash + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + */ +class UnregisteredInfoHash extends Model +{ + /** + * The attributes that aren't mass assignable. + * + * @var string[] + */ + protected $guarded = []; + + /** + * Belongs To A User. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(User::class, 'user_id'); + } + + /** + * Belongs To A Torrent. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function torrent(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(Torrent::class, 'info_hash', 'info_hash'); + } +} diff --git a/app/Models/Wiki.php b/app/Models/Wiki.php index 6ffbc96ad0..464f56259f 100644 --- a/app/Models/Wiki.php +++ b/app/Models/Wiki.php @@ -17,8 +17,8 @@ namespace App\Models; use App\Helpers\Bbcode; -use App\Helpers\MarkdownExtra; use App\Traits\Auditable; +use GrahamCampbell\Markdown\Facades\Markdown; use Illuminate\Database\Eloquent\Model; /** @@ -52,6 +52,6 @@ public function category(): \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function getContentHtml(): string { - return (new MarkdownExtra())->text((new Bbcode())->parse($this->content, false)); + return Markdown::convert((new Bbcode())->parse($this->content, false))->getContent(); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 978c6e2113..aedc1ec5b5 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -33,8 +33,10 @@ use App\Listeners\NotifyUserTicketWasClosed; use App\Listeners\NotifyUserTicketWasCreated; use App\Listeners\PasswordProtectBackup; +use App\Listeners\RegisteredListener; use Assada\Achievements\Event\Unlocked; use Illuminate\Auth\Events\Login; +use Illuminate\Auth\Events\Registered; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Spatie\Backup\Events\BackupZipWasCreated; @@ -51,6 +53,10 @@ class EventServiceProvider extends ServiceProvider LoginListener::class, ], + Registered::class => [ + RegisteredListener::class, + ], + // Achievements System Unlocked::class => [ AchievementUnlocked::class, diff --git a/app/Services/Unit3dAnnounce.php b/app/Services/Unit3dAnnounce.php index 0cec08c9f8..883dc73d06 100644 --- a/app/Services/Unit3dAnnounce.php +++ b/app/Services/Unit3dAnnounce.php @@ -178,7 +178,7 @@ public static function addUser(User $user): bool $peers = Peer::query() ->where('user_id', '=', $user->id) - ->selectRaw('SUM(seeder = 1 AND active = 1 AND visible = 1) as num_seeding, SUM(seeder = 0 AND active = 1 AND visible = 1) as num_leeching') + ->selectRaw('SUM(seeder = TRUE AND active = TRUE AND visible = TRUE) as num_seeding, SUM(seeder = FALSE AND active = TRUE AND visible = TRUE) as num_leeching') ->first(); return self::put('users', [ diff --git a/app/Traits/GroupedLastScope.php b/app/Traits/GroupedLastScope.php index c27fb41339..aa8c5eecf8 100644 --- a/app/Traits/GroupedLastScope.php +++ b/app/Traits/GroupedLastScope.php @@ -34,7 +34,7 @@ trait GroupedLastScope public function scopeLastPerGroup(Builder $query, ?array $fields = null): void { $query->whereIn('id', fn (QueryBuilder $query) => $query->from('torrents') - ->selectRaw('max(`id`)') + ->selectRaw('max("id")') ->groupBy($fields)); } } diff --git a/app/Traits/TorrentFilter.php b/app/Traits/TorrentFilter.php deleted file mode 100644 index ab0d4925bf..0000000000 --- a/app/Traits/TorrentFilter.php +++ /dev/null @@ -1,594 +0,0 @@ - - * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 - */ - -namespace App\Traits; - -use App\Models\PlaylistTorrent; -use App\Models\Torrent; -use App\Models\TorrentRequest; -use App\Models\User; -use App\Models\Wish; -use Carbon\Carbon; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Support\Facades\DB; - -trait TorrentFilter -{ - /** - * @param Builder $query - */ - public function scopeOfName(Builder $query, string $name, bool $isRegex = false): void - { - $query->when( - $isRegex, - fn ($query) => $query->where('name', 'REGEXP', substr($name, 1, -1)), - fn ($query) => $query->where('name', 'LIKE', '%'.str_replace(' ', '%', $name).'%') - ); - } - - /** - * @param Builder $query - */ - public function scopeOfDescription(Builder $query, string $description, bool $isRegex = false): void - { - $query->when( - $isRegex, - fn ($query) => $query->where('description', 'REGEXP', substr($description, 1, -1)), - fn ($query) => $query->where('description', 'LIKE', '%'.$description.'%') - ); - } - - /** - * @param Builder $query - */ - public function scopeOfMediainfo(Builder $query, string $mediainfo, bool $isRegex = false): void - { - $query->when( - $isRegex, - fn ($query) => $query->where('mediainfo', 'REGEXP', substr($mediainfo, 1, -1)), - fn ($query) => $query->where('mediainfo', 'LIKE', '%'.$mediainfo.'%') - ); - } - - /** - * @param Builder $query - */ - public function scopeOfUploader(Builder $query, string $username, User $authenticatedUser = null): void - { - $authenticatedUser ??= auth()->user(); - - $query - ->whereRelation('user', 'username', '=', $username) - ->when( - $authenticatedUser === null, - fn ($query) => $query->where('anon', '=', false), - fn ($query) => $query->when( - !$authenticatedUser->group->is_modo, - fn ($query) => $query->where(fn ($query) => $query->where('anon', '=', false)->orWhere('user_id', '=', $authenticatedUser->id)) - ) - ); - } - - /** - * @param Builder $query - * @param array $keywords - */ - public function scopeOfKeyword(Builder $query, array $keywords): void - { - $query->whereHas('keywords', fn ($query) => $query->whereIn('name', $keywords)); - } - - /** - * @param Builder $query - */ - public function scopeReleasedAfterOrIn(Builder $query, int $year): void - { - $query->where(function ($query) use ($year): void { - $query->where(function ($query) use ($year): void { - $query->whereRelation('movie', 'release_date', '>=', $year.'-01-01 00:00:00') - ->whereRelation('category', 'movie_meta', '=', true); - }) - ->orWhere(function ($query) use ($year): void { - $query->whereRelation('tv', 'first_air_date', '>=', $year.'-01-01 00:00:00') - ->whereRelation('category', 'tv_meta', '=', true); - }); - }); - } - - /** - * @param Builder $query - */ - public function scopeReleasedBeforeOrIn(Builder $query, int $year): void - { - $query->where(function ($query) use ($year): void { - $query->where(function ($query) use ($year): void { - $query->whereRelation('movie', 'release_date', '<=', $year.'-12-31 23:59:59') - ->whereRelation('category', 'movie_meta', '=', true); - }) - ->orWhere(function ($query) use ($year): void { - $query->orWhereRelation('tv', 'first_air_date', '<=', $year.'-12-31 23:59:59') - ->whereRelation('category', 'tv_meta', '=', true); - }); - }); - } - - /** - * @param Builder $query - */ - public function scopeOfSizeGreaterOrEqualTo(Builder $query, int $size): void - { - $query->where('size', '>=', $size); - } - - /** - * @param Builder $query - */ - public function scopeOfSizeLesserOrEqualTo(Builder $query, int $size): void - { - $query->where('size', '<=', $size); - } - - /** - * @param Builder $query - * @param array $categories - */ - public function scopeOfCategory(Builder $query, array $categories): void - { - $query->whereIntegerInRaw('category_id', $categories); - } - - /** - * @param Builder $query - * @param array $types - */ - public function scopeOfType(Builder $query, array $types): void - { - $query->whereIntegerInRaw('type_id', $types); - } - - /** - * @param Builder $query - * @param array $resolutions - */ - public function scopeOfResolution(Builder $query, array $resolutions): void - { - $query->whereIntegerInRaw('resolution_id', $resolutions); - } - - /** - * @param Builder $query - * @param array $genres - */ - public function scopeOfGenre(Builder $query, array $genres): void - { - $query - ->where( - fn ($query) => $query - ->where( - fn ($query) => $query - ->whereRelation('category', 'movie_meta', '=', true) - ->whereIn('tmdb', DB::table('genre_movie')->select('movie_id')->whereIn('genre_id', $genres)) - ) - ->orWhere( - fn ($query) => $query - ->whereRelation('category', 'tv_meta', '=', true) - ->whereIn('tmdb', DB::table('genre_tv')->select('tv_id')->whereIn('genre_id', $genres)) - ) - ); - } - - /** - * @param Builder $query - * @param array $regions - */ - public function scopeOfRegion(Builder $query, array $regions): void - { - $query->where( - fn ($query) => $query - ->whereIntegerInRaw('region_id', $regions) - ->when(\in_array(0, $regions), fn ($query) => $query->orWhereNull('region_id')) - ); - } - - /** - * @param Builder $query - * @param array $distributors - */ - public function scopeOfDistributor(Builder $query, array $distributors): void - { - $query->where( - fn ($query) => $query - ->whereIntegerInRaw('distributor_id', $distributors) - ->when(\in_array(0, $distributors), fn ($query) => $query->orWhereNull('distributor_id')) - ); - } - - /** - * @param Builder $query - */ - public function scopeOfTmdb(Builder $query, int $tvdbId): void - { - $query->where('tmdb', '=', $tvdbId); - } - - /** - * @param Builder $query - */ - public function scopeOfImdb(Builder $query, int $tvdbId): void - { - $query->where('imdb', '=', $tvdbId); - } - - /** - * @param Builder $query - */ - public function scopeOfTvdb(Builder $query, int $tvdbId): void - { - $query->where('tvdb', '=', $tvdbId); - } - - /** - * @param Builder $query - */ - public function scopeOfMal(Builder $query, int $malId): void - { - $query->where('mal', '=', $malId); - } - - /** - * @param Builder $query - */ - public function scopeOfPlaylist(Builder $query, int $playlistId, ?User $authenticatedUser = null): void - { - $authenticatedUser ??= auth()->user(); - - $query->whereIn( - 'id', - PlaylistTorrent::select('torrent_id') - ->where('playlist_id', '=', $playlistId) - ->when( - $authenticatedUser === null, - fn ($query) => $query->whereRelation('playlist', 'is_private', '=', false), - fn ($query) => $query->when( - ! $authenticatedUser->group->is_modo, - fn ($query) => $query->where(fn ($query) => $query - ->whereRelation('playlist', 'is_private', '=', false) - ->orWhereRelation('playlist', 'user_id', '=', $authenticatedUser->id)) - ) - ) - ); - } - - /** - * @param Builder $query - */ - public function scopeOfCollection(Builder $query, int $collectionId): void - { - $query - ->whereRelation('category', 'movie_meta', '=', true) - ->whereIn('tmdb', DB::table('collection_movie')->select('movie_id')->where('collection_id', '=', $collectionId)); - } - - /** - * @param Builder $query - */ - public function scopeOfCompany(Builder $query, int $companyId): void - { - $query - ->where( - fn ($query) => $query - ->where( - fn ($query) => $query - ->whereRelation('category', 'movie_meta', '=', true) - ->whereIn('tmdb', DB::table('company_movie')->select('movie_id')->where('company_id', '=', $companyId)) - ) - ->orWhere( - fn ($query) => $query - ->whereRelation('category', 'tv_meta', '=', true) - ->whereIn('tmdb', DB::table('company_tv')->select('tv_id')->where('company_id', '=', $companyId)) - ) - ); - } - - /** - * @param Builder $query - */ - public function scopeOfNetwork(Builder $query, int $networkId): void - { - $query - ->whereRelation('category', 'tv_meta', '=', true) - ->whereIn('tmdb', DB::table('network_tv')->select('tv_id')->where('network_id', '=', $networkId)); - } - - /** - * @param Builder $query - * @param int|array $free - */ - public function scopeOfFreeleech(Builder $query, int|array $free): void - { - $query->when( - config('other.freeleech'), - fn ($query) => $query->whereBetween('free', [0, 100]), - fn ($query) => $query->whereIntegerInRaw('free', (array) $free) - ); - } - - /** - * @param Builder $query - */ - public function scopeDoubleup(Builder $query): void - { - $query->where('doubleup', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopeFeatured(Builder $query): void - { - $query->where('featured', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopeRefundable(Builder $query): void - { - $query->where('refundable', '=', true); - } - - /** - * @param Builder $query - */ - public function scopeStreamOptimized(Builder $query): void - { - $query->where('stream', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopeSd(Builder $query): void - { - $query->where('sd', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopeHighSpeed(Builder $query): void - { - $query->where('highspeed', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopeBookmarkedBy(Builder $query, User $user): void - { - $query->whereRelation('bookmarks', 'user_id', '=', $user->id); - } - - /** - * @param Builder $query - */ - public function scopeWishedBy(Builder $query, User $user): void - { - $query->whereIn('tmdb', Wish::select('tmdb')->where('user_id', '=', $user->id)); - } - - /** - * @param Builder $query - */ - public function scopeInternal(Builder $query): void - { - $query->where('internal', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopePersonalRelease(Builder $query): void - { - $query->where('personal_release', '=', 1); - } - - /** - * @param Builder $query - */ - public function scopeTrumpable(Builder $query): void - { - $query->has('trump'); - } - - /** - * @param Builder $query - */ - public function scopeAlive(Builder $query): void - { - $query->where('seeders', '>', 0); - } - - /** - * @param Builder $query - */ - public function scopeDying(Builder $query): void - { - $query - ->where('seeders', '=', 1) - ->where('times_completed', '>=', 3); - } - - /** - * @param Builder $query - */ - public function scopeDead(Builder $query): void - { - $query->where('seeders', '=', 0); - } - - /** - * @param Builder $query - */ - public function scopeGraveyard(Builder $query): void - { - $query->where('seeders', '=', 0)->where('created_at', '<', Carbon::now()->subDays(30)); - } - - /** - * @param Builder $query - */ - public function scopeNotDownloadedBy(Builder $query, User $user): void - { - $query - ->whereDoesntHave( - 'history', - fn ($query) => $query - ->where('user_id', '=', $user->id) - ); - } - - /** - * @param Builder $query - */ - public function scopeDownloadedBy(Builder $query, User $user): void - { - $query->whereRelation('history', 'user_id', '=', $user->id); - } - - /** - * @param Builder $query - */ - public function scopeSeededBy(Builder $query, User $user): void - { - $query - ->whereHas( - 'history', - fn ($query) => $query - ->where('user_id', '=', $user->id) - ->where('active', '=', 1) - ->where('seeder', '=', 1) - ); - } - - /** - * @param Builder $query - */ - public function scopeLeechedby(Builder $query, User $user): void - { - $query - ->whereHas( - 'history', - fn ($query) => $query - ->where('user_id', '=', $user->id) - ->where('active', '=', 1) - ->where('seeder', '=', 0) - ); - } - - /** - * @param Builder $query - */ - public function scopeUncompletedBy(Builder $query, User $user): void - { - $query - ->whereHas( - 'history', - fn ($query) => $query - ->where('user_id', '=', $user->id) - ->where('active', '=', 0) - ->where('seeder', '=', 0) - ->where('seedtime', '=', 0) - ); - } - - /** - * @param Builder $query - */ - public function scopeOfFilename(Builder $query, string $filename): void - { - $query->whereRelation('files', 'name', '=', $filename); - } - - /** - * @param Builder $query - */ - public function scopeOfSeason(Builder $query, int $seasonNumber): void - { - $query->where('season_number', '=', $seasonNumber); - } - - /** - * @param Builder $query - */ - public function scopeOfEpisode(Builder $query, int $episodeNumber): void - { - $query->where('episode_number', '=', $episodeNumber); - } - - /** - * @param Builder $query - * @param array $languages - */ - public function scopeOfPrimaryLanguage(Builder $query, array $languages): void - { - $query - ->where( - fn ($query) => $query - ->where( - fn ($query) => $query - ->whereRelation('category', 'movie_meta', '=', true) - ->whereHas('movie', fn ($query) => $query->whereIn('original_language', $languages)) - ) - ->orWhere( - fn ($query) => $query - ->whereRelation('category', 'tv_meta', '=', true) - ->whereHas('tv', fn ($query) => $query->whereIn('original_language', $languages)) - ) - ); - } - - /** - * @param Builder $query - */ - public function scopeOfAdult(Builder $query, ?bool $isAdult = null): void - { - // Currently, only movies have an `adult` column. - $query - ->when( - $isAdult === true, - fn ($query) => $query - ->whereRelation('category', 'movie_meta', '=', true) - ->whereRelation('movie', 'adult', '=', true), - ) - ->when( - $isAdult === false, - fn ($query) => $query - ->where( - fn ($query) => $query - ->where( - fn ($query) => $query - ->whereRelation('category', 'movie_meta', '=', true) - ->whereRelation('movie', 'adult', '=', false) - ) - ->orWhere( - fn ($query) => $query - ->whereRelation('category', 'movie_meta', '=', false) - ) - ) - ); - } -} diff --git a/composer.json b/composer.json index 5aeb409aa5..90afb6fb64 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "bjeavons/zxcvbn-php": "^1.3.1", "doctrine/dbal": "^3.9.3", "gabrielelana/byte-units": "^0.5.0", + "graham-campbell/markdown": "^15.2", "guzzlehttp/guzzle": "^7.9.2", "hdvinnie/laravel-joypixel-emojis": "^v3.0.0", "hdvinnie/laravel-security-headers": "^v3.0.0", @@ -45,7 +46,7 @@ }, "require-dev": { "barryvdh/laravel-debugbar": "^3.14.6", - "brianium/paratest": "v7.4.0", + "brianium/paratest": "^7.6", "calebdw/larastan": "2.10.5", "calebdw/larastan-livewire": "^1.1.0", "fakerphp/faker": "^1.23.1", @@ -54,11 +55,11 @@ "laravel/sail": "1.31.1", "mockery/mockery": "^1.6.12", "nunomaduro/collision": "^8.5.0", - "pestphp/pest": "^2.35.1", - "pestphp/pest-plugin-laravel": "^2.4.0", - "pestphp/pest-plugin-livewire": "^v2.1.0", + "pestphp/pest": "^3.5", + "pestphp/pest-plugin-laravel": "^3.0", + "pestphp/pest-plugin-livewire": "^3.0", "phpstan/phpstan": "1.12.0", - "phpunit/phpunit": "10.5.17", + "phpunit/phpunit": "^11.0", "ryoluo/sail-ssl": "^1.3.2", "spatie/laravel-ignition": "^2.8.0", "tomasvotruba/bladestan": "^0.5.0" diff --git a/composer.lock b/composer.lock index d8d1f7a0c2..2840554594 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "488a8a8b1556689bd2798c3de8ad16bd", + "content-hash": "2b7b1571638ee3814dcd8de9c741fd01", "packages": [ { "name": "assada/laravel-achievements", @@ -1199,6 +1199,86 @@ }, "time": "2018-01-11T10:40:03+00:00" }, + { + "name": "graham-campbell/markdown", + "version": "v15.2.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Laravel-Markdown.git", + "reference": "d594fc197b9068de5e234a890be361807a1ab34f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/d594fc197b9068de5e234a890be361807a1ab34f", + "reference": "d594fc197b9068de5e234a890be361807a1ab34f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.75 || ^9.0 || ^10.0 || ^11.0", + "illuminate/filesystem": "^8.75 || ^9.0 || ^10.0 || ^11.0", + "illuminate/support": "^8.75 || ^9.0 || ^10.0 || ^11.0", + "illuminate/view": "^8.75 || ^9.0 || ^10.0 || ^11.0", + "league/commonmark": "^2.4.2", + "php": "^7.4.15 || ^8.0.2" + }, + "require-dev": { + "graham-campbell/analyzer": "^4.1", + "graham-campbell/testbench": "^6.1", + "mockery/mockery": "^1.6.6", + "phpunit/phpunit": "^9.6.17 || ^10.5.13" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "GrahamCampbell\\Markdown\\MarkdownServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "GrahamCampbell\\Markdown\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Markdown Is A CommonMark Wrapper For Laravel", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Laravel Markdown", + "Laravel-Markdown", + "common mark", + "commonmark", + "framework", + "laravel", + "markdown" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Laravel-Markdown/issues", + "source": "https://github.com/GrahamCampbell/Laravel-Markdown/tree/v15.2.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/markdown", + "type": "tidelift" + } + ], + "time": "2024-03-17T23:07:39+00:00" + }, { "name": "graham-campbell/result-type", "version": "v1.1.3", @@ -8798,16 +8878,16 @@ }, { "name": "brianium/paratest", - "version": "v7.4.0", + "version": "v7.6.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "4ffc52ebbce2f259d6a15c1ddaf4ad837eef6703" + "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/4ffc52ebbce2f259d6a15c1ddaf4ad837eef6703", - "reference": "4ffc52ebbce2f259d6a15c1ddaf4ad837eef6703", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/68ff89a8de47d086588e391a516d2a5b5fde6254", + "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254", "shasum": "" }, "require": { @@ -8815,31 +8895,30 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.0.0", - "jean85/pretty-package-versions": "^2.0.5", - "php": "~8.2.0 || ~8.3.0", - "phpunit/php-code-coverage": "^10.1.11 || ^11.0.0", - "phpunit/php-file-iterator": "^4.1.0 || ^5.0.0", - "phpunit/php-timer": "^6.0.0 || ^7.0.0", - "phpunit/phpunit": "^10.5.9 || ^11.0.0", - "sebastian/environment": "^6.0.1 || ^7.0.0", - "symfony/console": "^6.4.3 || ^7.0.3", - "symfony/process": "^6.4.3 || ^7.0.3" + "fidry/cpu-core-counter": "^1.2.0", + "jean85/pretty-package-versions": "^2.0.6", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^11.0.7", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-timer": "^7.0.1", + "phpunit/phpunit": "^11.4.1", + "sebastian/environment": "^7.2.0", + "symfony/console": "^6.4.11 || ^7.1.5", + "symfony/process": "^6.4.8 || ^7.1.5" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^1.10.57", - "phpstan/phpstan-deprecation-rules": "^1.1.4", - "phpstan/phpstan-phpunit": "^1.3.15", - "phpstan/phpstan-strict-rules": "^1.5.2", - "squizlabs/php_codesniffer": "^3.8.1", - "symfony/filesystem": "^6.4.3 || ^7.0.3" + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "squizlabs/php_codesniffer": "^3.10.3", + "symfony/filesystem": "^6.4.9 || ^7.1.5" }, "bin": [ "bin/paratest", - "bin/paratest.bat", "bin/paratest_for_phpstorm" ], "type": "library", @@ -8876,7 +8955,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.4.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.6.0" }, "funding": [ { @@ -8888,7 +8967,7 @@ "type": "paypal" } ], - "time": "2024-02-02T09:37:18+00:00" + "time": "2024-10-15T12:38:31+00:00" }, { "name": "calebdw/larastan", @@ -9845,36 +9924,38 @@ }, { "name": "pestphp/pest", - "version": "v2.35.1", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "b13acb630df52c06123588d321823c31fc685545" + "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/b13acb630df52c06123588d321823c31fc685545", - "reference": "b13acb630df52c06123588d321823c31fc685545", + "url": "https://api.github.com/repos/pestphp/pest/zipball/179d46ce97d52bcb3f791449ae94025c3f32e3e3", + "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3", "shasum": "" }, "require": { - "brianium/paratest": "^7.3.1", - "nunomaduro/collision": "^7.10.0|^8.4.0", - "nunomaduro/termwind": "^1.15.1|^2.0.1", - "pestphp/pest-plugin": "^2.1.1", - "pestphp/pest-plugin-arch": "^2.7.0", - "php": "^8.1.0", - "phpunit/phpunit": "^10.5.17" + "brianium/paratest": "^7.6.0", + "nunomaduro/collision": "^8.5.0", + "nunomaduro/termwind": "^2.2.0", + "pestphp/pest-plugin": "^3.0.0", + "pestphp/pest-plugin-arch": "^3.0.0", + "pestphp/pest-plugin-mutate": "^3.0.5", + "php": "^8.2.0", + "phpunit/phpunit": "^11.4.3" }, "conflict": { - "phpunit/phpunit": ">10.5.17", - "sebastian/exporter": "<5.1.0", + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">11.4.3", + "sebastian/exporter": "<6.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { - "pestphp/pest-dev-tools": "^2.16.0", - "pestphp/pest-plugin-type-coverage": "^2.8.5", - "symfony/process": "^6.4.0|^7.1.3" + "pestphp/pest-dev-tools": "^3.3.0", + "pestphp/pest-plugin-type-coverage": "^3.1.0", + "symfony/process": "^7.1.6" }, "bin": [ "bin/pest" @@ -9883,6 +9964,8 @@ "extra": { "pest": { "plugins": [ + "Pest\\Mutate\\Plugins\\Mutate", + "Pest\\Plugins\\Configuration", "Pest\\Plugins\\Bail", "Pest\\Plugins\\Cache", "Pest\\Plugins\\Coverage", @@ -9937,7 +10020,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v2.35.1" + "source": "https://github.com/pestphp/pest/tree/v3.5.1" }, "funding": [ { @@ -9949,34 +10032,34 @@ "type": "github" } ], - "time": "2024-08-20T21:41:50+00:00" + "time": "2024-10-31T16:12:45+00:00" }, { "name": "pestphp/pest-plugin", - "version": "v2.1.1", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b" + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e05d2859e08c2567ee38ce8b005d044e72648c0b", - "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", + "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", "shasum": "" }, "require": { "composer-plugin-api": "^2.0.0", "composer-runtime-api": "^2.2.2", - "php": "^8.1" + "php": "^8.2" }, "conflict": { - "pestphp/pest": "<2.2.3" + "pestphp/pest": "<3.0.0" }, "require-dev": { - "composer/composer": "^2.5.8", - "pestphp/pest": "^2.16.0", - "pestphp/pest-dev-tools": "^2.16.0" + "composer/composer": "^2.7.9", + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "composer-plugin", "extra": { @@ -10003,7 +10086,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v2.1.1" + "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" }, "funding": [ { @@ -10019,31 +10102,30 @@ "type": "patreon" } ], - "time": "2023-08-22T08:40:06+00:00" + "time": "2024-09-08T23:21:41+00:00" }, { "name": "pestphp/pest-plugin-arch", - "version": "v2.7.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "d23b2d7498475354522c3818c42ef355dca3fcda" + "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/d23b2d7498475354522c3818c42ef355dca3fcda", - "reference": "d23b2d7498475354522c3818c42ef355dca3fcda", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/0a27e55a270cfe73d8cb70551b91002ee2cb64b0", + "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0", "shasum": "" }, "require": { - "nunomaduro/collision": "^7.10.0|^8.1.0", - "pestphp/pest-plugin": "^2.1.1", - "php": "^8.1", + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", "ta-tikoma/phpunit-architecture-test": "^0.8.4" }, "require-dev": { - "pestphp/pest": "^2.33.0", - "pestphp/pest-dev-tools": "^2.16.0" + "pestphp/pest": "^3.0.0", + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "library", "extra": { @@ -10078,7 +10160,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v2.7.0" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.0.0" }, "funding": [ { @@ -10090,31 +10172,31 @@ "type": "github" } ], - "time": "2024-01-26T09:46:42+00:00" + "time": "2024-09-08T23:23:55+00:00" }, { "name": "pestphp/pest-plugin-laravel", - "version": "v2.4.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-laravel.git", - "reference": "53df51169a7f9595e06839cce638c73e59ace5e8" + "reference": "7dd98c0c3b3542970ec21fce80ec5c88916ac469" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/53df51169a7f9595e06839cce638c73e59ace5e8", - "reference": "53df51169a7f9595e06839cce638c73e59ace5e8", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/7dd98c0c3b3542970ec21fce80ec5c88916ac469", + "reference": "7dd98c0c3b3542970ec21fce80ec5c88916ac469", "shasum": "" }, "require": { - "laravel/framework": "^10.48.9|^11.5.0", - "pestphp/pest": "^2.34.7", - "php": "^8.1.0" + "laravel/framework": "^11.22.0", + "pestphp/pest": "^3.0.0", + "php": "^8.2.0" }, "require-dev": { - "laravel/dusk": "^7.13.0", - "orchestra/testbench": "^8.22.3|^9.0.4", - "pestphp/pest-dev-tools": "^2.16.0" + "laravel/dusk": "^8.2.5", + "orchestra/testbench": "^9.4.0", + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "library", "extra": { @@ -10152,7 +10234,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v2.4.0" + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v3.0.0" }, "funding": [ { @@ -10164,30 +10246,30 @@ "type": "github" } ], - "time": "2024-04-27T10:41:54+00:00" + "time": "2024-09-08T23:32:52+00:00" }, { "name": "pestphp/pest-plugin-livewire", - "version": "v2.1.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-livewire.git", - "reference": "e72a2f850f727dfdb6bfa6e2ee6ff478ccc93f97" + "reference": "e2f2edb0a7d414d6837d87908a0e148256d3bf89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/e72a2f850f727dfdb6bfa6e2ee6ff478ccc93f97", - "reference": "e72a2f850f727dfdb6bfa6e2ee6ff478ccc93f97", + "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/e2f2edb0a7d414d6837d87908a0e148256d3bf89", + "reference": "e2f2edb0a7d414d6837d87908a0e148256d3bf89", "shasum": "" }, "require": { - "livewire/livewire": "^2.12.3|^3.0", - "pestphp/pest": "^2.9.1", + "livewire/livewire": "^3.5.6", + "pestphp/pest": "^3.0.0", "php": "^8.1" }, "require-dev": { - "orchestra/testbench": "^8.5.10", - "pestphp/pest-dev-tools": "^2.12.0" + "orchestra/testbench": "^9.4.0", + "pestphp/pest-dev-tools": "^3.0.0" }, "type": "library", "autoload": { @@ -10214,7 +10296,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v2.1.0" + "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v3.0.0" }, "funding": [ { @@ -10230,7 +10312,79 @@ "type": "patreon" } ], - "time": "2023-07-20T16:28:21+00:00" + "time": "2024-09-09T00:05:59+00:00" + }, + { + "name": "pestphp/pest-plugin-mutate", + "version": "v3.0.5", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-mutate.git", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.2.0", + "pestphp/pest-plugin": "^3.0.0", + "php": "^8.2", + "psr/simple-cache": "^3.0.0" + }, + "require-dev": { + "pestphp/pest": "^3.0.8", + "pestphp/pest-dev-tools": "^3.0.0", + "pestphp/pest-plugin-type-coverage": "^3.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Mutate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sandro Gehri", + "email": "sandrogehri@gmail.com" + } + ], + "description": "Mutates your code to find untested cases", + "keywords": [ + "framework", + "mutate", + "mutation", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/gehrisandro", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-09-22T07:54:40+00:00" }, { "name": "phar-io/manifest", @@ -10719,35 +10873,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.16", + "version": "11.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f7f08030e8811582cc459871d28d6f5a1a4d35ca", + "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", + "nikic/php-parser": "^5.3.1", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "^11.4.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -10756,7 +10910,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -10785,7 +10939,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.7" }, "funding": [ { @@ -10793,32 +10947,32 @@ "type": "github" } ], - "time": "2024-08-22T04:31:57+00:00" + "time": "2024-10-09T06:21:38+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10846,7 +11000,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -10854,28 +11008,28 @@ "type": "github" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", - "version": "4.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -10883,7 +11037,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10909,7 +11063,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -10917,32 +11072,32 @@ "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "3.0.1", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -10969,7 +11124,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -10977,32 +11132,32 @@ "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "6.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -11028,7 +11183,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -11036,20 +11192,20 @@ "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "10.5.17", + "version": "11.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c1f736a473d21957ead7e94fcc029f571895abf5" + "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f736a473d21957ead7e94fcc029f571895abf5", - "reference": "c1f736a473d21957ead7e94fcc029f571895abf5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8e8ed1854de5d36c088ec1833beae40d2dedd76", + "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76", "shasum": "" }, "require": { @@ -11059,26 +11215,25 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.7", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.1", + "sebastian/comparator": "^6.1.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.1.3", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.0", + "sebastian/version": "^5.0.2" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -11089,7 +11244,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-main": "11.4-dev" } }, "autoload": { @@ -11121,7 +11276,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.17" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.3" }, "funding": [ { @@ -11137,7 +11292,7 @@ "type": "tidelift" } ], - "time": "2024-04-05T04:39:01+00:00" + "time": "2024-10-28T13:07:50+00:00" }, { "name": "ryoluo/sail-ssl", @@ -11203,28 +11358,28 @@ }, { "name": "sebastian/cli-parser", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -11248,7 +11403,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { @@ -11256,32 +11411,32 @@ "type": "github" } ], - "time": "2024-03-02T07:12:49+00:00" + "time": "2024-07-03T04:41:36+00:00" }, { "name": "sebastian/code-unit", - "version": "2.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + "reference": "6bb7d09d6623567178cf54126afa9c2310114268" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6bb7d09d6623567178cf54126afa9c2310114268", + "reference": "6bb7d09d6623567178cf54126afa9c2310114268", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -11304,7 +11459,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.1" }, "funding": [ { @@ -11312,32 +11468,32 @@ "type": "github" } ], - "time": "2023-02-03T06:58:43+00:00" + "time": "2024-07-03T04:44:28+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -11359,7 +11515,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" }, "funding": [ { @@ -11367,36 +11524,36 @@ "type": "github" } ], - "time": "2023-02-03T06:59:15+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "5.0.3", + "version": "6.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/43d129d6a0f81c78bee378b46688293eb7ea3739", + "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^11.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.2-dev" } }, "autoload": { @@ -11436,7 +11593,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.2.1" }, "funding": [ { @@ -11444,33 +11601,33 @@ "type": "github" } ], - "time": "2024-10-18T14:56:07+00:00" + "time": "2024-10-31T05:30:08+00:00" }, { "name": "sebastian/complexity", - "version": "3.2.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -11494,7 +11651,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -11502,33 +11659,33 @@ "type": "github" } ], - "time": "2023-12-21T08:37:17+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "5.1.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11561,7 +11718,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -11569,27 +11726,27 @@ "type": "github" } ], - "time": "2024-03-02T07:15:17+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "6.1.0", + "version": "7.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-posix": "*" @@ -11597,7 +11754,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -11625,7 +11782,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" }, "funding": [ { @@ -11633,34 +11790,34 @@ "type": "github" } ], - "time": "2024-03-23T08:47:14+00:00" + "time": "2024-07-03T04:54:44+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.2", + "version": "6.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", + "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -11703,7 +11860,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.3" }, "funding": [ { @@ -11711,35 +11868,35 @@ "type": "github" } ], - "time": "2024-03-02T07:17:12+00:00" + "time": "2024-07-03T04:56:19+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -11765,7 +11922,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { @@ -11773,33 +11930,33 @@ "type": "github" } ], - "time": "2024-03-02T07:19:19+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.2", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -11823,7 +11980,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -11831,34 +11988,34 @@ "type": "github" } ], - "time": "2023-12-21T08:38:20+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "5.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11880,7 +12037,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -11888,32 +12046,32 @@ "type": "github" } ], - "time": "2023-02-03T07:08:32+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "3.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -11935,7 +12093,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -11943,32 +12102,32 @@ "type": "github" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "5.0.0", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11998,7 +12157,8 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" }, "funding": [ { @@ -12006,32 +12166,32 @@ "type": "github" } ], - "time": "2023-02-03T07:05:40+00:00" + "time": "2024-07-03T05:10:34+00:00" }, { "name": "sebastian/type", - "version": "4.0.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac", + "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -12054,7 +12214,8 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.0" }, "funding": [ { @@ -12062,29 +12223,29 @@ "type": "github" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2024-09-17T13:12:04+00:00" }, { "name": "sebastian/version", - "version": "4.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -12107,7 +12268,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -12115,7 +12277,7 @@ "type": "github" } ], - "time": "2023-02-07T11:34:05+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { "name": "spatie/backtrace", @@ -12762,7 +12924,7 @@ "ext-zend-opcache": "*", "ext-zip": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "ext-mcrypt": "1.0" }, diff --git a/config/database.php b/config/database.php index 2cea5123aa..925bd71971 100644 --- a/config/database.php +++ b/config/database.php @@ -56,7 +56,10 @@ 'prefix_indexes' => true, 'strict' => true, 'engine' => null, - 'options' => \extension_loaded('pdo_mysql') ? array_filter([ + 'modes' => [ + 'ANSI', + ], + 'options' => \extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], 'dump' => [ diff --git a/config/markdown.php b/config/markdown.php new file mode 100644 index 0000000000..0d1b44f815 --- /dev/null +++ b/config/markdown.php @@ -0,0 +1,159 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + /* + |-------------------------------------------------------------------------- + | Enable View Integration + |-------------------------------------------------------------------------- + | + | This option specifies if the view integration is enabled so you can write + | markdown views and have them rendered as html. The following extensions + | are currently supported: ".md", ".md.php", and ".md.blade.php". You may + | disable this integration if it is conflicting with another package. + | + | Default: true + | + */ + + 'views' => true, + + /* + |-------------------------------------------------------------------------- + | CommonMark Extensions + |-------------------------------------------------------------------------- + | + | This option specifies what extensions will be automatically enabled. + | Simply provide your extension class names here. + | + | Default: [ + | League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension::class, + | League\CommonMark\Extension\Table\TableExtension::class, + | ] + | + */ + + 'extensions' => [ + League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension::class, + League\CommonMark\Extension\Autolink\AutolinkExtension::class, + League\CommonMark\Extension\Table\TableExtension::class, + League\CommonMark\Extension\Strikethrough\StrikethroughExtension::class, + League\CommonMark\Extension\Attributes\AttributesExtension::class, + League\CommonMark\Extension\DescriptionList\DescriptionListExtension::class, + League\CommonMark\Extension\Footnote\FootnoteExtension::class, + ], + + /* + |-------------------------------------------------------------------------- + | Renderer Configuration + |-------------------------------------------------------------------------- + | + | This option specifies an array of options for rendering HTML. + | + | Default: [ + | 'block_separator' => "\n", + | 'inner_separator' => "\n", + | 'soft_break' => "\n", + | ] + | + */ + + 'renderer' => [ + 'block_separator' => "\n", + 'inner_separator' => "\n", + 'soft_break' => "\n", + ], + + /* + |-------------------------------------------------------------------------- + | Commonmark Configuration + |-------------------------------------------------------------------------- + | + | This option specifies an array of options for commonmark. + | + | Default: [ + | 'enable_em' => true, + | 'enable_strong' => true, + | 'use_asterisk' => true, + | 'use_underscore' => true, + | 'unordered_list_markers' => ['-', '+', '*'], + | ] + | + */ + + 'commonmark' => [ + 'enable_em' => true, + 'enable_strong' => true, + 'use_asterisk' => true, + 'use_underscore' => true, + 'unordered_list_markers' => ['-', '+', '*'], + ], + + /* + |-------------------------------------------------------------------------- + | HTML Input + |-------------------------------------------------------------------------- + | + | This option specifies how to handle untrusted HTML input. + | + | Default: 'strip' + | + */ + + 'html_input' => 'allow', + + /* + |-------------------------------------------------------------------------- + | Allow Unsafe Links + |-------------------------------------------------------------------------- + | + | This option specifies whether to allow risky image URLs and links. + | + | Default: true + | + */ + + 'allow_unsafe_links' => true, + + /* + |-------------------------------------------------------------------------- + | Maximum Nesting Level + |-------------------------------------------------------------------------- + | + | This option specifies the maximum permitted block nesting level. + | + | Default: PHP_INT_MAX + | + */ + + 'max_nesting_level' => PHP_INT_MAX, + + /* + |-------------------------------------------------------------------------- + | Slug Normalizer + |-------------------------------------------------------------------------- + | + | This option specifies an array of options for slug normalization. + | + | Default: [ + | 'max_length' => 255, + | 'unique' => 'document', + | ] + | + */ + + 'slug_normalizer' => [ + 'max_length' => 255, + 'unique' => 'document', + ], +]; diff --git a/config/other.php b/config/other.php index 95792608f1..76f1fc487a 100644 --- a/config/other.php +++ b/config/other.php @@ -264,4 +264,21 @@ */ 'every' => 5, ], + + /* + |-------------------------------------------------------------------------- + | BON + |-------------------------------------------------------------------------- + | Configures user bon transactions. + */ + 'bon' => [ + /* + |-------------------------------------------------------------------------- + | The maximum allowed account buffer when buying upload. + |-------------------------------------------------------------------------- + | null = Disabled + | Example : 10 * 1024 * 1024 * 1024 * 1024 + */ + 'max-buffer-to-buy-upload' => null, + ], ]; diff --git a/config/unit3d.php b/config/unit3d.php index 004a9338b0..e6e3dda62f 100755 --- a/config/unit3d.php +++ b/config/unit3d.php @@ -23,7 +23,7 @@ | */ - 'powered-by' => 'Powered By UNIT3D Community Edition v8.3.3', + 'powered-by' => 'Powered By UNIT3D Community Edition v8.3.4', /* |-------------------------------------------------------------------------- @@ -45,7 +45,7 @@ | */ - 'version' => 'v8.3.3', + 'version' => 'v8.3.4', /* |-------------------------------------------------------------------------- diff --git a/database/factories/GroupFactory.php b/database/factories/GroupFactory.php index e2565ce731..1d85c5c8fa 100644 --- a/database/factories/GroupFactory.php +++ b/database/factories/GroupFactory.php @@ -16,8 +16,8 @@ namespace Database\Factories; -use Illuminate\Database\Eloquent\Factories\Factory; use App\Models\Group; +use Illuminate\Database\Eloquent\Factories\Factory; /** @extends Factory */ class GroupFactory extends Factory @@ -46,6 +46,7 @@ public function definition(): array 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_trusted' => $this->faker->boolean(), 'is_immune' => $this->faker->boolean(), @@ -62,4 +63,13 @@ public function definition(): array 'system_required' => false, ]; } + + public function owner(): GroupFactory + { + return $this->state(fn (array $attributes) => [ + 'is_owner' => true, + 'is_admin' => true, + 'is_modo' => true, + ]); + } } diff --git a/database/factories/InviteFactory.php b/database/factories/InviteFactory.php index 2697eee21c..e68f748f59 100644 --- a/database/factories/InviteFactory.php +++ b/database/factories/InviteFactory.php @@ -16,9 +16,9 @@ namespace Database\Factories; +use App\Models\Invite; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; -use App\Models\Invite; /** @extends Factory */ class InviteFactory extends Factory @@ -35,12 +35,27 @@ public function definition(): array { return [ 'user_id' => User::factory(), - 'email' => $this->faker->email(), - 'code' => $this->faker->word(), - 'expires_on' => $this->faker->dateTime(), - 'accepted_by' => User::factory(), - 'accepted_at' => $this->faker->dateTime(), + 'email' => $this->faker->safeEmail(), + 'code' => $this->faker->unique()->lexify(), + 'expires_on' => $this->faker->dateTimeBetween('now', '+1 month'), + 'accepted_by' => null, + 'accepted_at' => null, 'custom' => $this->faker->text(), ]; } + + public function expired(): self + { + return $this->state(fn (array $attributes) => [ + 'expires_on' => $this->faker->dateTimeBetween('-1 month', '-1 day'), + ]); + } + + public function accepted(): self + { + return $this->state(fn (array $attributes) => [ + 'accepted_by' => User::factory(), + 'accepted_at' => $this->faker->dateTimeBetween('-1 month'), + ]); + } } diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 6ef4940768..f66f5fab42 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -19,8 +19,8 @@ use App\Models\Chatroom; use App\Models\ChatStatus; use App\Models\Group; -use Illuminate\Database\Eloquent\Factories\Factory; use App\Models\User; +use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Facades\Hash; use Str; @@ -74,4 +74,13 @@ public function definition(): array 'own_flushes' => $this->faker->boolean(), ]; } + + public function system(): self + { + return $this->state(fn (array $attributes) => [ + 'id' => User::SYSTEM_USER_ID, + 'email' => config('unit3d.default-owner-email'), + 'group_id' => 9, + ]); + } } diff --git a/database/migrations/2017_12_10_020753_create_bon_transactions_table.php b/database/migrations/2017_12_10_020753_create_bon_transactions_table.php index aeb7479288..d5c6fae04d 100644 --- a/database/migrations/2017_12_10_020753_create_bon_transactions_table.php +++ b/database/migrations/2017_12_10_020753_create_bon_transactions_table.php @@ -31,7 +31,7 @@ public function up(): void $table->integer('receiver')->unsigned()->default(0); $table->integer('torrent_id')->nullable(); $table->text('comment'); - $table->timestamp('date_actioned')->default(DB::raw('CURRENT_TIMESTAMP')); + $table->timestamp('date_actioned')->useCurrent(); }); } }; diff --git a/database/migrations/2022_11_23_024350_update_history_table.php b/database/migrations/2022_11_23_024350_update_history_table.php index 8fe3d8cb73..94435f76f1 100644 --- a/database/migrations/2022_11_23_024350_update_history_table.php +++ b/database/migrations/2022_11_23_024350_update_history_table.php @@ -29,7 +29,7 @@ public function up(): void ->select( 'torrent_id', 'user_id', - DB::raw('COUNT(*) as `count`') + DB::raw('COUNT(*) as "count"') ) ->groupBy('torrent_id', 'user_id') ->having('count', '>', 1) diff --git a/database/migrations/2022_11_23_195306_update_peers_table.php b/database/migrations/2022_11_23_195306_update_peers_table.php index 627264661b..cc3a1d4590 100644 --- a/database/migrations/2022_11_23_195306_update_peers_table.php +++ b/database/migrations/2022_11_23_195306_update_peers_table.php @@ -30,7 +30,7 @@ public function up(): void 'torrent_id', 'user_id', 'peer_id', - DB::raw('COUNT(*) as `count`') + DB::raw('COUNT(*) as "count"') ) ->groupBy('torrent_id', 'user_id', 'peer_id') ->having('count', '>', 1) diff --git a/database/migrations/2024_01_15_151522_update_groups_table.php b/database/migrations/2024_01_15_151522_update_groups_table.php index 245f5c7a58..f050916111 100644 --- a/database/migrations/2024_01_15_151522_update_groups_table.php +++ b/database/migrations/2024_01_15_151522_update_groups_table.php @@ -14,7 +14,6 @@ * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 */ -use App\Models\Group; use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; @@ -27,27 +26,52 @@ public function up(): void $table->index(['is_editor']); }); - Group::updateOrCreate( - ['slug' => 'editor'], + DB::table('groups')->upsert([ [ - 'name' => 'Editor', - 'slug' => 'editor', - 'position' => 17, - 'color' => '#15B097', - 'icon' => config('other.font-awesome').' fa-user-pen', - 'effect' => 'none', - 'autogroup' => 0, - 'is_owner' => 0, - 'is_admin' => 0, - 'is_modo' => 0, - 'is_editor' => 1, - 'is_internal' => 0, - 'is_trusted' => 1, - 'is_freeleech' => 1, - 'is_immune' => 1, - 'can_upload' => 0, - 'level' => 0, + 'name' => 'Editor', + 'slug' => 'editor', + 'position' => 17, + 'color' => '#15B097', + 'icon' => config('other.font-awesome').' fa-user-pen', + 'effect' => 'none', + 'autogroup' => false, + 'system_required' => false, + 'is_owner' => false, + 'is_admin' => false, + 'is_modo' => false, + 'is_torrent_modo' => false, + 'is_editor' => true, + 'is_internal' => false, + 'is_uploader' => false, + 'is_trusted' => true, + 'is_freeleech' => true, + 'is_immune' => true, + 'can_upload' => true, + 'can_chat' => true, + 'can_comment' => true, + 'can_invite' => true, + 'can_request' => true, + 'level' => 0, + 'min_uploaded' => null, + 'min_seedsize' => null, + 'min_avg_seedtime' => null, + 'min_ratio' => null, + 'min_age' => null, ] - ); + ], 'slug'); + + $group = DB::table('groups')->where('slug', '=', 'editor')->first(); + + $forumIds = DB::table('forums')->pluck('id'); + + foreach ($forumIds as $forumId) { + DB::table('forum_permissions')->insert([ + 'forum_id' => $forumId, + 'group_id' => $group->id, + 'read_topic' => false, + 'reply_topic' => false, + 'start_topic' => false, + ]); + } } }; diff --git a/database/migrations/2024_02_22_015442_create_post_tips_table.php b/database/migrations/2024_02_22_015442_create_post_tips_table.php index bdb26f80e4..7392d6eb1d 100644 --- a/database/migrations/2024_02_22_015442_create_post_tips_table.php +++ b/database/migrations/2024_02_22_015442_create_post_tips_table.php @@ -42,7 +42,7 @@ public function up(): void 'cost', 'sender_id', 'receiver_id', - DB::raw('IF(EXISTS(SELECT * FROM posts WHERE id = post_id), post_id, null)'), + DB::raw('CASE WHEN EXISTS(SELECT * FROM posts WHERE id = post_id) THEN post_id END'), 'created_at', ]) ->where('name', '=', 'tip') diff --git a/database/migrations/2024_02_22_092555_create_torrent_tips_table.php b/database/migrations/2024_02_22_092555_create_torrent_tips_table.php index ec24b66a23..8b7a92e806 100644 --- a/database/migrations/2024_02_22_092555_create_torrent_tips_table.php +++ b/database/migrations/2024_02_22_092555_create_torrent_tips_table.php @@ -42,7 +42,7 @@ public function up(): void 'cost', 'sender_id', 'receiver_id', - DB::raw('IF(EXISTS(SELECT * FROM torrents WHERE id = torrent_id), torrent_id, null)'), + DB::raw('CASE WHEN EXISTS(SELECT * FROM torrents WHERE id = torrent_id) THEN torrent_id END'), 'created_at', ]) ->where('name', '=', 'tip') diff --git a/database/migrations/2024_10_29_180417_add_internal_note_to_invites_table.php b/database/migrations/2024_10_29_180417_add_internal_note_to_invites_table.php new file mode 100644 index 0000000000..a1878b0704 --- /dev/null +++ b/database/migrations/2024_10_29_180417_add_internal_note_to_invites_table.php @@ -0,0 +1,31 @@ + + * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 + */ + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class () extends Migration { + /** + * Run the migrations. + */ + public function up(): void + { + Schema::table('invites', static function (Blueprint $table): void { + $table->text('internal_note')->nullable()->after('custom'); + }); + } +}; diff --git a/database/migrations/2024_11_01_013426_add_soft_deletes_to_donation_packages_table.php b/database/migrations/2024_11_01_013426_add_soft_deletes_to_donation_packages_table.php new file mode 100644 index 0000000000..9f4f117b20 --- /dev/null +++ b/database/migrations/2024_11_01_013426_add_soft_deletes_to_donation_packages_table.php @@ -0,0 +1,16 @@ +softDeletes()->after('updated_at'); + }); + } +}; diff --git a/database/migrations/2024_11_13_044550_create_unregistered_info_hashes_table.php b/database/migrations/2024_11_13_044550_create_unregistered_info_hashes_table.php new file mode 100644 index 0000000000..0e6d1e5b9f --- /dev/null +++ b/database/migrations/2024_11_13_044550_create_unregistered_info_hashes_table.php @@ -0,0 +1,37 @@ + + * @license https://www.gnu.org/licenses/agpl-3.0.en.html/ GNU Affero General Public License v3.0 + */ + +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class () extends Migration { + /** + * Run the migrations. + */ + public function up(): void + { + Schema::create('unregistered_info_hashes', function (Blueprint $table): void { + $table->unsignedInteger('user_id'); + $table->binary('info_hash', 20, true); + $table->timestamps(); + + $table->foreign('user_id')->references('id')->on('users'); + + $table->primary(['info_hash', 'user_id']); + }); + } +}; diff --git a/database/migrations/2024_11_26_170256_add_is_torrent_modo_to_groups_table.php b/database/migrations/2024_11_26_170256_add_is_torrent_modo_to_groups_table.php new file mode 100644 index 0000000000..d5fc3b4347 --- /dev/null +++ b/database/migrations/2024_11_26_170256_add_is_torrent_modo_to_groups_table.php @@ -0,0 +1,71 @@ +boolean('is_torrent_modo')->default(false)->after('is_editor'); + $table->index(['is_torrent_modo']); + }); + + DB::table('groups')->upsert([ + [ + 'name' => 'Torrent Moderator', + 'slug' => 'torrent-moderator', + 'position' => 18, + 'color' => '#15B097', + 'icon' => config('other.font-awesome').' fa-badge-check', + 'effect' => 'none', + 'autogroup' => false, + 'system_required' => false, + 'is_owner' => false, + 'is_admin' => false, + 'is_modo' => false, + 'is_torrent_modo' => true, + 'is_editor' => true, + 'is_internal' => false, + 'is_uploader' => false, + 'is_trusted' => true, + 'is_freeleech' => true, + 'is_immune' => true, + 'can_upload' => true, + 'can_chat' => true, + 'can_comment' => true, + 'can_invite' => true, + 'can_request' => true, + 'level' => 0, + 'min_uploaded' => null, + 'min_seedsize' => null, + 'min_avg_seedtime' => null, + 'min_ratio' => null, + 'min_age' => null, + ] + ], 'slug'); + + $group = DB::table('groups')->where('slug', '=', 'torrent-moderator')->first(); + + $forumIds = DB::table('forums')->pluck('id'); + + foreach ($forumIds as $forumId) { + DB::table('forum_permissions')->insert([ + 'forum_id' => $forumId, + 'group_id' => $group->id, + 'read_topic' => false, + 'reply_topic' => false, + 'start_topic' => false, + ]); + } + + $staffGroups = DB::table('groups')->where('is_modo', '=', true)->get(); + + foreach ($staffGroups as $staffGroup) { + DB::table('groups')->where('id', $staffGroup->id)->update(['is_torrent_modo' => true]); + } + } +}; diff --git a/database/schema/mysql-schema.sql b/database/schema/mysql-schema.sql index 4483d57eb8..f800440790 100644 --- a/database/schema/mysql-schema.sql +++ b/database/schema/mysql-schema.sql @@ -8,12 +8,12 @@ DROP TABLE IF EXISTS `achievement_details`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `achievement_details` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `points` int unsigned NOT NULL DEFAULT '1', `secret` tinyint(1) NOT NULL DEFAULT '0', - `class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `class_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) @@ -23,9 +23,9 @@ DROP TABLE IF EXISTS `achievement_progress`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `achievement_progress` ( - `id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `achievement_id` int unsigned NOT NULL, - `achiever_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `id` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, + `achievement_id` bigint unsigned NOT NULL, + `achiever_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `achiever_id` int unsigned NOT NULL, `points` int unsigned NOT NULL DEFAULT '0', `unlocked_at` timestamp NULL DEFAULT NULL, @@ -54,8 +54,8 @@ CREATE TABLE `announces` ( `port` smallint unsigned NOT NULL, `numwant` smallint unsigned NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `event` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `event` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`), KEY `announces_user_id_torrent_id_index` (`user_id`,`torrent_id`), KEY `announces_torrent_id_index` (`torrent_id`) @@ -67,7 +67,7 @@ DROP TABLE IF EXISTS `apikeys`; CREATE TABLE `apikeys` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `content` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -81,7 +81,7 @@ DROP TABLE IF EXISTS `application_image_proofs`; CREATE TABLE `application_image_proofs` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `application_id` int NOT NULL, - `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `image` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -94,7 +94,7 @@ DROP TABLE IF EXISTS `application_url_proofs`; CREATE TABLE `application_url_proofs` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `application_id` int NOT NULL, - `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -106,9 +106,9 @@ DROP TABLE IF EXISTS `applications`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `applications` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `referrer` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `referrer` longtext COLLATE utf8mb4_unicode_ci, `status` tinyint NOT NULL DEFAULT '0', `moderated_at` datetime DEFAULT NULL, `moderated_by` int unsigned DEFAULT NULL, @@ -128,9 +128,9 @@ DROP TABLE IF EXISTS `articles`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `articles` ( `id` int NOT NULL AUTO_INCREMENT, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `content` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `user_id` int unsigned NOT NULL, @@ -146,14 +146,13 @@ DROP TABLE IF EXISTS `audits`; CREATE TABLE `audits` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned DEFAULT NULL, - `model_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `model_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `model_entry_id` bigint unsigned NOT NULL, - `action` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `action` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `record` json NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), - KEY `audits_user_id_foreign` (`user_id`), KEY `audits_user_id_action_created_at_index` (`user_id`,`action`,`created_at`), CONSTRAINT `audits_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -164,7 +163,7 @@ DROP TABLE IF EXISTS `automatic_torrent_freeleeches`; CREATE TABLE `automatic_torrent_freeleeches` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `position` int unsigned NOT NULL, - `name_regex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name_regex` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `size` bigint unsigned DEFAULT NULL, `category_id` int DEFAULT NULL, `type_id` int DEFAULT NULL, @@ -182,8 +181,8 @@ CREATE TABLE `bans` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `owned_by` int unsigned NOT NULL, `created_by` int unsigned DEFAULT NULL, - `ban_reason` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `unban_reason` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `ban_reason` text COLLATE utf8mb4_unicode_ci, + `unban_reason` text COLLATE utf8mb4_unicode_ci, `removed_at` datetime DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -199,11 +198,11 @@ DROP TABLE IF EXISTS `blacklist_clients`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `blacklist_clients` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `reason` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `reason` longtext COLLATE utf8mb4_unicode_ci, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, - `peer_id_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `peer_id_prefix` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `blacklist_clients_name_unique` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -214,8 +213,8 @@ DROP TABLE IF EXISTS `blocked_ips`; CREATE TABLE `blocked_ips` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `reason` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `ip_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `reason` text COLLATE utf8mb4_unicode_ci, `expires_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -230,7 +229,7 @@ DROP TABLE IF EXISTS `bon_exchanges`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `bon_exchanges` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `value` bigint unsigned NOT NULL DEFAULT '0', `cost` int unsigned NOT NULL DEFAULT '0', `upload` tinyint(1) NOT NULL DEFAULT '0', @@ -246,11 +245,11 @@ DROP TABLE IF EXISTS `bon_transactions`; CREATE TABLE `bon_transactions` ( `id` int NOT NULL AUTO_INCREMENT, `bon_exchange_id` int unsigned NOT NULL DEFAULT '0', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `cost` decimal(22,2) NOT NULL DEFAULT '0.00', `sender_id` int unsigned DEFAULT NULL, `receiver_id` int unsigned DEFAULT NULL, - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `bon_transactions_itemid_index` (`bon_exchange_id`), KEY `bon_transactions_sender_foreign` (`sender_id`), @@ -281,12 +280,12 @@ DROP TABLE IF EXISTS `bots`; CREATE TABLE `bots` ( `id` int NOT NULL AUTO_INCREMENT, `position` int NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `command` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `color` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `emoji` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `help` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `command` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `color` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `icon` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `emoji` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `help` text COLLATE utf8mb4_unicode_ci, `active` tinyint(1) NOT NULL DEFAULT '1', `is_protected` tinyint(1) NOT NULL DEFAULT '0', `is_nerdbot` tinyint(1) NOT NULL DEFAULT '0', @@ -305,10 +304,10 @@ DROP TABLE IF EXISTS `categories`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `categories` ( `id` smallint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `position` int NOT NULL, - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', + `icon` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', `no_meta` tinyint(1) NOT NULL DEFAULT '0', `music_meta` tinyint(1) NOT NULL DEFAULT '0', `game_meta` tinyint(1) NOT NULL DEFAULT '0', @@ -322,9 +321,9 @@ DROP TABLE IF EXISTS `chat_statuses`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `chat_statuses` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `color` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `color` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `icon` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -337,7 +336,7 @@ DROP TABLE IF EXISTS `chatrooms`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `chatrooms` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -379,12 +378,12 @@ DROP TABLE IF EXISTS `collections`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `collections` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `name_sort` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `parts` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `overview` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `poster` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `backdrop` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name_sort` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `parts` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `overview` mediumtext COLLATE utf8mb4_unicode_ci, + `poster` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `backdrop` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -396,13 +395,13 @@ DROP TABLE IF EXISTS `comments`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `comments` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `content` text COLLATE utf8mb4_unicode_ci NOT NULL, `anon` smallint NOT NULL DEFAULT '0', `user_id` int unsigned DEFAULT NULL, `parent_id` bigint unsigned DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, - `commentable_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `commentable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `commentable_id` bigint unsigned NOT NULL, PRIMARY KEY (`id`), KEY `comments_commentable_type_commentable_id_index` (`commentable_type`,`commentable_id`), @@ -417,12 +416,12 @@ DROP TABLE IF EXISTS `companies`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `companies` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `headquarters` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `homepage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `origin_country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` mediumtext COLLATE utf8mb4_unicode_ci, + `headquarters` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `homepage` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `logo` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `origin_country` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `companies_name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -456,7 +455,7 @@ DROP TABLE IF EXISTS `conversations`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `conversations` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -474,7 +473,7 @@ CREATE TABLE `credits` ( `tv_id` int unsigned DEFAULT NULL, `occupation_id` smallint unsigned NOT NULL, `order` int unsigned DEFAULT NULL, - `character` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `character` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `credits_person_id_movie_id_tv_id_occupation_id_character_unique` (`person_id`,`movie_id`,`tv_id`,`occupation_id`,`character`), KEY `credits_occupation_id_foreign` (`occupation_id`), @@ -491,7 +490,7 @@ DROP TABLE IF EXISTS `distributors`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `distributors` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`), KEY `distributors_name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -526,6 +525,7 @@ CREATE TABLE `donation_packages` ( `is_active` tinyint(1) NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `donation_packages_position_index` (`position`), KEY `donation_packages_is_active_index` (`is_active`) @@ -570,17 +570,17 @@ DROP TABLE IF EXISTS `episodes`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `episodes` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `overview` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `production_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `overview` mediumtext COLLATE utf8mb4_unicode_ci, + `production_code` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `season_number` int NOT NULL, `season_id` int unsigned NOT NULL, - `still` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `still` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `tv_id` int unsigned NOT NULL, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `vote_average` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `vote_average` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `vote_count` int DEFAULT NULL, - `air_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `air_date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `episode_number` int DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -613,11 +613,11 @@ DROP TABLE IF EXISTS `failed_jobs`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `failed_jobs` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `connection` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `queue` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `exception` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `uuid` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `connection` text COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` text COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `exception` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `failed_jobs_uuid_unique` (`uuid`) @@ -629,8 +629,8 @@ DROP TABLE IF EXISTS `failed_login_attempts`; CREATE TABLE `failed_login_attempts` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned DEFAULT NULL, - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `ip_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -659,7 +659,7 @@ DROP TABLE IF EXISTS `files`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `files` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `size` bigint unsigned NOT NULL, `torrent_id` int unsigned NOT NULL, PRIMARY KEY (`id`), @@ -687,9 +687,9 @@ DROP TABLE IF EXISTS `forum_categories`; CREATE TABLE `forum_categories` ( `id` smallint unsigned NOT NULL AUTO_INCREMENT, `position` smallint unsigned NOT NULL, - `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) @@ -725,19 +725,19 @@ CREATE TABLE `forums` ( `last_post_id` int DEFAULT NULL, `last_post_user_id` int unsigned DEFAULT NULL, `last_post_created_at` timestamp NULL DEFAULT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `description` text COLLATE utf8mb4_unicode_ci, `forum_category_id` smallint unsigned NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, - `default_topic_state_filter` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `default_topic_state_filter` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `forums_last_post_user_id_foreign` (`last_post_user_id`), KEY `forums_last_topic_id_foreign` (`last_topic_id`), - KEY `forums_parent_id_foreign` (`forum_category_id`), KEY `forums_last_post_id_foreign` (`last_post_id`), KEY `forums_last_post_created_at_index` (`last_post_created_at`), + KEY `forums_forum_category_id_foreign` (`forum_category_id`), CONSTRAINT `forums_forum_category_id_foreign` FOREIGN KEY (`forum_category_id`) REFERENCES `forum_categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `forums_last_post_id_foreign` FOREIGN KEY (`last_post_id`) REFERENCES `posts` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `forums_last_post_user_id_foreign` FOREIGN KEY (`last_post_user_id`) REFERENCES `users` (`id`) ON UPDATE CASCADE, @@ -789,7 +789,7 @@ DROP TABLE IF EXISTS `genres`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `genres` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`), KEY `genres_name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -802,7 +802,7 @@ CREATE TABLE `gifts` ( `sender_id` int unsigned DEFAULT NULL, `recipient_id` int unsigned DEFAULT NULL, `bon` decimal(22,2) NOT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `gifts_sender_id_foreign` (`sender_id`), @@ -816,8 +816,8 @@ DROP TABLE IF EXISTS `git_updates`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `git_updates` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `hash` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -830,18 +830,19 @@ DROP TABLE IF EXISTS `groups`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `groups` ( `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `slug` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `position` int NOT NULL, `level` int NOT NULL DEFAULT '0', `download_slots` int DEFAULT NULL, - `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `color` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `effect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', + `description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `color` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `icon` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `effect` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', `is_uploader` tinyint(1) NOT NULL DEFAULT '0', `is_internal` tinyint(1) NOT NULL DEFAULT '0', `is_editor` tinyint(1) NOT NULL DEFAULT '0', + `is_torrent_modo` tinyint(1) NOT NULL DEFAULT '0', `is_owner` tinyint(1) NOT NULL DEFAULT '0', `is_admin` tinyint(1) NOT NULL DEFAULT '0', `is_modo` tinyint(1) NOT NULL DEFAULT '0', @@ -867,7 +868,8 @@ CREATE TABLE `groups` ( PRIMARY KEY (`id`), UNIQUE KEY `groups_slug_unique` (`slug`), KEY `groups_download_slots_index` (`download_slots`), - KEY `groups_is_editor_index` (`is_editor`) + KEY `groups_is_editor_index` (`is_editor`), + KEY `groups_is_torrent_modo_index` (`is_torrent_modo`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `history`; @@ -876,7 +878,7 @@ DROP TABLE IF EXISTS `history`; CREATE TABLE `history` ( `user_id` int unsigned NOT NULL, `torrent_id` int unsigned NOT NULL, - `agent` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `agent` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, `uploaded` bigint unsigned NOT NULL DEFAULT '0', `actual_uploaded` bigint unsigned NOT NULL DEFAULT '0', `client_uploaded` bigint unsigned NOT NULL, @@ -898,7 +900,6 @@ CREATE TABLE `history` ( KEY `history_immune_index` (`immune`), KEY `history_hitrun_index` (`hitrun`), KEY `history_user_id_torrent_id_index` (`user_id`,`torrent_id`), - KEY `history_torrent_id_foreign` (`torrent_id`), KEY `history_idx_prewa_hitru_immun_activ_actua` (`prewarned_at`,`hitrun`,`immune`,`active`,`actual_downloaded`), KEY `history_torrent_id_completed_at_created_at_index` (`torrent_id`,`completed_at`,`created_at`), CONSTRAINT `history_torrent_id_foreign` FOREIGN KEY (`torrent_id`) REFERENCES `torrents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, @@ -927,9 +928,9 @@ DROP TABLE IF EXISTS `internals`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `internals` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', - `effect` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `icon` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', + `effect` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'none', PRIMARY KEY (`id`), UNIQUE KEY `internals_name_unique` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -940,12 +941,13 @@ DROP TABLE IF EXISTS `invites`; CREATE TABLE `invites` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `code` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `expires_on` datetime DEFAULT NULL, `accepted_by` int unsigned DEFAULT NULL, `accepted_at` datetime DEFAULT NULL, - `custom` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `custom` text COLLATE utf8mb4_unicode_ci, + `internal_note` text COLLATE utf8mb4_unicode_ci, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, @@ -960,13 +962,13 @@ DROP TABLE IF EXISTS `job_batches`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `job_batches` ( - `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `total_jobs` int NOT NULL, `pending_jobs` int NOT NULL, `failed_jobs` int NOT NULL, - `failed_job_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `failed_job_ids` text COLLATE utf8mb4_unicode_ci NOT NULL, + `options` text COLLATE utf8mb4_unicode_ci, `cancelled_at` int DEFAULT NULL, `created_at` int NOT NULL, `finished_at` int DEFAULT NULL, @@ -978,8 +980,8 @@ DROP TABLE IF EXISTS `jobs`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `jobs` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `queue` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `payload` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `queue` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `payload` text COLLATE utf8mb4_unicode_ci NOT NULL, `attempts` tinyint(1) NOT NULL, `reserved_at` int unsigned DEFAULT NULL, `available_at` int unsigned NOT NULL, @@ -993,7 +995,7 @@ DROP TABLE IF EXISTS `keywords`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `keywords` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `torrent_id` int unsigned NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -1024,8 +1026,8 @@ DROP TABLE IF EXISTS `media_languages`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `media_languages` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `code` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `code` char(2) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) @@ -1040,7 +1042,7 @@ CREATE TABLE `messages` ( `chatroom_id` int unsigned NOT NULL, `receiver_id` int unsigned DEFAULT NULL, `bot_id` int unsigned DEFAULT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1055,7 +1057,7 @@ DROP TABLE IF EXISTS `migrations`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `migrations` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `migration` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `batch` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -1065,29 +1067,29 @@ DROP TABLE IF EXISTS `movies`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `movies` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `tmdb_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `imdb_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `title_sort` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `original_language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `tmdb_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `imdb_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `title_sort` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `original_language` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `adult` tinyint(1) DEFAULT NULL, - `backdrop` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `budget` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `homepage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `original_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `overview` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `popularity` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `poster` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `backdrop` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `budget` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `homepage` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `original_title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `overview` mediumtext COLLATE utf8mb4_unicode_ci, + `popularity` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `poster` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `release_date` date DEFAULT NULL, - `revenue` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `runtime` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `tagline` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `vote_average` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `revenue` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `runtime` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `tagline` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `vote_average` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `vote_count` int DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, - `trailer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `trailer` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `movie_title_index` (`title`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -1109,12 +1111,12 @@ DROP TABLE IF EXISTS `networks`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `networks` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `description` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `logo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `homepage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `headquarters` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `origin_country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` mediumtext COLLATE utf8mb4_unicode_ci, + `logo` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `homepage` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `headquarters` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `origin_country` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `networks_name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -1123,11 +1125,11 @@ DROP TABLE IF EXISTS `notifications`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `notifications` ( - `id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `id` char(36) COLLATE utf8mb4_unicode_ci NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `notifiable_id` int unsigned NOT NULL, - `notifiable_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `notifiable_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `data` text COLLATE utf8mb4_unicode_ci NOT NULL, `read_at` datetime DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -1143,7 +1145,7 @@ DROP TABLE IF EXISTS `occupations`; CREATE TABLE `occupations` ( `id` smallint unsigned NOT NULL AUTO_INCREMENT, `position` smallint NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1153,7 +1155,7 @@ DROP TABLE IF EXISTS `options`; CREATE TABLE `options` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `poll_id` int unsigned NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `votes` int NOT NULL DEFAULT '0', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -1167,8 +1169,8 @@ DROP TABLE IF EXISTS `pages`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `pages` ( `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `content` text COLLATE utf8mb4_unicode_ci, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) @@ -1199,7 +1201,7 @@ DROP TABLE IF EXISTS `passkeys`; CREATE TABLE `passkeys` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `content` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1223,8 +1225,8 @@ DROP TABLE IF EXISTS `password_resets`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `password_resets` ( - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` datetime DEFAULT NULL, PRIMARY KEY (`email`), KEY `password_resets_email_index` (`email`), @@ -1238,7 +1240,7 @@ CREATE TABLE `peers` ( `peer_id` binary(20) NOT NULL, `ip` varbinary(16) NOT NULL, `port` smallint unsigned NOT NULL, - `agent` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `agent` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, `uploaded` bigint unsigned NOT NULL, `downloaded` bigint unsigned NOT NULL, `left` bigint unsigned NOT NULL, @@ -1263,20 +1265,20 @@ DROP TABLE IF EXISTS `people`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `people` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `imdb_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `known_for_department` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `place_of_birth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `popularity` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `profile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `still` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `adult` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `also_known_as` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `biography` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `birthday` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `deathday` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `homepage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `imdb_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `known_for_department` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `place_of_birth` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `popularity` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `profile` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `still` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `adult` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `also_known_as` mediumtext COLLATE utf8mb4_unicode_ci, + `biography` mediumtext COLLATE utf8mb4_unicode_ci, + `birthday` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `deathday` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `gender` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `homepage` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `person_name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -1317,9 +1319,9 @@ DROP TABLE IF EXISTS `playlists`; CREATE TABLE `playlists` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `cover_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci NOT NULL, + `cover_image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `position` int DEFAULT NULL, `is_private` tinyint(1) NOT NULL DEFAULT '0', `is_pinned` tinyint(1) NOT NULL DEFAULT '0', @@ -1340,7 +1342,7 @@ DROP TABLE IF EXISTS `polls`; CREATE TABLE `polls` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL DEFAULT '0', - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `multiple_choice` tinyint(1) NOT NULL DEFAULT '0', `expires_at` datetime DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, @@ -1374,7 +1376,7 @@ DROP TABLE IF EXISTS `posts`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `posts` ( `id` int NOT NULL AUTO_INCREMENT, - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `content` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `user_id` int unsigned NOT NULL, @@ -1394,7 +1396,7 @@ CREATE TABLE `private_messages` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `conversation_id` int unsigned NOT NULL, `sender_id` int unsigned NOT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1426,9 +1428,9 @@ DROP TABLE IF EXISTS `recommendations`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `recommendations` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `poster` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `vote_average` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `poster` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `vote_average` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `release_date` date DEFAULT NULL, `first_air_date` date DEFAULT NULL, `movie_id` int unsigned DEFAULT NULL, @@ -1453,7 +1455,7 @@ DROP TABLE IF EXISTS `regions`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `regions` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `position` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -1463,13 +1465,13 @@ DROP TABLE IF EXISTS `reports`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `reports` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `reporter_id` int unsigned NOT NULL, `staff_id` int unsigned DEFAULT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `solved` int NOT NULL, - `verdict` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `verdict` text COLLATE utf8mb4_unicode_ci, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `reported_user` int unsigned DEFAULT NULL, @@ -1526,14 +1528,14 @@ DROP TABLE IF EXISTS `requests`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `requests` ( `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `category_id` smallint unsigned NOT NULL, `imdb` int unsigned DEFAULT NULL, `tvdb` int unsigned DEFAULT NULL, `tmdb` int unsigned DEFAULT NULL, `mal` int unsigned DEFAULT NULL, - `igdb` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', - `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `igdb` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', + `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `user_id` int unsigned NOT NULL, `bounty` decimal(12,2) NOT NULL, `votes` int NOT NULL DEFAULT '0', @@ -1577,7 +1579,7 @@ DROP TABLE IF EXISTS `resolutions`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `resolutions` ( `id` smallint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `position` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -1606,7 +1608,7 @@ DROP TABLE IF EXISTS `rss`; CREATE TABLE `rss` ( `id` int NOT NULL AUTO_INCREMENT, `position` int NOT NULL DEFAULT '0', - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Default', + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Default', `user_id` int unsigned NOT NULL DEFAULT '1', `is_private` tinyint(1) NOT NULL DEFAULT '0', `is_torrent` tinyint(1) NOT NULL DEFAULT '0', @@ -1627,7 +1629,7 @@ DROP TABLE IF EXISTS `rsskeys`; CREATE TABLE `rsskeys` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `content` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1642,10 +1644,10 @@ CREATE TABLE `seasons` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `tv_id` int unsigned NOT NULL, `season_number` int NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `overview` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `poster` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `air_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `overview` mediumtext COLLATE utf8mb4_unicode_ci, + `poster` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `air_date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1660,8 +1662,8 @@ DROP TABLE IF EXISTS `seedboxes`; CREATE TABLE `seedboxes` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `ip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1675,11 +1677,11 @@ DROP TABLE IF EXISTS `sessions`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `sessions` ( - `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `user_id` int unsigned DEFAULT NULL, - `ip_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `payload` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `ip_address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `user_agent` text COLLATE utf8mb4_unicode_ci, + `payload` text COLLATE utf8mb4_unicode_ci NOT NULL, `last_activity` int NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `sessions_id_unique` (`id`), @@ -1711,12 +1713,12 @@ DROP TABLE IF EXISTS `subtitles`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `subtitles` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `file_size` bigint unsigned NOT NULL, `language_id` int NOT NULL, - `extension` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `note` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `extension` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `note` text COLLATE utf8mb4_unicode_ci, `downloads` int DEFAULT NULL, `verified` tinyint(1) NOT NULL DEFAULT '0', `user_id` int unsigned NOT NULL, @@ -1724,7 +1726,7 @@ CREATE TABLE `subtitles` ( `anon` tinyint(1) NOT NULL DEFAULT '0', `status` smallint NOT NULL DEFAULT '0', `moderated_at` datetime DEFAULT NULL, - `moderated_by` int unsigned DEFAULT NULL, + `moderated_by` int unsigned NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1761,9 +1763,9 @@ CREATE TABLE `ticket_attachments` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, `ticket_id` int NOT NULL, - `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `file_size` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `file_extension` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `file_size` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `file_extension` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, @@ -1778,7 +1780,7 @@ DROP TABLE IF EXISTS `ticket_categories`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `ticket_categories` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `position` int NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -1792,7 +1794,7 @@ CREATE TABLE `ticket_notes` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, `ticket_id` int unsigned NOT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1805,7 +1807,7 @@ DROP TABLE IF EXISTS `ticket_priorities`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `ticket_priorities` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `position` int NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -1823,8 +1825,8 @@ CREATE TABLE `tickets` ( `staff_id` int unsigned DEFAULT NULL, `user_read` tinyint DEFAULT NULL, `staff_read` tinyint DEFAULT NULL, - `subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `body` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `subject` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `body` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `closed_at` timestamp NULL DEFAULT NULL, `reminded_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, @@ -1859,8 +1861,8 @@ DROP TABLE IF EXISTS `topics`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `topics` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `state` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `priority` tinyint unsigned NOT NULL, `approved` tinyint(1) NOT NULL DEFAULT '0', `denied` tinyint(1) NOT NULL DEFAULT '0', @@ -1873,7 +1875,7 @@ CREATE TABLE `topics` ( `first_post_user_id` int unsigned DEFAULT NULL, `last_post_id` int DEFAULT NULL, `last_post_user_id` int unsigned DEFAULT NULL, - `last_post_created_at` datetime DEFAULT NULL, + `last_post_created_at` timestamp NULL DEFAULT NULL, `views` int DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -1898,7 +1900,7 @@ CREATE TABLE `torrent_downloads` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, `torrent_id` int unsigned NOT NULL, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -1950,13 +1952,13 @@ DROP TABLE IF EXISTS `torrents`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `torrents` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci NOT NULL, `mediainfo` longtext COLLATE utf8mb4_unicode_ci, - `bdinfo` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `bdinfo` longtext COLLATE utf8mb4_unicode_ci, + `file_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `num_file` int NOT NULL, - `folder` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `folder` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `size` double NOT NULL, `nfo` blob, `leechers` int NOT NULL DEFAULT '0', @@ -1968,7 +1970,7 @@ CREATE TABLE `torrents` ( `tvdb` int unsigned NOT NULL DEFAULT '0', `tmdb` int unsigned NOT NULL DEFAULT '0', `mal` int unsigned NOT NULL DEFAULT '0', - `igdb` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', + `igdb` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', `season_number` int DEFAULT NULL, `episode_number` int DEFAULT NULL, `stream` tinyint(1) NOT NULL DEFAULT '0', @@ -2025,7 +2027,6 @@ CREATE TABLE `torrents` ( KEY `torrents_idx_sticky_bumped_at` (`sticky`,`bumped_at`), KEY `torrents_idx_status_info_hash` (`status`), KEY `torrents_fl_until_du_until_index` (`fl_until`,`du_until`), - KEY `torrents_user_id_foreign` (`user_id`), KEY `torrents_info_hash_index` (`info_hash`), KEY `torrents_user_id_anon_status_created_at_index` (`user_id`,`anon`,`status`,`created_at`), KEY `torrents_status_sticky_created_at_index` (`status`,`sticky`,`created_at`), @@ -2043,35 +2044,35 @@ DROP TABLE IF EXISTS `tv`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `tv` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `tmdb_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `imdb_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `tvdb_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `name_sort` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `overview` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `tmdb_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `imdb_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `tvdb_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `name_sort` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `overview` mediumtext COLLATE utf8mb4_unicode_ci, `number_of_episodes` int DEFAULT NULL, `count_existing_episodes` int DEFAULT NULL, `count_total_episodes` int DEFAULT NULL, `number_of_seasons` int DEFAULT NULL, - `episode_run_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `first_air_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `homepage` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `episode_run_time` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `first_air_date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `homepage` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `in_production` tinyint(1) DEFAULT NULL, - `last_air_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `next_episode_to_air` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `origin_country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `original_language` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `original_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `popularity` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `backdrop` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `poster` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `vote_average` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `last_air_date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `next_episode_to_air` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `origin_country` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `original_language` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `original_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `popularity` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `backdrop` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `poster` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `vote_average` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `vote_count` int DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, - `trailer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `trailer` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `tv_name_index` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -2081,11 +2082,24 @@ DROP TABLE IF EXISTS `types`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `types` ( `id` smallint unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `position` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +DROP TABLE IF EXISTS `unregistered_info_hashes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `unregistered_info_hashes` ( + `user_id` int unsigned NOT NULL, + `info_hash` binary(20) NOT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`info_hash`,`user_id`), + KEY `unregistered_info_hashes_user_id_foreign` (`user_id`), + CONSTRAINT `unregistered_info_hashes_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `user_audibles`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; @@ -2135,7 +2149,7 @@ CREATE TABLE `user_notes` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, `staff_id` int unsigned NOT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -2295,14 +2309,14 @@ CREATE TABLE `user_settings` ( `user_id` int unsigned NOT NULL, `censor` tinyint(1) NOT NULL DEFAULT '0', `chat_hidden` tinyint(1) NOT NULL DEFAULT '0', - `locale` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'en', + `locale` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'en', `style` tinyint unsigned NOT NULL DEFAULT '0', `torrent_layout` tinyint unsigned NOT NULL DEFAULT '0', `torrent_filters` tinyint(1) NOT NULL DEFAULT '0', - `custom_css` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `standalone_css` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `custom_css` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `standalone_css` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `show_poster` tinyint(1) NOT NULL DEFAULT '0', - `torrent_sort_field` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `torrent_sort_field` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `torrent_search_autofocus` tinyint(1) NOT NULL DEFAULT '1', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -2316,27 +2330,27 @@ DROP TABLE IF EXISTS `users`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `users` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `two_factor_secret` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `two_factor_recovery_codes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `two_factor_secret` text COLLATE utf8mb4_unicode_ci, + `two_factor_recovery_codes` text COLLATE utf8mb4_unicode_ci, `two_factor_confirmed_at` timestamp NULL DEFAULT NULL, - `passkey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `passkey` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `group_id` int NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '0', `uploaded` bigint unsigned NOT NULL DEFAULT '0', `downloaded` bigint unsigned NOT NULL DEFAULT '0', - `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `image` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `icon` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `about` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - `signature` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, + `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `about` mediumtext COLLATE utf8mb4_unicode_ci, + `signature` text COLLATE utf8mb4_unicode_ci, `fl_tokens` int unsigned NOT NULL DEFAULT '0', `seedbonus` decimal(12,2) NOT NULL DEFAULT '0.00', `invites` int unsigned NOT NULL DEFAULT '0', `hitandruns` int unsigned NOT NULL DEFAULT '0', - `rsskey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `rsskey` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `chatroom_id` int unsigned NOT NULL DEFAULT '1', `read_rules` tinyint(1) NOT NULL DEFAULT '0', `can_chat` tinyint(1) DEFAULT NULL, @@ -2347,8 +2361,8 @@ CREATE TABLE `users` ( `can_upload` tinyint(1) DEFAULT NULL, `is_donor` tinyint(1) NOT NULL DEFAULT '0', `is_lifetime` tinyint(1) NOT NULL DEFAULT '0', - `remember_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `api_token` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `remember_token` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `api_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `last_login` datetime DEFAULT NULL, `last_action` datetime DEFAULT NULL, `disabled_at` datetime DEFAULT NULL, @@ -2396,7 +2410,7 @@ CREATE TABLE `warnings` ( `user_id` int unsigned NOT NULL, `warned_by` int unsigned NOT NULL, `torrent` int unsigned DEFAULT NULL, - `reason` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `reason` text COLLATE utf8mb4_unicode_ci NOT NULL, `expires_on` datetime DEFAULT NULL, `active` tinyint(1) NOT NULL DEFAULT '0', `deleted_by` int unsigned DEFAULT NULL, @@ -2422,7 +2436,7 @@ CREATE TABLE `watchlists` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, `staff_id` int unsigned NOT NULL, - `message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -2437,7 +2451,7 @@ DROP TABLE IF EXISTS `whitelisted_image_urls`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `whitelisted_image_urls` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `pattern` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `pattern` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), @@ -2449,8 +2463,8 @@ DROP TABLE IF EXISTS `wiki_categories`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `wiki_categories` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'fa-book', + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `icon` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'fa-book', `position` int NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -2460,8 +2474,8 @@ DROP TABLE IF EXISTS `wikis`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `wikis` ( `id` int unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL, `category_id` int unsigned NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, @@ -2476,7 +2490,7 @@ DROP TABLE IF EXISTS `wishes`; CREATE TABLE `wishes` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `user_id` int unsigned NOT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `movie_id` int unsigned DEFAULT NULL, `tv_id` int unsigned DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, @@ -2554,270 +2568,270 @@ INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (57,'2017_12_10_020 INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (58,'2017_12_10_020754_add_foreign_keys_to_torrents_table',1); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (59,'2017_12_10_020754_add_foreign_keys_to_voters_table',1); INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (60,'2017_12_10_020754_add_foreign_keys_to_warnings_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (61,'2017_12_21_123452_add_custom_css_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (62,'2017_12_27_000000_add_locale_column',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (63,'2018_01_23_095412_add_implemented_to_topics_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (64,'2018_01_25_000000_add_twostep_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (65,'2018_02_06_142024_add_last_reply_at_to_topics_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (66,'2018_02_14_000000_add_is_internal_to_groups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (67,'2018_03_13_000000_add_position_to_categories_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (68,'2018_03_21_000000_add_censor_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (69,'2018_03_27_000000_add_chat_hidden_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (70,'2018_04_19_221542_create_failed_jobs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (71,'2018_04_21_181026_create_wishes_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (72,'2018_04_22_195516_alter_reports_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (73,'2018_04_28_021651_alter_shoutbox_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (74,'2018_04_28_022305_create_chatrooms_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (75,'2018_04_28_022344_add_chatroom_id_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (76,'2018_05_04_101711_create_chat_statuses_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (77,'2018_05_04_102055_add_chat_status_id_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (78,'2018_05_07_183534_add_can_upload_to_groups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (79,'2018_05_15_223339_add_receiver_id_column_to_messages_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (80,'2018_05_18_144651_rename_ban_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (81,'2018_05_21_022459_add_torrent_layout_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (82,'2018_05_21_192858_alter_peers_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (83,'2018_05_22_224911_alter_private_messages_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (84,'2018_05_31_120936_create_albums_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (85,'2018_05_31_120955_create_images_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (86,'2018_06_11_110000_create_topic_subscriptions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (87,'2018_07_12_114125_add_soft_deletes_to_warnings',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (88,'2018_08_19_212319_create_git_updates_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (89,'2018_09_08_153849_add_soft_deletes_to_user_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (90,'2018_09_24_205852_add_internal_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (91,'2018_09_29_163937_add_anon_to_requests_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (92,'2018_09_29_164525_add_anon_to_request_bounty_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (93,'2018_11_09_010002_add_immune_to_history_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (94,'2018_12_03_024251_create_applications_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (95,'2018_12_03_032701_create_application_image_proofs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (96,'2018_12_03_032712_create_application_url_proofs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (97,'2018_12_06_012908_update_tag_torrent_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (98,'2018_1_10_020753_create_freeleech_tokens_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (99,'2018_1_20_070937_create_two_step_auth_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (100,'2019_01_09_151754_alter_categories_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (101,'2019_01_09_175336_add_incognito_to_groups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (102,'2019_01_10_102512_add_request_id_to_reports_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (103,'2019_01_11_001150_alter_rss_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (104,'2019_01_17_213210_add_torrent_filters_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (105,'2019_01_23_034500_alter_bon_transactions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (106,'2019_01_24_033802_rename_topic_subscriptions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (107,'2019_01_24_190220_alter_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (108,'2019_01_27_005216_create_user_privacy_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (109,'2019_01_28_031842_alter_groups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (110,'2019_01_28_225127_create_user_notifications_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (111,'2019_01_29_054104_alter_users_tables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (112,'2019_02_04_041644_create_user_echoes_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (113,'2019_02_05_220444_create_bots_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (114,'2019_02_06_005248_add_bot_id_to_messages_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (115,'2019_02_06_075938_create_bot_transactions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (116,'2019_02_07_022409_create_user_audibles_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (117,'2019_02_10_010213_fix_chat_related_tables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (118,'2019_02_21_133950_add_is_owner_to_groups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (119,'2019_02_21_221047_add_request_to_user_privacy_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (120,'2019_03_20_214306_alter_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (121,'2019_06_17_172554_add_last_action_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (122,'2019_07_09_225645_add_release_year_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (123,'2019_07_30_210848_create_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (124,'2019_07_30_210849_create_seasons_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (125,'2019_07_30_210850_create_cast_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (126,'2019_07_30_210850_create_collection_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (127,'2019_07_30_210850_create_companies_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (128,'2019_07_30_210850_create_episodes_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (129,'2019_07_30_210850_create_genres_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (130,'2019_07_30_210850_create_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (131,'2019_07_30_210850_create_networks_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (132,'2019_07_30_210850_create_person_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (133,'2019_07_31_024816_alter_requests_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (134,'2019_07_31_210850_create_cast_episode_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (135,'2019_07_31_210850_create_cast_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (136,'2019_07_31_210850_create_cast_season_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (137,'2019_07_31_210850_create_cast_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (138,'2019_07_31_210850_create_company_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (139,'2019_07_31_210850_create_crew_episode_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (140,'2019_07_31_210850_create_crew_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (141,'2019_07_31_210850_create_crew_season_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (142,'2019_07_31_210850_create_crew_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (143,'2019_07_31_210850_create_episode_guest_star_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (144,'2019_07_31_210850_create_episode_person_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (145,'2019_07_31_210850_create_genre_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (146,'2019_07_31_210850_create_network_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (147,'2019_07_31_210850_create_person_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (148,'2019_07_31_210850_create_person_tv_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (149,'2019_07_31_210851_create_collection_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (150,'2019_07_31_210851_create_company_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (151,'2019_07_31_210851_create_genre_movie_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (152,'2019_07_31_210851_create_person_season_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (153,'2019_09_22_204439_create_playlists_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (154,'2019_09_22_204613_create_playlist_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (155,'2019_09_24_160123_alter_comments_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (156,'2019_11_05_233558_create_audits_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (157,'2019_11_27_025048_add_api_token_field_users',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (158,'2019_12_17_030908_create_keywords_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (159,'2020_01_02_203432_bdinfo_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (160,'2020_02_14_185120_add_foreign_key_to_options_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (161,'2020_02_14_202935_drop_ip_checking_in_polls_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (162,'2020_02_14_203001_drop_ip_address_in_voters_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (163,'2020_03_02_031656_update_comments_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (164,'2020_03_26_030235_create_subtitles_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (165,'2020_03_26_034620_create_media_languages_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (166,'2020_03_31_201107_add_is_double_upload_to_groups_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (167,'2020_05_19_023939_add_type_id_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (168,'2020_05_26_053632_add_type_id_to_requests_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (169,'2020_06_06_185230_create_resolutions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (170,'2020_06_07_023938_add_resolution_id_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (171,'2020_06_07_054632_add_resolution_id_to_requests_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (172,'2020_06_10_014256_unique_groups',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (173,'2020_06_18_115296_add_bumped_at_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (174,'2020_07_07_202935_drop_tags_tables',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (175,'2020_10_06_143759_add_uuid_to_failed_jobs_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (176,'2020_10_07_012129_create_job_batches_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (177,'2020_10_18_235628_create_genre_torrent_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (178,'2020_11_01_165838_update_wishes_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (179,'2021_01_02_230512_update_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (180,'2021_01_06_360572_update_nfo_column_on_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (181,'2021_01_18_191121_create_tickets_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (182,'2021_01_18_191321_create_ticket_categories_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (183,'2021_01_18_191336_create_ticket_priorities_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (184,'2021_01_18_191357_create_ticket_attachments_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (185,'2021_01_18_191596_add_ticket_id_to_comments_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (186,'2021_03_04_042851_create_watchlists_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (187,'2021_03_11_024605_add_personal_release_to_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (188,'2021_03_14_093812_add_read_column_tickets_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (189,'2021_04_13_200421_update_about_column_on_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (190,'2021_05_26_215430_create_recommendations_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (191,'2021_06_28_123452_add_standalone_css_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (192,'2021_07_04_200752_create_conversations_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (193,'2021_07_04_202354_create_conversation_user_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (194,'2021_07_04_205806_create_conversation_message_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (195,'2021_07_08_135537_add_flush_own_peers_to_users_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (196,'2021_07_27_140562_change_torrents_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (197,'2021_07_27_185231_create_distributors_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (198,'2021_07_27_285231_create_regions_table',1); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (199,'2021_04_18_085155_add_internals_table',2); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (200,'2021_07_31_172708_add_connectable_state_to_peers_table',2); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (201,'2021_08_20_121103_change_torrent_to_nullable_in_warning',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (202,'2021_10_03_180121_add_indexes_to_tables',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (203,'2021_11_22_115517_add_more_torrent_promos',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (204,'2021_11_26_024738_update_torrents_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (205,'2021_12_19_202317_fix_database_indexs',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (206,'2022_01_23_232931_update_comments_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (207,'2022_02_03_080630_update_groups_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (208,'2022_02_03_090219_update_torrents_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (209,'2022_02_06_210013_update_history_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (210,'2022_02_21_162827_create_torrent_downloads_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (211,'2022_04_27_143156_update_users_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (212,'2022_08_29_030244_update_history_table_add_refundable',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (213,'2022_08_29_030525_update_torrents_table_add_refundable',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (214,'2022_08_29_031309_update_groups_table_add_refundable',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (215,'2022_08_29_155715_create_client_blacklist_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (216,'2022_09_29_182332_alter_torrents_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (217,'2022_11_23_024350_update_history_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (218,'2022_11_23_195306_update_peers_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (219,'2022_11_24_032502_update_torrents_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (220,'2022_11_24_032521_update_requests_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (221,'2022_11_27_062458_drop_old_tables',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (222,'2022_11_29_010000_alter_reports_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (223,'2022_11_29_010010_alter_bon_transactions_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (224,'2022_11_29_030020_alter_user_id',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (225,'2022_12_05_012617_drop_conversations',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (226,'2022_12_21_014703_alter_torrent_id',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (227,'2022_12_22_004317_update_peers_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (228,'2022_12_22_213142_update_history_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (229,'2022_12_23_103322_update_requests_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (230,'2022_12_24_222839_update_follows_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (231,'2022_12_30_090331_update_user_notifications_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (232,'2022_12_30_090351_update_user_privacy_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (233,'2023_01_06_194157_remove_slugs',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (234,'2023_02_03_094806_update_rss_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (235,'2023_02_09_113903_clean_torrent_files',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (236,'2023_02_27_164336_credits_refactor',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (237,'2023_04_08_053641_alter_torrents_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (238,'2023_06_13_092029_alter_invites_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (239,'2023_07_16_010906_add_indexes',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (240,'2023_07_20_084446_drop_distributor_position',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (241,'2023_07_22_023920_alter_movie_and_tv_ids',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (242,'2023_07_22_043634_post_playlist_html_special_chars_decode',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (243,'2023_07_22_165745_add_active_column_to_peers',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (244,'2023_07_22_204126_rename_bon_transactions_foreign_keys',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (245,'2023_07_23_190319_drop_genre_torrent_table',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (246,'2023_07_23_192525_rename_graveyard_to_resurrections',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (247,'2023_07_23_220207_alter_mediahub_ids',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (248,'2023_07_29_205035_add_torrent_folder_name',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (249,'2023_07_31_043749_drop_announce_column_from_torrents',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (250,'2023_08_05_231341_swap_username_for_user_id_on_request_claims',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (251,'2023_08_13_234828_add_forum_foreign_key_constraints',3); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (252,'2014_10_12_200000_add_two_factor_columns_to_users_table',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (253,'2023_06_14_102346_delete_user_activations',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (254,'2023_09_10_234654_create_blocked_ips_table',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (255,'2023_11_06_152351_drop_2fa_table',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (256,'2023_11_12_223126_create_passkeys',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (257,'2023_11_15_170525_create_apikeys',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (258,'2023_11_16_084506_create_rsskeys',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (259,'2023_11_16_122533_create_announces',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (260,'2023_12_19_133124_create_wiki_categories_table',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (261,'2023_12_19_233124_create_wikis_table',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (262,'2023_12_22_221619_plural_table_names',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (263,'2023_12_30_092415_add_peer_id_prefix_to_blacklist_client',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (264,'2024_01_08_025430_update_meta_tables',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (265,'2024_01_12_092724_alter_history_table_64_int_id',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (266,'2024_01_15_151522_update_groups_table',4); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (267,'2024_01_21_062125_create_email_updates',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (268,'2024_01_23_115425_add_created_at_index_to_torrent_downloads',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (269,'2024_02_02_222845_create_automatic_torrent_freeleeches_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (270,'2024_02_04_012321_remove_user_ratings',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (271,'2024_02_07_192449_add_requirements_to_groups',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (272,'2024_02_07_213520_add_visible_to_peers',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (273,'2024_02_08_095758_add_last_post_id_to_topics',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (274,'2024_02_08_144018_add_system_required_to_groups_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (275,'2024_02_09_190708_remove_show_forum_from_permissions',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (276,'2024_02_10_140207_create_forum_categories',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (277,'2024_02_13_033340_create_topic_reads',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (278,'2024_02_14_022118_fix_subtitle_filepaths',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (279,'2024_02_19_100212_add_primary_keys',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (280,'2024_02_19_100813_alter_year_type',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (281,'2024_02_19_102057_alter_floats_to_decimal',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (282,'2024_02_19_233644_add_permission_indexes',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (283,'2024_02_22_015442_create_post_tips_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (284,'2024_02_22_033718_create_gifts_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (285,'2024_02_22_092555_create_torrent_tips_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (286,'2024_02_23_154435_remove_request_bon_transactions',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (287,'2024_02_23_211021_create_internal_user',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (288,'2024_02_24_233030_rename_permissions_to_forum_permissions',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (289,'2024_02_26_000850_create_whitelisted_image_domains',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (290,'2024_03_06_062526_add_open_topics_to_forums',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (291,'2024_03_06_154000_add_user_indexes_to_torrents_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (292,'2024_03_19_211512_create_ticket_notes_table',5); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (293,'2024_03_21_145139_add_group_description',6); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (294,'2017_12_10_020755_add_two_factor_columns_to_users_table',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (295,'2024_04_30_063509_remove_casino_triva_bet_bot',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (296,'2024_05_08_000014_add_min_uploads_to_groups_table',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (297,'2024_05_23_184913_alter_wishes',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (298,'2024_05_26_034811_create_user_settings',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (299,'2024_05_26_043410_drop_user_stat_hidden_peer_hidden',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (300,'2024_05_29_075428_add_torrent_sort_field_to_user_settings',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (301,'2024_06_04_115016_add_torrent_search_autofocus_to_user_settings',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (302,'2024_06_06_042258_create_private_message_conversations',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (303,'2024_06_09_052006_drop_useless_columns_from_bots',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (304,'2024_06_14_005443_add_soft_deletes_to_torrents_table',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (305,'2024_06_23_202341_add_prewarned_at_to_history',7); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (306,'2024_05_06_212348_create_donations_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (307,'2024_05_06_212410_create_donation_packages_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (308,'2024_05_06_212446_create_donation_gateways_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (309,'2024_06_13_125854_add_is_uploader_to_groups_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (310,'2024_06_13_185043_add_donation_columns_to_users_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (311,'2024_07_02_082323_add_indexes_to_torrents_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (312,'2024_07_16_083832_add_composite_primary_key_to_peers',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (313,'2024_07_19_143828_add_priority_to_topics',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (314,'2024_07_23_054141_add_composite_primary_key_to_history',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (315,'2024_07_23_054751_create_torrent_trumps_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (316,'2024_07_23_153202_add_poll_expiry',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (317,'2024_07_26_211112_fix_some_user_group_perms',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (318,'2024_07_28_231553_update_cat_type_res_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (319,'2024_08_14_012412_drop_release_year_from_torrents_table',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (320,'2024_08_17_140412_create_password_reset_history',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (321,'2024_08_25_121227_drop_num_torrent_from_categories',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (322,'2024_08_26_085452_fix_bot_systembot_nerdbot_flags',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (323,'2024_09_02_224259_alter_reports_add_snooze_until',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (324,'2024_09_27_072554_add_indexes_to_audits',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (325,'2024_09_29_041904_add_indexes_for_top10_performance',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (326,'2024_10_10_140532_update_mediainfo_from_text_to_longtext',8); -INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (327,'2024_10_13_221353_create_events_claimed_prizes_tables',8); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (61,'2017_12_10_020755_add_two_factor_columns_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (62,'2017_12_21_123452_add_custom_css_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (63,'2017_12_27_000000_add_locale_column',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (64,'2018_01_23_095412_add_implemented_to_topics_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (65,'2018_01_25_000000_add_twostep_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (66,'2018_02_06_142024_add_last_reply_at_to_topics_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (67,'2018_02_14_000000_add_is_internal_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (68,'2018_03_13_000000_add_position_to_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (69,'2018_03_21_000000_add_censor_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (70,'2018_03_27_000000_add_chat_hidden_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (71,'2018_04_19_221542_create_failed_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (72,'2018_04_21_181026_create_wishes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (73,'2018_04_22_195516_alter_reports_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (74,'2018_04_28_021651_alter_shoutbox_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (75,'2018_04_28_022305_create_chatrooms_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (76,'2018_04_28_022344_add_chatroom_id_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (77,'2018_05_04_101711_create_chat_statuses_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (78,'2018_05_04_102055_add_chat_status_id_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (79,'2018_05_07_183534_add_can_upload_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (80,'2018_05_15_223339_add_receiver_id_column_to_messages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (81,'2018_05_18_144651_rename_ban_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (82,'2018_05_21_022459_add_torrent_layout_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (83,'2018_05_21_192858_alter_peers_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (84,'2018_05_22_224911_alter_private_messages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (85,'2018_05_31_120936_create_albums_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (86,'2018_05_31_120955_create_images_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (87,'2018_06_11_110000_create_topic_subscriptions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (88,'2018_07_12_114125_add_soft_deletes_to_warnings',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (89,'2018_08_19_212319_create_git_updates_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (90,'2018_09_08_153849_add_soft_deletes_to_user_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (91,'2018_09_24_205852_add_internal_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (92,'2018_09_29_163937_add_anon_to_requests_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (93,'2018_09_29_164525_add_anon_to_request_bounty_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (94,'2018_11_09_010002_add_immune_to_history_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (95,'2018_12_03_024251_create_applications_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (96,'2018_12_03_032701_create_application_image_proofs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (97,'2018_12_03_032712_create_application_url_proofs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (98,'2018_12_06_012908_update_tag_torrent_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (99,'2018_1_10_020753_create_freeleech_tokens_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (100,'2018_1_20_070937_create_two_step_auth_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (101,'2019_01_09_151754_alter_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (102,'2019_01_09_175336_add_incognito_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (103,'2019_01_10_102512_add_request_id_to_reports_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (104,'2019_01_11_001150_alter_rss_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (105,'2019_01_17_213210_add_torrent_filters_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (106,'2019_01_23_034500_alter_bon_transactions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (107,'2019_01_24_033802_rename_topic_subscriptions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (108,'2019_01_24_190220_alter_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (109,'2019_01_27_005216_create_user_privacy_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (110,'2019_01_28_031842_alter_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (111,'2019_01_28_225127_create_user_notifications_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (112,'2019_01_29_054104_alter_users_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (113,'2019_02_04_041644_create_user_echoes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (114,'2019_02_05_220444_create_bots_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (115,'2019_02_06_005248_add_bot_id_to_messages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (116,'2019_02_06_075938_create_bot_transactions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (117,'2019_02_07_022409_create_user_audibles_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (118,'2019_02_10_010213_fix_chat_related_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (119,'2019_02_21_133950_add_is_owner_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (120,'2019_02_21_221047_add_request_to_user_privacy_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (121,'2019_03_20_214306_alter_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (122,'2019_06_17_172554_add_last_action_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (123,'2019_07_09_225645_add_release_year_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (124,'2019_07_30_210848_create_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (125,'2019_07_30_210849_create_seasons_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (126,'2019_07_30_210850_create_cast_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (127,'2019_07_30_210850_create_collection_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (128,'2019_07_30_210850_create_companies_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (129,'2019_07_30_210850_create_episodes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (130,'2019_07_30_210850_create_genres_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (131,'2019_07_30_210850_create_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (132,'2019_07_30_210850_create_networks_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (133,'2019_07_30_210850_create_person_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (134,'2019_07_31_024816_alter_requests_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (135,'2019_07_31_210850_create_cast_episode_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (136,'2019_07_31_210850_create_cast_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (137,'2019_07_31_210850_create_cast_season_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (138,'2019_07_31_210850_create_cast_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (139,'2019_07_31_210850_create_company_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (140,'2019_07_31_210850_create_crew_episode_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (141,'2019_07_31_210850_create_crew_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (142,'2019_07_31_210850_create_crew_season_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (143,'2019_07_31_210850_create_crew_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (144,'2019_07_31_210850_create_episode_guest_star_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (145,'2019_07_31_210850_create_episode_person_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (146,'2019_07_31_210850_create_genre_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (147,'2019_07_31_210850_create_network_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (148,'2019_07_31_210850_create_person_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (149,'2019_07_31_210850_create_person_tv_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (150,'2019_07_31_210851_create_collection_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (151,'2019_07_31_210851_create_company_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (152,'2019_07_31_210851_create_genre_movie_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (153,'2019_07_31_210851_create_person_season_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (154,'2019_09_22_204439_create_playlists_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (155,'2019_09_22_204613_create_playlist_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (156,'2019_09_24_160123_alter_comments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (157,'2019_11_05_233558_create_audits_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (158,'2019_11_27_025048_add_api_token_field_users',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (159,'2019_12_17_030908_create_keywords_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (160,'2020_01_02_203432_bdinfo_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (161,'2020_02_14_185120_add_foreign_key_to_options_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (162,'2020_02_14_202935_drop_ip_checking_in_polls_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (163,'2020_02_14_203001_drop_ip_address_in_voters_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (164,'2020_03_02_031656_update_comments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (165,'2020_03_26_030235_create_subtitles_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (166,'2020_03_26_034620_create_media_languages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (167,'2020_03_31_201107_add_is_double_upload_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (168,'2020_05_19_023939_add_type_id_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (169,'2020_05_26_053632_add_type_id_to_requests_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (170,'2020_06_06_185230_create_resolutions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (171,'2020_06_07_023938_add_resolution_id_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (172,'2020_06_07_054632_add_resolution_id_to_requests_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (173,'2020_06_10_014256_unique_groups',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (174,'2020_06_18_115296_add_bumped_at_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (175,'2020_07_07_202935_drop_tags_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (176,'2020_10_06_143759_add_uuid_to_failed_jobs_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (177,'2020_10_07_012129_create_job_batches_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (178,'2020_10_18_235628_create_genre_torrent_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (179,'2020_11_01_165838_update_wishes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (180,'2021_01_02_230512_update_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (181,'2021_01_06_360572_update_nfo_column_on_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (182,'2021_01_18_191121_create_tickets_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (183,'2021_01_18_191321_create_ticket_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (184,'2021_01_18_191336_create_ticket_priorities_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (185,'2021_01_18_191357_create_ticket_attachments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (186,'2021_01_18_191596_add_ticket_id_to_comments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (187,'2021_03_04_042851_create_watchlists_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (188,'2021_03_11_024605_add_personal_release_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (189,'2021_03_14_093812_add_read_column_tickets_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (190,'2021_04_13_200421_update_about_column_on_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (191,'2021_04_18_085155_add_internals_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (192,'2021_05_26_215430_create_recommendations_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (193,'2021_06_28_123452_add_standalone_css_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (194,'2021_07_08_135537_add_flush_own_peers_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (195,'2021_07_27_140562_change_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (196,'2021_07_27_185231_create_distributors_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (197,'2021_07_27_285231_create_regions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (198,'2021_07_31_172708_add_connectable_state_to_peers_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (199,'2021_08_20_121103_change_torrent_to_nullable_in_warning',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (200,'2021_10_03_180121_add_indexes_to_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (201,'2021_11_22_115517_add_more_torrent_promos',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (202,'2021_11_26_024738_update_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (203,'2021_12_19_202317_fix_database_indexs',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (204,'2022_01_23_232931_update_comments_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (205,'2022_02_03_080630_update_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (206,'2022_02_03_090219_update_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (207,'2022_02_06_210013_update_history_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (208,'2022_02_21_162827_create_torrent_downloads_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (209,'2022_04_27_143156_update_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (210,'2022_08_29_030244_update_history_table_add_refundable',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (211,'2022_08_29_030525_update_torrents_table_add_refundable',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (212,'2022_08_29_031309_update_groups_table_add_refundable',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (213,'2022_08_29_155715_create_client_blacklist_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (214,'2022_09_29_182332_alter_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (215,'2022_11_23_024350_update_history_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (216,'2022_11_23_195306_update_peers_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (217,'2022_11_24_032502_update_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (218,'2022_11_24_032521_update_requests_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (219,'2022_11_27_062458_drop_old_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (220,'2022_11_29_010000_alter_reports_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (221,'2022_11_29_010010_alter_bon_transactions_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (222,'2022_11_29_030020_alter_user_id',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (223,'2022_12_05_012617_drop_conversations',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (224,'2022_12_21_014703_alter_torrent_id',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (225,'2022_12_22_004317_update_peers_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (226,'2022_12_22_213142_update_history_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (227,'2022_12_23_103322_update_requests_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (228,'2022_12_24_222839_update_follows_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (229,'2022_12_30_090331_update_user_notifications_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (230,'2022_12_30_090351_update_user_privacy_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (231,'2023_01_06_194157_remove_slugs',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (232,'2023_02_03_094806_update_rss_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (233,'2023_02_09_113903_clean_torrent_files',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (234,'2023_02_27_164336_credits_refactor',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (235,'2023_04_08_053641_alter_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (236,'2023_06_13_092029_alter_invites_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (237,'2023_06_14_102346_delete_user_activations',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (238,'2023_07_16_010906_add_indexes',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (239,'2023_07_20_084446_drop_distributor_position',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (240,'2023_07_22_023920_alter_movie_and_tv_ids',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (241,'2023_07_22_043634_post_playlist_html_special_chars_decode',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (242,'2023_07_22_165745_add_active_column_to_peers',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (243,'2023_07_22_204126_rename_bon_transactions_foreign_keys',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (244,'2023_07_23_190319_drop_genre_torrent_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (245,'2023_07_23_192525_rename_graveyard_to_resurrections',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (246,'2023_07_23_220207_alter_mediahub_ids',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (247,'2023_07_29_205035_add_torrent_folder_name',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (248,'2023_07_31_043749_drop_announce_column_from_torrents',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (249,'2023_08_05_231341_swap_username_for_user_id_on_request_claims',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (250,'2023_08_13_234828_add_forum_foreign_key_constraints',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (251,'2023_09_10_234654_create_blocked_ips_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (252,'2023_11_06_152351_drop_2fa_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (253,'2023_11_12_223126_create_passkeys',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (254,'2023_11_15_170525_create_apikeys',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (255,'2023_11_16_084506_create_rsskeys',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (256,'2023_11_16_122533_create_announces',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (257,'2023_12_19_133124_create_wiki_categories_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (258,'2023_12_19_233124_create_wikis_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (259,'2023_12_22_221619_plural_table_names',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (260,'2023_12_30_092415_add_peer_id_prefix_to_blacklist_client',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (261,'2024_01_08_025430_update_meta_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (262,'2024_01_12_092724_alter_history_table_64_int_id',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (263,'2024_01_15_151522_update_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (264,'2024_01_21_062125_create_email_updates',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (265,'2024_01_23_115425_add_created_at_index_to_torrent_downloads',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (266,'2024_02_02_222845_create_automatic_torrent_freeleeches_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (267,'2024_02_04_012321_remove_user_ratings',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (268,'2024_02_07_192449_add_requirements_to_groups',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (269,'2024_02_07_213520_add_visible_to_peers',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (270,'2024_02_08_095758_add_last_post_id_to_topics',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (271,'2024_02_08_144018_add_system_required_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (272,'2024_02_09_190708_remove_show_forum_from_permissions',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (273,'2024_02_10_140207_create_forum_categories',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (274,'2024_02_13_033340_create_topic_reads',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (275,'2024_02_14_022118_fix_subtitle_filepaths',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (276,'2024_02_19_100212_add_primary_keys',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (277,'2024_02_19_100813_alter_year_type',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (278,'2024_02_19_102057_alter_floats_to_decimal',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (279,'2024_02_19_233644_add_permission_indexes',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (280,'2024_02_22_015442_create_post_tips_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (281,'2024_02_22_033718_create_gifts_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (282,'2024_02_22_092555_create_torrent_tips_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (283,'2024_02_23_154435_remove_request_bon_transactions',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (284,'2024_02_23_211021_create_internal_user',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (285,'2024_02_24_233030_rename_permissions_to_forum_permissions',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (286,'2024_02_26_000850_create_whitelisted_image_domains',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (287,'2024_03_06_062526_add_open_topics_to_forums',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (288,'2024_03_06_154000_add_user_indexes_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (289,'2024_03_19_211512_create_ticket_notes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (290,'2024_03_21_145139_add_group_description',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (291,'2024_04_30_063509_remove_casino_triva_bet_bot',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (292,'2024_05_06_212348_create_donations_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (293,'2024_05_06_212410_create_donation_packages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (294,'2024_05_06_212446_create_donation_gateways_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (295,'2024_05_08_000014_add_min_uploads_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (296,'2024_05_23_184913_alter_wishes',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (297,'2024_05_26_034811_create_user_settings',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (298,'2024_05_26_043410_drop_user_stat_hidden_peer_hidden',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (299,'2024_05_29_075428_add_torrent_sort_field_to_user_settings',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (300,'2024_06_04_115016_add_torrent_search_autofocus_to_user_settings',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (301,'2024_06_06_042258_create_private_message_conversations',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (302,'2024_06_09_052006_drop_useless_columns_from_bots',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (303,'2024_06_13_125854_add_is_uploader_to_groups_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (304,'2024_06_13_185043_add_donation_columns_to_users_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (305,'2024_06_14_005443_add_soft_deletes_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (306,'2024_06_23_202341_add_prewarned_at_to_history',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (307,'2024_07_02_082323_add_indexes_to_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (308,'2024_07_16_083832_add_composite_primary_key_to_peers',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (309,'2024_07_19_143828_add_priority_to_topics',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (310,'2024_07_23_054141_add_composite_primary_key_to_history',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (311,'2024_07_23_054751_create_torrent_trumps_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (312,'2024_07_23_153202_add_poll_expiry',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (313,'2024_07_26_211112_fix_some_user_group_perms',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (314,'2024_07_28_231553_update_cat_type_res_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (315,'2024_08_14_012412_drop_release_year_from_torrents_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (316,'2024_08_17_140412_create_password_reset_history',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (317,'2024_08_25_121227_drop_num_torrent_from_categories',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (318,'2024_08_26_085452_fix_bot_systembot_nerdbot_flags',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (319,'2024_09_02_224259_alter_reports_add_snooze_until',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (320,'2024_09_27_072554_add_indexes_to_audits',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (321,'2024_09_29_041904_add_indexes_for_top10_performance',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (322,'2024_10_10_140532_update_mediainfo_from_text_to_longtext',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (323,'2024_10_13_221353_create_events_claimed_prizes_tables',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (324,'2024_10_29_180417_add_internal_note_to_invites_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (325,'2024_11_01_013426_add_soft_deletes_to_donation_packages_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (326,'2024_11_13_044550_create_unregistered_info_hashes_table',1); +INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES (327,'2024_11_26_170256_add_is_torrent_modo_to_groups_table',1); diff --git a/database/seeders/GroupsTableSeeder.php b/database/seeders/GroupsTableSeeder.php index f606037c3e..421d17ca5b 100644 --- a/database/seeders/GroupsTableSeeder.php +++ b/database/seeders/GroupsTableSeeder.php @@ -36,6 +36,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -66,6 +67,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -96,6 +98,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -117,7 +120,7 @@ public function run(): void [ 'name' => 'Administrator', 'slug' => 'administrator', - 'position' => 18, + 'position' => 20, 'color' => '#f92672', 'icon' => config('other.font-awesome').' fa-user-secret', 'effect' => 'none', @@ -126,6 +129,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => true, 'is_modo' => true, + 'is_torrent_modo' => true, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -156,6 +160,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -177,7 +182,7 @@ public function run(): void [ 'name' => 'Moderator', 'slug' => 'moderator', - 'position' => 17, + 'position' => 19, 'color' => '#4ECDC4', 'icon' => config('other.font-awesome').' fa-user-secret', 'effect' => 'none', @@ -186,6 +191,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => true, + 'is_torrent_modo' => true, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -216,6 +222,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => true, @@ -246,6 +253,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -267,7 +275,7 @@ public function run(): void [ 'name' => 'Bot', 'slug' => 'bot', - 'position' => 20, + 'position' => 22, 'color' => '#f1c40f', 'icon' => 'fab fa-android', 'effect' => 'none', @@ -276,6 +284,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -297,7 +306,7 @@ public function run(): void [ 'name' => 'Owner', 'slug' => 'owner', - 'position' => 19, + 'position' => 21, 'color' => '#00abff', 'icon' => config('other.font-awesome').' fa-user-secret', 'effect' => 'none', @@ -306,6 +315,7 @@ public function run(): void 'is_owner' => true, 'is_admin' => true, 'is_modo' => true, + 'is_torrent_modo' => true, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -336,6 +346,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -366,6 +377,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -396,6 +408,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -426,6 +439,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -456,6 +470,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -486,6 +501,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -516,6 +532,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -546,6 +563,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -576,6 +594,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => true, 'is_uploader' => false, @@ -606,6 +625,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -636,6 +656,7 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => false, 'is_internal' => false, 'is_uploader' => false, @@ -666,13 +687,14 @@ public function run(): void 'is_owner' => false, 'is_admin' => false, 'is_modo' => false, + 'is_torrent_modo' => false, 'is_editor' => true, 'is_internal' => false, 'is_uploader' => false, 'is_trusted' => true, 'is_freeleech' => true, 'is_immune' => true, - 'can_upload' => false, + 'can_upload' => true, 'can_chat' => true, 'can_comment' => true, 'can_invite' => true, @@ -684,6 +706,66 @@ public function run(): void 'min_ratio' => null, 'min_age' => null, ], - ], ['slug'], []); + [ + 'name' => 'Torrent Moderator', + 'slug' => 'torrent-moderator', + 'position' => 18, + 'color' => '#15B097', + 'icon' => config('other.font-awesome').' fa-badge-check', + 'effect' => 'none', + 'autogroup' => false, + 'system_required' => false, + 'is_owner' => false, + 'is_admin' => false, + 'is_modo' => false, + 'is_torrent_modo' => true, + 'is_editor' => true, + 'is_internal' => false, + 'is_uploader' => false, + 'is_trusted' => true, + 'is_freeleech' => true, + 'is_immune' => true, + 'can_upload' => true, + 'can_chat' => true, + 'can_comment' => true, + 'can_invite' => true, + 'can_request' => true, + 'level' => 0, + 'min_uploaded' => null, + 'min_seedsize' => null, + 'min_avg_seedtime' => null, + 'min_ratio' => null, + 'min_age' => null, + ] + ], ['slug'], [ + 'name', + 'position', + 'color', + 'icon', + 'effect', + 'autogroup', + 'system_required', + 'is_owner', + 'is_admin', + 'is_modo', + 'is_torrent_modo', + 'is_editor', + 'is_internal', + 'is_uploader', + 'is_trusted', + 'is_freeleech', + 'is_immune', + 'can_chat', + 'can_comment', + 'can_invite', + 'can_request', + 'can_upload', + 'level', + 'min_uploaded', + 'min_seedsize', + 'min_avg_seedtime', + 'min_ratio', + 'min_age' + ]); } } diff --git a/database/seeders/OccupationSeeder.php b/database/seeders/OccupationSeeder.php index a5833fff2d..382f16638b 100644 --- a/database/seeders/OccupationSeeder.php +++ b/database/seeders/OccupationSeeder.php @@ -74,6 +74,9 @@ public function run(): void 'position' => 10, 'name' => 'Actor', ], - ], ['id'], []); + ], ['id'], [ + 'position', + 'name', + ]); } } diff --git a/lang/en/user.php b/lang/en/user.php index 8939f45c0f..61832a2a17 100644 --- a/lang/en/user.php +++ b/lang/en/user.php @@ -189,6 +189,7 @@ 'my-general-settings' => 'My General Settings', 'my-notification' => 'My Notification', 'my-notification-settings' => 'My Notification Settings', + 'my-playlists' => 'My Playlists', 'my-privacy' => 'My Privacy', 'my-privacy-settings' => 'My Privacy Settings', 'my-profile' => 'My Profile', diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 2995a1601e..789260b5ac 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -535,11 +535,6 @@ parameters: count: 1 path: app/Http/Resources/UserResource.php - - - message: "#^Method App\\\\Http\\\\Resources\\\\UserResource\\:\\:toArray\\(\\) return type with generic interface Illuminate\\\\Contracts\\\\Support\\\\Arrayable does not specify its types\\: TKey, TValue$#" - count: 1 - path: app/Http/Resources/UserResource.php - - message: "#^Strict comparison using \\=\\=\\= between float\\|null and 0 will always evaluate to false\\.$#" count: 1 @@ -655,6 +650,16 @@ parameters: count: 1 path: database/migrations/2023_07_29_205035_add_torrent_folder_name.php + - + message: "#^Access to an undefined property object\\:\\:\\$id\\.$#" + count: 1 + path: database/migrations/2024_01_15_151522_update_groups_table.php + + - + message: "#^Access to an undefined property object\\:\\:\\$id\\.$#" + count: 1 + path: database/migrations/2024_11_26_170256_add_is_torrent_modo_to_groups_table.php + - message: "#^Parameter \\#1 \\$root of static method Illuminate\\\\Support\\\\Facades\\\\URL\\:\\:forceRootUrl\\(\\) expects string\\|null, true given\\.$#" count: 1 diff --git a/resources/js/app.js b/resources/js/app.js index 7b47b71a13..22256b98df 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -32,12 +32,6 @@ if (token) { import Swal from 'sweetalert2'; window.Swal = Swal; -// ChartJS -import { Chart, registerables } from 'chart.js'; -import 'chartjs-adapter-date-fns'; -Chart.register(...registerables); -window.Chart = Chart; - // Vite Import import.meta.glob(['/public/img/pipes/**', '/resources/sass/vendor/webfonts/font-awesome/**']); diff --git a/resources/js/vendor/chart.js b/resources/js/vendor/chart.js new file mode 100644 index 0000000000..19cbc96189 --- /dev/null +++ b/resources/js/vendor/chart.js @@ -0,0 +1,5 @@ +// ChartJS +import { Chart, registerables } from 'chart.js'; +import 'chartjs-adapter-date-fns'; +Chart.register(...registerables); +window.Chart = Chart; diff --git a/resources/sass/pages/_top10.scss b/resources/sass/pages/_top10.scss index eda7b11efc..138f5db4c2 100644 --- a/resources/sass/pages/_top10.scss +++ b/resources/sass/pages/_top10.scss @@ -1,3 +1,22 @@ +.top10--weekly { + margin: 0 calc(-1 * max(0px, 10vw - 60px)); /* Inverses the magic numbers used in the main layout styles */ + width: max-content; + max-width: 100vw; + align-self: center; +} + +@media only screen and (min-width: 1600px) { + .top10--weekly { + margin: 0 calc(-1 * max(0px, 25vw - 300px)); /* Inverses the magic numbers used in the main layout styles */ + } +} + +@media only screen and (min-width: 2500px) { + .top10--weekly { + margin: 0 calc(-1 * max(0px, 45vw - 800px)); /* Inverses the magic numbers used in the main layout styles */ + } +} + .top10-poster { display: grid; grid-template-rows: auto 1fr; @@ -24,3 +43,21 @@ font-size: 11px; text-align: center; } + +.top10-weekly__row { + display: grid; + grid-template-columns: repeat(10, minmax(120px, 1fr)); + gap: 0.75rem; + + .torrent-search--poster__caption { + margin: 2px; + } + + .torrent-search--poster__title { + font-size: 12px; + } + + .torrent-search--poster__release-date { + font-size: 12px; + } +} diff --git a/resources/views/Staff/dashboard/index.blade.php b/resources/views/Staff/dashboard/index.blade.php index 524c9ed19f..cb1cadb3d2 100644 --- a/resources/views/Staff/dashboard/index.blade.php +++ b/resources/views/Staff/dashboard/index.blade.php @@ -350,6 +350,15 @@ class="form__button form__button--text" Trumps

+

+ + + Unregistered Info Hashes + +

5 minutes
-
{{ $avg['5-minute'] }}
+
{{ $avg['5-minute'] ?? 'N/A' }}
15 minutes
-
{{ $avg['15-minute'] }}
+
{{ $avg['15-minute'] ?? 'N/A' }}
diff --git a/resources/views/Staff/donation/index.blade.php b/resources/views/Staff/donation/index.blade.php index 3d816b8c2f..79dd922381 100644 --- a/resources/views/Staff/donation/index.blade.php +++ b/resources/views/Staff/donation/index.blade.php @@ -52,13 +52,34 @@ {{ $donation->transaction }} - $ {{ $donation->package->cost }} - + + $ {{ $donation->package->cost }} + + {{ App\Helpers\StringHelper::formatBytes($donation->package->upload_value ?? 0) }} - {{ $donation->package->invite_value ?? 0 }} - {{ $donation->package->bonus_value ?? 0 }} - + + {{ $donation->package->invite_value ?? 0 }} + + + {{ $donation->package->bonus_value ?? 0 }} + + @if ($donation->package->donor_value === null) Lifetime @else @@ -124,6 +145,7 @@ class="form__button form__button--filled" @endsection @section('scripts') + @vite('resources/js/vendor/chart.js')