MemberMaintenance.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Models\User;
  4. use App\Models\UserSession;
  5. use App\Services\MaintenanceService;
  6. use App\Support\MaintenancePolicy as Policy;
  7. use Closure;
  8. use Illuminate\Http\Request;
  9. /** Assigned only to member routes, never the entire Laravel API group. */
  10. class MemberMaintenance
  11. {
  12. public function handle(Request $request, Closure $next)
  13. {
  14. if ($request->isMethod('OPTIONS')) return $next($request);
  15. $now = now()->getTimestamp();
  16. $platform = Policy::platform($request->header('Platform', $request->input('platform')));
  17. $language = Policy::language($request->header('lang', $request->input('lang'))) ?? 'vi';
  18. $service = new MaintenanceService();
  19. $rows = $service->runtimeRows($language);
  20. $row = Policy::select($rows, $platform, null, $now);
  21. if ($row === null) return $next($request);
  22. // Read-only session validation: blocked requests must not renew login activity.
  23. $token = $request->header('Authorization');
  24. if (is_string($token) && $token !== '') {
  25. $session = UserSession::where('token', $token)->where('expire_time', '>', $now)->first();
  26. if ($session && UserSession::validUntil($session->getAttributes()) > $now) {
  27. $user = User::where('user_id', $session->user_id)->first();
  28. $saved = $user && empty($user->delete_time) && !(int) ($user->is_banned ?? 0) ? Policy::language($user->language) : null;
  29. if ($saved && $saved !== $language) {
  30. $language = $saved; $row = Policy::select($service->runtimeRows($language), $platform, null, $now);
  31. }
  32. }
  33. }
  34. // The rule may have been switched off between reads.
  35. if ($row === null) return $next($request);
  36. return response()->json(Policy::failure($row, $platform, $language, $now) + ['timestamp' => $now])->header('Cache-Control', 'no-store');
  37. }
  38. }