api-rest-entrypoint-generator-from-mysql v1.0.2
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.
- Funcionamiento
- Funciones
- Nomenclatura MySQL
- Uso
- Configuracion mediante archivo .env
- Salida esperada
- 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"
}
}
}