diff --git a/app/Http/Controllers/WikiController.php b/app/Http/Controllers/WikiController.php index b5731bbc..3e881792 100644 --- a/app/Http/Controllers/WikiController.php +++ b/app/Http/Controllers/WikiController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Enums\WikiSuspensionReason; use App\Helper\DomainHelper; use App\Helper\DomainValidator; use App\Helper\ProfileValidator; @@ -18,6 +19,8 @@ use App\WikiManager; use App\WikiProfile; use App\WikiSetting; +use App\WikiSuspension; +use Carbon\CarbonImmutable; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -107,6 +110,14 @@ public function create(Request $request): Response { 'domain' => $submittedDomain, ]); + $suspension = new WikiSuspension(); + $suspension->wiki_id = $wiki->id; + $suspension->active_from = CarbonImmutable::now()->addDays( + Config::get('wbstack.automatic_expiry_suspension_days') + ); + $suspension->reason = WikiSuspensionReason::AUTOMATIC_EXPIRY; + $suspension->save(); + // Assign storage $dbAssignment = DB::table('wiki_dbs')->where($wikiDbCondition)->limit(1)->update(['wiki_id' => $wiki->id]); if (!$dbAssignment) { diff --git a/config/wbstack.php b/config/wbstack.php index 76f4a2bb..11f0f223 100644 --- a/config/wbstack.php +++ b/config/wbstack.php @@ -35,4 +35,8 @@ 'transferbot_image_repo' => env('WBSTACK_TRANSFERBOT_IMAGE_REPO', 'ghcr.io/wbstack/transferbot'), 'transferbot_image_version' => env('WBSTACK_TRANSFERBOT_IMAGE_VERSION', '1.1.0'), + + 'automatic_expiry_suspension_days' => intval( + env('WBSTACK_AUTOMATIC_EXPIRY_SUSPENSION_DAYS', '91') + ), ]; diff --git a/tests/Routes/Wiki/CreateTest.php b/tests/Routes/Wiki/CreateTest.php index 4711b154..119b2758 100644 --- a/tests/Routes/Wiki/CreateTest.php +++ b/tests/Routes/Wiki/CreateTest.php @@ -2,6 +2,7 @@ namespace Tests\Routes\Wiki\Managers; +use App\Enums\WikiSuspensionReason; use App\Jobs\ElasticSearchAliasInit; use App\Jobs\MediawikiInit; use App\Jobs\ProvisionWikiDbJob; @@ -9,10 +10,13 @@ use App\QueryserviceNamespace; use App\User; use App\Wiki; +use App\WikiDb; use App\WikiManager; use App\WikiProfile; use App\WikiSetting; +use App\WikiSuspension; use Carbon\Carbon; +use Carbon\CarbonImmutable; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Queue; @@ -36,6 +40,37 @@ class CreateTest extends TestCase { use DatabaseTransactions; use OptionsRequestAllowed; + public function testCreateSchedulesAutomaticExpirySuspension(): void { + Queue::fake(); + + $user = User::factory()->create(['verified' => true]); + + $now = CarbonImmutable::parse('2026-06-01 12:00'); + $this->travelTo($now); + + WikiDb::factory()->create([ + 'wiki_id' => null, + 'version' => config('wbstack.wiki_db_use_version'), + ]); + QueryserviceNamespace::create([ + 'namespace' => 'automatic-expiry-test', + 'backend' => 'wdqs.svc', + ]); + + $response = $this->actingAs($user, 'api')->postJson($this->route, [ + 'domain' => 'automatic-expiry-test.wikibase.cloud', + 'sitename' => 'Automatic Expiry Test', + 'username' => 'Admin', + ]); + + $response->assertOk()->assertJsonPath('success', true); + $suspension = WikiSuspension::where('wiki_id', $response->json('data.id'))->sole(); + $this->assertSame(WikiSuspensionReason::AUTOMATIC_EXPIRY, $suspension->reason); + $this->assertTrue($suspension->active_from->equalTo('2026-08-31 12:00')); + $this->assertNull($suspension->actor_user_id); + $this->assertNull($suspension->review_submission_action_id); + } + /** * @dataProvider createDispatchesSomeJobsProvider */