From 4f9ea1dbfd4d6038eed3f44d2512277a4846aa77 Mon Sep 17 00:00:00 2001 From: devfzn Date: Fri, 24 Mar 2023 12:41:27 -0300 Subject: [PATCH] init php rest api --- .gitignore | 2 + .htaccess | 1 + README.md | 98 ++++++++++ apirest_yt/.htaccess | 19 ++ apirest_yt/auth.php | 29 +++ apirest_yt/clases/auth.class.php | 68 +++++++ apirest_yt/clases/conexion/conexion.php | 102 +++++++++++ apirest_yt/clases/respuestas.class.php | 37 ++++ apirest_yt/index.php | 20 ++ imgs/firefox_rested_extension.png | Bin 0 -> 97940 bytes original/.htaccess | 19 ++ original/assets/estilo.css | 63 +++++++ original/auth.php | 29 +++ original/clases/auth.class.php | 86 +++++++++ original/clases/conexion/conexion.php | 92 ++++++++++ original/clases/pacientes.class.php | 232 ++++++++++++++++++++++++ original/clases/respuestas.class.php | 63 +++++++ original/clases/token.class.php | 42 +++++ original/cron/actualizar_tokens.php | 6 + original/cron/registros/registros.txt | 4 + original/database/apirest.sql | 181 ++++++++++++++++++ original/index.php | 105 +++++++++++ original/pacientes.php | 90 +++++++++ 23 files changed, 1388 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 README.md create mode 100644 apirest_yt/.htaccess create mode 100644 apirest_yt/auth.php create mode 100644 apirest_yt/clases/auth.class.php create mode 100644 apirest_yt/clases/conexion/conexion.php create mode 100644 apirest_yt/clases/respuestas.class.php create mode 100644 apirest_yt/index.php create mode 100644 imgs/firefox_rested_extension.png create mode 100644 original/.htaccess create mode 100644 original/assets/estilo.css create mode 100644 original/auth.php create mode 100644 original/clases/auth.class.php create mode 100644 original/clases/conexion/conexion.php create mode 100644 original/clases/pacientes.class.php create mode 100644 original/clases/respuestas.class.php create mode 100644 original/clases/token.class.php create mode 100644 original/cron/actualizar_tokens.php create mode 100644 original/cron/registros/registros.txt create mode 100644 original/database/apirest.sql create mode 100644 original/index.php create mode 100644 original/pacientes.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..191cbbf --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +pruebas/ +config diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..ed19066 --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ +RedirectMatch 404 /\.git diff --git a/README.md b/README.md new file mode 100644 index 0000000..5626e87 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# Apuntes PHP REST API + +### Requerimientos + +[MariaDB](https://mariadb.com/docs/), [Apache](https://httpd.apache.org/docs/) +y [PHP](https://www.php.net/docs.php). Opcional +[PhpMyAdmin](https://docs.phpmyadmin.net/en/latest/) + +```sh +sudo apt install mariadb-server apache2 php-mysql python3-mysqldb php php-cli \ + php-curl php-gd php-json php-mbstring php-mysql php-zip + +# opcional +sudo apt install phpmyadmin +``` + +```sh +sudo systemctl enable mysql +``` + +### Configuracion Apache2 + +#### Agregar user a www-data + +```sh +sudo usermod -a -G www-data $USER +``` + +#### Crear regla + +Ejemplo usando symlink `html` a `$HOME/projects/apirest` en vez de usar el +directorio `/var/www/html`. + +```sh +cd /var/www/ +sudo ln -s $HOME/projects/apirest html +``` + +`/etc/apache2/apache2.conf` + +```apache + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + +# Para usar phpmyadmin, agregar al final +Include /etc/phpmyadmin/apache.conf +``` + +#### Activar modulo rewrite + +Para usar `.htaccess` específico del proyecto. + +```sh +sudo a2enmod rewrite +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` + +```apache +php_flag display_errors 1 +``` + +O modifcar el/los parametro(s) en `/etc/php/8.1/php.ini` + +```apache +error_reporting = E_ALL +display_errors = On +``` + +#### Extension RESTED para Firefox + +![img](./imgs/firefox_rested_extension.png) + +---- + +### Inicio del proyecto + +Crear y poblar base de datos, según archivo `./original/database/apirest.sql`. + +Crear archivo de configuración en la ruta `.//clases/conexion/config`. + +```json +{ + "conexion":{ + "server" : "127.0.0.1", + "user" : "", + "password" : "", + "database" : "apirest", + "port" : "3306" + } +} +``` diff --git a/apirest_yt/.htaccess b/apirest_yt/.htaccess new file mode 100644 index 0000000..4263238 --- /dev/null +++ b/apirest_yt/.htaccess @@ -0,0 +1,19 @@ +php_flag display_errors 1 + +FallbackResource /index.php +RewriteEngine On + +# Si el archivo existe no es necesario especificar extension ".php" +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.php -f +RewriteRule ^(.*)$ $1.php + +# Si el archivo existe no es necesario especificar extension ".html" +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^(.*)$ $1.html + +# Si la ruta no existe redirige al index +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.+?)/?$ index.php?url=$1 [L,QSA] diff --git a/apirest_yt/auth.php b/apirest_yt/auth.php new file mode 100644 index 0000000..f315df6 --- /dev/null +++ b/apirest_yt/auth.php @@ -0,0 +1,29 @@ +login($postBody); + // respuesta + header('Content-Type: application/json'); + 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{ + header('Content-Type: application/json'); + $datosArray = $_respuestas->error_405(); + echo json_encode($datosArray); +} + +?> diff --git a/apirest_yt/clases/auth.class.php b/apirest_yt/clases/auth.class.php new file mode 100644 index 0000000..d29d97a --- /dev/null +++ b/apirest_yt/clases/auth.class.php @@ -0,0 +1,68 @@ +error_400(); + } else { + // echo "ok"; + $usuario = $datos['usuario']; + $password = $datos['password']; + $datos = $this->obtenerDatosUsuario($usuario); + if ($datos){ + // Usuario existe + //print_r($datos); + } else { + // Usuario no existe + //echo "Usuario no existe"; + // return $_respuestas->error_400(); + return $_respuestas->error_200("No existe el usuario $usuario"); + } + } + } + + private function obtenerDatosUsuario($correo){ + $query = "SELECT UsuarioID,Password,Estado FROM usuarios WHERE Usuario = '$correo'"; + # Llamado a método de clase padre + $datos = parent::obtenerDatos($query); + if(isset($datos[0]["UsuarioID"])){ + return $datos; + } else { + return 0; + } + } + +} + +?> + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apirest_yt/clases/conexion/conexion.php b/apirest_yt/clases/conexion/conexion.php new file mode 100644 index 0000000..3bf1aca --- /dev/null +++ b/apirest_yt/clases/conexion/conexion.php @@ -0,0 +1,102 @@ +debug){ echo '
'."En constructor clase conexion".'
'; } + + $listadatos = $this->datosConexion(); + foreach ($listadatos as $key => $value) { + $this->server = $value['server']; + $this->user = $value['user']; + $this->password = $value['password']; + $this->database = $value['database']; + $this->port = $value['port']; + } + + if ($this->debug){ echo "datos constructor: SERVER: $this->server, USER: $this->user, + PASS: $this->password, DB: $this->database, PORT: $this->port".'
';} + + if ($this->debug){ echo '
'."pre conector".'
'; } + try { + $conn = new mysqli("$this->server","$this->user","$this->password","$this->database","$this->port"); + $this->conector = $conn; + if ($this->debug){ echo "todo BIEN con la conexion"; } + } catch (Exception $e) { + echo '
'."Error al intentar conectar con base de datos!".'
'; + echo "connect_errno: [$conn->connect_errno]".'
'; + echo "connect_error: [$conn->connect_error]".'
'; + echo "Exception: $e".'
'; + die(); + } + if ($this->debug){ echo '
'."post conector".'
'; } + + } + + private function datosConexion(){ + if ($this->debug){ echo '
'."En funcion datosConexion".'
'; } + + $ruta = dirname(__FILE__); + $jsondata = file_get_contents($ruta . "/" . "config"); + + if ($this->debug){ echo '
'."Ruta: $ruta".'
'.'
'; print_r($jsondata); echo '
'.'
'; } + + return json_decode($jsondata, true); + } + + private function convertirUTF8($array){ + if ($this->debug){ echo '
'."En funcion convertirUTF8".'
'; } + array_walk_recursive($array,function(&$item,$key){ + if(!mb_detect_encoding($item,'utf-8',true)){ + $item = utf8_encode($item); + } + }); + return $array; + } + + public function obtenerDatos($query){ + if ($this->debug){ echo '
'."En funcion obtenerDatos".'
'; } + $results = $this->conector->query($query); + $resultsArray = array(); + foreach ($results as $value) { + $resultsArray[] = $value; + } + if ($this->debug){ echo '
'; print_r($resultsArray); echo '
'.'
'; } + return $this->convertirUTF8($resultsArray); + } + + public function test_conector(){ + echo '
'."Funcion test_conector".'
'; + } + + public function nonQuery($sqlstr){ + $results = $this->conector->query($sqlstr); + #return $results->affected_rows; + return $this->conector->affected_rows; + } + + // INSERT + public function nonQueryId($sqlstr){ + $results = $this->conector->query($sqlstr); + $filas = $this->conector->affected_rows; + if ($filas >= 1){ + #return $results->insert_id; + return $this->conector->insert_id; + } else { + return 0; + } + } +} +?> + + + diff --git a/apirest_yt/clases/respuestas.class.php b/apirest_yt/clases/respuestas.class.php new file mode 100644 index 0000000..b7c2e3b --- /dev/null +++ b/apirest_yt/clases/respuestas.class.php @@ -0,0 +1,37 @@ + "ok", + "result" => array() + ]; + + public function error_405(){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "405", + "error_msg" => "Metodo no permitido" + ); + return $this->response; + } + + public function error_200($mensaje = "Datos incorrectos"){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "200", + "error_msg" => $mensaje + ); + return $this->response; + } + + public function error_400(){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "400", + "error_msg" => "Datos recibidos incompletos o formato erroneo" + ); + return $this->response; + } +} + +?> diff --git a/apirest_yt/index.php b/apirest_yt/index.php new file mode 100644 index 0000000..e7d88d7 --- /dev/null +++ b/apirest_yt/index.php @@ -0,0 +1,20 @@ +'; + +require_once "clases/conexion/conexion.php"; + +$conector = new conexion; + +#$conector->test_conector(); + +// Prueba Select +#$query = "SELECT * FROM pacientes"; +#echo '
'; print_r($conector->obtenerDatos($query)); echo '
'; + +// Prueba insert +#$query = "INSERT INTO pacientes (DNI)value('0')"; +#echo '
'; print_r($conector->nonQuery($query)); echo '
'; +#$query = "INSERT INTO pacientes (DNI)value('1')"; +#echo '
'; print_r($conector->nonQueryId($query)); echo '
'; + +?> diff --git a/imgs/firefox_rested_extension.png b/imgs/firefox_rested_extension.png new file mode 100644 index 0000000000000000000000000000000000000000..1ffaf6fc7d50d0dcec36240939c9fdfc2f5215bb GIT binary patch literal 97940 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 z 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

QI=sKY|+4VHD;_OupTC>vn;)2oP69)*P<~1Q1 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 WoBnL&|B^lo%OeeKAoSkzkpBT6PU{^2 literal 0 HcmV?d00001 diff --git a/original/.htaccess b/original/.htaccess new file mode 100644 index 0000000..6f5672f --- /dev/null +++ b/original/.htaccess @@ -0,0 +1,19 @@ +#php_flag display_errors 1 +RewriteEngine On + +# esta lineas son para quitar la ext .php +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.php -f +RewriteRule ^(.*)$ $1.php + +# esta lineas son para quitar la ext .html +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME}.html -f +RewriteRule ^(.*)$ $1.html + + +# Si la ruta no es un archivo existente, ni una carpeta +# Reescribir al index +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.+?)/?$ index.php?url=$1 [L,QSA] diff --git a/original/assets/estilo.css b/original/assets/estilo.css new file mode 100644 index 0000000..4d2228a --- /dev/null +++ b/original/assets/estilo.css @@ -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; + } \ No newline at end of file diff --git a/original/auth.php b/original/auth.php new file mode 100644 index 0000000..82ccc8b --- /dev/null +++ b/original/auth.php @@ -0,0 +1,29 @@ +login($postBody); + //delvolvemos una respuesta + header('Content-Type: application/json'); + 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{ + header('Content-Type: application/json'); + $datosArray = $_respuestas->error_405(); + echo json_encode($datosArray); +} + +?> diff --git a/original/clases/auth.class.php b/original/clases/auth.class.php new file mode 100644 index 0000000..95632cc --- /dev/null +++ b/original/clases/auth.class.php @@ -0,0 +1,86 @@ +error_400(); + }else{ + //todo esta bien + $usuario = $datos['usuario']; + $password = $datos['password']; + $password = parent::encriptar($password); + $datos = $this->obtenerDatosUsuario($usuario); + if($datos){ + //verificar si la contraseña es igual + if($password == $datos[0]['Password']){ + if($datos[0]['Estado'] == "Activo"){ + //crear el token + $verificar = $this->insertarToken($datos[0]['UsuarioId']); + if($verificar){ + // si se guardo + $result = $_respustas->response; + $result["result"] = array( + "token" => $verificar + ); + return $result; + }else{ + //error al guardar + return $_respustas->error_500("Error interno, No hemos podido guardar"); + } + }else{ + //el usuario esta inactivo + return $_respustas->error_200("El usuario esta inactivo"); + } + }else{ + //la contraseña no es igual + return $_respustas->error_200("El password es invalido"); + } + }else{ + //no existe el usuario + return $_respustas->error_200("El usuaro $usuario no existe "); + } + } + } + + + + private function obtenerDatosUsuario($correo){ + $query = "SELECT UsuarioId,Password,Estado FROM usuarios WHERE Usuario = '$correo'"; + $datos = parent::obtenerDatos($query); + if(isset($datos[0]["UsuarioId"])){ + return $datos; + }else{ + return 0; + } + } + + + private function insertarToken($usuarioid){ + $val = true; + $token = bin2hex(openssl_random_pseudo_bytes(16,$val)); + $date = date("Y-m-d H:i"); + $estado = "Activo"; + $query = "INSERT INTO usuarios_token (UsuarioId,Token,Estado,Fecha)VALUES('$usuarioid','$token','$estado','$date')"; + $verifica = parent::nonQuery($query); + if($verifica){ + return $token; + }else{ + return 0; + } + } + + +} + + + + +?> \ No newline at end of file diff --git a/original/clases/conexion/conexion.php b/original/clases/conexion/conexion.php new file mode 100644 index 0000000..41faf80 --- /dev/null +++ b/original/clases/conexion/conexion.php @@ -0,0 +1,92 @@ +datosConexion(); + foreach ($listadatos as $key => $value) { + $this->server = $value['server']; + $this->user = $value['user']; + $this->password = $value['password']; + $this->database = $value['database']; + $this->port = $value['port']; + } + $this->conexion = new mysqli($this->server,$this->user,$this->password,$this->database,$this->port); + if($this->conexion->connect_errno){ + echo "algo va mal con la conexion"; + die(); + } + + } + + private function datosConexion(){ + $direccion = dirname(__FILE__); + $jsondata = file_get_contents($direccion . "/" . "config"); + return json_decode($jsondata, true); + } + + + private function convertirUTF8($array){ + array_walk_recursive($array,function(&$item,$key){ + if(!mb_detect_encoding($item,'utf-8',true)){ + $item = utf8_encode($item); + } + }); + return $array; + } + + + public function obtenerDatos($sqlstr){ + $results = $this->conexion->query($sqlstr); + $resultArray = array(); + foreach ($results as $key) { + $resultArray[] = $key; + } + return $this->convertirUTF8($resultArray); + + } + + + + public function nonQuery($sqlstr){ + $results = $this->conexion->query($sqlstr); + return $this->conexion->affected_rows; + } + + + //INSERT + public function nonQueryId($sqlstr){ + $results = $this->conexion->query($sqlstr); + $filas = $this->conexion->affected_rows; + if($filas >= 1){ + return $this->conexion->insert_id; + }else{ + return 0; + } + } + + //encriptar + + protected function encriptar($string){ + return md5($string); + } + + + + + +} + + + +?> \ No newline at end of file diff --git a/original/clases/pacientes.class.php b/original/clases/pacientes.class.php new file mode 100644 index 0000000..0426cb5 --- /dev/null +++ b/original/clases/pacientes.class.php @@ -0,0 +1,232 @@ + 1){ + $inicio = ($cantidad * ($pagina - 1)) +1 ; + $cantidad = $cantidad * $pagina; + } + $query = "SELECT PacienteId,Nombre,DNI,Telefono,Correo FROM " . $this->table . " limit $inicio,$cantidad"; + $datos = parent::obtenerDatos($query); + return ($datos); + } + + public function obtenerPaciente($id){ + $query = "SELECT * FROM " . $this->table . " WHERE PacienteId = '$id'"; + return parent::obtenerDatos($query); + + } + + public function post($json){ + $_respuestas = new respuestas; + $datos = json_decode($json,true); + + 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{ + $this->nombre = $datos['nombre']; + $this->dni = $datos['dni']; + $this->correo = $datos['correo']; + if(isset($datos['telefono'])) { $this->telefono = $datos['telefono']; } + if(isset($datos['direccion'])) { $this->direccion = $datos['direccion']; } + if(isset($datos['codigoPostal'])) { $this->codigoPostal = $datos['codigoPostal']; } + if(isset($datos['genero'])) { $this->genero = $datos['genero']; } + if(isset($datos['fechaNacimiento'])) { $this->fechaNacimiento = $datos['fechaNacimiento']; } + $resp = $this->insertarPaciente(); + if($resp){ + $respuesta = $_respuestas->response; + $respuesta["result"] = array( + "pacienteId" => $resp + ); + return $respuesta; + }else{ + return $_respuestas->error_500(); + } + } + + }else{ + return $_respuestas->error_401("El Token que envio es invalido o ha caducado"); + } + } + + + + + } + + + private function insertarPaciente(){ + $query = "INSERT INTO " . $this->table . " (DNI,Nombre,Direccion,CodigoPostal,Telefono,Genero,FechaNacimiento,Correo) + values + ('" . $this->dni . "','" . $this->nombre . "','" . $this->direccion ."','" . $this->codigoPostal . "','" . $this->telefono . "','" . $this->genero . "','" . $this->fechaNacimiento . "','" . $this->correo . "')"; + $resp = parent::nonQueryId($query); + if($resp){ + return $resp; + }else{ + return 0; + } + } + + public function put($json){ + $_respuestas = new respuestas; + $datos = json_decode($json,true); + + 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']; + if(isset($datos['nombre'])) { $this->nombre = $datos['nombre']; } + if(isset($datos['dni'])) { $this->dni = $datos['dni']; } + if(isset($datos['correo'])) { $this->correo = $datos['correo']; } + if(isset($datos['telefono'])) { $this->telefono = $datos['telefono']; } + if(isset($datos['direccion'])) { $this->direccion = $datos['direccion']; } + if(isset($datos['codigoPostal'])) { $this->codigoPostal = $datos['codigoPostal']; } + if(isset($datos['genero'])) { $this->genero = $datos['genero']; } + if(isset($datos['fechaNacimiento'])) { $this->fechaNacimiento = $datos['fechaNacimiento']; } + + $resp = $this->modificarPaciente(); + if($resp){ + $respuesta = $_respuestas->response; + $respuesta["result"] = array( + "pacienteId" => $this->pacienteid + ); + return $respuesta; + }else{ + return $_respuestas->error_500(); + } + } + + }else{ + return $_respuestas->error_401("El Token que envio es invalido o ha caducado"); + } + } + + + } + + + private function modificarPaciente(){ + $query = "UPDATE " . $this->table . " SET Nombre ='" . $this->nombre . "',Direccion = '" . $this->direccion . "', DNI = '" . $this->dni . "', CodigoPostal = '" . + $this->codigoPostal . "', Telefono = '" . $this->telefono . "', Genero = '" . $this->genero . "', FechaNacimiento = '" . $this->fechaNacimiento . "', Correo = '" . $this->correo . + "' WHERE PacienteId = '" . $this->pacienteid . "'"; + $resp = parent::nonQuery($query); + if($resp >= 1){ + return $resp; + }else{ + return 0; + } + } + + + public function delete($json){ + $_respuestas = new respuestas; + $datos = json_decode($json,true); + + 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( + "pacienteId" => $this->pacienteid + ); + return $respuesta; + }else{ + return $_respuestas->error_500(); + } + } + + }else{ + return $_respuestas->error_401("El Token que envio es invalido o ha 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; + } + } + + + 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; + } + } + + + +} + + + + + +?> \ No newline at end of file diff --git a/original/clases/respuestas.class.php b/original/clases/respuestas.class.php new file mode 100644 index 0000000..5b4c5a8 --- /dev/null +++ b/original/clases/respuestas.class.php @@ -0,0 +1,63 @@ + "ok", + "result" => array() + ]; + + + public function error_405(){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "405", + "error_msg" => "Metodo no permitido" + ); + return $this->response; + } + + public function error_200($valor = "Datos incorrectos"){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "200", + "error_msg" => $valor + ); + return $this->response; + } + + + public function error_400(){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "400", + "error_msg" => "Datos enviados incompletos o con formato incorrecto" + ); + return $this->response; + } + + + public function error_500($valor = "Error interno del servidor"){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "500", + "error_msg" => $valor + ); + return $this->response; + } + + + public function error_401($valor = "No autorizado"){ + $this->response['status'] = "error"; + $this->response['result'] = array( + "error_id" => "401", + "error_msg" => $valor + ); + return $this->response; + } + + + +} + +?> diff --git a/original/clases/token.class.php b/original/clases/token.class.php new file mode 100644 index 0000000..c63e784 --- /dev/null +++ b/original/clases/token.class.php @@ -0,0 +1,42 @@ +escribirEntrada($verifica); + return $verifica; + }else{ + return 0; + } + } + + function crearTxt($direccion){ + $archivo = fopen($direccion, 'w') or die ("error al crear el archivo de registros"); + $texto = "------------------------------------ Registros del CRON JOB ------------------------------------ \n"; + fwrite($archivo,$texto) or die ("no pudimos escribir el registro"); + fclose($archivo); + } + + function escribirEntrada($registros){ + $direccion = "../cron/registros/registros.txt"; + if(!file_exists($direccion)){ + $this->crearTxt($direccion); + } + /* crear una entrada nueva */ + $this->escribirTxt($direccion, $registros); + } + + function escribirTxt($direccion, $registros){ + $date = date("Y-m-d H:i"); + $archivo = fopen($direccion, 'a') or die ("error al abrir el archivo de registros"); + $texto = "Se modificaron $registros registro(s) el dia [$date] \n"; + fwrite($archivo,$texto) or die ("no pudimos escribir el registro"); + fclose($archivo); + } +} + +?> \ No newline at end of file diff --git a/original/cron/actualizar_tokens.php b/original/cron/actualizar_tokens.php new file mode 100644 index 0000000..578bd18 --- /dev/null +++ b/original/cron/actualizar_tokens.php @@ -0,0 +1,6 @@ +actualizarTokens($fecha); +?> \ No newline at end of file diff --git a/original/cron/registros/registros.txt b/original/cron/registros/registros.txt new file mode 100644 index 0000000..223ff88 --- /dev/null +++ b/original/cron/registros/registros.txt @@ -0,0 +1,4 @@ +------------------------------------ Registros del CRON JOB ------------------------------------ +Se modificaron -1 el dia [2020-10-18 16:36] +Se modificaron 3 el dia [2020-10-18 16:39] +Se modificaron 2 el dia [2020-10-18 16:41] diff --git a/original/database/apirest.sql b/original/database/apirest.sql new file mode 100644 index 0000000..bba7aa5 --- /dev/null +++ b/original/database/apirest.sql @@ -0,0 +1,181 @@ +-- phpMyAdmin SQL Dump +-- version 5.0.1 +-- https://www.phpmyadmin.net/ +-- +-- Servidor: 127.0.0.1 +-- Tiempo de generación: 07-08-2020 a las 15:36:00 +-- Versión del servidor: 10.4.11-MariaDB +-- Versión de PHP: 7.2.28 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Base de datos: `apirest` +-- + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `citas` +-- + +CREATE TABLE `citas` ( + `CitaId` int(11) NOT NULL, + `PacienteId` varchar(45) DEFAULT NULL, + `Fecha` varchar(45) DEFAULT NULL, + `HoraInicio` varchar(45) DEFAULT NULL, + `HoraFIn` varchar(45) DEFAULT NULL, + `Estado` varchar(45) DEFAULT NULL, + `Motivo` varchar(45) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Volcado de datos para la tabla `citas` +-- + +INSERT INTO `citas` (`CitaId`, `PacienteId`, `Fecha`, `HoraInicio`, `HoraFIn`, `Estado`, `Motivo`) VALUES +(1, '1', '2020-06-09', '08:30:00', '09:00:00', 'Confirmada', 'El paciente presenta un leve dolor de espalda'), +(2, '2', '2020-06-10', '08:30:00', '09:00:00', 'Confirmada', 'Dolor en la zona lumbar '), +(3, '3', '2020-06-18', '09:00:00', '09:30:00', 'Confirmada', 'Dolor en el cuello'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `pacientes` +-- + +CREATE TABLE `pacientes` ( + `PacienteId` int(11) NOT NULL, + `DNI` varchar(45) DEFAULT NULL, + `Nombre` varchar(150) DEFAULT NULL, + `Direccion` varchar(45) DEFAULT NULL, + `CodigoPostal` varchar(45) DEFAULT NULL, + `Telefono` varchar(45) DEFAULT NULL, + `Genero` varchar(45) DEFAULT NULL, + `FechaNacimiento` date DEFAULT NULL, + `Correo` varchar(45) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Volcado de datos para la tabla `pacientes` +-- + +INSERT INTO `pacientes` (`PacienteId`, `DNI`, `Nombre`, `Direccion`, `CodigoPostal`, `Telefono`, `Genero`, `FechaNacimiento`, `Correo`) VALUES +(1, 'A000000001', 'Juan Carlos Medina', 'Calle de pruebas 1', '20001', '633281515', 'M', '1989-03-02', 'Paciente1@gmail.com'), +(2, 'B000000002', 'Daniel Rios', 'Calle de pruebas 2', '20002', '633281512', 'M', '1990-05-11', 'Paciente2@gmail.com'), +(3, 'C000000003', 'Marcela Dubon', 'Calle de pruebas 3', '20003', '633281511', 'F', '2000-07-22', 'Paciente3@gmail.com'), +(4, 'D000000004', 'Maria Mendez', 'Calle de pruebas 4', '20004', '633281516', 'F', '1980-01-01', 'Paciente4@gmail.com'), +(5, 'E000000005', 'Zamuel Valladares', 'Calle de pruebas 5', '20006', '633281519', 'M', '1985-12-15', 'Paciente5@gmail.com'), +(6, 'F000000006', 'Angel Rios', 'Calle de pruebas 6', '20005', '633281510', 'M', '1988-11-30', 'Paciente6@gmail.com'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `usuarios` +-- + +CREATE TABLE `usuarios` ( + `UsuarioId` int(11) NOT NULL, + `Usuario` varchar(45) DEFAULT NULL, + `Password` varchar(45) DEFAULT NULL, + `Estado` varchar(45) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Volcado de datos para la tabla `usuarios` +-- + +INSERT INTO `usuarios` (`UsuarioId`, `Usuario`, `Password`, `Estado`) VALUES +(1, 'usuario1@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Activo'), +(2, 'usuario2@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Activo'), +(3, 'usuario3@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Activo'), +(4, 'usuario4@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Activo'), +(5, 'usuario5@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Activo'), +(6, 'usuario6@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Activo'), +(7, 'usuario7@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Inactivo'), +(8, 'usuario8@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Inactivo'), +(9, 'usuario9@gmail.com', 'e10adc3949ba59abbe56e057f20f883e', 'Inactivo'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `usuarios_token` +-- + +CREATE TABLE `usuarios_token` ( + `TokenId` int(11) NOT NULL, + `UsuarioId` varchar(45) DEFAULT NULL, + `Token` varchar(45) DEFAULT NULL, + `Estado` varchar(45) CHARACTER SET armscii8 DEFAULT NULL, + `Fecha` datetime DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Índices para tablas volcadas +-- + +-- +-- Indices de la tabla `citas` +-- +ALTER TABLE `citas` + ADD PRIMARY KEY (`CitaId`); + +-- +-- Indices de la tabla `pacientes` +-- +ALTER TABLE `pacientes` + ADD PRIMARY KEY (`PacienteId`); + +-- +-- Indices de la tabla `usuarios` +-- +ALTER TABLE `usuarios` + ADD PRIMARY KEY (`UsuarioId`); + +-- +-- Indices de la tabla `usuarios_token` +-- +ALTER TABLE `usuarios_token` + ADD PRIMARY KEY (`TokenId`); + +-- +-- AUTO_INCREMENT de las tablas volcadas +-- + +-- +-- AUTO_INCREMENT de la tabla `citas` +-- +ALTER TABLE `citas` + MODIFY `CitaId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT de la tabla `pacientes` +-- +ALTER TABLE `pacientes` + MODIFY `PacienteId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; + +-- +-- AUTO_INCREMENT de la tabla `usuarios` +-- +ALTER TABLE `usuarios` + MODIFY `UsuarioId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10; + +-- +-- AUTO_INCREMENT de la tabla `usuarios_token` +-- +ALTER TABLE `usuarios_token` + MODIFY `TokenId` int(11) NOT NULL AUTO_INCREMENT; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/original/index.php b/original/index.php new file mode 100644 index 0000000..8d67918 --- /dev/null +++ b/original/index.php @@ -0,0 +1,105 @@ + + + + + + API - Prubebas + + + + +

+

Api de pruebas

+
+

Auth - login

+ + POST /auth +
+ { +
+ "usuario" :"", -> REQUERIDO +
+ "password": "" -> REQUERIDO +
+ } + +
+
+
+

Pacientes

+ + GET /pacientes?page=$numeroPagina +
+ GET /pacientes?id=$idPaciente +
+ + + POST /pacientes +
+ { +
+ "nombre" : "", -> REQUERIDO +
+ "dni" : "", -> REQUERIDO +
+ "correo":"", -> REQUERIDO +
+ "codigoPostal" :"", +
+ "genero" : "", +
+ "telefono" : "", +
+ "fechaNacimiento" : "", +
+ "token" : "" -> REQUERIDO +
+ } + +
+ + PUT /pacientes +
+ { +
+ "nombre" : "", +
+ "dni" : "", +
+ "correo":"", +
+ "codigoPostal" :"", +
+ "genero" : "", +
+ "telefono" : "", +
+ "fechaNacimiento" : "", +
+ "token" : "" , -> REQUERIDO +
+ "pacienteId" : "" -> REQUERIDO +
+ } + +
+ + DELETE /pacientes +
+ { +
+ "token" : "", -> REQUERIDO +
+ "pacienteId" : "" -> REQUERIDO +
+ } + +
+
+ + +
+ + + + diff --git a/original/pacientes.php b/original/pacientes.php new file mode 100644 index 0000000..c9b79b6 --- /dev/null +++ b/original/pacientes.php @@ -0,0 +1,90 @@ +listaPacientes($pagina); + header("Content-Type: application/json"); + echo json_encode($listaPacientes); + http_response_code(200); + }else if(isset($_GET['id'])){ + $pacienteid = $_GET['id']; + $datosPaciente = $_pacientes->obtenerPaciente($pacienteid); + header("Content-Type: application/json"); + echo json_encode($datosPaciente); + http_response_code(200); + } + +}else if($_SERVER['REQUEST_METHOD'] == "POST"){ + //recibimos los datos enviados + $postBody = file_get_contents("php://input"); + //enviamos los datos al manejador + $datosArray = $_pacientes->post($postBody); + //delvovemos una respuesta + header('Content-Type: application/json'); + 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 if($_SERVER['REQUEST_METHOD'] == "PUT"){ + //recibimos los datos enviados + $postBody = file_get_contents("php://input"); + //enviamos datos al manejador + $datosArray = $_pacientes->put($postBody); + //delvovemos una respuesta + header('Content-Type: application/json'); + 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 if($_SERVER['REQUEST_METHOD'] == "DELETE"){ + + $headers = getallheaders(); + if(isset($headers["token"]) && isset($headers["pacienteId"])){ + //recibimos los datos enviados por el header + $send = [ + "token" => $headers["token"], + "pacienteId" =>$headers["pacienteId"] + ]; + $postBody = json_encode($send); + }else{ + //recibimos los datos enviados + $postBody = file_get_contents("php://input"); + } + + //enviamos datos al manejador + $datosArray = $_pacientes->delete($postBody); + //delvovemos una respuesta + header('Content-Type: application/json'); + 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{ + header('Content-Type: application/json'); + $datosArray = $_respuestas->error_405(); + echo json_encode($datosArray); +} + + +?> \ No newline at end of file