Proyecto para campus, una plataforma donde los restautantes puedan crear sus menus y sus comensales, puedan realizar pedidos, todo atraves de la api de whatsapp
ejemplo para el mensaje
Hola, quiero una hamburguesa 🍔 📍Giron, Barrio el poblado #74-58 📱3194xxxxx ✋Luis Fernando <link__> por favor sin cebolla, salsa piña
https://api.whatsapp.com/send?phone=573173420342&text=Hola%20estoy%20quiero%20una%20hamburguesa%20%F0%9F%8D%94%0A%F0%9F%93%8DGiron%2C%20Barrio%20el%20poblado%20%2374-58%0A%F0%9F%93%B13194xxxxx%0A%E2%9C%8BLuis%20Fernando%0A%3Clink__%3E%0Apor%20favor%20sin%20cebolla%2C%20salsa%20pi%C3%B1a
Crear un backend para la aplicacion, que permina a restautantes crear sus menus y a sus clientes realizar sus pedidos por medio de whatsapp
- Craer el diagrama MER de la base de datos
- Connectar el backend con la api de whatsapp
- Crear plantilla para el envio de los mensajes
- Especificar las rutas de la aplicacion
- Configurar autenticación por JWT
- Craer un sistema para que los restaurantes creen sus propios menus
- Crear validaciones para las entradas de datos
- Crear ingredientes
- Crea platillos y los relaciona con los ingredientes
- Relaciona los platillos con el mismo, esto crea los menus
- Puede estar registrado o ser anonimo
- Consulta los platillos y sus ingredientes
- Crea un nuevo pedido
- Digita su info con el pedido o esta se agg automaticamente si el clientes ya esta registrado
- Se asocia el pedido con el cliente, el restaurante y el menu
- El cliente recibe un link de whatsapp con un mensaje personalizado
- Usa el link para confirmar su pedido con el restaurante
Clona el repositorio
git clone https://github.com/Dannkol/menus.gitve al directorio
cd menusInstala las dependencias
npm installInicializa el servidor de desarrollo
npm run devRun tsc para compilar los typescripts
npx tsc -wcrea la base de datos con el archivo phpmyadmin.php, que se encuentra en db/phpmyadmin.sql si necesitas solo las tablas puedes usar el archivo database.sql (Desactualizado)
Node, Express, Mysql
NOTA : RECUERDA USAR EN EL HEADER DE LA PETICION EL PARAMETRO Authorization CON LA API_KEY O TOKEN PARA LOS ENDPOINTS QUE SEA OBLIGATORIO
NOTA : Para usar estos endpoint tienes que estas logueado como restaurante y usar su api_key en el header Authorization
POST /api/auth/restaurante/| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Opcional. |
email |
string |
Required. |
password |
string |
Required. |
Request
{
"email" : "SushKami@correo.com",
"password" : "12354"
}Responde
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibm9tYnJlIjoicGVwZXMiLCJyb2wiOiJyZXN0YXVyYW50ZSIsImlhdCI6MTY5MDE2NDg2NiwiZXhwIjoxNjkwMTY4NDY2fQ.5ua59hXVduEpwrJLlh57EFi3IZnh3inH6JhN8Q-Zm3g"
}Cada Restaurante tiene su propio menu, pueden realizar todas las acciones de un CRUD
GET /api/auth/restaurante/menu| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. Your API key |
Responde
{
"mensaje" : "Menu del restaurante 1",
"data" : [
{
"nombre" : "pasta con carne",
"precio" : 12.000,
"descripcion" : "pastas con carne y sabor a verduras"
},
{
"nombre" : "pasta con verduras",
"precio" : 10.000,
"descripcion" : "pastas con verduras"
},
]
}GET /api/auth/restaurante/menu/ingredientes| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. |
Responde
{
"mensaje" : "Ingredientes",
"data" : [
{
"nombre" : "Tomate"
},
{
"nombre" : "Tomate grille"
}
]
}POST /api/auth/restaurante/menu/ingredientes| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. |
nombre |
string |
Required |
Request
{
"nombre" : "tomate"
}Responde
{
"nombre" : "Ingredientes agregado"
}PUT /api/auth/restaurante/menu/ingredientes/{id}| Parameter | Type | Description |
|---|---|---|
id |
number |
Required. |
api_key |
string |
Required. |
nombre |
string |
Required |
Request
{
"nombre" : "tomate grill"
}Responde
{
"nombre" : "Ingrediente actualizados"
}NOTA : SOLO PUEDES BORRAR INGREDIENTES QUE NO ESTEN ASOSIADOS A UN PLATILLO
DELETE /api/auth/restaurante/menu/ingredientes/{id}| Parameter | Type | Description |
|---|---|---|
id |
number |
Required. |
api_key |
string |
Required. |
Responde
{
"nombre" : "Ingrediente Eliminado"
}GET /api/auth/restaurante/menu| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. |
pormedio del api_key se trae el platillo del restaurante
Responde
{
"mensaje" : "Platillos",
"data" : [
{
"nombre" : "papas fritas",
"precio" : 3.000,
"descripcion" : "papas fritas de las calles"
},
{
"nombre" : "pasta",
"precio" : 12.000,
"descripcion" : "pasta boloñesa"
}
]
}POST /api/auth/restaurante/menupormedio del api_key se oscia el platillo al restaurante
| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. |
nombre |
string |
Required |
precio |
number |
Required |
descripcion |
string |
Required |
slug |
string |
nombre + random_number |
ingredientes |
array |
Required |
Request
{
"nombre" : "papas fritas",
"precio" : 3.000,
"descripcion" : "papas fritas de las calles",
"ingredientes" : [
1,2
],// array con los id de los ingredientes
}Responde
{
"mensaje" : "Platillo creado"
}
PUT /api/auth/restaurante/menu/{id}| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. |
id |
numbre |
Required. |
nombre |
string |
Required |
precio |
number |
Required |
descripcion |
string |
Required |
slug |
string |
nombre + random_number |
Request
{
"nombre" : "papas fritas",
"precio" : 3.000,
"descripcion" : "papas fritas de las calles"
}Responde
{
"mensaje" : "Platillo actualizado"
}PUT /api/auth/restaurante/menu/:platillo/ingrediente/:ingredientes| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Required. |
platillo |
number |
Required. |
ingredientes |
number |
Required. |
Request
params: id del platillo y el ingrediente a actualizar
Body el id del ingrediente actualizado
{
"ingrediente" : 1
}
Responde
{
"mensaje": "Ingredientes actualizados"
}NOTA : Para usar estos endpoint tienes que estas logueado como cliente y usar su api_key en el header Authorization o no usar ningun header de Authorization
POST /api/auth/| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Opcional. |
email |
string |
Required. |
password |
string |
Required. |
Request
{
"email" : "daniel@correo.com",
"password" : "12345"
}Responde
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibm9tYnJlIjoicGVwZXMiLCJyb2wiOiJyZXN0YXVyYW50ZSIsImlhdCI6MTY5MDE2NDg2NiwiZXhwIjoxNjkwMTY4NDY2fQ.5ua59hXVduEpwrJLlh57EFi3IZnh3inH6JhN8Q-Zm3g"
}los clientes pueden realizar pedidos, estos pueden estar registrados o ser ananonimos, al realizar un pedido, este se relaciona al usuario si esta logueado y tambien se relaciona al restaurante sin importar si esta logueado o no
NOTA : Si usas el token de un restaurante no podras usar los endpoints, tendras un error de permisos
POST /api/pedidos| Parameter | Type | Description |
|---|---|---|
api_key |
string |
Opcional |
platillo |
number |
Required. |
cantidad |
number |
Required. |
metodo_pago |
number |
Required. |
nombre |
string |
Opcional |
direccion |
string |
Opcional |
tel |
string |
Opcional |
opciones |
array |
Opcional |
por medio del platillo se sabe a que restaurante esta asosiado y de esta manera se asosia el pedido a un restaurante
En caso dee que el usuario ya este registrado, se usara su info para crear el link de whatsapp.
Request
{
"platillo_menu" : 1,
"cantidad" : 2,
"metodo_pago" : 1
}Request
{
"platillo_menu" : 1,
"cantidad" : 2,
"metodo_pago" : 2,
"nombre" : "Daniel",
"direccion" : "Giron, Barrio el poblado #74-58",
"tel" : "3194xxxxx",
"opciones" : [ 1, 2] // los ingredientes que no quiere en el pedido
}Responde
{
"mensaje" : "Pedido enviado al restaurante",
"whatsapp" : "https://api.whatsapp.com/send?phone=573173420342&text=Hola%20estoy%20quiero%20una%20hamburguesa%20%F0%9F%8D%94%0A%F0%9F%93%8DGiron%2C%20Barrio%20el%20poblado%20%2374-58%0A%F0%9F%93%B13194xxxxx%0A%E2%9C%8BLuis%20Fernando%0A%3Clink__%3E%0Apor%20favor%20sin%20cebolla%2C%20salsa%20pi%C3%B1a"
}GET /api/pedidosNOTA : Si el usuario no esta registrado se usaran las cookies para tener un historial de sus pedidos Status: 403 Forbidden
{
"error": "No tienes permisos para esta acción"
}{
"mensaje": "mis pedidos",
"data": [
{
"Mensaje": "https://api.whatsapp.com/send?phone=573175834536&text=Hola%2C%20quiero%202%20sushi%20salmon%20%F0%9F%8D%94%20%F0%9F%93%8Del%20poblado%20%F0%9F%93%B113254868%20%E2%9C%8BDaniel%20por%20favor%20sin%20undefined",
"Fecha": "2023-07-26T12:53:11.000Z",
"Metod_pago": "Efectivo",
"Restaurante": "Sushi Kami",
"Platilo": "sushi salmon",
"Total": "100000.00"
},
{
"Mensaje": "https://api.whatsapp.com/send?phone=573175834536&text=Hola%2C%20quiero%202%20sushi%20salmon%20%F0%9F%8D%94%20%F0%9F%93%8Del%20poblado%20%F0%9F%93%B113254868%20%E2%9C%8BDaniel%20por%20favor%20sin%20undefined",
"Fecha": "2023-07-26T12:53:11.000Z",
"Metod_pago": "Efectivo",
"Restaurante": "Sushi Kami",
"Platilo": "papas fritas",
"Total": "6.00"
}
]
}con este endpoint se pueden registrar los usuario
POST /api/usuario/login| Parameter | Type | Description |
|---|---|---|
email |
string |
Required. |
password |
string |
Required. |
metodo_pago |
number |
Required. |
nombre |
string |
Required |
direccion |
string |
Required |
tel |
string |
Required |
Request
{
"email" : "correo@correo.com",
"password" : "dew223",
"metodo_pago" : 1, // id del metodo de pago a usar
"nombre" : "Daniel",
"direccion" : "Giron, Barrio el poblado #74-58",
"tel" : "3194xxxxx"
}Responde
{
"mensaje" : "Usuario registrado"
}Estos endpoint tienen el fin de ser parte esencial de la navegacion de los usuarios ( clientes )
GET /api/restaurante/menu/publicResponde
{
"mensaje": "Menu de los restaurante",
"data": [
{
"menu": 1,
"restaurante": "pepes",
"restaurante_id": 1,
"platillo": "papas saladas sin sal",
"platillo_id": 1,
"descripcion": "papas fritas de las calles",
"precio": "34.00",
"slug": "papas418"
},
{
"menu": 3,
"restaurante": "pepes",
"restaurante_id": 1,
"platillo": "pastas carno",
"platillo_id": 3,
"descripcion": "pres",
"precio": "3.00",
"slug": "pastas_carno778"
}
]
}GET /api/restaurante/menu/ingredientes/public/:id| Parameter | Type | Description |
|---|---|---|
:id |
number |
Required. |
Responde
[
{
"id": 1,
"Nombre": "tomate grille"
},
{
"id": 2,
"Nombre": "Pasta"
}
]