main/app/api.php
2024-11-22 17:41:07 -03:00

109 lines
3 KiB
PHP

<?php
/**
* API para análise de URLs
*
* Este arquivo implementa um endpoint REST que recebe URLs via GET
* e retorna resultados processados em formato JSON.
*
* Funcionalidades:
* - Validação de URLs
* - Análise de conteúdo
* - Tratamento de erros
* - Suporte a CORS
*/
require_once 'config.php';
require_once 'inc/URLAnalyzer.php';
// Define o tipo de conteúdo como JSON
header('Content-Type: application/json');
// Habilita CORS (Cross-Origin Resource Sharing)
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET');
// Obtém a URL da requisição a partir do path
$path = $_SERVER['REQUEST_URI'];
$prefix = '/api/';
if (strpos($path, $prefix) === 0) {
$url = urldecode(substr($path, strlen($prefix)));
/**
* Função para enviar resposta JSON padronizada
*
* @param array $data Dados a serem enviados na resposta
* @param int $statusCode Código de status HTTP
*/
function sendResponse($data, $statusCode = 200) {
http_response_code($statusCode);
$response = [
'status' => $statusCode
];
if (isset($data['error'])) {
$response['error'] = $data['error'];
} else if (isset($data['url'])) {
$response['url'] = $data['url'];
}
echo json_encode($response);
exit;
}
// Validação básica da URL
if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) {
sendResponse([
'error' => [
'code' => 'INVALID_URL',
'message' => MESSAGES['INVALID_URL']['message']
]
], 400);
}
try {
// Instancia o analisador de URLs
$analyzer = new URLAnalyzer();
// Tenta analisar a URL fornecida
$analyzer->analyze($url);
// Se a análise for bem-sucedida, retorna a URL processada
sendResponse([
'url' => SITE_URL . '/p/' . $url
], 200);
} catch (Exception $e) {
// Tratamento de erros com mapeamento para códigos HTTP apropriados
$message = $e->getMessage();
$statusCode = 400;
$errorCode = 'GENERIC_ERROR';
// Mapeia a mensagem de erro para o código e status apropriados
foreach (MESSAGES as $key => $value) {
if (strpos($message, $value['message']) !== false) {
$statusCode = ($value['type'] === 'error') ? 400 : 503;
$errorCode = $key;
break;
}
}
// Adiciona header de erro para melhor tratamento no cliente
header('X-Error-Message: ' . $message);
sendResponse([
'error' => [
'code' => $errorCode,
'message' => $message
]
], $statusCode);
}
} else {
// Retorna erro 404 para endpoints não encontrados
sendResponse([
'error' => [
'code' => 'NOT_FOUND',
'message' => MESSAGES['NOT_FOUND']['message']
]
], 404);
}