1.0.2 • Published 2 years ago

api-rest-entrypoint-generator-from-mysql v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

GENERADOR DE API REST EN NODEJS PARA MYSQL

Generador automático de entry points (GET,POST,PUT,DELETE,PATCH) de API REST a partir de una base de datos MySQL existente que debe respetar determinada nomenclatura de tablas y atributos. Este desarrollo fue motivado por un desafío planteado a mi persona.

  1. Funcionamiento
  2. Funciones
  3. Nomenclatura MySQL
  4. Uso
  5. Configuracion mediante archivo .env
  6. Salida esperada
  7. Listado de Entry Points - Ejemplo

FUNCIONAMIENTO

A partir de una configuración de conexión a la base de datos MySQL (y tomando algunos valores configurables a través de un archivo .env) y una app de Express JS, la única función run() recrea la estructura de la misma teniendo en cuenta relaciones (ver NOMENCLATURA), campos clave, campos timestamp de creación y modificación para definirla en Sequelize. Luego emplea la misma estructura para generar las rutas y los controladores para cada una, y asocia las mismas al objeto de Express pasado por parámetro sobre una ruta raíz o root configurable, define respuesta para solicitudes inválidas y errores, e inicia el servidor en un puerto configurable.

FUNCIONES

  • generación automática de una API REST con una sola línea
  • paralelización de todas las tareas posibles para reducir el tiempo de arranque
  • entry points para absolutamente todas las tablas válidas a diferencia de otro framework similar (ver NOMENCLATURA)
  • entry point para generar un listado de los entry points al consultar la raíz de la API (ver LISTADO EJEMPLO)
  • carga de id autoincremental, fecha de creación y de modificación (estos últimos son configurables con un mismo nombre para toda la base de datos y pueden o no estar en las distintas tablas)
  • permite nombre de tablas modelo de varias palabras (ej. medical_conditions) a diferencia de otro framework similar
  • se pueden hacer búsquedas solo por un id en las tablas de relaciones, indicando cero (0) en el id referente a la otra tabla de la relación (ej. /organizations/0/products/0); esto permite también listar todos los elementos de las tablas de relaciones
  • se buscó la forma correcta de definir dinámicamente la base de datos en Sequelize

¿Por qué Sequelize?

Era necesario realizar algo diferente a lo que ya existe disponible (ej. Kaleboo Framework - mejor o peor, pero este fue creado por completo por mí). Con Sequelize se logra una más rápida y sencilla adopción de nuevas funcionalidades así como una drástica reducción del código de los controladores y validación de datos. También permite realizar en forma más sencila la migración a otros motores de bases de datos SQL.

¿Qué queda por hacer?

  • Sería bueno mejorar el sistema de logger, aunque no necesario
  • Aún no genera las asociaciones de Sequelize que permite extender la funcionalidad de los objetos del modelo (quedó relegado por falta de tiempo)
  • Probar aún más, siempre es bueno

NOMENCLATURA MySQL

  • Todos los nombres de las tablas están en minúscula. (ej. users).
  • Todos los nombres de las tablas están en inglés. (ej. devices).
  • Todos los nombres de las tablas, de haber espacio, el mismo está reemplazado por guión bajo. (ej. device_brands).
  • Todos los nombres de las tablas que son modelos, están en plural (ej. devices).
  • Todos los nombres de las tablas que son relaciones, tienen como prefijo el nombre del modelo en singular. (ej. device_brands donde device es el modelo).
  • Tipos de relaciones:

    • A - Entre modelos, a través de una tabla intermedia cuyo nombre se define con singular(modelo1)_modelo2 (ej. organization_users donde un modelo es organizations y otro es users, dado que existen esas 2 tablas en plural, por lo cual son modelos), y

    • B - Extensiones a un mismo modelo, cuyo nombre se define con singular(modelo1)_plural(extension) (ej. device_brands donde un modelo es devices y tiene atributos (1 o más) extensibles/relación con device_brands)

  • Todas las tablas tienen una PRIMARY KEY llamada id numérico y distinto de cero (0).

  • Todas las tablas que tienen una relación con otro modelo o bien extensiones de un mismo modelo, tienen una FOREIGN KEY que comienza con el prefijo id_ y luego el nombre del modelo en singular (ej. id_user).

USO

var ApiGenerator = require('rest-entrypoint-generator-from-mysql');
var express = require('express');
var bodyParser = require('body-parser');

// Express App
var app = express();
    app.use(bodyParser.json());

// MySQL Config - will be priorized setted .env variables (indicated at each inline comment)
const config = {
        host : 'localhost', // sobreescrito por env.DB_HOST
	  username : 'root',      // sobreescrito por env.DB_USER
    password : 'password',  // sobreescrito por DB_PASS
    database : 'testing',   // sobreescrito por DB_NAME
  serverport : 2000,        // Opcional, sobreescrito por PORT_DEV / PORT_PROD
 apirootpath : '/'          // Opcional, sobreescrito por env.API_ROOTPATH
};

ApiGenerator.run(config, app);

CONFIGURACION MEDIANTE ARCHIVO .env

Tiene opción a definir configuraciones en un archivo llamado .env en la raíz de su proyecto. Cada una de estas configuraciones reemplaza la configuración que pueda haber pasado por parámetro a la función run(). A continuación, un ejemplo:

API_ROOTPATH=/
PORT_DEV=2000
PORT_PROD=2000
NODE_ENV=production
# NODE_ENV=development
# LOG_LEVEL=development
SQZ_LOGGER=
# SQZ_LOGGER=console.log 

DB_USER=root
DB_PASS=password
DB_NAME=testing
DB_HOST=localhost

DB_ID_FIELD =id
DB_CREATEDAT_FIELD=created_at
DB_MODIFIEDAT_FIELD=updated_at

SALIDA ESPERADA

Cuando el parámetro LOG_LEVEL es development, la salida se incrementa mucho, en forma desordenada (por la ejecución asíncrona de tareas) a diferencia de la salida de producción que se emite cuando la ejecución es estable.

Trying to find models from mysql...

        ✓ Model attributes discovered.
                has many dependencies with organization_attributes
                has many dependencies with user_attributes
        ✓ Model devices discovered.
                has 1 dependency with device_brands
                has 1 dependency with device_screensizes
        ✓ Model measurements discovered.
                has 1 external relationship with metrics
                has 1 external relationship with units
        ✓ Model metrics discovered.
        ✓ Model organizations discovered.
                has many dependencies with organization_attributes
                has many dependencies with organization_products
                has many dependencies with organization_users
        ✓ Model permissions discovered.
                has many dependencies with user_permissions
        ✓ Model products discovered.
                has many dependencies with organization_products
        ✓ Model units discovered.
        ✓ Model users discovered.
                has many dependencies with organization_users
                has many dependencies with user_attributes
                has many dependencies with user_permissions

Trying to find and assign ExpressJs routes...
        -----------------------------------
        ✔      GET   /attributes                                (Try on: http://fbroqua.sytes.net:2000/attributes)
        ✔      GET   /attributes/:id                            (Try on: http://fbroqua.sytes.net:2000/attributes/:id)
        ✔     POST   /attributes                                (Try on: http://fbroqua.sytes.net:2000/attributes)
        ✔      PUT   /attributes/:id                            (Try on: http://fbroqua.sytes.net:2000/attributes/:id)
        ✔    PATCH   /attributes/:id                            (Try on: http://fbroqua.sytes.net:2000/attributes/:id)
        ✔   DELETE   /attributes/:id                            (Try on: http://fbroqua.sytes.net:2000/attributes/:id)
        -----------------------------------
        ✔      GET   /devices/brands                            (Try on: http://fbroqua.sytes.net:2000/devices/brands)
        ✔      GET   /devices/brands/:id                        (Try on: http://fbroqua.sytes.net:2000/devices/brands/:id)
        ✔     POST   /devices/brands                            (Try on: http://fbroqua.sytes.net:2000/devices/brands)
        ✔      PUT   /devices/brands/:id                        (Try on: http://fbroqua.sytes.net:2000/devices/brands/:id)
        ✔    PATCH   /devices/brands/:id                        (Try on: http://fbroqua.sytes.net:2000/devices/brands/:id)
        ✔   DELETE   /devices/brands/:id                        (Try on: http://fbroqua.sytes.net:2000/devices/brands/:id)

        ✔      GET   /devices/screensizes                       (Try on: http://fbroqua.sytes.net:2000/devices/screensizes)
        ✔      GET   /devices/screensizes/:id                   (Try on: http://fbroqua.sytes.net:2000/devices/screensizes/:id)
        ✔     POST   /devices/screensizes                       (Try on: http://fbroqua.sytes.net:2000/devices/screensizes)
        ✔      PUT   /devices/screensizes/:id                   (Try on: http://fbroqua.sytes.net:2000/devices/screensizes/:id)
        ✔    PATCH   /devices/screensizes/:id                   (Try on: http://fbroqua.sytes.net:2000/devices/screensizes/:id)
        ✔   DELETE   /devices/screensizes/:id                   (Try on: http://fbroqua.sytes.net:2000/devices/screensizes/:id)

        ✔      GET   /devices                                   (Try on: http://fbroqua.sytes.net:2000/devices)
        ✔      GET   /devices/:id                               (Try on: http://fbroqua.sytes.net:2000/devices/:id)
        ✔     POST   /devices                                   (Try on: http://fbroqua.sytes.net:2000/devices)
        ✔      PUT   /devices/:id                               (Try on: http://fbroqua.sytes.net:2000/devices/:id)
        ✔    PATCH   /devices/:id                               (Try on: http://fbroqua.sytes.net:2000/devices/:id)
        ✔   DELETE   /devices/:id                               (Try on: http://fbroqua.sytes.net:2000/devices/:id)
        -----------------------------------
        ✔      GET   /measurements                              (Try on: http://fbroqua.sytes.net:2000/measurements)
        ✔      GET   /measurements/:id                          (Try on: http://fbroqua.sytes.net:2000/measurements/:id)
        ✔     POST   /measurements                              (Try on: http://fbroqua.sytes.net:2000/measurements)
        ✔      PUT   /measurements/:id                          (Try on: http://fbroqua.sytes.net:2000/measurements/:id)
        ✔    PATCH   /measurements/:id                          (Try on: http://fbroqua.sytes.net:2000/measurements/:id)
        ✔   DELETE   /measurements/:id                          (Try on: http://fbroqua.sytes.net:2000/measurements/:id)
        -----------------------------------
        ✔      GET   /metrics                                   (Try on: http://fbroqua.sytes.net:2000/metrics)
        ✔      GET   /metrics/:id                               (Try on: http://fbroqua.sytes.net:2000/metrics/:id)
        ✔     POST   /metrics                                   (Try on: http://fbroqua.sytes.net:2000/metrics)
        ✔      PUT   /metrics/:id                               (Try on: http://fbroqua.sytes.net:2000/metrics/:id)
        ✔    PATCH   /metrics/:id                               (Try on: http://fbroqua.sytes.net:2000/metrics/:id)
        ✔   DELETE   /metrics/:id                               (Try on: http://fbroqua.sytes.net:2000/metrics/:id)
        -----------------------------------
        ✔      GET   /organizations/:id/attributes              (Try on: http://fbroqua.sytes.net:2000/organizations/:id/attributes)
        ✔      GET   /organizations/:id/attributes/:id2         (Try on: http://fbroqua.sytes.net:2000/organizations/:id/attributes/:id2)
        ✔     POST   /organizations/:id/attributes              (Try on: http://fbroqua.sytes.net:2000/organizations/:id/attributes)
        ✔      PUT   /organizations/:id/attributes/:id2         (Try on: http://fbroqua.sytes.net:2000/organizations/:id/attributes/:id2)
        ✔    PATCH   /organizations/:id/attributes/:id2         (Try on: http://fbroqua.sytes.net:2000/organizations/:id/attributes/:id2)
        ✔   DELETE   /organizations/:id/attributes/:id2         (Try on: http://fbroqua.sytes.net:2000/organizations/:id/attributes/:id2)

        ✔      GET   /organizations/:id/products                (Try on: http://fbroqua.sytes.net:2000/organizations/:id/products)
        ✔      GET   /organizations/:id/products/:id2           (Try on: http://fbroqua.sytes.net:2000/organizations/:id/products/:id2)
        ✔     POST   /organizations/:id/products                (Try on: http://fbroqua.sytes.net:2000/organizations/:id/products)
        ✔      PUT   /organizations/:id/products/:id2           (Try on: http://fbroqua.sytes.net:2000/organizations/:id/products/:id2)
        ✔    PATCH   /organizations/:id/products/:id2           (Try on: http://fbroqua.sytes.net:2000/organizations/:id/products/:id2)
        ✔   DELETE   /organizations/:id/products/:id2           (Try on: http://fbroqua.sytes.net:2000/organizations/:id/products/:id2)

        ✔      GET   /organizations/:id/users                   (Try on: http://fbroqua.sytes.net:2000/organizations/:id/users)
        ✔      GET   /organizations/:id/users/:id2              (Try on: http://fbroqua.sytes.net:2000/organizations/:id/users/:id2)
        ✔     POST   /organizations/:id/users                   (Try on: http://fbroqua.sytes.net:2000/organizations/:id/users)
        ✔      PUT   /organizations/:id/users/:id2              (Try on: http://fbroqua.sytes.net:2000/organizations/:id/users/:id2)
        ✔    PATCH   /organizations/:id/users/:id2              (Try on: http://fbroqua.sytes.net:2000/organizations/:id/users/:id2)
        ✔   DELETE   /organizations/:id/users/:id2              (Try on: http://fbroqua.sytes.net:2000/organizations/:id/users/:id2)

        ✔      GET   /organizations                             (Try on: http://fbroqua.sytes.net:2000/organizations)
        ✔      GET   /organizations/:id                         (Try on: http://fbroqua.sytes.net:2000/organizations/:id)
        ✔     POST   /organizations                             (Try on: http://fbroqua.sytes.net:2000/organizations)
        ✔      PUT   /organizations/:id                         (Try on: http://fbroqua.sytes.net:2000/organizations/:id)
        ✔    PATCH   /organizations/:id                         (Try on: http://fbroqua.sytes.net:2000/organizations/:id)
        ✔   DELETE   /organizations/:id                         (Try on: http://fbroqua.sytes.net:2000/organizations/:id)
        -----------------------------------
        ✔      GET   /permissions                               (Try on: http://fbroqua.sytes.net:2000/permissions)
        ✔      GET   /permissions/:id                           (Try on: http://fbroqua.sytes.net:2000/permissions/:id)
        ✔     POST   /permissions                               (Try on: http://fbroqua.sytes.net:2000/permissions)
        ✔      PUT   /permissions/:id                           (Try on: http://fbroqua.sytes.net:2000/permissions/:id)
        ✔    PATCH   /permissions/:id                           (Try on: http://fbroqua.sytes.net:2000/permissions/:id)
        ✔   DELETE   /permissions/:id                           (Try on: http://fbroqua.sytes.net:2000/permissions/:id)
        -----------------------------------
        ✔      GET   /products                                  (Try on: http://fbroqua.sytes.net:2000/products)
        ✔      GET   /products/:id                              (Try on: http://fbroqua.sytes.net:2000/products/:id)
        ✔     POST   /products                                  (Try on: http://fbroqua.sytes.net:2000/products)
        ✔      PUT   /products/:id                              (Try on: http://fbroqua.sytes.net:2000/products/:id)
        ✔    PATCH   /products/:id                              (Try on: http://fbroqua.sytes.net:2000/products/:id)
        ✔   DELETE   /products/:id                              (Try on: http://fbroqua.sytes.net:2000/products/:id)
        -----------------------------------
        ✔      GET   /units                                     (Try on: http://fbroqua.sytes.net:2000/units)
        ✔      GET   /units/:id                                 (Try on: http://fbroqua.sytes.net:2000/units/:id)
        ✔     POST   /units                                     (Try on: http://fbroqua.sytes.net:2000/units)
        ✔      PUT   /units/:id                                 (Try on: http://fbroqua.sytes.net:2000/units/:id)
        ✔    PATCH   /units/:id                                 (Try on: http://fbroqua.sytes.net:2000/units/:id)
        ✔   DELETE   /units/:id                                 (Try on: http://fbroqua.sytes.net:2000/units/:id)
        -----------------------------------
        ✔      GET   /users/:id/attributes                      (Try on: http://fbroqua.sytes.net:2000/users/:id/attributes)
        ✔      GET   /users/:id/attributes/:id2                 (Try on: http://fbroqua.sytes.net:2000/users/:id/attributes/:id2)
        ✔     POST   /users/:id/attributes                      (Try on: http://fbroqua.sytes.net:2000/users/:id/attributes)
        ✔      PUT   /users/:id/attributes/:id2                 (Try on: http://fbroqua.sytes.net:2000/users/:id/attributes/:id2)
        ✔    PATCH   /users/:id/attributes/:id2                 (Try on: http://fbroqua.sytes.net:2000/users/:id/attributes/:id2)
        ✔   DELETE   /users/:id/attributes/:id2                 (Try on: http://fbroqua.sytes.net:2000/users/:id/attributes/:id2)

        ✔      GET   /users/:id/permissions                     (Try on: http://fbroqua.sytes.net:2000/users/:id/permissions)
        ✔      GET   /users/:id/permissions/:id2                (Try on: http://fbroqua.sytes.net:2000/users/:id/permissions/:id2)
        ✔     POST   /users/:id/permissions                     (Try on: http://fbroqua.sytes.net:2000/users/:id/permissions)
        ✔      PUT   /users/:id/permissions/:id2                (Try on: http://fbroqua.sytes.net:2000/users/:id/permissions/:id2)
        ✔    PATCH   /users/:id/permissions/:id2                (Try on: http://fbroqua.sytes.net:2000/users/:id/permissions/:id2)
        ✔   DELETE   /users/:id/permissions/:id2                (Try on: http://fbroqua.sytes.net:2000/users/:id/permissions/:id2)

        ✔      GET   /users                                     (Try on: http://fbroqua.sytes.net:2000/users)
        ✔      GET   /users/:id                                 (Try on: http://fbroqua.sytes.net:2000/users/:id)
        ✔     POST   /users                                     (Try on: http://fbroqua.sytes.net:2000/users)
        ✔      PUT   /users/:id                                 (Try on: http://fbroqua.sytes.net:2000/users/:id)
        ✔    PATCH   /users/:id                                 (Try on: http://fbroqua.sytes.net:2000/users/:id)
        ✔   DELETE   /users/:id                                 (Try on: http://fbroqua.sytes.net:2000/users/:id)
        -----------------------------------
View all entries in: http://fbroqua.sytes.net:2000/

Express Server is up on port 2000

LISTADO DE ENTRY POINTS

Al consultar la raíz de la API (ej. http://fbroqua.sytes.net:2000/) recibirá una salida similara a la siguiente. donde los "0" pueden ser reemplazados por los id deseados:

{
    "attributes": {
        "GET_ALL": {
            "table": "attributes",
            "method": "GET_ALL",
            "path": "/attributes",
            "trylink": "http://fbroqua.sytes.net:2000/attributes"
        },
        "GET_ONE": {
            "table": "attributes",
            "method": "GET_ONE",
            "path": "/attributes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/attributes/0"
        },
        "POST": {
            "table": "attributes",
            "method": "POST",
            "path": "/attributes",
            "trylink": "http://fbroqua.sytes.net:2000/attributes"
        },
        "PUT": {
            "table": "attributes",
            "method": "PUT",
            "path": "/attributes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/attributes/0"
        },
        "PATCH": {
            "table": "attributes",
            "method": "PATCH",
            "path": "/attributes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/attributes/0"
        },
        "DELETE": {
            "table": "attributes",
            "method": "DELETE",
            "path": "/attributes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/attributes/0"
        }
    },
    "device_brands": {
        "GET_ALL": {
            "table": "device_brands",
            "method": "GET_ALL",
            "path": "/devices/brands",
            "trylink": "http://fbroqua.sytes.net:2000/devices/brands"
        },
        "GET_ONE": {
            "table": "device_brands",
            "method": "GET_ONE",
            "path": "/devices/brands/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/brands/0"
        },
        "POST": {
            "table": "device_brands",
            "method": "POST",
            "path": "/devices/brands",
            "trylink": "http://fbroqua.sytes.net:2000/devices/brands"
        },
        "PUT": {
            "table": "device_brands",
            "method": "PUT",
            "path": "/devices/brands/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/brands/0"
        },
        "PATCH": {
            "table": "device_brands",
            "method": "PATCH",
            "path": "/devices/brands/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/brands/0"
        },
        "DELETE": {
            "table": "device_brands",
            "method": "DELETE",
            "path": "/devices/brands/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/brands/0"
        }
    },
    "device_screensizes": {
        "GET_ALL": {
            "table": "device_screensizes",
            "method": "GET_ALL",
            "path": "/devices/screensizes",
            "trylink": "http://fbroqua.sytes.net:2000/devices/screensizes"
        },
        "GET_ONE": {
            "table": "device_screensizes",
            "method": "GET_ONE",
            "path": "/devices/screensizes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/screensizes/0"
        },
        "POST": {
            "table": "device_screensizes",
            "method": "POST",
            "path": "/devices/screensizes",
            "trylink": "http://fbroqua.sytes.net:2000/devices/screensizes"
        },
        "PUT": {
            "table": "device_screensizes",
            "method": "PUT",
            "path": "/devices/screensizes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/screensizes/0"
        },
        "PATCH": {
            "table": "device_screensizes",
            "method": "PATCH",
            "path": "/devices/screensizes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/screensizes/0"
        },
        "DELETE": {
            "table": "device_screensizes",
            "method": "DELETE",
            "path": "/devices/screensizes/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/screensizes/0"
        }
    },
    "devices": {
        "GET_ALL": {
            "table": "devices",
            "method": "GET_ALL",
            "path": "/devices",
            "trylink": "http://fbroqua.sytes.net:2000/devices"
        },
        "GET_ONE": {
            "table": "devices",
            "method": "GET_ONE",
            "path": "/devices/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/0"
        },
        "POST": {
            "table": "devices",
            "method": "POST",
            "path": "/devices",
            "trylink": "http://fbroqua.sytes.net:2000/devices"
        },
        "PUT": {
            "table": "devices",
            "method": "PUT",
            "path": "/devices/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/0"
        },
        "PATCH": {
            "table": "devices",
            "method": "PATCH",
            "path": "/devices/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/0"
        },
        "DELETE": {
            "table": "devices",
            "method": "DELETE",
            "path": "/devices/:id",
            "trylink": "http://fbroqua.sytes.net:2000/devices/0"
        }
    },
    "measurements": {
        "GET_ALL": {
            "table": "measurements",
            "method": "GET_ALL",
            "path": "/measurements",
            "trylink": "http://fbroqua.sytes.net:2000/measurements"
        },
        "GET_ONE": {
            "table": "measurements",
            "method": "GET_ONE",
            "path": "/measurements/:id",
            "trylink": "http://fbroqua.sytes.net:2000/measurements/0"
        },
        "POST": {
            "table": "measurements",
            "method": "POST",
            "path": "/measurements",
            "trylink": "http://fbroqua.sytes.net:2000/measurements"
        },
        "PUT": {
            "table": "measurements",
            "method": "PUT",
            "path": "/measurements/:id",
            "trylink": "http://fbroqua.sytes.net:2000/measurements/0"
        },
        "PATCH": {
            "table": "measurements",
            "method": "PATCH",
            "path": "/measurements/:id",
            "trylink": "http://fbroqua.sytes.net:2000/measurements/0"
        },
        "DELETE": {
            "table": "measurements",
            "method": "DELETE",
            "path": "/measurements/:id",
            "trylink": "http://fbroqua.sytes.net:2000/measurements/0"
        }
    },
    "metrics": {
        "GET_ALL": {
            "table": "metrics",
            "method": "GET_ALL",
            "path": "/metrics",
            "trylink": "http://fbroqua.sytes.net:2000/metrics"
        },
        "GET_ONE": {
            "table": "metrics",
            "method": "GET_ONE",
            "path": "/metrics/:id",
            "trylink": "http://fbroqua.sytes.net:2000/metrics/0"
        },
        "POST": {
            "table": "metrics",
            "method": "POST",
            "path": "/metrics",
            "trylink": "http://fbroqua.sytes.net:2000/metrics"
        },
        "PUT": {
            "table": "metrics",
            "method": "PUT",
            "path": "/metrics/:id",
            "trylink": "http://fbroqua.sytes.net:2000/metrics/0"
        },
        "PATCH": {
            "table": "metrics",
            "method": "PATCH",
            "path": "/metrics/:id",
            "trylink": "http://fbroqua.sytes.net:2000/metrics/0"
        },
        "DELETE": {
            "table": "metrics",
            "method": "DELETE",
            "path": "/metrics/:id",
            "trylink": "http://fbroqua.sytes.net:2000/metrics/0"
        }
    },
    "organization_attributes": {
        "GET_ALL": {
            "table": "organization_attributes",
            "method": "GET_ALL",
            "path": "/organizations/:id/attributes",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/attributes"
        },
        "GET_ONE": {
            "table": "organization_attributes",
            "method": "GET_ONE",
            "path": "/organizations/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/attributes/0"
        },
        "POST": {
            "table": "organization_attributes",
            "method": "POST",
            "path": "/organizations/:id/attributes",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/attributes"
        },
        "PUT": {
            "table": "organization_attributes",
            "method": "PUT",
            "path": "/organizations/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/attributes/0"
        },
        "PATCH": {
            "table": "organization_attributes",
            "method": "PATCH",
            "path": "/organizations/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/attributes/0"
        },
        "DELETE": {
            "table": "organization_attributes",
            "method": "DELETE",
            "path": "/organizations/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/attributes/0"
        }
    },
    "organization_products": {
        "GET_ALL": {
            "table": "organization_products",
            "method": "GET_ALL",
            "path": "/organizations/:id/products",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/products"
        },
        "GET_ONE": {
            "table": "organization_products",
            "method": "GET_ONE",
            "path": "/organizations/:id/products/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/products/0"
        },
        "POST": {
            "table": "organization_products",
            "method": "POST",
            "path": "/organizations/:id/products",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/products"
        },
        "PUT": {
            "table": "organization_products",
            "method": "PUT",
            "path": "/organizations/:id/products/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/products/0"
        },
        "PATCH": {
            "table": "organization_products",
            "method": "PATCH",
            "path": "/organizations/:id/products/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/products/0"
        },
        "DELETE": {
            "table": "organization_products",
            "method": "DELETE",
            "path": "/organizations/:id/products/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/products/0"
        }
    },
    "organization_users": {
        "GET_ALL": {
            "table": "organization_users",
            "method": "GET_ALL",
            "path": "/organizations/:id/users",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/users"
        },
        "GET_ONE": {
            "table": "organization_users",
            "method": "GET_ONE",
            "path": "/organizations/:id/users/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/users/0"
        },
        "POST": {
            "table": "organization_users",
            "method": "POST",
            "path": "/organizations/:id/users",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/users"
        },
        "PUT": {
            "table": "organization_users",
            "method": "PUT",
            "path": "/organizations/:id/users/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/users/0"
        },
        "PATCH": {
            "table": "organization_users",
            "method": "PATCH",
            "path": "/organizations/:id/users/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/users/0"
        },
        "DELETE": {
            "table": "organization_users",
            "method": "DELETE",
            "path": "/organizations/:id/users/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0/users/0"
        }
    },
    "organizations": {
        "GET_ALL": {
            "table": "organizations",
            "method": "GET_ALL",
            "path": "/organizations",
            "trylink": "http://fbroqua.sytes.net:2000/organizations"
        },
        "GET_ONE": {
            "table": "organizations",
            "method": "GET_ONE",
            "path": "/organizations/:id",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0"
        },
        "POST": {
            "table": "organizations",
            "method": "POST",
            "path": "/organizations",
            "trylink": "http://fbroqua.sytes.net:2000/organizations"
        },
        "PUT": {
            "table": "organizations",
            "method": "PUT",
            "path": "/organizations/:id",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0"
        },
        "PATCH": {
            "table": "organizations",
            "method": "PATCH",
            "path": "/organizations/:id",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0"
        },
        "DELETE": {
            "table": "organizations",
            "method": "DELETE",
            "path": "/organizations/:id",
            "trylink": "http://fbroqua.sytes.net:2000/organizations/0"
        }
    },
    "permissions": {
        "GET_ALL": {
            "table": "permissions",
            "method": "GET_ALL",
            "path": "/permissions",
            "trylink": "http://fbroqua.sytes.net:2000/permissions"
        },
        "GET_ONE": {
            "table": "permissions",
            "method": "GET_ONE",
            "path": "/permissions/:id",
            "trylink": "http://fbroqua.sytes.net:2000/permissions/0"
        },
        "POST": {
            "table": "permissions",
            "method": "POST",
            "path": "/permissions",
            "trylink": "http://fbroqua.sytes.net:2000/permissions"
        },
        "PUT": {
            "table": "permissions",
            "method": "PUT",
            "path": "/permissions/:id",
            "trylink": "http://fbroqua.sytes.net:2000/permissions/0"
        },
        "PATCH": {
            "table": "permissions",
            "method": "PATCH",
            "path": "/permissions/:id",
            "trylink": "http://fbroqua.sytes.net:2000/permissions/0"
        },
        "DELETE": {
            "table": "permissions",
            "method": "DELETE",
            "path": "/permissions/:id",
            "trylink": "http://fbroqua.sytes.net:2000/permissions/0"
        }
    },
    "products": {
        "GET_ALL": {
            "table": "products",
            "method": "GET_ALL",
            "path": "/products",
            "trylink": "http://fbroqua.sytes.net:2000/products"
        },
        "GET_ONE": {
            "table": "products",
            "method": "GET_ONE",
            "path": "/products/:id",
            "trylink": "http://fbroqua.sytes.net:2000/products/0"
        },
        "POST": {
            "table": "products",
            "method": "POST",
            "path": "/products",
            "trylink": "http://fbroqua.sytes.net:2000/products"
        },
        "PUT": {
            "table": "products",
            "method": "PUT",
            "path": "/products/:id",
            "trylink": "http://fbroqua.sytes.net:2000/products/0"
        },
        "PATCH": {
            "table": "products",
            "method": "PATCH",
            "path": "/products/:id",
            "trylink": "http://fbroqua.sytes.net:2000/products/0"
        },
        "DELETE": {
            "table": "products",
            "method": "DELETE",
            "path": "/products/:id",
            "trylink": "http://fbroqua.sytes.net:2000/products/0"
        }
    },
    "units": {
        "GET_ALL": {
            "table": "units",
            "method": "GET_ALL",
            "path": "/units",
            "trylink": "http://fbroqua.sytes.net:2000/units"
        },
        "GET_ONE": {
            "table": "units",
            "method": "GET_ONE",
            "path": "/units/:id",
            "trylink": "http://fbroqua.sytes.net:2000/units/0"
        },
        "POST": {
            "table": "units",
            "method": "POST",
            "path": "/units",
            "trylink": "http://fbroqua.sytes.net:2000/units"
        },
        "PUT": {
            "table": "units",
            "method": "PUT",
            "path": "/units/:id",
            "trylink": "http://fbroqua.sytes.net:2000/units/0"
        },
        "PATCH": {
            "table": "units",
            "method": "PATCH",
            "path": "/units/:id",
            "trylink": "http://fbroqua.sytes.net:2000/units/0"
        },
        "DELETE": {
            "table": "units",
            "method": "DELETE",
            "path": "/units/:id",
            "trylink": "http://fbroqua.sytes.net:2000/units/0"
        }
    },
    "user_attributes": {
        "GET_ALL": {
            "table": "user_attributes",
            "method": "GET_ALL",
            "path": "/users/:id/attributes",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/attributes"
        },
        "GET_ONE": {
            "table": "user_attributes",
            "method": "GET_ONE",
            "path": "/users/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/attributes/0"
        },
        "POST": {
            "table": "user_attributes",
            "method": "POST",
            "path": "/users/:id/attributes",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/attributes"
        },
        "PUT": {
            "table": "user_attributes",
            "method": "PUT",
            "path": "/users/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/attributes/0"
        },
        "PATCH": {
            "table": "user_attributes",
            "method": "PATCH",
            "path": "/users/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/attributes/0"
        },
        "DELETE": {
            "table": "user_attributes",
            "method": "DELETE",
            "path": "/users/:id/attributes/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/attributes/0"
        }
    },
    "user_permissions": {
        "GET_ALL": {
            "table": "user_permissions",
            "method": "GET_ALL",
            "path": "/users/:id/permissions",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/permissions"
        },
        "GET_ONE": {
            "table": "user_permissions",
            "method": "GET_ONE",
            "path": "/users/:id/permissions/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/permissions/0"
        },
        "POST": {
            "table": "user_permissions",
            "method": "POST",
            "path": "/users/:id/permissions",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/permissions"
        },
        "PUT": {
            "table": "user_permissions",
            "method": "PUT",
            "path": "/users/:id/permissions/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/permissions/0"
        },
        "PATCH": {
            "table": "user_permissions",
            "method": "PATCH",
            "path": "/users/:id/permissions/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/permissions/0"
        },
        "DELETE": {
            "table": "user_permissions",
            "method": "DELETE",
            "path": "/users/:id/permissions/:id2",
            "trylink": "http://fbroqua.sytes.net:2000/users/0/permissions/0"
        }
    },
    "users": {
        "GET_ALL": {
            "table": "users",
            "method": "GET_ALL",
            "path": "/users",
            "trylink": "http://fbroqua.sytes.net:2000/users"
        },
        "GET_ONE": {
            "table": "users",
            "method": "GET_ONE",
            "path": "/users/:id",
            "trylink": "http://fbroqua.sytes.net:2000/users/0"
        },
        "POST": {
            "table": "users",
            "method": "POST",
            "path": "/users",
            "trylink": "http://fbroqua.sytes.net:2000/users"
        },
        "PUT": {
            "table": "users",
            "method": "PUT",
            "path": "/users/:id",
            "trylink": "http://fbroqua.sytes.net:2000/users/0"
        },
        "PATCH": {
            "table": "users",
            "method": "PATCH",
            "path": "/users/:id",
            "trylink": "http://fbroqua.sytes.net:2000/users/0"
        },
        "DELETE": {
            "table": "users",
            "method": "DELETE",
            "path": "/users/:id",
            "trylink": "http://fbroqua.sytes.net:2000/users/0"
        }
    }
}