#118 - keys
This commit is contained in:
@@ -7,7 +7,9 @@ namespace Toby\Architecture\Providers;
|
||||
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Toby\Domain\Enums\Role;
|
||||
use Toby\Domain\Policies\KeyPolicy;
|
||||
use Toby\Domain\Policies\VacationRequestPolicy;
|
||||
use Toby\Eloquent\Models\Key;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Eloquent\Models\VacationRequest;
|
||||
|
||||
@@ -15,6 +17,7 @@ class AuthServiceProvider extends ServiceProvider
|
||||
{
|
||||
protected $policies = [
|
||||
VacationRequest::class => VacationRequestPolicy::class,
|
||||
Key::class => KeyPolicy::class,
|
||||
];
|
||||
|
||||
public function boot(): void
|
||||
|
26
app/Domain/Policies/KeyPolicy.php
Normal file
26
app/Domain/Policies/KeyPolicy.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Domain\Policies;
|
||||
|
||||
use Toby\Domain\Enums\Role;
|
||||
use Toby\Eloquent\Models\Key;
|
||||
use Toby\Eloquent\Models\User;
|
||||
|
||||
class KeyPolicy
|
||||
{
|
||||
public function manage(User $user): bool
|
||||
{
|
||||
return $user->role === Role::AdministrativeApprover;
|
||||
}
|
||||
|
||||
public function give(User $user, Key $key): bool
|
||||
{
|
||||
if ($key->user()->is($user)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return $user->role === Role::AdministrativeApprover;
|
||||
}
|
||||
}
|
@@ -11,8 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property User $owner
|
||||
* @property User $previousOwner
|
||||
* @property User $user
|
||||
*/
|
||||
class Key extends Model
|
||||
{
|
||||
@@ -20,14 +19,9 @@ class Key extends Model
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
public function owner(): BelongsTo
|
||||
public function user(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class, "owner_id");
|
||||
}
|
||||
|
||||
public function previousOwner(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class, "previous_owner_id");
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
|
||||
protected static function newFactory(): KeyFactory
|
||||
|
@@ -74,6 +74,11 @@ class User extends Authenticatable
|
||||
return $this->hasMany(Vacation::class);
|
||||
}
|
||||
|
||||
public function keys(): HasMany
|
||||
{
|
||||
return $this->hasMany(Key::class);
|
||||
}
|
||||
|
||||
public function hasRole(Role $role): bool
|
||||
{
|
||||
return $this->role === $role;
|
||||
|
@@ -4,20 +4,83 @@ declare(strict_types=1);
|
||||
|
||||
namespace Toby\Infrastructure\Http\Controllers;
|
||||
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Response;
|
||||
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Toby\Eloquent\Models\Key;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Infrastructure\Http\Requests\GiveKeyRequest;
|
||||
use Toby\Infrastructure\Http\Resources\KeyResource;
|
||||
use Toby\Infrastructure\Http\Resources\SimpleUserResource;
|
||||
|
||||
class KeysController extends Controller
|
||||
{
|
||||
public function index(Request $request, YearPeriodRetriever $yearPeriodRetriever): Response
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
$keys = Key::query()->get();
|
||||
$keys = Key::query()
|
||||
->oldest()
|
||||
->get();
|
||||
|
||||
return inertia("Keys/Index", [
|
||||
$users = User::query()
|
||||
->where("id", "!=", $request->user()->id)
|
||||
->orderByProfileField("last_name")
|
||||
->orderByProfileField("first_name")
|
||||
->get();
|
||||
|
||||
return inertia("Keys", [
|
||||
"keys" => KeyResource::collection($keys),
|
||||
"users" => SimpleUserResource::collection($users),
|
||||
"can" => [
|
||||
"manageKeys" => $request->user()->can("manage", Key::class),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws AuthorizationException
|
||||
*/
|
||||
public function store(Request $request): RedirectResponse
|
||||
{
|
||||
$this->authorize("manageKeys");
|
||||
|
||||
$request->user()->keys()->create();
|
||||
|
||||
return redirect()
|
||||
->back()
|
||||
->with("success", __("Key has been created."));
|
||||
}
|
||||
|
||||
public function take(Key $key, Request $request): RedirectResponse
|
||||
{
|
||||
$key->user()->associate($request->user());
|
||||
|
||||
$key->save();
|
||||
|
||||
return redirect()
|
||||
->back()
|
||||
->with("success", __("Key has been taked."));
|
||||
}
|
||||
|
||||
public function give(Key $key, GiveKeyRequest $request): RedirectResponse
|
||||
{
|
||||
$key->user()->associate($request->recipient());
|
||||
|
||||
$key->save();
|
||||
|
||||
return redirect()
|
||||
->back()
|
||||
->with("success", __("Key has been given."));
|
||||
}
|
||||
|
||||
public function destroy(Key $key): RedirectResponse
|
||||
{
|
||||
$this->authorize("manageKeys");
|
||||
|
||||
$key->delete();
|
||||
|
||||
return redirect()
|
||||
->back()
|
||||
->with("success", __("Key has been deleted."));
|
||||
}
|
||||
}
|
||||
|
23
app/Infrastructure/Http/Requests/GiveKeyRequest.php
Normal file
23
app/Infrastructure/Http/Requests/GiveKeyRequest.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Infrastructure\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Toby\Eloquent\Models\User;
|
||||
|
||||
class GiveKeyRequest extends FormRequest
|
||||
{
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
"user" => ["required", "exists:users,id"],
|
||||
];
|
||||
}
|
||||
|
||||
public function recipient(): User
|
||||
{
|
||||
return User::find($this->get("user"));
|
||||
}
|
||||
}
|
@@ -14,9 +14,12 @@ class KeyResource extends JsonResource
|
||||
{
|
||||
return [
|
||||
"id" => $this->id,
|
||||
"owner" => new UserResource($this->owner),
|
||||
"previousOwner" => new UserResource($this->previousOwner),
|
||||
"user" => new SimpleUserResource($this->user),
|
||||
"updatedAt" => $this->updated_at->toDatetimeString(),
|
||||
"can" => [
|
||||
"give" => $request->user()->can("give", $this->resource),
|
||||
"take" => !$this->user()->is($request->user()),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user