feat(integration): administrar instancias y asociaciones con permisos
Agrega endpoints para crear, editar y asociar instancias a clientes y tipos de sitio. Valida las credenciales contra el esquema del catalogo y devuelve metadatos sin secretos. Restringe la administracion al rol admin autenticado y mantiene inmutables los codigos de integracion. Incluye pruebas de API, permisos, prioridad de resolucion, edicion compartida y renovacion de tokens.
This commit is contained in:
@@ -4,8 +4,12 @@ namespace App\Domains\Integration\Controllers;
|
||||
|
||||
use App\Domains\Client\Models\Client;
|
||||
use App\Domains\Integration\Models\Integration;
|
||||
use App\Domains\Integration\Models\IntegrationInstance;
|
||||
use App\Domains\Integration\Requests\AssociateIntegrationInstanceRequest;
|
||||
use App\Domains\Integration\Requests\StoreClientIntegrationRequest;
|
||||
use App\Domains\Integration\Resources\IntegrationAssociationResource;
|
||||
use App\Domains\Integration\Services\ClientIntegrationService;
|
||||
use App\Domains\Integration\Services\IntegrationAssociationService;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
@@ -61,4 +65,18 @@ class ClientIntegrationController extends Controller
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function associate(AssociateIntegrationInstanceRequest $request, Client $client, string $integrationCode, IntegrationAssociationService $service)
|
||||
{
|
||||
return new IntegrationAssociationResource($service->associate(
|
||||
$client, $integrationCode, IntegrationInstance::findOrFail($request->validated('integration_instance_id')),
|
||||
));
|
||||
}
|
||||
|
||||
public function destroy(Client $client, string $integrationCode, IntegrationAssociationService $service)
|
||||
{
|
||||
$service->detach($client, $integrationCode);
|
||||
|
||||
return response()->noContent();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ class IntegrationController extends Controller
|
||||
|
||||
public function destroy(Integration $integration)
|
||||
{
|
||||
abort_if($integration->instances()->exists(), 409, 'Delete the integration instances first.');
|
||||
$integration->delete();
|
||||
|
||||
return response()->noContent();
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Integration\Controllers;
|
||||
|
||||
use App\Domains\Integration\Models\IntegrationInstance;
|
||||
use App\Domains\Integration\Requests\StoreIntegrationInstanceRequest;
|
||||
use App\Domains\Integration\Resources\IntegrationInstanceResource;
|
||||
use App\Domains\Integration\Services\IntegrationInstanceService;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
class IntegrationInstanceController extends Controller
|
||||
{
|
||||
public function __construct(private readonly IntegrationInstanceService $service) {}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return IntegrationInstanceResource::collection(IntegrationInstance::query()->orderBy('id')->paginate());
|
||||
}
|
||||
|
||||
public function store(StoreIntegrationInstanceRequest $request)
|
||||
{
|
||||
return (new IntegrationInstanceResource($this->service->create($request->validated())))
|
||||
->response()->setStatusCode(201);
|
||||
}
|
||||
|
||||
public function show(IntegrationInstance $integrationInstance)
|
||||
{
|
||||
return new IntegrationInstanceResource($integrationInstance);
|
||||
}
|
||||
|
||||
public function update(StoreIntegrationInstanceRequest $request, IntegrationInstance $integrationInstance)
|
||||
{
|
||||
return new IntegrationInstanceResource($this->service->update($integrationInstance, $request->validated()));
|
||||
}
|
||||
|
||||
public function destroy(IntegrationInstance $integrationInstance)
|
||||
{
|
||||
$this->service->delete($integrationInstance);
|
||||
|
||||
return response()->noContent();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Integration\Controllers;
|
||||
|
||||
use App\Domains\Integration\Models\IntegrationInstance;
|
||||
use App\Domains\Integration\Requests\AssociateIntegrationInstanceRequest;
|
||||
use App\Domains\Integration\Resources\IntegrationAssociationResource;
|
||||
use App\Domains\Integration\Services\IntegrationAssociationService;
|
||||
use App\Domains\Tenant\Models\WebsiteType;
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
class WebsiteTypeIntegrationController extends Controller
|
||||
{
|
||||
public function __construct(private readonly IntegrationAssociationService $service) {}
|
||||
|
||||
public function index(WebsiteType $websiteType)
|
||||
{
|
||||
return IntegrationAssociationResource::collection($websiteType->integrations()->with('integrationInstance')->get());
|
||||
}
|
||||
|
||||
public function show(WebsiteType $websiteType, string $integrationCode)
|
||||
{
|
||||
return new IntegrationAssociationResource($websiteType->integrations()->with('integrationInstance')->where('integration_code', $integrationCode)->firstOrFail());
|
||||
}
|
||||
|
||||
public function store(AssociateIntegrationInstanceRequest $request, WebsiteType $websiteType, string $integrationCode)
|
||||
{
|
||||
return new IntegrationAssociationResource($this->service->associate(
|
||||
$websiteType, $integrationCode, IntegrationInstance::findOrFail($request->validated('integration_instance_id')),
|
||||
));
|
||||
}
|
||||
|
||||
public function destroy(WebsiteType $websiteType, string $integrationCode)
|
||||
{
|
||||
$this->service->detach($websiteType, $integrationCode);
|
||||
|
||||
return response()->noContent();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user