Files
shopit-back/app/Providers/AppServiceProvider.php
ncoronel ab5ea7dd33 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.
2026-09-04 12:48:06 -03:00

84 lines
2.9 KiB
PHP

<?php
namespace App\Providers;
use App\Domains\Integration\Models\Integration;
use App\Domains\Integration\Policies\IntegrationPolicy;
use App\Domains\Notification\Events\PasswordResetRequested;
use App\Domains\Notification\Events\UserRegistered;
use App\Domains\Notification\Listeners\SendPasswordResetEmail;
use App\Domains\Notification\Listeners\SendPurchaseConfirmedEmail;
use App\Domains\Notification\Listeners\SendWelcomeEmail;
use App\Domains\Purchase\Events\PurchasePaid;
use App\Domains\Ticket\Listeners\GenerateTicketsForPaidPurchase;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Gate::policy(
Integration::class,
IntegrationPolicy::class,
);
Event::listen(PurchasePaid::class, GenerateTicketsForPaidPurchase::class);
Event::listen(PurchasePaid::class, SendPurchaseConfirmedEmail::class);
Event::listen(UserRegistered::class, SendWelcomeEmail::class);
Event::listen(PasswordResetRequested::class, SendPasswordResetEmail::class);
RateLimiter::for('login', function (Request $request): array {
$normalizedEmail = mb_strtolower(trim((string) $request->input('email')));
$emailFingerprint = hash_hmac(
'sha256',
$normalizedEmail,
(string) config('app.key'),
);
$ipAddress = $request->ip() ?? 'unknown';
return [
Limit::perMinute(
max(1, (int) config('login-security.rate_limit_per_minute'))
)->by("login:identity:{$emailFingerprint}:{$ipAddress}"),
Limit::perMinute(
max(1, (int) config('login-security.ip_rate_limit_per_minute'))
)->by("login:ip:{$ipAddress}"),
];
});
Builder::macro('paginateFromRequest', function (int $defaultPerPage = 15, int $maxPerPage = 100, ?int $page = null) {
/** @var Builder $this */
$perPage = (int) request()->query('per_page', $defaultPerPage);
$page = $page ?? (int) request()->query('page', 1);
if ($perPage <= 0) {
$perPage = $defaultPerPage;
}
if ($perPage > $maxPerPage) {
$perPage = $maxPerPage;
}
if ($page <= 0) {
$page = 1;
}
return $this->paginate(perPage: $perPage, page: $page);
});
}
}