Creación de instancias QMAP
qmapCreator
recibe opcionalmente un objeto que permite extender
las capacidades de la instancia.
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator({
extends: undefined,
functions: undefined,
schemas: undefined,
queries: undefined,
cache: undefined,
mode: undefined
})
Opciones
functions
Aquí es dónde se declaran las funciones que tiene disponible la query.
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator({
functions: {
upperCase: (str) => str.toUpperCase()
}
})
Luego se puede utilizar de la siguiente forma:
const query = `{
upperCase(name)
}`
Si no se declara la función, será un error en runtime para su aplicación (a menos que esté declarada en algún padre al hacer uso de extends)
schemas
Al tener un servicio que cuenta con varios niveles de autorización se puede incurrir en tener condicionales para seleccionar que datos se deben incluir según el rol, lo que significa que si se agrega un nuevo rol habrá que cambiar el código interno del endpoint, qmap tiene como propósito no enfocarse en que información tiene que poder consultar cada usuario, sino en que es lo que se quiere, por lo que los condicionales pueden cambiar su enfoque de "el rol tiene acceso a", a "se van incluir en lo consultado?", la librería se encarga de filtrar la información según lo declarado (véase función includes).
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator({
schemas: `{
admin {
transaction, product, provider
},
client {
transaction {
description, amount, date
},
product {
name
}
}
}`
})
{}
Es importante no olvidar las llaves que envuelven los schemas
En este ejemplo el administrador puede consultar toda la información en transaction, product y provider sin embargo, el cliente puede ver únicamente transaction y product, además que se le restringe que información puede consultar, transaction se limita a description, amount y date, y del product únicamente a name.
Se puede seleccionar el schema
al compilar la query:
qmap(query, {
schema: "admin"
})
Si tiene trozos repetidos puede reutilizarlos usando spread
:
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator({
schemas: `{
client {
transaction,
product
},
admin {
...client,
provider
}
}`
})
En lo anterior el cliente tiene acceso total a transaction y
product, como el administrador también los tiene simplemente
se puede utilizar el operador spread
para copiar lo que ya se definió
antes (debe estar declarado antes). Algo que por
el momento no se ha mencionado, pero es importante, es que
el spread
funciona únicamente en el scope de la query (el string)
por lo que aunque se use extends
no podrá utilizarlo con los
schemas
o queries
del qmap padre.
queries
Permite predefinir manipulaciones del JSON que pueden ser modificadas por medio de la query que se manda a ejecutar.
import { qmapCreator } from "@qmap/engine"
const qmap = qmapCreator({
queries: `{
compact_transaction {
description: transaction.description,
amount: transaction.amount,
}
}`
})
{}
Es importante no olvidar las llaves que envuelven las queries
Las queries compiladas con la función qmap
podrá hacer
uso del nombre compact_transaction
para referirse a dicha
query.
qmap("compact_transaction")
// es equivalente
qmap(`{
description: transaction.description,
amount: transaction.amount,
}`)
Para aplicar transformaciones sobre la query:
qmap(`compact_transaction {
description
}`)
extends
Permite reutilizar functions
, queries
y schemas
de
otras instancias ya creadas. Lo definido en la instancia
actual, sobreescribe el comportamiento de las anteriores
(únicamente para la nueva instacia).
import { qmapCreator } from "@qmap/engine"
const qmapCommon = qmapCreator({
functions: {
concat(...strs) {
return strs.join("")
},
take(list, n) {
return list.slice(0, n)
},
upperCase(str) {
return str.toUpperCase()
}
}
})
const qmap = qmapCreator({
extends: qmapCommon,
schemas: `{
admin {
... // puede consultar todo
// también podría no definirlo
},,
client {
name,
price
}
}`
})
Por lo que lo siguiente es válido:
qmap(`{
concat(name, id)
}`)
qmapCreator
compila la query de schemas
y queries
al ejecutarse (es decir que la instancia devuelta para
ejecutar queries ya no las vuelve a compilar)
por lo que dejar la llamada a qmapCreator
en
dónde no se vuelva a ejecutar será una buena elección.
mode
Se refiere a como debe operar la instancia y sus hijos (si no es sobreescrito)
"only-cache"
al usarapply
si el valor no existe en el cache, se lanzará una excepción"normal"
(por defecto) utiliza el cache si el valor se encuentra, en otro caso compila y guarda, si existe un cache, de otro modo funciona al igual quecompiler
"compiler"
siempre compila la query
cache
Recibe el cache (de tipo CacheStore
) que se va utilizar en la instancia actual y sus
hijos (si no es sobreescrito) véase compiler cache