Skip to content

Commit 2e9d342

Browse files
Boefjimriasvdv
andauthored
Support URLs up to 2048 characters (#207)
* feat: increase max url length to 2048 * fix: ensure correct migration order * fix: require `doctrine/dbal` package * Add upgrade scripts * Try different dbal version * Only 4.2 * Newer testbench version, drop Statamic v4 * Drop 8.1 --------- Co-authored-by: Rias <hey@rias.be>
1 parent 79556db commit 2e9d342

13 files changed

+274
-29
lines changed

.github/workflows/run-tests.yml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,11 @@ jobs:
1010
strategy:
1111
fail-fast: false
1212
matrix:
13-
php: [8.1, 8.2, 8.3, 8.4]
14-
statamic: [4.*, 5.*]
15-
exclude:
16-
- statamic: 4.*
17-
php: 8.4
13+
php: [8.2, 8.3, 8.4]
14+
statamic: [5.*]
1815
include:
19-
- statamic: 4.*
20-
testbench: ^7.0
2116
- statamic: 5.*
22-
testbench: ^8.0
17+
testbench: ^9.0
2318

2419
name: PHP ${{ matrix.php }} - Statamic ${{ matrix.statamic }}
2520

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
/vendor
1010
mix-manifest.json
1111
node_modules
12+
.phpunit.cache

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"ext-json": "*",
55
"php": "^7.4|^8.0",
66
"spatie/simple-excel": "^1.0|^2.0|^3.0",
7-
"statamic/cms": "^4.10|^5.0"
7+
"statamic/cms": "^4.10|^5.0",
8+
"doctrine/dbal": "^4.2"
89
},
910
"require-dev": {
1011
"friendsofphp/php-cs-fixer": "^3.10",
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
use Rias\StatamicRedirect\Data\Error;
7+
8+
class IncreaseRedirectErrorTableUrlLength extends Migration
9+
{
10+
public function up(): void
11+
{
12+
Schema::table('errors', function (Blueprint $table): void {
13+
$table->dropIndex('errors_url_index');
14+
});
15+
16+
Schema::table('errors', function (Blueprint $table): void {
17+
$table->string('url', 2048)->change();
18+
$table->string('url_md5')->index()->after('url');
19+
});
20+
21+
Error::each(function (Error $error) {
22+
$error->update(['url_md5' => md5($error->url)]);
23+
});
24+
}
25+
26+
public function down(): void
27+
{
28+
Schema::table('errors', function (Blueprint $table): void {
29+
$table->dropColumn('url_md5');
30+
$table->string('url')->index()->change();
31+
});
32+
}
33+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
use Rias\StatamicRedirect\Eloquent\Redirects\RedirectModel;
7+
8+
class IncreaseRedirectRedirectsTableUrlLength extends Migration
9+
{
10+
public function up(): void
11+
{
12+
Schema::table('redirects', function (Blueprint $table): void {
13+
$table->dropIndex('redirects_source_index');
14+
});
15+
16+
Schema::table('redirects', function (Blueprint $table): void {
17+
$table->string('source', 2048)->change();
18+
$table->string('source_md5')->index()->after('source');
19+
$table->string('destination', 2048)->change();
20+
});
21+
22+
RedirectModel::each(function (RedirectModel $redirect) {
23+
$redirect->update(['source_md5' => md5($redirect->source)]);
24+
});
25+
}
26+
27+
public function down(): void
28+
{
29+
Schema::table('redirects', function (Blueprint $table): void {
30+
$table->dropColumn('source_md5');
31+
$table->string('source')->index()->change();
32+
$table->string('destination')->change();
33+
});
34+
}
35+
}

src/Data/Error.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public function getConnectionName()
3737

3838
protected static function booted()
3939
{
40+
self::saving(function ($model) {
41+
$model->url_md5 = md5($model->url);
42+
});
4043
self::deleting(function ($error) {
4144
$error->hits()->delete();
4245
});
@@ -70,6 +73,6 @@ public function addHit(int $timestamp, array $data = []): ?Hit
7073

7174
public static function findByUrl(string $url): ?self
7275
{
73-
return self::where('url', $url)->first();
76+
return self::where('url_md5', md5($url))->where('url', $url)->first();
7477
}
7578
}

src/Data/Redirect.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class Redirect implements Localization, RedirectContract
2929
/** @var string */
3030
protected $source;
3131

32+
/** @var string */
33+
protected $source_md5;
34+
3235
/** @var string */
3336
protected $destination;
3437

@@ -62,6 +65,11 @@ public function source($source = null)
6265
return $this->fluentlyGetOrSet('source')->args(func_get_args());
6366
}
6467

68+
public function source_md5($source_md5 = null)
69+
{
70+
return $this->fluentlyGetOrSet('source_md5')->args(func_get_args());
71+
}
72+
6573
public function destination($destination = null)
6674
{
6775
return $this->fluentlyGetOrSet('destination')->args(func_get_args());

src/RedirectServiceProvider.php

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
use Rias\StatamicRedirect\UpdateScripts\AddDescriptionColumnToRedirectsTable;
2323
use Rias\StatamicRedirect\UpdateScripts\AddHitsCount;
2424
use Rias\StatamicRedirect\UpdateScripts\ClearErrors;
25+
use Rias\StatamicRedirect\UpdateScripts\IncreaseUrlSizeOnErrors;
26+
use Rias\StatamicRedirect\UpdateScripts\IncreaseUrlSizeOnRedirects;
2527
use Rias\StatamicRedirect\UpdateScripts\MoveRedirectsToDefaultSite;
2628
use Rias\StatamicRedirect\UpdateScripts\RenameLocaleToSiteOnRedirectsTable;
2729
use Rias\StatamicRedirect\Widgets\ErrorsLastDayWidget;
@@ -45,14 +47,16 @@ class RedirectServiceProvider extends AddonServiceProvider
4547
MoveRedirectsToDefaultSite::class,
4648
RenameLocaleToSiteOnRedirectsTable::class,
4749
AddDescriptionColumnToRedirectsTable::class,
50+
IncreaseUrlSizeOnRedirects::class,
51+
IncreaseUrlSizeOnErrors::class,
4852
];
4953

5054
protected $scripts = [
51-
__DIR__.'/../resources/dist/js/cp.js',
55+
__DIR__ . '/../resources/dist/js/cp.js',
5256
];
5357

5458
protected $routes = [
55-
'cp' => __DIR__.'/../routes/cp.php',
59+
'cp' => __DIR__ . '/../routes/cp.php',
5660
];
5761

5862
protected $listen = [
@@ -112,17 +116,19 @@ public function boot()
112116
->bootPermissions();
113117
});
114118

115-
if (! $this->app->runningInConsole()) {
119+
if (!$this->app->runningInConsole()) {
116120
return;
117121
}
118122

119123
$this->publishes([
120124
__DIR__ . '/../database/migrations/create_redirect_error_tables.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_redirect_error_tables.php'),
125+
__DIR__ . '/../database/migrations/increase_redirect_error_table_url_length.php.stub' => database_path('migrations/' . date('Y_m_d_His', time() + 1) . '_increase_redirect_error_table_url_length.php'),
121126
], 'statamic-redirect-error-migrations');
122127

123128
$this->publishes([
124129
__DIR__ . '/../database/migrations/create_redirect_redirects_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_redirect_redirects_table.php'),
125-
__DIR__ . '/../database/migrations/add_description_to_redirect_redirects_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_add_description_to_redirect_redirects_table.php'),
130+
__DIR__ . '/../database/migrations/add_description_to_redirect_redirects_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time() + 1) . '_add_description_to_redirect_redirects_table.php'),
131+
__DIR__ . '/../database/migrations/increase_redirect_redirects_table_url_length.php.stub' => database_path('migrations/' . date('Y_m_d_His', time() + 2) . '_increase_redirect_redirects_table_url_length.php'),
126132
], 'statamic-redirect-redirect-migrations');
127133
}
128134

@@ -141,7 +147,7 @@ protected function getRedirectRepository()
141147

142148
protected function bootAddonViews()
143149
{
144-
$this->loadViewsFrom(__DIR__.'/../resources/views', 'redirect');
150+
$this->loadViewsFrom(__DIR__ . '/../resources/views', 'redirect');
145151

146152
return $this;
147153
}
@@ -160,8 +166,8 @@ protected function bootAddonNav()
160166
$nav->tools('Redirect')
161167
->route(
162168
config('statamic.redirect.log_errors')
163-
? 'redirect.index'
164-
: 'redirect.redirects.index'
169+
? 'redirect.index'
170+
: 'redirect.redirects.index'
165171
)
166172
->icon('git')
167173
->active('redirect')
@@ -183,7 +189,7 @@ protected function bootStores()
183189

184190
protected function bootDatabase()
185191
{
186-
if (! config('statamic.redirect.log_errors')) {
192+
if (!config('statamic.redirect.log_errors')) {
187193
return $this;
188194
}
189195

@@ -207,17 +213,17 @@ protected function ensureDatabaseExists($sqlitePath)
207213
{
208214
$oldSqlitePath = storage_path('redirect/errors.sqlite');
209215

210-
if (! file_exists($sqlitePath) && file_exists($oldSqlitePath)) {
216+
if (!file_exists($sqlitePath) && file_exists($oldSqlitePath)) {
211217
File::move($oldSqlitePath, $sqlitePath);
212218

213219
return;
214220
}
215221

216-
if (! file_exists($sqlitePath)) {
222+
if (!file_exists($sqlitePath)) {
217223
File::put($sqlitePath, '');
218224

219225
$gitIgnorePath = storage_path('redirect/.gitignore');
220-
if (! file_exists($gitIgnorePath)) {
226+
if (!file_exists($gitIgnorePath)) {
221227
File::put($gitIgnorePath, "*\n!.gitignore");
222228
}
223229
}
@@ -227,7 +233,7 @@ protected function bootDatabaseForErrors()
227233
{
228234
if (
229235
config('statamic.redirect.error_connection', 'redirect-sqlite') !== 'redirect-sqlite' &&
230-
! $this->generalConnectionIsBuiltinSqlite()
236+
!$this->generalConnectionIsBuiltinSqlite()
231237
) {
232238
return;
233239
}
@@ -240,14 +246,16 @@ protected function bootDatabaseForErrors()
240246
DB::setDefaultConnection('redirect-sqlite');
241247
require_once(__DIR__ . '/../database/migrations/create_redirect_error_tables.php.stub');
242248
(new \CreateRedirectErrorTables())->up();
249+
require_once(__DIR__ . '/../database/migrations/increase_redirect_error_table_url_length.php.stub');
250+
(new \IncreaseRedirectErrorTableUrlLength())->up();
243251
DB::setDefaultConnection($defaultConnection);
244252
}
245253

246254
protected function bootDatabaseForRedirects()
247255
{
248256
if (
249257
config('statamic.redirect.redirect_connection', 'stache') !== 'redirect-sqlite' &&
250-
! $this->generalConnectionIsBuiltinSqlite()
258+
!$this->generalConnectionIsBuiltinSqlite()
251259
) {
252260
return;
253261
}
@@ -263,6 +271,8 @@ protected function bootDatabaseForRedirects()
263271
(new \CreateRedirectRedirectsTable())->up();
264272
require_once(__DIR__ . '/../database/migrations/add_description_to_redirect_redirects_table.php.stub');
265273
(new \AddDescriptionToRedirectRedirectsTable())->up();
274+
require_once(__DIR__ . '/../database/migrations/increase_redirect_redirects_table_url_length.php.stub');
275+
(new \IncreaseRedirectRedirectsTableUrlLength())->up();
266276

267277
DB::setDefaultConnection($defaultConnection);
268278
}
@@ -282,10 +292,10 @@ protected function generalConnectionIsBuiltinSqlite()
282292

283293
protected function registerAddonConfig()
284294
{
285-
$this->mergeConfigFrom(__DIR__.'/../config/redirect.php', 'statamic.redirect');
295+
$this->mergeConfigFrom(__DIR__ . '/../config/redirect.php', 'statamic.redirect');
286296

287297
$this->publishes([
288-
__DIR__.'/../config/redirect.php' => config_path('statamic/redirect.php'),
298+
__DIR__ . '/../config/redirect.php' => config_path('statamic/redirect.php'),
289299
], 'statamic-redirect-config');
290300

291301
return $this;

src/Stache/Redirects/RedirectRepository.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,25 @@ public function findByUrl(string $siteHandle, string $url): ?Redirect
4242
->where('locale', $siteHandle)
4343
->where(function (RedirectQueryBuilder $query) use ($url) {
4444
$query
45-
->orWhere('source', $url)
46-
->orWhere('source', str($url)->start('/'))
47-
->orWhere('source', str($url)->finish('/'))
48-
->orWhere('source', str($url)->start('/')->finish('/'));
45+
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
46+
$query->where('source_md5', md5($url))
47+
->where('source', $url);
48+
})
49+
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
50+
$source = str($url)->start('/');
51+
$query->where('source_md5', md5($source))
52+
->where('source', $source);
53+
})
54+
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
55+
$source = str($url)->finish('/');
56+
$query->where('source_md5', md5($source))
57+
->where('source', $source);
58+
})
59+
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
60+
$source = str($url)->start('/')->finish('/');
61+
$query->where('source_md5', md5($source))
62+
->where('source', $source);
63+
});
4964
})
5065
->where('matchType', MatchTypeEnum::EXACT)
5166
->orderBy('order')
@@ -86,6 +101,7 @@ public function save($redirect)
86101
if (! $redirect->id()) {
87102
$redirect->id(StacheFacade::generateId());
88103
}
104+
$redirect->source_md5(md5($redirect->source()));
89105

90106
StacheFacade::store('redirects')->save($redirect);
91107

src/UpdateScripts/AddDescriptionColumnToRedirectsTable.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Rias\StatamicRedirect\UpdateScripts;
44

55
use Illuminate\Database\QueryException;
6+
use Illuminate\Database\Schema\Blueprint;
67
use Illuminate\Support\Facades\Artisan;
78
use Illuminate\Support\Facades\Schema;
89
use Statamic\UpdateScripts\UpdateScript;
@@ -31,6 +32,18 @@ public function shouldUpdate($newVersion, $oldVersion)
3132

3233
public function update()
3334
{
35+
$connection = config('statamic.redirect.redirect_connection');
36+
37+
if ($connection === 'redirect-sqlite') {
38+
Schema::connection($connection)->table('redirects', function (Blueprint $table): void {
39+
$table->text('description')->nullable()->after('enabled');
40+
});
41+
42+
$this->console()->info('Added description field to the redirects table!');
43+
44+
return;
45+
}
46+
3447
Artisan::call('vendor:publish', [
3548
'--tag' => 'statamic-redirect-redirect-migrations',
3649
]);

0 commit comments

Comments
 (0)