diff --git a/app/Concerns/ReservedSlugs.php b/app/Concerns/ReservedSlugs.php new file mode 100644 index 0000000..5fc96a8 --- /dev/null +++ b/app/Concerns/ReservedSlugs.php @@ -0,0 +1,27 @@ +reservedSlugs()); + } + + public function reservedSlugs(): array + { + return [ + 'index', + 'edit', + 'update', + 'create', + 'store', + 'delete', + 'destroy', + 'revoke', + 'invite', + 'accept', + ]; + } +} diff --git a/app/Http/Controllers/TeamController.php b/app/Http/Controllers/TeamController.php index 786967b..1028547 100644 --- a/app/Http/Controllers/TeamController.php +++ b/app/Http/Controllers/TeamController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Concerns\ReservedSlugs; use App\Enums\TeamMemberRole; use App\Http\Requests\StoreTeamRequest; use App\Http\Requests\UpdateTeamRequest; @@ -19,6 +20,9 @@ use Inertia\Response; class TeamController extends Controller { + + use ReservedSlugs; + /** * Display a listing of the resource. */ @@ -112,7 +116,7 @@ class TeamController extends Controller return response()->json([ 'name' => $name, 'slug' => $slug, - 'taken' => $slug === 'create' || ($slug !== $ignoredSlug && Team::whereSlug($slug)->exists()), + 'taken' => $this->isReserved($slug) || ($slug !== $ignoredSlug && Team::whereSlug($slug)->exists()), ]); } @@ -138,7 +142,7 @@ class TeamController extends Controller 'email' => 'required|email|max:255', ]); - $teamInvite = $team->invites()->whereInvitedEmail($validated['email'])->firstOrFail(); + $teamInvite = $team->invites()->whereInvitedEmail(Arr::get($validated,'email'))->firstOrFail(); try { $teamInvite->delete(); diff --git a/app/Http/Requests/StoreTeamRequest.php b/app/Http/Requests/StoreTeamRequest.php index 065d19d..4d7f464 100644 --- a/app/Http/Requests/StoreTeamRequest.php +++ b/app/Http/Requests/StoreTeamRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests; +use App\Concerns\ReservedSlugs; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Str; @@ -9,6 +10,9 @@ use Illuminate\Validation\Rule; class StoreTeamRequest extends FormRequest { + + use ReservedSlugs; + /** * Get the validation rules that apply to the request. * @@ -18,7 +22,7 @@ class StoreTeamRequest extends FormRequest { return [ 'name' => ['required', 'string', 'max:255'], - 'slug' => ['required', 'string', 'max:255', Rule::notIn(['create']), Rule::unique('teams', 'slug')], + 'slug' => ['required', 'string', 'max:255', Rule::notIn($this->reservedSlugs()), Rule::unique('teams', 'slug')], 'require_2fa' => ['required', 'boolean'], ]; } diff --git a/app/Http/Requests/UpdateTeamRequest.php b/app/Http/Requests/UpdateTeamRequest.php index 97fba60..3f7b31d 100644 --- a/app/Http/Requests/UpdateTeamRequest.php +++ b/app/Http/Requests/UpdateTeamRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests; +use App\Concerns\ReservedSlugs; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Str; @@ -9,6 +10,7 @@ use Illuminate\Validation\Rule; class UpdateTeamRequest extends FormRequest { + use ReservedSlugs; /** * Get the validation rules that apply to the request. * @@ -18,7 +20,7 @@ class UpdateTeamRequest extends FormRequest { return [ 'name' => ['sometimes', 'required', 'string', 'max:255'], - 'slug' => [Rule::excludeIf(! $this->has('name')), 'required', 'string', 'max:255', Rule::notIn(['create']), Rule::unique('teams', 'slug')->ignore($this->route('team'))], + 'slug' => [Rule::excludeIf(! $this->has('name')), 'required', 'string', 'max:255', Rule::notIn($this->reservedSlugs()), Rule::unique('teams', 'slug')->ignore($this->route('team'))], 'require_2fa' => ['required', 'boolean'], ]; }