Pequeña prueba de gestión de mesas, disponibilidad y reservas para un restaurante.
Para el desarrollo de esta pequeña prueba se ha usado:
- Codeigniter - Framework PHP
- CodeIgniter RestServer - Librería para desarrollo de API REST
Se sobreentiende que para poder usar la aplicación, tenemos un servidor local para ejecutar PHP. Si no, podemos crear uno rápidamente con WAMPP (Windows), MAMPP (Mac OS), LAMPP (Distro LINUX) o XAMPP (Cualquiera).
Una vez clonado el repositorio, necesitamos importar la base de datos, instalar algunas dependencias (opcional) y terminar de configurar el proyecto para nuestro entorno.
Para este proyecto se ha usado MySQL con ayuda de phpMyAdmin.
Empezaremos con la creación de la base de datos, llamándola por ejemplo bookme. Una vez creada, pasaremos a importar la base de datos con la estructura y datos iniciales.
Se puede hacer con la herramienta de importación o ejecutando el script, siempre con la base de datos anteriormente creada seleccionada.
El script para importar o ejecutar está en db/bookme.sql.
NOTA: Estas dependencias son necesarias para poder usar el servicio REST de la aplicación. Si no se quiere usar la API, se puede saltar todo el bloque de dependencias.
Antes debemos asegurarnos de que el archivo composer.json contiene:
{
"require": {
"chriskacerguis/codeigniter-restserver": "^3.1"
}
}
Una vez comprobado, iremos al directorio root del proyecto desde la consola y instalaremos las dependencias con:
$ composer install
Hay algunos archivos que, al depender del entorno en el que se despliegue y privacidad de algunas variables, son necesarios crearlos y hacer unos cambios en algunos parámetros.
- application/config/config.php:
Se puede usar como base el archivo que está en el mismo directorio, config_sample.php. Una vez creado el archivo, cambiaremos los valores:
$config['base_url']
: Pondremos la URL en la que el proyecto está alojado. Ej: http://localhost/bookme$config['encryption_key']
: Pondremos una cadena de 32 caracteres para poder cifrar y descifrar datos. Ej: abb90ae2724543a4161120c315ccve2d$config['composer_autoload']
: NOTA: No será necesario si no se han instalado las dependencias. Indicaremos en qué directorio debe buscar el autoload de composer. Ej: FCPATH.'vendor/autoload.php'
- application/config/database.php:
Al igual que el archivo config.php, se puede usar como base el archivo que está en el mismo directorio database_sample.php. Una vez creado, cambiaremos los valores:
username
: Nombre del usuario que accederá a la base de datos. Ej: rootpassword
: Contraseña, si la hay, del usuario que accederá a la base de datos. Ej: (vacía)database
: Nombre de la base de datos creada anteriormente. Ej: bookme
Tenemos el archivo .htaccess en el raíz del proyecto con varias reglas para quitar de la URL index.php
, quedando una URL más amigable. Para que funcione, debemos tener activo el mod_rewrite
en el servidor.
(Activar mod_rewrite)
Una vez terminado con la configuración estaremos listos para empezar a probar.
Ahora se puede empezar a probar el proyecto que dividiremos en 3 partes. Cada una de ellas puede usarse mediante los controladores de Codeigniter o bien con la API (si se han instalado previamente las dependencias necesarias).
Para los controladores, al no haber realmente una interfaz que ayude a insertar los datos necesarios, en cada una de las funciones están definidos los parámetros que se van a usar. Para mayor comodidad, cambiando y probando valores, se aconseja usar la API.
Para la API, se puede usar Postman. En el directorio raiz del proyecto, hay un archivo para importar la colección directamente en el programa y no tener que crearlas desde 0: Bookme.postman_collection.json. Al importar la colección tendremos acceso a todas las llamadas implementadas.
Para obtener todas o sólo una mesa, cuando se pasa el identificador.
- opcional
idMesa
: Identificador de la mesa
-
url/mesa/get
url/mesa/get/{idMesa}
-
url/api/mesa
url/api/mesa/{idMesa}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Mesa encontrada",
"response": {
"idMesa": "1",
"aforoMin": "1",
"aforoMax": "2"
}
}
Ejemplo de respuesta errónea:
{
"status": 404,
"message": "Mesa no encontrada",
"response": null
}
Para añadir una nueva mesa.
- required
aforoMin
: Número mínimo de personas para la mesa - required
aforoMax
: Número máximo de personas para la mesa
-
url/mesa/post
-
url/api/mesa
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Mesa creada correctamente",
"response": {
"idMesa": "2",
"aforoMin": "1",
"aforoMax": "2"
}
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro aforoMax no enviado",
"response": null
}
Para editar la mesa del identificador indicado en la URL.
- required
idMesa
: Identificador de la mesa - required
aforoMin
: Número mínimo de personas para la mesa - required
aforoMax
: Número máximo de personas para la mesa
-
url/mesa/put/{idMesa}
-
url/api/mesa/{idMesa}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Mesa actualizada correctamente",
"response": {
"idMesa": "1",
"aforoMin": "3",
"aforoMax": "4"
}
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro aforoMax no enviado",
"response": null
}
Para eliminar una mesa.
- required
idMesa
: Identificador de la mesa
-
url/mesa/del/{idMesa}
-
url/api/mesa/{idMesa}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Mesa eliminada correctamente",
"response": null
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro id no enviado",
"response": null
}
Para obtener todas o sólo una reserva, cuando se pasa el identificador. También se le puede pasar como parámetro adicional mesa/{idMesa}
para obtener las reservas de una mesa en concreto.
- opcional
idReserva
: Identificador de la reserva - opcional
idMesa
: Identificador de la mesa
-
url/reserva/get
url/reserva/get/{idReserva}
url/reserva/get/mesa/{idMesa}
-
url/api/reserva
url/api/reserva/{idReserva}
url/api/reserva/mesa/{idMesa}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Reserva encontrada",
"response": {
"idReserva": "1",
"idMesa": "1",
"fecha": "01-01-2020",
"comensales": "2",
"nombreReserva": "John Doe",
"codigoReserva": "W597RV"
}
}
Ejemplo de respuesta errónea:
{
"status": 404,
"message": "Reserva no encontrada",
"response": null
}
Para crear una nueva reserva.
- required
idMesa
: Identificador de la mesa a la que se va a hacer reserva - required
fecha
: Fecha de la reserva (dd-mm-yyyy) - required
comensales
: Número de personas para la reserva - required
nombreReserva
: Nombre del titular de la reserva
-
url/reserva/post
-
url/api/reserva
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Reserva creada correctamente",
"response": {
"idMesa": "2",
"aforoMin": "1",
"aforoMax": "2"
}
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro aforoMax no enviado",
"response": null
}
Para editar una reserva del identificador indicado en la URL.
- required
idReserva
: Identificador de la reserva - required
idMesa
: Identificador de la mesa a la que se va a hacer reserva - required
fecha
: Fecha de la reserva (dd-mm-yyyy) - required
comensales
: Número de personas para la reserva - required
nombreReserva
: Nombre del titular de la reserva
-
url/reserva/put/{idReserva}
-
url/api/reserva/{idReserva}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Mesa actualizada correctamente",
"response": {
"idMesa": "1",
"aforoMin": "3",
"aforoMax": "4"
}
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro aforoMax no enviado",
"response": null
}
Para eliminar una reserva.
- required
idReserva
: Identificador de la reserva
-
url/reserva/del/{idReserva}
-
url/api/reserva/{idReserva}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Reserva eliminada correctamente",
"response": null
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro id no enviado",
"response": null
}
Para saber qué mesas están disponibles dada una fecha y número de comensales.
- required
fecha
: Día elegido para ver la disponibilidad (dd-mm-yyyy) - required
comensales
: Número de personas para ver la disponibilidad
-
url/reserva/disponibilidad/{fecha}/comensales/{comensales}
-
url/api/disponibilidad/{fecha}/comensales/{comensales}
Ejemplo de respuesta correcta:
{
"status": 200,
"message": "Mesas disponibles",
"response": [
{
"idMesa": "1",
"aforoMin": "1",
"aforoMax": "2"
},
{
"idMesa": "2",
"aforoMin": "1",
"aforoMax": "2"
},
{
"idMesa": "3",
"aforoMin": "3",
"aforoMax": "4"
},
{
"idMesa": "4",
"aforoMin": "3",
"aforoMax": "4"
}
]
}
Ejemplo de respuesta errónea:
{
"status": 400,
"message": "Parámetro comensales no enviado",
"response": null
}