pixelfed/pixelfed

View on GitHub
app/Http/Controllers/StatusEditController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\Status\StoreStatusEditRequest;
use App\Status;
use App\Models\StatusEdit;
use Purify;
use App\Services\Status\UpdateStatusService;
use App\Services\StatusService;
use App\Util\Lexer\Autolink;
use App\Jobs\StatusPipeline\StatusLocalUpdateActivityPubDeliverPipeline;

class StatusEditController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        abort_if(!config('exp.pue'), 404, 'Post editing is not enabled on this server.');
    }

    public function store(StoreStatusEditRequest $request, $id)
    {
        $validated = $request->validated();

        $status = Status::findOrFail($id);
        abort_if(StatusEdit::whereStatusId($status->id)->count() >= 10, 400, 'You cannot edit your post more than 10 times.');
        $res = UpdateStatusService::call($status, $validated);

        $status = Status::findOrFail($id);
        StatusLocalUpdateActivityPubDeliverPipeline::dispatch($status)->delay(now()->addMinutes(1));
        return $res;
    }

    public function history(Request $request, $id)
    {
        abort_if(!$request->user(), 403);
        $status = Status::whereNull('reblog_of_id')->findOrFail($id);
        abort_if(!in_array($status->scope, ['public', 'unlisted']), 403);
        if(!$status->edits()->count()) {
            return [];
        }
        $cached = StatusService::get($status->id, false);

        $res = $status->edits->map(function($edit) use($cached) {
            $caption = nl2br(strip_tags(str_replace('</p>', "\n", $edit->caption)));
            return [
                'content' => Autolink::create()->autolink($caption),
                'spoiler_text' => $edit->spoiler_text,
                'sensitive' => (bool) $edit->is_nsfw,
                'created_at' => str_replace('+00:00', 'Z', $edit->created_at->format(DATE_RFC3339_EXTENDED)),
                'account' => $cached['account'],
                'media_attachments' => $cached['media_attachments'],
                'emojis' => $cached['emojis'],
            ];
        })->reverse()->values()->toArray();
        return $res;
    }
}