trove/app/Livewire/UrlSubmissionForm.php

49 lines
1 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace App\Livewire;
use App\Enums\PageStatusEnum;
use App\Models\Page;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\RateLimiter;
use Livewire\Component;
class UrlSubmissionForm extends Component
{
public string $url = '';
public ?string $confirmedUrl = null;
public function submit(): void
{
$key = 'submit-url:' . request()->ip();
if (RateLimiter::tooManyAttempts($key, 10)) {
$this->addError('rate_limit', 'Too many submissions, try again shortly.');
return;
}
RateLimiter::hit($key, 60);
$validated = $this->validate([
'url' => ['required', 'url:http,https'],
]);
Page::firstOrCreate(
['url' => $validated['url']],
['status' => PageStatusEnum::Discovered],
);
$this->confirmedUrl = $validated['url'];
$this->reset('url');
}
public function render(): View
{
return view('livewire.url-submission-form');
}
}