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
+
+
1 minute
- {{ $avg['1-minute'] }}
+ {{ $avg['1-minute'] ?? 'N/A' }}
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')
|