Fix: socket permissions para nginx

This commit is contained in:
2026-05-21 23:21:41 -06:00
parent b574ae1ed3
commit 28faa727b1
32 changed files with 2144 additions and 6 deletions
+12
View File
@@ -1,8 +1,20 @@
<?php
use App\Http\Controllers\WhatsAppAnalyticsController;
use App\Http\Controllers\WhatsAppWebhookController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
// Webhook de Meta (sin auth)
Route::get('/webhook/whatsapp', [WhatsAppWebhookController::class, 'verify']);
Route::post('/webhook/whatsapp', [WhatsAppWebhookController::class, 'handle']);
// API para n8n (sin auth de usuario — proteger con token en n8n si se desea)
Route::middleware('auth:sanctum')->group(function () {
Route::get('/whatsapp/stats', [WhatsAppAnalyticsController::class, 'stats']);
Route::get('/whatsapp/logs', [WhatsAppAnalyticsController::class, 'logs']);
});
+14
View File
@@ -13,3 +13,17 @@ Broadcast::channel('chat.{receiverId}', function ($user, $receiverId) {
Broadcast::channel('notifications.{userId}', function ($user, $userId) {
return (int) $user->id === (int) $userId;
});
// WhatsApp chat — solo usuarios del mismo plantel que el prospecto pueden escuchar
Broadcast::channel('whatsapp-chat.{alumnoId}', function ($user, $alumnoId) {
$alumno = \App\Models\Alumno::find($alumnoId);
if (!$alumno) {
return false;
}
$plantelesAlumno = $alumno->alumnos()
->with('plantelUsuarios')
->get()
->flatMap(fn($u) => $u->plantelUsuarios->pluck('id'));
$plantelesUsuario = $user->plantelUsuarios->pluck('id');
return $plantelesAlumno->intersect($plantelesUsuario)->isNotEmpty();
});
+29
View File
@@ -36,7 +36,10 @@ use App\Http\Controllers\PermissionController;
use App\Http\Controllers\PlanController;
use App\Http\Controllers\PlaneController;
use App\Http\Controllers\PlantelController;
use App\Http\Controllers\PromocionController;
use App\Http\Controllers\RoleController;
use App\Http\Controllers\WhatsAppAnalyticsController;
use App\Http\Controllers\WhatsAppChatController;
use App\Http\Controllers\StripeWebhookController;
use App\Http\Controllers\TurnoController;
use App\Http\Controllers\UnsubscribeController;
@@ -165,4 +168,30 @@ Route::middleware(['auth:sanctum',config('jetstream.auth_session'),'verified',
Route::resource('/mail',MailController::class);
Route::get('/mailme/{user}',[MailController::class,'mailme'])->name('mailme');
// Promociones WhatsApp
Route::resource('/promocion', PromocionController::class)->middleware([
'index' => 'can:promocion.index',
'create' => 'can:promocion.create',
'store' => 'can:promocion.create',
'edit' => 'can:promocion.edit',
'update' => 'can:promocion.edit',
'destroy' => 'can:promocion.destroy',
]);
Route::patch('/promocion/{promocion}/toggle', [PromocionController::class, 'toggleStatus'])
->name('promocion.toggle')->middleware('can:promocion.edit');
Route::post('/promocion/{promocion}/enviar', [PromocionController::class, 'enviar'])
->name('promocion.enviar')->middleware('can:promocion.enviar');
// Chat WhatsApp
Route::get('/promociones/chat', [WhatsAppChatController::class, 'index'])
->name('promocion.chat')->middleware('can:promocion.chat');
Route::get('/promociones/chat/{alumno}', [WhatsAppChatController::class, 'show'])
->name('promocion.chat.show')->middleware('can:promocion.chat');
Route::post('/promociones/chat/send', [WhatsAppChatController::class, 'send'])
->name('promocion.chat.send')->middleware('can:promocion.chat');
// Analytics WhatsApp
Route::get('/promociones/analytics', [WhatsAppAnalyticsController::class, 'index'])
->name('promocion.analytics')->middleware('can:promocion.analytics');
});