Skip to content

Dannkol/menus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Menus para restautantes

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

link de 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

Objetivos

Objetivo general

Crear un backend para la aplicacion, que permina a restautantes crear sus menus y a sus clientes realizar sus pedidos por medio de whatsapp

Objetivos Especificos

  • 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

Navegabilidad

Restaurantes

  • Crear ingredientes
  • Crea platillos y los relaciona con los ingredientes
  • Relaciona los platillos con el mismo, esto crea los menus

Clientes

  • 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

Diagrama MER

Diagrama

Run Locally

Clona el repositorio

  git clone https://github.com/Dannkol/menus.git

ve al directorio

  cd menus

Instala las dependencias

  npm install

Inicializa el servidor de desarrollo

  npm run dev

Run tsc para compilar los typescripts

  npx tsc -w

Crear Base de datos

crea 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)

NOTA: NO OLVIDES CAMBIAR LAS VARIABLES DE ENTORNO A TUS NECESIDADES

🛠 Tecnologias

Node, Express, Mysql

🔗 Links

portfolio linkedin

API Reference

NOTA : RECUERDA USAR EN EL HEADER DE LA PETICION EL PARAMETRO Authorization CON LA API_KEY O TOKEN PARA LOS ENDPOINTS QUE SEA OBLIGATORIO

Restaurantes

NOTA : Para usar estos endpoint tienes que estas logueado como restaurante y usar su api_key en el header Authorization

Authentication Restaurantes

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 all platillos (Menus)

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"
        },
    ]
}

Crear platillos y menus

CRUD ingredientes

Get ingredientes

GET /api/auth/restaurante/menu/ingredientes
Parameter Type Description
api_key string Required.

Responde

{
    "mensaje" : "Ingredientes",
    "data" : [
        {
            "nombre" : "Tomate"
        },
        {
            "nombre" : "Tomate grille"
        }
    ]
}

Post ingredientes

POST /api/auth/restaurante/menu/ingredientes
Parameter Type Description
api_key string Required.
nombre string Required

Request

{
    "nombre" : "tomate"
}

Responde

{
    "nombre" : "Ingredientes agregado"
}

Put ingredientes para uctualizar ingredientes

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"
}

Delete ingredientes

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"
}

CRUD Platillo

Get platilos

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 platilos crea nuevos menus

POST /api/auth/restaurante/menu

pormedio 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 platilos

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 ingredientes de un platillo

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"
}

Cientes

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

Authentication Clientes

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 realizar un pedido

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

Usuario ya registrado

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
}

Usuario no registrado

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 pedidos realizados

GET /api/pedidos

NOTA : 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"
    }
  ]
}

Post Creacion de un usuario

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"
}

Endpoints Publicos

Estos endpoint tienen el fin de ser parte esencial de la navegacion de los usuarios ( clientes )

Get All platillos

GET /api/restaurante/menu/public

Responde

{
  "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 All ingredientes del platillo

GET /api/restaurante/menu/ingredientes/public/:id
Parameter Type Description
:id number Required.

Responde

[
  {
    "id": 1,
    "Nombre": "tomate grille"
  },
  {
    "id": 2,
    "Nombre": "Pasta"
  }
]

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors