Skip to content

Commit

Permalink
Add coordinate validation trait
Browse files Browse the repository at this point in the history
  • Loading branch information
andyksaw committed Dec 10, 2024
1 parent 4336dd4 commit dff6e8d
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 54 deletions.
27 changes: 27 additions & 0 deletions app/Core/Domains/MinecraftCoordinate/ValidatesCoordinates.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace App\Core\Domains\MinecraftCoordinate;

/**
* A set of validation rules for a Minecraft coordinate
*/
trait ValidatesCoordinates
{
protected array $coordinateRules = [
'world' => ['required', 'string'],
'x' => ['required' ,'numeric'],
'y' => ['required', 'numeric'],
'z' => ['required', 'numeric'],
'pitch' => ['required', 'numeric'],
'yaw' => ['required', 'numeric'],
];

protected array $optionalCoordinateRules = [
'world' => ['string'],
'x' => ['numeric'],
'y' => ['numeric'],
'z' => ['numeric'],
'pitch' => ['numeric'],
'yaw' => ['numeric'],
];
}
38 changes: 16 additions & 22 deletions app/Http/Controllers/Api/v2/Minecraft/MinecraftBuildController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Http\Controllers\Api\v2\Minecraft;

use App\Core\Domains\MinecraftCoordinate\ValidatesCoordinates;
use App\Core\Domains\MinecraftUUID\Data\MinecraftUUID;
use App\Core\Domains\MinecraftUUID\Rules\MinecraftUUIDRule;
use App\Http\Controllers\ApiController;
Expand All @@ -14,6 +15,8 @@

final class MinecraftBuildController extends ApiController
{
use ValidatesCoordinates;

public function index(Request $request)
{
$request->validate([
Expand All @@ -35,40 +38,30 @@ public function show(Request $request, MinecraftBuild $build)

public function store(Request $request)
{
$input = $request->validate([
$validated = $request->validate([
'player_uuid' => ['required', new MinecraftUUIDRule],
'name' => ['required', Rule::unique(MinecraftBuild::tableName())],
'world' => 'required|string',
'x' => 'required|numeric',
'y' => 'required|numeric',
'z' => 'required|numeric',
'pitch' => 'required|numeric',
'yaw' => 'required|numeric',
...$this->coordinateRules,
]);

$player = MinecraftPlayer::firstOrCreate(
uuid: new MinecraftUUID($input['player_uuid']),
uuid: new MinecraftUUID($validated['player_uuid']),
alias: $request->get('alias'),
);
$input['player_id'] = $player->getKey();
$validated['player_id'] = $player->getKey();

return MinecraftBuild::create($input);
return MinecraftBuild::create($validated);
}

public function update(Request $request, MinecraftBuild $build)
{
$input = $request->validate([
$validated = $request->validate([
'player_uuid' => ['required', new MinecraftUUIDRule],
'name' => ['required', Rule::unique(MinecraftBuild::tableName())->ignore($build)],
'world' => 'required|string',
'x' => 'required|numeric',
'y' => 'required|numeric',
'z' => 'required|numeric',
'pitch' => 'required|numeric',
'yaw' => 'required|numeric',
...$this->coordinateRules,
]);

$this->assertHasWriteAccess(build: $build, uuid: $input['player_uuid']);
$this->assertHasWriteAccess(build: $build, uuid: $validated['player_uuid']);

$build->update($request->all());

Expand All @@ -77,12 +70,12 @@ public function update(Request $request, MinecraftBuild $build)

public function patch(Request $request, MinecraftBuild $build)
{
$input = $request->validate([
$validated = $request->validate([
'player_uuid' => ['required', new MinecraftUUIDRule],
'name' => [Rule::unique(MinecraftBuild::tableName())->ignore($build)],
]);

$this->assertHasWriteAccess(build: $build, uuid: $input['player_uuid']);
$this->assertHasWriteAccess(build: $build, uuid: $validated['player_uuid']);

if ($request->has('name')) {
$name = $request->get('name');
Expand All @@ -103,11 +96,11 @@ public function patch(Request $request, MinecraftBuild $build)

public function destroy(Request $request, MinecraftBuild $build)
{
$input = $request->validate([
$validated = $request->validate([
'player_uuid' => ['required', new MinecraftUUIDRule],
]);

$this->assertHasWriteAccess(build: $build, uuid: $input['player_uuid']);
$this->assertHasWriteAccess(build: $build, uuid: $validated['player_uuid']);

DB::transaction(function () use ($build) {
MinecraftBuildVote::where('build_id', $build->getKey())->delete();
Expand All @@ -121,6 +114,7 @@ public function destroy(Request $request, MinecraftBuild $build)
* Ensures the given player UUID has the ability to modify the given build.
* Basically checks the UUID is the build owner or a staff member.
*/
// TODO: convert this to a Policy
private function assertHasWriteAccess(MinecraftBuild $build, string $uuid): void
{
$uuid = new MinecraftUUID($uuid);
Expand Down
17 changes: 5 additions & 12 deletions app/Http/Controllers/Api/v2/Minecraft/MinecraftWarpController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

namespace App\Http\Controllers\Api\v2\Minecraft;

use App\Core\Domains\MinecraftCoordinate\ValidatesCoordinates;
use App\Http\Controllers\ApiController;
use App\Models\MinecraftWarp;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

final class MinecraftWarpController extends ApiController
{
use ValidatesCoordinates;

public function index(Request $request)
{
return MinecraftWarp::orderBy('name', 'asc')->get();
Expand All @@ -18,12 +21,7 @@ public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'alpha_dash', Rule::unique(MinecraftWarp::tableName())],
'world' => 'required|string',
'x' => 'required|numeric',
'y' => 'required|numeric',
'z' => 'required|numeric',
'pitch' => 'required|numeric',
'yaw' => 'required|numeric',
...$this->coordinateRules,
]);

return MinecraftWarp::create($request->all());
Expand All @@ -33,12 +31,7 @@ public function update(Request $request, MinecraftWarp $warp)
{
$request->validate([
'name' => ['required', 'string', 'alpha_dash', Rule::unique(MinecraftWarp::tableName())->ignore($warp)],
'world' => 'required|string',
'x' => 'required|numeric',
'y' => 'required|numeric',
'z' => 'required|numeric',
'pitch' => 'required|numeric',
'yaw' => 'required|numeric',
...$this->coordinateRules,
]);

$warp->update($request->all());
Expand Down
82 changes: 82 additions & 0 deletions app/Http/Controllers/Manage/Minecraft/MinecraftBuildController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php

namespace App\Http\Controllers\Manage\Minecraft;

use App\Core\Domains\MinecraftCoordinate\ValidatesCoordinates;
use App\Http\Controllers\WebController;
use App\Models\MinecraftBuild;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class MinecraftBuildController extends WebController
{
use ValidatesCoordinates;

public function index(Request $request)
{
$builds = MinecraftBuild::orderBy('name', 'asc')
->with('player')
->paginate(100);

return view('manage.pages.minecraft-builds.index')
->with(compact('builds'));
}

public function create(Request $request)
{
$build = new MinecraftBuild();

return view('manage.pages.minecraft-builds.create')
->with(compact('build'));
}

public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => ['required', 'string', 'alpha_dash', Rule::unique(MinecraftBuild::tableName())],
...$this->coordinateRules,
]);

if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}

MinecraftBuild::create($validator->validated());

return redirect(route('manage.minecraft.builds.index'));
}

public function edit(MinecraftBuild $build)
{
return view('manage.pages.minecraft-builds.edit')
->with(compact('build'));
}

public function update(Request $request, MinecraftBuild $build)
{
$validator = Validator::make($request->all(), [
'name' => ['required', 'string', 'alpha_dash', Rule::unique(MinecraftBuild::tableName())->ignore($build)],
...$this->coordinateRules,
]);

if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}

$build->update($validator->validated());

return redirect(route('manage.minecraft.builds.index'));
}

public function destroy(Request $request, MinecraftBuild $build)
{
$build->delete();

return redirect(route('manage.minecraft.builds.index'));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\Http\Controllers\Manage;
namespace App\Http\Controllers\Manage\Minecraft;

use App\Domains\MinecraftEventBus\Events\MinecraftConfigUpdated;
use App\Http\Controllers\WebController;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\Http\Controllers\Manage;
namespace App\Http\Controllers\Manage\Minecraft;

use App\Core\Domains\Mojang\Api\MojangPlayerApi;
use App\Http\Controllers\WebController;
Expand All @@ -17,9 +17,11 @@ class MinecraftPlayerController extends WebController
*/
public function index()
{
$minecraftPlayers = MinecraftPlayer::with(['account'])->paginate(50);
$minecraftPlayers = MinecraftPlayer::with(['account'])
->paginate(50);

return view('manage.pages.minecraft-player.index')->with(compact('minecraftPlayers'));
return view('manage.pages.minecraft-player.index')
->with(compact('minecraftPlayers'));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<?php

namespace App\Http\Controllers\Manage;
namespace App\Http\Controllers\Manage\Minecraft;

use App\Core\Domains\MinecraftCoordinate\ValidatesCoordinates;
use App\Http\Controllers\WebController;
use App\Models\MinecraftWarp;
use Illuminate\Contracts\Foundation\Application;
Expand All @@ -14,6 +15,8 @@

class MinecraftWarpController extends WebController
{
use ValidatesCoordinates;

public function index(Request $request): MinecraftWarp|Factory|View
{
$warps = MinecraftWarp::orderBy('name', 'asc')
Expand All @@ -34,12 +37,7 @@ public function store(Request $request): RedirectResponse
{
$validator = Validator::make($request->all(), [
'name' => ['required', 'string', 'alpha_dash', Rule::unique('minecraft_warps')],
'world' => 'required|string',
'x' => 'required|numeric',
'y' => 'required|numeric',
'z' => 'required|numeric',
'pitch' => 'required|numeric',
'yaw' => 'required|numeric',
...$this->coordinateRules,
]);

if ($validator->fails()) {
Expand All @@ -66,12 +64,7 @@ public function update(Request $request, MinecraftWarp $warp): RedirectResponse
{
$validator = Validator::make($request->all(), [
'name' => ['required', 'string', 'alpha_dash', Rule::unique('minecraft_warps')->ignore($warp)],
'world' => 'required|string',
'x' => 'required|numeric',
'y' => 'required|numeric',
'z' => 'required|numeric',
'pitch' => 'required|numeric',
'yaw' => 'required|numeric',
...$this->coordinateRules,
]);

if ($validator->fails()) {
Expand Down
6 changes: 3 additions & 3 deletions routes/web_manage.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@
use App\Http\Controllers\Manage\GamePlayerBanController;
use App\Http\Controllers\Manage\GroupAccountController;
use App\Http\Controllers\Manage\GroupController;
use App\Http\Controllers\Manage\MinecraftConfigController;
use App\Http\Controllers\Manage\MinecraftPlayerController;
use App\Http\Controllers\Manage\Minecraft\MinecraftConfigController;
use App\Http\Controllers\Manage\Minecraft\MinecraftPlayerController;
use App\Http\Controllers\Manage\Minecraft\MinecraftWarpController;
use App\Http\Controllers\Manage\MinecraftPlayerLookupController;
use App\Http\Controllers\Manage\MinecraftWarpController;
use App\Http\Controllers\Manage\PlayerWarningController;
use App\Http\Controllers\Manage\ServerController;
use App\Http\Controllers\Manage\ServerTokenController;
Expand Down

0 comments on commit dff6e8d

Please sign in to comment.