Skip to content

Commit 8857ef6

Browse files
authored
Make API Endpoint to set the ReadOnly status of a Wiki (#1009)
Bug: T410395
1 parent 721496d commit 8857ef6

4 files changed

Lines changed: 128 additions & 0 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Backend;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Wiki;
7+
use Illuminate\Http\Request;
8+
9+
class WikiReadOnlyController extends Controller {
10+
public function setWikiReadOnly(Request $request) {
11+
12+
$validated = $request->validate([
13+
'domain' => 'required|string',
14+
'readOnly' => 'required|boolean',
15+
]);
16+
17+
$domain = $validated['domain'];
18+
$readOnly = $validated['readOnly'];
19+
20+
$wiki = Wiki::where('domain', $domain)->first();
21+
if (!$wiki) {
22+
return response()->json([
23+
'error' => "Wiki not found for domain '$domain'",
24+
], 404);
25+
}
26+
27+
if ($readOnly) {
28+
$wiki->setSetting('wgReadOnly', 'This wiki is currently read-only.');
29+
30+
return response()->json([
31+
'success' => true,
32+
'domain' => $domain,
33+
'message' => 'Wiki set to read-only successfully.',
34+
]);
35+
} else {
36+
$wiki->deleteSetting('wgReadOnly');
37+
38+
return response()->json([
39+
'success' => true,
40+
'domain' => $domain,
41+
'message' => 'Read-only setting successfully removed for wiki.',
42+
]);
43+
}
44+
}
45+
}

app/Wiki.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,15 @@ public function getDomainDecodedAttribute(): string {
159159
public function wikiLatestProfile() {
160160
return $this->hasOne(WikiProfile::class)->latestOfMany();
161161
}
162+
163+
public function setSetting(string $name, string $value): void {
164+
$this->settings()->updateOrCreate(
165+
['name' => $name],
166+
['value' => $value]
167+
);
168+
}
169+
170+
public function deleteSetting(string $name): ?string {
171+
return $this->settings()->where('name', $name)->delete();
172+
}
162173
}

routes/backend.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
// GET
1111
$router->get('healthz', fn () => "It's Alive");
1212
$router->get('getWikiHostsForDomain', ['uses' => 'MediaWikiHostsController@getWikiHostsForDomain']);
13+
// PUT
14+
$router->put('setWikiReadOnly', ['uses' => 'WikiReadOnlyController@setWikiReadOnly']);
1315

1416
// PUT
1517
$router->put('setWikiDbVersion', ['uses' => 'WikiDbVersionController@updateWikiDbVersion']);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace Tests\Routes\Backend;
4+
5+
use App\Wiki;
6+
use App\WikiSetting;
7+
use Illuminate\Foundation\Testing\RefreshDatabase;
8+
use Tests\TestCase;
9+
10+
class WikiReadOnlyControllerTest extends TestCase {
11+
use RefreshDatabase;
12+
13+
protected string $route = '/backend/setWikiReadOnly';
14+
15+
public function testItReturns404WhenWikiNotFound() {
16+
$response = $this->putJson($this->route, [
17+
'domain' => 'nonexistent.wikibase.cloud',
18+
'readOnly' => true,
19+
]);
20+
21+
$response->assertStatus(404)
22+
->assertJson([
23+
'error' => "Wiki not found for domain 'nonexistent.wikibase.cloud'",
24+
]);
25+
}
26+
27+
public function testSetWikiToReadOnly() {
28+
$wiki = Wiki::factory()->create([
29+
'domain' => 'somewiki.wikibase.cloud',
30+
]);
31+
32+
$response = $this->putJson($this->route, [
33+
'domain' => 'somewiki.wikibase.cloud',
34+
'readOnly' => true,
35+
]);
36+
37+
$response->assertStatus(200)
38+
->assertJson([
39+
'success' => true,
40+
'domain' => 'somewiki.wikibase.cloud',
41+
'message' => 'Wiki set to read-only successfully.',
42+
]);
43+
44+
$this->assertSame(
45+
'This wiki is currently read-only.',
46+
WikiSetting::whereWikiId($wiki->id)->whereName('wgReadOnly')->first()->value
47+
);
48+
49+
}
50+
51+
public function testDeleteSettingForReadOnlyFalse() {
52+
$wiki = Wiki::factory()->create([
53+
'domain' => 'somewiki.wikibase.cloud',
54+
]);
55+
$wiki->setSetting('wgReadOnly', 'test');
56+
57+
$this->putJson($this->route, [
58+
'domain' => $wiki->domain,
59+
'readOnly' => false,
60+
])
61+
->assertStatus(200)
62+
->assertJson(['message' => 'Read-only setting successfully removed for wiki.']);
63+
64+
$this->assertNull(
65+
WikiSetting::whereWikiId($wiki->id)
66+
->whereName('wgReadOnly')
67+
->first(),
68+
);
69+
}
70+
}

0 commit comments

Comments
 (0)