Skip to content
Draft
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
17 changes: 17 additions & 0 deletions app/ActiveSuspension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ActiveSuspension extends Model
{
protected $fillable = [
'since',
'wiki_id'
];

public function Wiki(): BelongsTo {
return $this->belongsTo(Wiki::class);
}
}
56 changes: 56 additions & 0 deletions app/Http/Controllers/ActiveSuspensionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace App\Http\Controllers;

use App\ActiveSuspension;
use Illuminate\Http\Request;

class ActiveSuspensionController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
// Possible for anyone
// TODO: implement
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// Only possible for admin
return ActiveSuspension::create([
'since' => $request->input('since'),
'wiki_id' => $request->input('wiki_id')
]);
}

/**
* Display the specified resource.
*/
public function show(ActiveSuspension $activeSuspension)
{
// Possible for anyone
// TODO: implement
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, ActiveSuspension $activeSuspension)
{
// Only possible for admin
// TODO: implement
}

/**
* Remove the specified resource from storage.
*/
public function destroy(ActiveSuspension $suspension)
{
$suspension->first()->delete();
}
}
86 changes: 86 additions & 0 deletions app/Http/Controllers/ReviewSubmissionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

namespace App\Http\Controllers;

use App\ActiveSuspension;
use App\ReviewSubmission;
use App\ScheduledSuspension;
use App\Wiki;
use Carbon\CarbonImmutable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ReviewSubmissionController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
// Only possible for Admin
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// Possible for Admin or Authed user
// Authed user can only create pending "submitted" status
$submission = new ReviewSubmission();
$submission->status = 'submitted';
$submission->wiki_id = $request->input('wiki_id');
$submission->save();
}

/**
* Display the specified resource.
*/
public function show(ReviewSubmission $reviewSubmission)
{
// Possible for admin or specifically authed user
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, ReviewSubmission $reviewSubmission)
{
// Only possible for admin to pick up/approv, normal Wikimanager can cancel
if ($request->input('status') === 'cancelled') {
$loadedSubmission = $reviewSubmission->get()->first();
$loadedSubmission->status = $request->input('status');

DB::transaction( function () use ($loadedSubmission) {
$wiki = $loadedSubmission->wiki;
$loadedSubmission->save();
$this->enactAnyPendingScheduledSuspensionsOnCancellation($wiki);
});
}
}

private function enactAnyPendingScheduledSuspensionsOnCancellation( Wiki $wiki ): void {
// var_dump($wiki);
$scheduledSuspension = ScheduledSuspension::where(['wiki_id' => $wiki->id])->first();
// var_dump($scheduledSuspension);
if( $scheduledSuspension && $scheduledSuspension->schedulingDue()) {
ActiveSuspension::create([
'wiki_id' => $wiki->id,
'since' => CarbonImmutable::now(),
'reason' => $scheduledSuspension->reason
]);
$scheduledSuspension->delete();
}
//if there are any scheduled suspensions
//and they should have been processed
//make them active and remove the scheduled suspension
}

/**
* Remove the specified resource from storage.
*/
public function destroy(ReviewSubmission $reviewSubmission)
{
// Possible for admin only
}
}
61 changes: 61 additions & 0 deletions app/Http/Controllers/ScheduledSuspensionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

namespace App\Http\Controllers;

use App\ScheduledSuspension;
use App\Wiki;
use Illuminate\Http\Request;

class ScheduledSuspensionController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return ScheduledSuspension::all();
}

/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
return ScheduledSuspension::create([
'active_from' => $request->input('active_from'),
'wiki_id' => $request->input('wiki_id')
]);
}

/**
* Display the specified resource.
*/
public function show( ScheduledSuspension $suspension )
{
return $suspension->get();
}

/**
* Update the specified resource in storage.
*/
public function update(Request $request, ScheduledSuspension $suspension)
{
$suspension->first()->update([
'active_from' => $request->input('active_from')
]);

}

/**
* Remove the specified resource from storage.
*/
public function destroy(ScheduledSuspension $suspension)
{
$suspension->first()->delete();
}

public function showByWiki( Wiki $wiki ) {
return $wiki->first()->scheduledSuspension;
}

}
28 changes: 28 additions & 0 deletions app/Jobs/MakeExistingWikisTemporaryJob.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

namespace App\Jobs;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class MakeExistingWikisTemporaryJob implements ShouldQueue
{
use Queueable;

/**
* Create a new job instance.
*/
public function __construct()
{
//
}

/**
* Execute the job.
*/
public function handle(): void
{
// Create scheduled suspensions for all Wikis with a reason expiry and a date 3 months from now
// unless they already have a scheduledSuspension
}
}
36 changes: 36 additions & 0 deletions app/Jobs/NightlyRunScheduledWikiSuspension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace App\Jobs;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class NightlyRunScheduledWikiSuspension implements ShouldQueue
{
use Queueable;

/**
* Create a new job instance.
*/
public function __construct()
{
//
}

/**
* Execute the job.
*/
public function handle(): void
{
// for each Wiki
// if it has a scheduledSuspension
// and that scheduled suspension
// and that should be active by comparison with local time
// and there is no submitted or picked-up review review submission
// then in a single transaction
// create an actual suspension
// with an expiry time of now
// and the corresponding reason from the scheduled suspension
// and remove the scheduled suspension
}
}
13 changes: 13 additions & 0 deletions app/ReviewSubmission.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class ReviewSubmission extends Model
{
public function Wiki(): BelongsTo {
return $this->belongsTo(Wiki::class);
}
}
24 changes: 24 additions & 0 deletions app/ScheduledSuspension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace App;

use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;

class ScheduledSuspension extends Model
{
protected $fillable = [
'active_from',
'wiki_id'
];

public function Wiki(): BelongsTo {
return $this->belongsTo(Wiki::class);
}

public function schedulingDue(): bool {
return CarbonImmutable::now() > CarbonImmutable::parse($this->active_from);
}
}
4 changes: 4 additions & 0 deletions app/Wiki.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ public function settings(): HasMany {
return $this->hasMany(WikiSetting::class);
}

public function scheduledSuspension(): HasOne {
return $this->hasOne(ScheduledSuspension::class);
}

public function publicSettings() {
return $this->settings()->whereIn('name',
[
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

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('scheduled_suspensions', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->foreignId('wiki_id');
$table->date('active_from');
$table->enum('reason', ['expiry', 'hp_violation', 'tou_violation']);
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('scheduled_suspension');
}
};
Loading
Loading