Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,11 @@ jobs:
strategy:
fail-fast: false
matrix:
php: [8.1, 8.2, 8.3, 8.4]
statamic: [4.*, 5.*]
exclude:
- statamic: 4.*
php: 8.4
php: [8.2, 8.3, 8.4]
statamic: [5.*]
include:
- statamic: 4.*
testbench: ^7.0
- statamic: 5.*
testbench: ^8.0
testbench: ^9.0

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

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
/vendor
mix-manifest.json
node_modules
.phpunit.cache
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"ext-json": "*",
"php": "^7.4|^8.0",
"spatie/simple-excel": "^1.0|^2.0|^3.0",
"statamic/cms": "^4.10|^5.0"
"statamic/cms": "^4.10|^5.0",
"doctrine/dbal": "^4.2"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.10",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Rias\StatamicRedirect\Data\Error;

class IncreaseRedirectErrorTableUrlLength extends Migration
{
public function up(): void
{
Schema::table('errors', function (Blueprint $table): void {
$table->dropIndex('errors_url_index');
});

Schema::table('errors', function (Blueprint $table): void {
$table->string('url', 2048)->change();
$table->string('url_md5')->index()->after('url');
});

Error::each(function (Error $error) {
$error->update(['url_md5' => md5($error->url)]);
});
}

public function down(): void
{
Schema::table('errors', function (Blueprint $table): void {
$table->dropColumn('url_md5');
$table->string('url')->index()->change();
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Rias\StatamicRedirect\Eloquent\Redirects\RedirectModel;

class IncreaseRedirectRedirectsTableUrlLength extends Migration
{
public function up(): void
{
Schema::table('redirects', function (Blueprint $table): void {
$table->dropIndex('redirects_source_index');
});

Schema::table('redirects', function (Blueprint $table): void {
$table->string('source', 2048)->change();
$table->string('source_md5')->index()->after('source');
$table->string('destination', 2048)->change();
});

RedirectModel::each(function (RedirectModel $redirect) {
$redirect->update(['source_md5' => md5($redirect->source)]);
});
}

public function down(): void
{
Schema::table('redirects', function (Blueprint $table): void {
$table->dropColumn('source_md5');
$table->string('source')->index()->change();
$table->string('destination')->change();
});
}
}
5 changes: 4 additions & 1 deletion src/Data/Error.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public function getConnectionName()

protected static function booted()
{
self::saving(function ($model) {
$model->url_md5 = md5($model->url);
});
self::deleting(function ($error) {
$error->hits()->delete();
});
Expand Down Expand Up @@ -70,6 +73,6 @@ public function addHit(int $timestamp, array $data = []): ?Hit

public static function findByUrl(string $url): ?self
{
return self::where('url', $url)->first();
return self::where('url_md5', md5($url))->where('url', $url)->first();
}
}
8 changes: 8 additions & 0 deletions src/Data/Redirect.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ class Redirect implements Localization, RedirectContract
/** @var string */
protected $source;

/** @var string */
protected $source_md5;

/** @var string */
protected $destination;

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

public function source_md5($source_md5 = null)
{
return $this->fluentlyGetOrSet('source_md5')->args(func_get_args());
}

public function destination($destination = null)
{
return $this->fluentlyGetOrSet('destination')->args(func_get_args());
Expand Down
40 changes: 25 additions & 15 deletions src/RedirectServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
use Rias\StatamicRedirect\UpdateScripts\AddDescriptionColumnToRedirectsTable;
use Rias\StatamicRedirect\UpdateScripts\AddHitsCount;
use Rias\StatamicRedirect\UpdateScripts\ClearErrors;
use Rias\StatamicRedirect\UpdateScripts\IncreaseUrlSizeOnErrors;
use Rias\StatamicRedirect\UpdateScripts\IncreaseUrlSizeOnRedirects;
use Rias\StatamicRedirect\UpdateScripts\MoveRedirectsToDefaultSite;
use Rias\StatamicRedirect\UpdateScripts\RenameLocaleToSiteOnRedirectsTable;
use Rias\StatamicRedirect\Widgets\ErrorsLastDayWidget;
Expand All @@ -45,14 +47,16 @@ class RedirectServiceProvider extends AddonServiceProvider
MoveRedirectsToDefaultSite::class,
RenameLocaleToSiteOnRedirectsTable::class,
AddDescriptionColumnToRedirectsTable::class,
IncreaseUrlSizeOnRedirects::class,
IncreaseUrlSizeOnErrors::class,
];

protected $scripts = [
__DIR__.'/../resources/dist/js/cp.js',
__DIR__ . '/../resources/dist/js/cp.js',
];

protected $routes = [
'cp' => __DIR__.'/../routes/cp.php',
'cp' => __DIR__ . '/../routes/cp.php',
];

protected $listen = [
Expand Down Expand Up @@ -112,17 +116,19 @@ public function boot()
->bootPermissions();
});

if (! $this->app->runningInConsole()) {
if (!$this->app->runningInConsole()) {
return;
}

$this->publishes([
__DIR__ . '/../database/migrations/create_redirect_error_tables.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_redirect_error_tables.php'),
__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'),
], 'statamic-redirect-error-migrations');

$this->publishes([
__DIR__ . '/../database/migrations/create_redirect_redirects_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_redirect_redirects_table.php'),
__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'),
__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'),
__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'),
], 'statamic-redirect-redirect-migrations');
}

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

protected function bootAddonViews()
{
$this->loadViewsFrom(__DIR__.'/../resources/views', 'redirect');
$this->loadViewsFrom(__DIR__ . '/../resources/views', 'redirect');

return $this;
}
Expand All @@ -160,8 +166,8 @@ protected function bootAddonNav()
$nav->tools('Redirect')
->route(
config('statamic.redirect.log_errors')
? 'redirect.index'
: 'redirect.redirects.index'
? 'redirect.index'
: 'redirect.redirects.index'
)
->icon('git')
->active('redirect')
Expand All @@ -183,7 +189,7 @@ protected function bootStores()

protected function bootDatabase()
{
if (! config('statamic.redirect.log_errors')) {
if (!config('statamic.redirect.log_errors')) {
return $this;
}

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

if (! file_exists($sqlitePath) && file_exists($oldSqlitePath)) {
if (!file_exists($sqlitePath) && file_exists($oldSqlitePath)) {
File::move($oldSqlitePath, $sqlitePath);

return;
}

if (! file_exists($sqlitePath)) {
if (!file_exists($sqlitePath)) {
File::put($sqlitePath, '');

$gitIgnorePath = storage_path('redirect/.gitignore');
if (! file_exists($gitIgnorePath)) {
if (!file_exists($gitIgnorePath)) {
File::put($gitIgnorePath, "*\n!.gitignore");
}
}
Expand All @@ -227,7 +233,7 @@ protected function bootDatabaseForErrors()
{
if (
config('statamic.redirect.error_connection', 'redirect-sqlite') !== 'redirect-sqlite' &&
! $this->generalConnectionIsBuiltinSqlite()
!$this->generalConnectionIsBuiltinSqlite()
) {
return;
}
Expand All @@ -240,14 +246,16 @@ protected function bootDatabaseForErrors()
DB::setDefaultConnection('redirect-sqlite');
require_once(__DIR__ . '/../database/migrations/create_redirect_error_tables.php.stub');
(new \CreateRedirectErrorTables())->up();
require_once(__DIR__ . '/../database/migrations/increase_redirect_error_table_url_length.php.stub');
(new \IncreaseRedirectErrorTableUrlLength())->up();
DB::setDefaultConnection($defaultConnection);
}

protected function bootDatabaseForRedirects()
{
if (
config('statamic.redirect.redirect_connection', 'stache') !== 'redirect-sqlite' &&
! $this->generalConnectionIsBuiltinSqlite()
!$this->generalConnectionIsBuiltinSqlite()
) {
return;
}
Expand All @@ -263,6 +271,8 @@ protected function bootDatabaseForRedirects()
(new \CreateRedirectRedirectsTable())->up();
require_once(__DIR__ . '/../database/migrations/add_description_to_redirect_redirects_table.php.stub');
(new \AddDescriptionToRedirectRedirectsTable())->up();
require_once(__DIR__ . '/../database/migrations/increase_redirect_redirects_table_url_length.php.stub');
(new \IncreaseRedirectRedirectsTableUrlLength())->up();

DB::setDefaultConnection($defaultConnection);
}
Expand All @@ -282,10 +292,10 @@ protected function generalConnectionIsBuiltinSqlite()

protected function registerAddonConfig()
{
$this->mergeConfigFrom(__DIR__.'/../config/redirect.php', 'statamic.redirect');
$this->mergeConfigFrom(__DIR__ . '/../config/redirect.php', 'statamic.redirect');

$this->publishes([
__DIR__.'/../config/redirect.php' => config_path('statamic/redirect.php'),
__DIR__ . '/../config/redirect.php' => config_path('statamic/redirect.php'),
], 'statamic-redirect-config');

return $this;
Expand Down
24 changes: 20 additions & 4 deletions src/Stache/Redirects/RedirectRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,25 @@ public function findByUrl(string $siteHandle, string $url): ?Redirect
->where('locale', $siteHandle)
->where(function (RedirectQueryBuilder $query) use ($url) {
$query
->orWhere('source', $url)
->orWhere('source', str($url)->start('/'))
->orWhere('source', str($url)->finish('/'))
->orWhere('source', str($url)->start('/')->finish('/'));
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
$query->where('source_md5', md5($url))
->where('source', $url);
})
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
$source = str($url)->start('/');
$query->where('source_md5', md5($source))
->where('source', $source);
})
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
$source = str($url)->finish('/');
$query->where('source_md5', md5($source))
->where('source', $source);
})
->orWhere(function (RedirectQueryBuilder $query) use ($url) {
$source = str($url)->start('/')->finish('/');
$query->where('source_md5', md5($source))
->where('source', $source);
});
})
->where('matchType', MatchTypeEnum::EXACT)
->orderBy('order')
Expand Down Expand Up @@ -86,6 +101,7 @@ public function save($redirect)
if (! $redirect->id()) {
$redirect->id(StacheFacade::generateId());
}
$redirect->source_md5(md5($redirect->source()));

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

Expand Down
13 changes: 13 additions & 0 deletions src/UpdateScripts/AddDescriptionColumnToRedirectsTable.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Rias\StatamicRedirect\UpdateScripts;

use Illuminate\Database\QueryException;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schema;
use Statamic\UpdateScripts\UpdateScript;
Expand Down Expand Up @@ -31,6 +32,18 @@ public function shouldUpdate($newVersion, $oldVersion)

public function update()
{
$connection = config('statamic.redirect.redirect_connection');

if ($connection === 'redirect-sqlite') {
Schema::connection($connection)->table('redirects', function (Blueprint $table): void {
$table->text('description')->nullable()->after('enabled');
});

$this->console()->info('Added description field to the redirects table!');

return;
}

Artisan::call('vendor:publish', [
'--tag' => 'statamic-redirect-redirect-migrations',
]);
Expand Down
Loading