60 lines
1.9 KiB
PHP
60 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\V1;
|
|
|
|
use App\Domains\Api\Resources\LinkResource;
|
|
use App\Domains\Link\Actions\CreateLink;
|
|
use App\Domains\Link\Actions\DeleteLink;
|
|
use App\Domains\Link\Models\Link;
|
|
use App\Domains\Workspace\Models\Workspace;
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
|
|
|
|
class LinkController extends Controller
|
|
{
|
|
public function index(Request $request, string $workspaceUlid): AnonymousResourceCollection
|
|
{
|
|
$workspace = Workspace::where('ulid', $workspaceUlid)->firstOrFail();
|
|
$this->authorize('view', $workspace);
|
|
|
|
$links = $workspace->links()->latest()->paginate(50);
|
|
|
|
return LinkResource::collection($links);
|
|
}
|
|
|
|
public function store(Request $request, string $workspaceUlid, CreateLink $action): \Illuminate\Http\JsonResponse
|
|
{
|
|
$workspace = Workspace::where('ulid', $workspaceUlid)->firstOrFail();
|
|
$this->authorize('update', $workspace);
|
|
|
|
$validated = $request->validate([
|
|
'target_url' => 'required|url:http,https|max:2048',
|
|
'slug' => 'nullable|string|max:64|alpha_dash',
|
|
'title' => 'nullable|string|max:255',
|
|
'tags' => 'nullable|array',
|
|
'tags.*' => 'string|max:64',
|
|
]);
|
|
|
|
$link = $action->handle($workspace, $request->user(), $validated);
|
|
|
|
return (new LinkResource($link))
|
|
->response()
|
|
->setStatusCode(201);
|
|
}
|
|
|
|
public function destroy(Request $request, string $workspaceUlid, string $linkUlid, DeleteLink $action): \Illuminate\Http\Response
|
|
{
|
|
$workspace = Workspace::where('ulid', $workspaceUlid)->firstOrFail();
|
|
$this->authorize('update', $workspace);
|
|
|
|
$link = Link::where('ulid', $linkUlid)
|
|
->where('workspace_id', $workspace->id)
|
|
->firstOrFail();
|
|
|
|
$action->handle($link);
|
|
|
|
return response()->noContent();
|
|
}
|
|
}
|