root(); $routes = [ ['name' => 'base', 'method' => 'GET', 'path' => '/', 'auth' => 'Sem JWT', 'type' => 'open'], ['name' => 'health', 'method' => 'GET', 'path' => '/health', 'auth' => 'Sem JWT', 'type' => 'open'], ['name' => 'api_health', 'method' => 'GET', 'path' => '/api/health', 'auth' => 'Sem JWT', 'type' => 'open'], ['name' => 'health_check_key', 'method' => 'GET', 'path' => '/api/health-check-key', 'auth' => 'Sem JWT', 'type' => 'open'], ['name' => 'health_check_db', 'method' => 'GET', 'path' => '/api/health-check-db', 'auth' => 'Sem JWT', 'type' => 'open'], ['name' => 'health_check_token', 'method' => 'GET', 'path' => '/api/health-check-token', 'auth' => 'Bearer para diagnostico', 'type' => 'diagnostic'], ['name' => 'ranking_semanal', 'method' => 'GET', 'path' => '/api/v1/rankings/weekly', 'auth' => 'JWT obrigatorio', 'type' => 'jwt'], ['name' => 'ranking_mensal', 'method' => 'GET', 'path' => '/api/v1/rankings/monthly', 'auth' => 'JWT obrigatorio', 'type' => 'jwt'], ['name' => 'ranking_anual', 'method' => 'GET', 'path' => '/api/v1/rankings/yearly', 'auth' => 'JWT obrigatorio', 'type' => 'jwt'], ['name' => 'ranking_plataforma', 'method' => 'GET', 'path' => '/api/v1/rankings/platforms/Steam', 'auth' => 'JWT obrigatorio', 'type' => 'jwt'], ['name' => 'historico_jogador', 'method' => 'GET', 'path' => '/api/v1/rankings/history/1', 'auth' => 'JWT obrigatorio', 'type' => 'jwt'], ['name' => 'mais_jogados', 'method' => 'GET', 'path' => '/api/v1/games/most-played', 'auth' => 'JWT obrigatorio', 'type' => 'jwt'], ]; $cards = collect($routes)->map(function (array $route) use ($baseUrl) { $url = $baseUrl . ($route['path'] === '/' ? '' : $route['path']); $authClass = match ($route['type']) { 'jwt' => 'auth-jwt', 'diagnostic' => 'auth-diagnostic', default => 'auth-open', }; return sprintf( '
%s

%s

%s
%s
', e($route['method']), e($route['name']), $authClass, e($route['auth']), e($url), e($url), ); })->implode(''); return response(<< API Ranking Jogos

API RANKING JOGOS

Menu de navegacao - rotas GET disponiveis

Status: ok Service: api-ranking-jogos
{$cards}
HTML); }); Route::get('/health', function () { return response()->json(['status' => 'ok']); }); Route::get('/health-check-key', function () { $rawPublicKey = (string) config('jwt.public_key'); $formattedPublicKey = trim($rawPublicKey); if ( (str_starts_with($formattedPublicKey, '"') && str_ends_with($formattedPublicKey, '"')) || (str_starts_with($formattedPublicKey, "'") && str_ends_with($formattedPublicKey, "'")) ) { $formattedPublicKey = substr($formattedPublicKey, 1, -1); } $formattedPublicKey = trim(str_replace(['\\r\\n', '\\n', '\\r', "\r\n", "\r"], "\n", $formattedPublicKey)); $pemType = null; $bodyLength = null; if (preg_match('/-----BEGIN ([A-Z ]*PUBLIC KEY)-----(.*?)-----END \1-----/s', $formattedPublicKey, $matches)) { $pemType = $matches[1]; $body = preg_replace('/[^A-Za-z0-9+\/=]/', '', $matches[2]); $bodyLength = strlen($body); $formattedPublicKey = "-----BEGIN {$pemType}-----\n" . chunk_split($body, 64, "\n") . "-----END {$pemType}-----\n"; } elseif (preg_match('/-----BEGIN ([A-Z ]*PUBLIC KEY)-----(.*)/s', $formattedPublicKey, $matches)) { $pemType = $matches[1]; $bodySource = preg_split('/-----END|END\s+(?:RSA\s+)?PUBLIC\s+KEY/i', $matches[2], 2)[0]; $body = preg_replace('/[^A-Za-z0-9+\/=]/', '', $bodySource); $bodyLength = strlen($body); if ($bodyLength > 100) { $formattedPublicKey = "-----BEGIN {$pemType}-----\n" . chunk_split($body, 64, "\n") . "-----END {$pemType}-----\n"; } } elseif (!str_contains($formattedPublicKey, '-----BEGIN')) { $body = preg_replace('/[^A-Za-z0-9+\/=]/', '', $formattedPublicKey); $bodyLength = strlen($body); if ($bodyLength > 100) { $pemType = 'PUBLIC KEY'; $formattedPublicKey = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($body, 64, "\n") . "-----END PUBLIC KEY-----\n"; } } while (openssl_error_string() !== false) { // Clear stale OpenSSL errors before testing the current key. } $publicKeyResource = openssl_pkey_get_public($formattedPublicKey); $openSslErrors = []; while (($error = openssl_error_string()) !== false) { $openSslErrors[] = $error; } return response()->json([ 'raw_key_empty' => $rawPublicKey === '', 'raw_key_length' => strlen($rawPublicKey), 'formatted_key_length' => strlen($formattedPublicKey), 'pem_type' => $pemType, 'pem_body_length' => $bodyLength, 'has_begin_marker' => str_contains($rawPublicKey, '-----BEGIN PUBLIC KEY-----'), 'has_rsa_begin_marker' => str_contains($rawPublicKey, '-----BEGIN RSA PUBLIC KEY-----'), 'has_end_marker' => str_contains($rawPublicKey, '-----END PUBLIC KEY-----'), 'has_rsa_end_marker' => str_contains($rawPublicKey, '-----END RSA PUBLIC KEY-----'), 'openssl_accepted' => $publicKeyResource !== false, 'openssl_errors' => $openSslErrors, ]); }); Route::get('/health-check-db', function () { try { $hasGamesTable = Schema::hasTable('games'); return response()->json([ 'connection' => config('database.default'), 'driver' => DB::connection()->getDriverName(), 'database' => DB::connection()->getDatabaseName(), 'games_table_exists' => $hasGamesTable, 'games_count' => $hasGamesTable ? DB::table('games')->count() : null, ]); } catch (Throwable $e) { return response()->json([ 'connection' => config('database.default'), 'error' => $e->getMessage(), ], 500); } });