Compare commits

..

4 Commits

Author SHA1 Message Date
eea515c805
+: token.class.php y cron/actualizar_tokens
token.class.php: creacion de clase y metodo para desctivar tokens todos
los tokens con fecha inferior a la del momento de ejecución.
actualizar_tokens.php: creación de archivo para ser llamado por 'cron'.
2023-03-26 21:14:03 -03:00
e34e1b37c0
recepción de datos del Header para metodo GET
html de referencia de uso de API en index.php
+css en assets/estilo.css
2023-03-26 01:13:49 -03:00
42771264b5
implementación de token para post, put, delete
Pendientes: update, y usar función actualizarToken
respuestas.class.php: agregada función error_401
2023-03-25 02:40:05 -03:00
1370cec5c3
edited: pacientes.php y pacientes.class.php
pacientes.php: manejo condición DELETE
pacientes.class.php: creación función DELETE y eliminarPaciente
2023-03-25 01:36:53 -03:00
8 changed files with 355 additions and 63 deletions

View File

@ -1,5 +1,12 @@
# Apuntes PHP REST API
Proyecto realizado con fines didácticos, con el propósito de comprender la
creación y funcionamiento de una API básica utilizando **Php** y **Apache**.
Además de servir de introducción los mismos.
Las clases, metodos y funciones creadas dentro de este proyecto cumplen este
propósito. No estan diseñadas para correr en un entorno de producción.
### Requerimientos
[MariaDB](https://mariadb.com/docs/), [Apache](https://httpd.apache.org/docs/)
@ -36,7 +43,9 @@ cd /var/www/
sudo ln -s $HOME/projects/apirest html
```
`/etc/apache2/apache2.conf`
Editar archivo de configuración de apache `sudoedit /etc/apache2/apache2.conf`
Agregar:
```apache
<Directory /var/www/>
@ -60,7 +69,7 @@ sudo systemctl restart apache2
> ¿Como mostrar errores en php? [stackoverflow](https://stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display).
Agregar la sgte. linea en `.htaccess`
Agregar la sgte. linea en archivo [.htaccess](./apirest_yt/.htaccess)
```apache
php_flag display_errors 1
@ -81,7 +90,8 @@ display_errors = On
## Inicio del proyecto
Crear y poblar base de datos, según archivo `./original/database/apirest.sql`.
Crear y poblar base de datos, según [archivo sql](./original/database/apirest.sql)
en `./original/database/apirest.sql`.
Crear archivo de configuración en la ruta `./<projecto>/clases/conexion/config`.
@ -99,11 +109,24 @@ Crear archivo de configuración en la ruta `./<projecto>/clases/conexion/config`
#### Creación de token
Combinación de 2 funciones de *php* para generar un *token* único en `<proyecto>/clases/auth.class.php`
Combinación de 2 funciones de *php* para generar un *token* único en [archivo](./apirest_yt/clases/auth.class.php)
`<proyecto>/clases/auth.class.php`.
- Función [bin2hex](https://www.php.net/manual/en/function.bin2hex.php) devuelve
un `string` *hexadecimal*.
un *string hexadecimal*.
- Función [openssl_random_pseudo_bytes](https://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php).
> [Metodos HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)
#### Desactivar tokens
Cron Job para cambiar estado de tokens a ***Inactivo***
Agregar tarea: `crontab -e`
ej. Ejecutar tarea cada 5 minutos.
```sh
# m h dom mon dow command
*/5 * * * * curl localhost/php_apirest/apirest_yt/cron/actualizar_tokens &>/dev/null
```

View File

@ -0,0 +1,63 @@
body{
color:black;
}
.container {
margin: 10px;
border: 1px solid #D0D0D0;
box-shadow: 0 0 8px #D0D0D0;
}
h1{
color: #444;
background-color: transparent;
border-bottom: 1px solid #D0D0D0;
font-size: 24px;
font-weight: normal;
margin: 0 0 14px 0;
padding: 14px 15px 10px 15px;
}
h2 {
display: block;
font-size: 1.5em;
-webkit-margin-before: 0.83em;
-webkit-margin-after: 0.83em;
-webkit-margin-start: 0px;
-webkit-margin-end: 0px;
font-weight: bold;
}
p {
display: block;
-webkit-margin-before: 1em;
-webkit-margin-after: 1em;
-webkit-margin-start: 0px;
-webkit-margin-end: 0px;
}
.divbody{
margin: 0 15px 0 15px;
}
p.divfooter {
text-align: right;
font-size: 16px;
border-top: 1px solid #D0D0D0;
line-height: 32px;
padding: 0 10px 0 10px;
margin: 20px 0 0 0;
}
code {
font-family: Consolas, Monaco, Courier New, Courier, monospace;
font-size: 16px;
background-color: #f9f9f9;
border: 1px solid #D0D0D0;
color: #002166;
display: block;
margin: 14px 0 14px 0;
padding: 12px 10px 12px 10px;
}

View File

@ -3,7 +3,6 @@ require_once 'conexion/conexion.php';
require_once 'clases/respuestas.class.php';
class pacientes extends conexion{
private $table = "pacientes";
private $pacienteid = "";
private $dni = "";
@ -14,12 +13,13 @@ class pacientes extends conexion{
private $telefono = "";
private $fecha_nacimiento = "0000-00-00";
private $correo = "";
private $token = "";
// 532c75dac0f7f4d311300302538ab49f
public function listaPacientes($pagina = 1){
// paginador
$inicio = 0;
$cantidad = 100;
$cantidad = 10;
if ($pagina > 1){
$inicio = ($cantidad * ($pagina - 1)) + 1;
$cantidad = $cantidad * $pagina;
@ -39,6 +39,14 @@ class pacientes extends conexion{
public function post($json){
$_respuestas = new respuestas;
$datos = json_decode($json, true);
// validación token
if (!isset($datos['token'])){
return $_respuestas->error_401();
} else {
$this->token = $datos['token'];
$arrayToken = $this->buscarToken();
if ($arrayToken){
if (!isset($datos['nombre']) || !isset($datos['dni']) || !isset($datos['correo'])){
return $_respuestas->error_400();
} else {
@ -61,6 +69,10 @@ class pacientes extends conexion{
return $_respuestas->error_500();
}
}
} else {
return $_respuestas->error_401("Token inválido o caducado");
}
}
}
private function insertarPaciente(){
@ -80,6 +92,14 @@ class pacientes extends conexion{
public function put($json){
$_respuestas = new respuestas;
$datos = json_decode($json, true);
// validación token
if (!isset($datos['token'])){
return $_respuestas->error_401();
} else {
$this->token = $datos['token'];
$arrayToken = $this->buscarToken();
if ($arrayToken){
if (!isset($datos['pacienteid'])){
return $_respuestas->error_400();
} else {
@ -105,6 +125,10 @@ class pacientes extends conexion{
return $_respuestas->error_500();
}
}
} else {
return $_respuestas->error_401("Token inválido o caducado");
}
}
}
private function modificarPaciente(){
@ -122,6 +146,72 @@ class pacientes extends conexion{
}
}
public function delete($json){
$_respuestas = new respuestas;
$datos = json_decode($json, true);
// validación token
if (!isset($datos['token'])){
return $_respuestas->error_401();
} else {
$this->token = $datos['token'];
$arrayToken = $this->buscarToken();
if ($arrayToken){
if (!isset($datos['pacienteid'])){
return $_respuestas->error_400();
} else {
$this->pacienteid = $datos['pacienteid'];
$resp = $this->eliminarPaciente();
if ($resp){
$respuesta = $_respuestas->response;
$respuesta['result'] = array(
//'filas_afectadas' => $resp,
'pacienteid' => $this->pacienteid
);
return $respuesta;
} else {
return $_respuestas->error_500();
}
}
} else {
return $_respuestas->error_401("Token inválido o caducado");
}
}
}
private function eliminarPaciente(){
$query = "DELETE FROM $this->table WHERE PacienteId = '$this->pacienteid'";
$resp = parent::nonQuery($query);
if ($resp >= 1){
return $resp;
} else {
return 0;
}
}
private function buscarToken(){
$query = "SELECT TokenId,UsuarioId,Estado FROM usuarios_token
WHERE Token = '$this->token' AND Estado = 'Activo'";
$resp = parent::obtenerDatos($query);
if ($resp){
return $resp;
} else {
return 0;
}
}
// Sin implementación
//private function actualizarToken($tokenid){
// $date = date("Y m d H:i");
// $query = "UPDATE usuarios_token SET Fecha = '$date'
// WHERE TokenId = '$tokenid'";
// $resp = parent::nonQuery($query);
// if ($resp >= 1){
// return $resp;
// } else {
// return 0;
// }
//}
}
?>

View File

@ -42,6 +42,14 @@ class respuestas{
return $this->response;
}
public function error_401($mensaje = "No autorizado"){
$this->response['status'] = "error";
$this->response['result'] = array(
"error_id" => "401",
"error_msg" => $mensaje
);
return $this->response;
}
}
?>

View File

@ -0,0 +1,16 @@
<?php
require_once 'conexion/conexion.php';
class token extends conexion{
public function actualizarToken($fecha){
$query = "UPDATE usuarios_token SET Estado = 'Inactivo'
WHERE Fecha < '$fecha' AND Estado = 'Activo'";
$verificar = parent::nonQuery(($query));
if ($verificar > 0){
return 1;
} else {
return 0;
}
}
}
?>

View File

@ -0,0 +1,8 @@
<?php
require_once '../clases/token.class.php';
$_token = new token;
$fecha = date('Y-m-d H:i');
echo $_token->actualizarToken($fecha);
?>

View File

@ -1,20 +1,83 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API de Prueba</title>
<link rel="stylesheet" href="assets/estilo.css" type="text/css">
</head>
<?php
echo "INDEX.php".'</br>';
// echo "INDEX.php".'</br>';
require_once "clases/conexion/conexion.php";
// require_once "clases/conexion/conexion.php";
// $conector = new conexion;
// $conector->test_conector();
$conector = new conexion;
#$conector->test_conector();
// Prueba Select
#$query = "SELECT * FROM pacientes";
#echo '<pre>'; print_r($conector->obtenerDatos($query)); echo '</pre>';
// Prueba insert
#$query = "INSERT INTO pacientes (DNI)value('0')";
#echo '<pre>'; print_r($conector->nonQuery($query)); echo '</pre>';
#$query = "INSERT INTO pacientes (DNI)value('1')";
#echo '<pre>'; print_r($conector->nonQueryId($query)); echo '</pre>';
// # Prueba Select
// $query = "SELECT * FROM pacientes";
// echo '<pre>'; print_r($conector->obtenerDatos($query)); echo '</pre>';
// # Prueba insert
// $query = "INSERT INTO pacientes (DNI)value('0')";
// echo '<pre>'; print_r($conector->nonQuery($query)); echo '</pre>';
// $query = "INSERT INTO pacientes (DNI)value('1')";
// echo '<pre>'; print_r($conector->nonQueryId($query)); echo '</pre>';
?>
<!-- Space char "&nbsp;" -->
<body>
<div class="container">
<h1>Api de Prueba</h1>
<div class="divbody">
<h3>Auth - login</h3>
<code>
POST /auth</br>
{</br>
&nbsp;&nbsp;"usuario" :"", -> REQUERIDO</br>
&nbsp;&nbsp;"password": "" -> REQUERIDO</br>
}
</code>
</div>
<div class="divbody">
<h3>Pacientes</h3>
<code>
GET /pacientes?page=$numeroPagina</br>
GET /pacientes?id=$idPaciente
</code>
<code>
POST /pacientes</br>
{</br>
&nbsp;&nbsp;"nombre" : "", -> REQUERIDO</br>
&nbsp;&nbsp;"dni" : "", -> REQUERIDO</br>
&nbsp;&nbsp;"correo":"", -> REQUERIDO</br>
&nbsp;&nbsp;"codigoPostal" :"",</br>
&nbsp;&nbsp;"genero" : "",</br>
&nbsp;&nbsp;"telefono" : "",</br>
&nbsp;&nbsp;"fechaNacimiento" : "",</br>
&nbsp;&nbsp;"token" : "" -> REQUERIDO</br>
}
</code>
<code>
PUT /pacientes</br>
{</br>
&nbsp;&nbsp;"nombre" : "",</br>
&nbsp;&nbsp;"dni" : "",</br>
&nbsp;&nbsp;"correo":"",</br>
&nbsp;&nbsp;"codigoPostal" :"",</br>
&nbsp;&nbsp;"genero" : "",</br>
&nbsp;&nbsp;"telefono" : "",</br>
&nbsp;&nbsp;"fechaNacimiento" : "",</br>
&nbsp;&nbsp;"token" : "" , -> REQUERIDO</br>
&nbsp;&nbsp;"pacienteId" : "" -> REQUERIDO</br>
}
</code>
<code>
DELETE /pacientes</br>
{</br>
&nbsp;&nbsp;"token" : "", -> REQUERIDO</br>
&nbsp;&nbsp;"pacienteId" : "" -> REQUERIDO</br>
}
</code>
</div>
</div>
</body>
</html>

View File

@ -51,7 +51,28 @@ if ($_SERVER['REQUEST_METHOD'] == "GET"){
echo json_encode($datosArray);
} else if ($_SERVER['REQUEST_METHOD'] == "DELETE"){
echo "hola DELETE";
// recepción de datos
$headers = getallheaders();
if (isset($headers['token']) && isset($headers['pacienteid'])){
$datos_header = [
"token" => $headers["token"],
"pacienteid" => $headers["pacienteid"]
];
$datos = json_encode($datos_header);
} else {
$datos = file_get_contents("php://input");
}
// envio de datos al manejador
$datosArray = $_pacientes->delete($datos);
// devolucion de respuesta
if(isset($datosArray["result"]["error_id"])){
$responseCode = $datosArray["result"]["error_id"];
http_response_code($responseCode);
}else{
http_response_code(200);
}
echo json_encode($datosArray);
} else {
$datosArray = $_respuestas->error_405();