www.api.seguridadmorris.com Open in urlscan Pro
192.185.48.203  Public Scan

Submitted URL: https://www.api.seguridadmorris.com/
Effective URL: https://www.api.seguridadmorris.com/api/documentation
Submission: On September 26 via automatic, source certstream-suspicious — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

MORRIS


MORRIS API DOCUMENTATION

Guardar
arrow_drop_up
 * description Documentación
 * code Morris API
 * donut_large Workbench
 * data_object Esquema

Documentación Morris API Workbench Esquema

<script src= "https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min.js"
></script>
<script>

const headers = {
Authorization : "{{ getToken(token) }}" ,
Content-Type : "application/json"
}

const body = {
{{ item.name }} : "{{ item.value }}" ,
}

axios . request ( {
url : "https://morris.codev.com.co{{ url }}" ,
method : "{{ method }}" ,
headers ,
data : body
} ) . then ( response => console . log ( response . data ) ) ;

</script>



{{ TITLE }}


{{ GETMETHODTYPE(ENTITY.METHOD) }}

{{ entity.url }}

{{ entity.tag }}


DESCRIPCIÓN

{{ entity.description }}


PARÁMETROS

{{ param.name }} ({{ param.type }}) {{ param.description }}


INCLUDES

{{ include }}


PARÁMETROS PERSONALIZADOS

Aquí puedes enviar parámetros separados por "&" ejemplo: page=1&top=5&other=true





TABLAS RELACIONADAS

 * {{ table }}

{{ attr.name }} ({{ attr.type }}) {{ attr.description }}


NO HAY PARAMETROS



Probar


RESPUESTA


INTRODUCCIÓN


CONOZCA LA API Y APRENDA A USARLA.

Si aún no sabe qué es, podemos presentarlo diciendo que API es la abreviatura de
lo que se conoce como interfaz de programación de aplicaciones. Básicamente una
API es un software que actúa como intermediario entre dos aplicaciones. Es un
mensajero que ayuda a las aplicaciones a comunicarse entre sí. Esto significa
que una aplicación externa a la API consumirá los recursos de esta y trabajará
con ellos según el propósito que tenga para su funcionalidad. Esto puede
lograrse a través de los formatos XML o JSON.
El uso de esta API está dirigida a la funcionalidad de los requerimientos de
Morris y está estructurada en formato JSON. por lo que más adelante encontrará
la documentación de cada uno de los endpoints y la funcionalidad que estos
proveen.
La api provee varias formas de manipular los datos de cada entidad usando
simples parámetros por la url, como filtros, paginación, búsquedas etc. por lo
que ya no es necesario incluir un endpoint de búsquedas , de filtros o de
condiciones muy específicas tales como los datos que pertenecen a cierto usuario
o al usuario actualmente logueado.
todo esto ya es posible manejarlo a nivel global en toda la api únicamente
usando parámetros por url. Esto permite seleccionar datos según la necesidad de
la consulta usando condicionales "sql". Con esto podemos manipular por url el
resultado de la consulta a la api, por lo que podemos usar esta ventaja para
crear buscadores por ejemplo. si después de leer esto no entiende la metodología
de las consultas no se preocupe el contenido a continuación explica cada una de
estas funcionalidades.


INCLUDES

Los includes son una forma de llamar entidades relacionadas con el recurso
solicitado. tome como ejemplo una consulta tipo GET que nos devuelve una lista
de películas:

<script>

axios . request ( {
url : "https://morris.codev.com.co/api/v1/movies" ,
method : "GET" ,
headers ,
data : body
} ) . then ( response => console . log ( response . data ) ) ;

</script>

normalmente tendremos una respuesta similar a esta:

ahora si agregamos el parámetro include podremos llamar entidades relacionadas
de la siguiente manera:

/api/v1/movies?include=category

ahora la consulta nos devolverá para cada objeto la propiedad "category" con la
información de la categoría:

puedes llamar múltiples includes simplemente separándolos por comas:

/api/v1/movies?include=category,user

también puedes anidar includes, tome como ejemplo que category acepta el include
de "status"

/api/v1/categories?include=status

podemos llamarlo desde la ruta de movies pidiendo el estado de la categoría de
la siguiente manera:

/api/v1/movies?include=category.status

la consulta nos devolverá algo como esto:

puedes ver que includes puedes poner en la documentación de cada endpoint.


PAGINACIÓN

La paginación es la mejor forma de economizar la carga grande de datos
simplemente separándose por lotes. Esto acorta muchísimo los tiempos de carga de
las consultas a la api. por defecto cualquier petición a la api no devuelve los
datos paginados si no la lista completa. para solicitar una paginación puedes
hacerlo pasando los parámetros "top" y "page" ejemplo:

/api/v1/movies?top=5&page=1

En este caso el parámetro "top" indica el número de datos límite por consulta
que en el ejemplo anterior es de "5". y el parámetro "page" indica el lote de
datos que se cargará que en este es el el primero "1". por lo cual la consulta
anterior nos devolvería los datos del 1 al 5.
la siguiente consulta devolvería datos del 6 al 10:

/api/v1/movies?top=5&page=2
y la siguiente consulta devolvería datos del 11 al 15:
/api/v1/movies?top=5&page=3

así sucesivamente...


FILTROS

Los filtros son una forma de seleccionar datos que cumplen con una o más
condiciones en específico. la api provee una forma de filtrar las consultas de
la base de datos usando condicionales SQL únicamente usando la url, para
entender esto es importante conocer las condiciones básicas de sql.
esta seria una consulta sql plana consultando los datos de la tabla "movies"

select * from movies

esta es la consulta base que devuelven todos los endpoints tipo GET, un ejemplo
de petición a la lista de películas:

<script>

axios . request ( {
url : "https://morris.codev.com.co/api/v1/movies" ,
method : "GET" ,
headers ,
data : body
} ) . then ( response => console . log ( response . data ) ) ;

</script>

Ahora si deseamos filtrar datos podemos hacerlo pasando el parámetro "filter"
por la url y especificando las condiciones que debe cumplir la consulta usando
las condicionales "like", "=", "!=", ">", "<" a continuación se explica cada una
de estas:


IGUAL QUE

Para filtrar datos con la condicional "igual que" pasamos el nombre del atributo
seguido de ":" y el valor a coincidir, un ejemplo de filtro usando condicional
"=":

/api/v1/movies?filter=id:1

Aquí filtramos los datos que tengan el id = 1, puedes especificar cualquier
atributo del recurso solicitado otro ejemplo con el atributo name:

/api/v1/movies?filter=name:Movie 1


DIFERENTE DE

Para filtrar datos con la condicional "Diferente de" pasamos el nombre del
atributo seguido de "!" y el valor a coincidir, un ejemplo de filtro usando
condicional "!=":

/api/v1/movies?filter=id!1

Aquí filtramos los datos que tengan el id diferente a "1" lo cual nos trae todos
excepto el del id "1", puedes especificar cualquier atributo del recurso
solicitado otro ejemplo con el atributo name:

/api/v1/movies?filter=name!Movie 1


SIMILAR A

Muchas veces necesitamos filtrar datos que cumplan no con una condición exacta
si no con una similar a los detalles especificados, para filtrar datos con la
condicional "Similar a" pasamos el nombre del atributo seguido de "/" y el valor
a coincidir, un ejemplo de filtro usando condicional "like":

/api/v1/movies?filter=name/Movie

En este caso la consulta devolverá todos los datos que tienen en el atributo
"name" la palabra "movie" ya sea en mayusculas o minusculas, por lo que un
ejemplo de respuesta sería el siguiente:


MAYOR QUE E MENOR QUE

Para filtrar datos con la condicional "Mayor que" pasamos el nombre del atributo
seguido de ">" y el valor a coincidir, un ejemplo de filtro usando condicional
">":

/api/v1/movies?filter=id>1

Aquí filtramos los datos donde su id sea mayor a 1, en el caso de menor que
sería exactamente igual solo que en vez de ">" pasamos "<" un ejemplo de
condicional "<":

/api/v1/movies?filter=id<100


MÚLTIPLES CONDICIONALES CON "AND" Y "OR"

Anteriormente hablamos de las condicionales "=", "!=", "like", ">" y "<" pero
también sabemos que es muy necesario hacer uso de todas estas en una sola
consulta, lo podemos hacer usando separadores "and" u "or", el condicionante
"and" se encarga de validar que todas las condiciones pasadas por url se
cumplan, mientras que or se encarga de validar que alguna de estas condiciones
se cumplan.
para separar las condicionales por "and" podemos hacerlo usando "," y para
separarlas por "or" lo hacemos con "|".
un ejemplo de condicionales múltiples usando "and"

/api/v1/movies?filter=id>0,id<100,id!200,name/movie

En el ejemplo anterior usamos la separación "and" lo cual validará que todas las
condicionales se cumplan
en el caso de "or" se validará que al menos una de todas las condiciones pasadas
a la url se cumplan, un ejemplo de condicionales múltiples usando "or"

/api/v1/movies?filter=id>0|id<100|id!200|name/movie


SELECT

es importante saber que las condiciones "and" y "or" no pueden ir juntas al
tiempo por lo que la siguiente consulta no funcionaría:

/api/v1/movies?filter=id>0,id<100|id!200,name/movie

En estos casos se le dará prioridad a "or", sin embargo podemos usar el
parámetro "select" para separar las consultas "or" de las "and" o las "and" de
las "or", lo impórtate es saber que nuestra consulta no debe llevar
condicionales "and" y "or" mezcladas. sin embargo es obvio que existan casos
donde debamos aplicarlas a ambos, en estos casos usamos a "select" como un sobre
filtro para "filter" por lo que nuestro filtro anterior quedaría de la siguiente
manera

/api/v1/movies?filter=id>0|id<100&select=id!200,name/movie

el parámetro "select" actúa como un sobre filtro de "filter" por lo que primero
se ejecutara "filter" y a ese resultado lo filtramos con las condicionales
enviadas por "select". esto nos sirve para separar las condicionales, obteniendo
primero una consulta usando por ejemplo "or" y sobre ese resultado usando
"select" para filtrar usando "and" o usando "filter" para filtrar por "and" y
"select" para filtrar la consulta de "filter" por "or".

Nota: el parámetro "select" no aplica para consultas multitabla, solo para
atributos proporcionados directamente por el modelo.


ORDERBY

El orderBy parámetro se encarga de ordenar la colección de datos de menor a
mayor en el caso de números y fechas, y alfabéticamente en el caso de tratarse
de una cadena de texto según el atributo pasado en el parámetro ejemplo:

/api/v1/movies?orderBy=name

En este caso se ordenará alfabéticamente ya que estamos ordenando los datos por
un atributo de tipo string como lo es el nombre, en el caso de tratarse de un
entero como por ejemplo el id se ordenarán los datos de mayor a menor según el
valor del id:

/api/v1/movies?orderBy=id

Normalmente las colecciones de datos devueltas por la api ya están ordenadas de
menor a mayor por id, otro ejemplo podría ser la fecha de creación, que en el
caso de que el atributo especificado sea de tipo fecha se ordenará igualmente de
menor a mayor:

/api/v1/movies?orderBy=created_at

En este ejemplo ordenamos los datos por el atributo 'created_at' que nos
ordenará los datos del más viejo al más reciente, siendo el más reciente el
último de todos.
Por último es importante saber que puedes combinar el resto de parámetros con
orderBy un ejemplo de esto sería un filtro:

/api/v1/movies?orderBy=created_at&filter=id<20

En este caso se llaman solo los datos con id menor a 20 y ordenados del más
viejo al más reciente.


ORDERBYDESC

Al igual que el parámetro orderBy este sirve para ordenar colecciones de datos
devueltas por la api. la única diferencia es que orderByDesc lo hace
inversamente, en los casos de atributos con tipo string se ordenarán
alfabéticamente pero de la Z a la A, en el caso de enteros se ordenará de mayor
a menor siendo el menor el último, y en el caso de fechas se ordenará del más
reciente al más viejo siendo el más viejo el último.
Al igual que orderBy puedes combinar otros parámetros con orderByDesc por
ejemplo un filtro:

/api/v1/movies?orderByDesc=created_at&filter=id<20

En este caso se llaman solo los datos con id menor a 20 y ordenados del más
reciente al más viejo.


CONSULTAS MÚLTITABLA

Anteriormente hablamos de los include para llamar entidades relacionadas como
ejemplo tomamos a movies llamando su categoría relacionada de esta manera:

/api/v1/movies?include=category

con una respuesta como esta:

ok, ya sabemos qué movies está relacionada con categories, que pasa si queremos
filtrar las películas de una categoría en específico?
podemos hacerlo con la "foreign key" que normalmente se declara con el nombre de
la tabla en singular y seguido de un "_" y un "id". entonces la "fk" en este
caso sería "category_id" y nuestro filtro quedaría de la siguiente manera:

/api/v1/movies?filter=category_id:2

ok, pero y si queremos hacer el filtro por el nombre de la categoría? aquí es
donde entran las consultas multitabla. para hacer esto necesitamos especificar
el nombre de la tabla relacionada seguido de "." seguido de la propiedad que
deseamos usar para el filtro y seguido del valor usado por el filtro.
un ejemplo de consultas multitabla usando un filtro por nombre de categoría

/api/v1/movies?filter=categories.name:category 1

ok, y cómo podemos saber el nombre de la tabla para especificar por la url?
en la documentación se encuentra el esquema de la base de datos en formato pdf
solo tienes que dar click en el botón "workbench" o también puedes ver en cada
endpoint una lista de tablas relacionadas con el recurso.


CONSULTAS ANIDADAS

También puedes anidar consultas. supongamos que categories tabla está
relacionada con statuses tabla, y nuestro filtro a aplicar es: las películas
cuyas categorías están en un estado habilitado. nuestro filtro quedaría de la
siguiente manera:

/api/v1/movies?filter=categories.statuses.name:Habilitado

puedes anidar tantas tablas como gustes.


FIRST

En ocasiones necesitaremos obtener únicamente un objeto de un modelo especifico.
Para esto podemos usar un filtro por id y luego pasar el parámetro “first” para
obtener el primer objeto como respuesta en lugar de una colección de datos.
Normalmente usando un filtro como este:

/api/v1/movies?filter=id:5

Obtendríamos una respuesta como esta:

Para traer únicamente el objeto en lugar de la colección pasamos el parámetro
“first”:

/api/v1/movies?filter=id:5&first

Que nos devolverá el primer registro en un objeto en lugar de una colección de
datos. Por lo cual obtendríamos una respuesta como esta:


REGISTROS ELIMINADOS

Normalmente tenemos que eliminar registros de la base datos, lo cual puede ser
un problema si se trata de información muy delicada en el sistema, por lo que no
podríamos recuperar esta información y se daría por perdida. Para solucionar
este problema se aplica la eliminación suave que simplemente pondrá el registro
en un estado inactivo que lo hará invisible a los ojos de quienes usan el
sistema.


TRASHED

Para poder visualizar únicamente los registros eliminados lo hacemos pasando el
parámetro “trashed” en la url:

/api/v1/movies?trashed


ALL

Ahora para traer todos los datos incluidos registros eliminados y no eliminados
lo hacemos pasando el parámetro “all” en la url

/api/v1/movies?all

Los parámetros filter, select, first etc… pueden combinarse junto con “trashed”
y “all”.

/api/v1/movies?trashed&filter=id>0&select=name/movie


EXPORTAR PDF

Existen casos donde podemos exportar una colección de datos en formato pdf, para
hacer esto solo necesitamos pasar el parámetro “pdf” en la url:

/api/v1/movies?pdf

También podemos filtrar los datos que se cargaran en el pdf combinando el
parámetro “pdf” junto con filter, select etc…

/api/v1/movies?pdf&filter=id<20&select=name/movie

Por defecto se visualiza el pdf en el navegador, si lo que deseas es descargarlo
de inmediato puedes hacerlo pasando el parámetro "download" en la url:

/api/v1/movies?pdf&download
Nota: no todos los módulos implementan esta funcionalidad por lo que en estos
casos simplemente se devolverá la colección de datos


EXPORTAR EXCEL

También existen casos donde podemos exportar un csv de datos, para hacerlo
simplemente pasamos el parámetro “export” a la url

/api/v1/movies?export

También es posible filtrar los resultados combinado export con filter, select
etc…

/api/v1/movies?export&filter=id<20&select=name/movie
Nota: no todos los módulos implementan esta funcionalidad por lo que en estos
casos simplemente se devolverá la colección de datos


FILTRANDO AL USUARIO ACTUAL

Normalmente filtramos información del usuario actual, un ejemplo de esto sería
una consulta a las películas del usuario logueado, podríamos usar un filtro para
esto que quedaría de la siguiente manera:

/api/v1/movies?filter=user_id:1

o también con una consulta multitabla:

/api/v1/movies?filter=users.id:1

Sin embargo el tener que pasar el id del usuario por la url tendríamos que
primero obtener la información del usuario usando un endpoint "auth/me" para
obtener ese id, ademas de que tendríamos que enviarlo en todas las peticiones y
eso nos obliga a hacer un proceso extra para obtener ese id de donde sea que lo
hayamos guardado. para evitar esto la api provee una convención para acceder la
información del usuario por la url de la siguiente manera:

/api/v1/movies?filter=users.id:{auth.user.id}

aquí solamente cambiamos el id plano por "{auth.user.id}" que autománticamente
usara el id del usuario logueado, esto no funciona únicamente para el id puedes
usarlo con cualquier atributo del usuario por ejemplo el nombre:

/api/v1/movies?filter=users.name:{auth.user.name}


FORCEALL

En ocasiones la API esta configurada con filtros por defecto, un ejemplo podría
ser una consulta a la lista de películas cuya fecha de lanzamiento es menor a 1
año, esto significa que el endpoint api/v1/movies siempre nos traerá
independientemente del filtro que usemos las películas ya filtradas de esta
manera.
Para forzar a la API a devolver todos los datos e ignore el filtro por defecto
podemos hacerlo pasando el parámetro forceAll a la url:

/api/v1/movies?forceAll


MÚLTIPLES PARÁMETROS

Por último es importante aclarar que puedes hacer uso de todos los parámetros
mencionados anteriormente separándolos por "&" y saber que "include" no
necesariamente deber ir de primeras. para poner todos los ejemplos juntos
tomemos el ejemplo de una consulta de películas cuyas categorías están
habilitadas, paginadas por 20 datos , tomamos el lote número 3 e incluimos al
usuario y a la categoría en cada uno de los modelos devueltos:

/api/v1/movies?filter=categories.statuses.name:Habilitado&include=category,user&top=20&page=3
{{ note.name }}



ESQUEMA DE BASE DE DATOS RELACIONAL

{{ tb }}



MORRIS


MORRIS API DOCUMENTATION

Guardar
arrow_drop_up
 * descriptionDocumentación
 * codeMorris API
 * donut_largeWorkbench
 * data_objectEsquema

DocumentaciónMorris APIWorkbenchEsquema




INTRODUCCIÓN


CONOZCA LA API Y APRENDA A USARLA.

Si aún no sabe qué es, podemos presentarlo diciendo que API es la abreviatura de
lo que se conoce como interfaz de programación de aplicaciones. Básicamente una
API es un software que actúa como intermediario entre dos aplicaciones. Es un
mensajero que ayuda a las aplicaciones a comunicarse entre sí. Esto significa
que una aplicación externa a la API consumirá los recursos de esta y trabajará
con ellos según el propósito que tenga para su funcionalidad. Esto puede
lograrse a través de los formatos XML o JSON.
El uso de esta API está dirigida a la funcionalidad de los requerimientos de
Morris y está estructurada en formato JSON. por lo que más adelante encontrará
la documentación de cada uno de los endpoints y la funcionalidad que estos
proveen.
La api provee varias formas de manipular los datos de cada entidad usando
simples parámetros por la url, como filtros, paginación, búsquedas etc. por lo
que ya no es necesario incluir un endpoint de búsquedas , de filtros o de
condiciones muy específicas tales como los datos que pertenecen a cierto usuario
o al usuario actualmente logueado.
todo esto ya es posible manejarlo a nivel global en toda la api únicamente
usando parámetros por url. Esto permite seleccionar datos según la necesidad de
la consulta usando condicionales "sql". Con esto podemos manipular por url el
resultado de la consulta a la api, por lo que podemos usar esta ventaja para
crear buscadores por ejemplo. si después de leer esto no entiende la metodología
de las consultas no se preocupe el contenido a continuación explica cada una de
estas funcionalidades.


INCLUDES

Los includes son una forma de llamar entidades relacionadas con el recurso
solicitado. tome como ejemplo una consulta tipo GET que nos devuelve una lista
de películas:

<script>

axios.request({
url:"https://morris.codev.com.co/api/v1/movies",
method:"GET",
headers,
data:body
}).then(response=>console.log(response.data));

</script>

normalmente tendremos una respuesta similar a esta:

{
"data":{
"data":[
{
"id":1,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
},
{
"id":2,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
}
]
}
}

ahora si agregamos el parámetro include podremos llamar entidades relacionadas
de la siguiente manera:

/api/v1/movies?include=category

ahora la consulta nos devolverá para cada objeto la propiedad "category" con la
información de la categoría:

{
"data":{
"data":[
{
"id":1,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524",
"category":{
"id":1,
"name":"category example"
}
},
{
"id":2,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524",
"category":{
"id":2,
"name":"category example"
}
}
]
}
}

puedes llamar múltiples includes simplemente separándolos por comas:

/api/v1/movies?include=category,user

también puedes anidar includes, tome como ejemplo que category acepta el include
de "status"

/api/v1/categories?include=status

podemos llamarlo desde la ruta de movies pidiendo el estado de la categoría de
la siguiente manera:

/api/v1/movies?include=category.status

la consulta nos devolverá algo como esto:

{
"data":{
"data":[
{
"id":1,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524",
"category":{
"id":1,
"name":"category example",
"status":{
"id":1,
"name":"Habilitado"
}
}
},
{
"id":2,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524",
"category":{
"id":2,
"name":"category example",
"status":{
"id":1,
"name":"Habilitado"
}
}
}
]
}
}

puedes ver que includes puedes poner en la documentación de cada endpoint.


PAGINACIÓN

La paginación es la mejor forma de economizar la carga grande de datos
simplemente separándose por lotes. Esto acorta muchísimo los tiempos de carga de
las consultas a la api. por defecto cualquier petición a la api no devuelve los
datos paginados si no la lista completa. para solicitar una paginación puedes
hacerlo pasando los parámetros "top" y "page" ejemplo:

/api/v1/movies?top=5&page=1

En este caso el parámetro "top" indica el número de datos límite por consulta
que en el ejemplo anterior es de "5". y el parámetro "page" indica el lote de
datos que se cargará que en este es el el primero "1". por lo cual la consulta
anterior nos devolvería los datos del 1 al 5.
la siguiente consulta devolvería datos del 6 al 10:

/api/v1/movies?top=5&page=2
y la siguiente consulta devolvería datos del 11 al 15:
/api/v1/movies?top=5&page=3

así sucesivamente...


FILTROS

Los filtros son una forma de seleccionar datos que cumplen con una o más
condiciones en específico. la api provee una forma de filtrar las consultas de
la base de datos usando condicionales SQL únicamente usando la url, para
entender esto es importante conocer las condiciones básicas de sql.
esta seria una consulta sql plana consultando los datos de la tabla "movies"

select * from movies

esta es la consulta base que devuelven todos los endpoints tipo GET, un ejemplo
de petición a la lista de películas:

<script>

axios.request({
url:"https://morris.codev.com.co/api/v1/movies",
method:"GET",
headers,
data:body
}).then(response=>console.log(response.data));

</script>

Ahora si deseamos filtrar datos podemos hacerlo pasando el parámetro "filter"
por la url y especificando las condiciones que debe cumplir la consulta usando
las condicionales "like", "=", "!=", ">", "<" a continuación se explica cada una
de estas:


IGUAL QUE

Para filtrar datos con la condicional "igual que" pasamos el nombre del atributo
seguido de ":" y el valor a coincidir, un ejemplo de filtro usando condicional
"=":

/api/v1/movies?filter=id:1

Aquí filtramos los datos que tengan el id = 1, puedes especificar cualquier
atributo del recurso solicitado otro ejemplo con el atributo name:

/api/v1/movies?filter=name:Movie 1


DIFERENTE DE

Para filtrar datos con la condicional "Diferente de" pasamos el nombre del
atributo seguido de "!" y el valor a coincidir, un ejemplo de filtro usando
condicional "!=":

/api/v1/movies?filter=id!1

Aquí filtramos los datos que tengan el id diferente a "1" lo cual nos trae todos
excepto el del id "1", puedes especificar cualquier atributo del recurso
solicitado otro ejemplo con el atributo name:

/api/v1/movies?filter=name!Movie 1


SIMILAR A

Muchas veces necesitamos filtrar datos que cumplan no con una condición exacta
si no con una similar a los detalles especificados, para filtrar datos con la
condicional "Similar a" pasamos el nombre del atributo seguido de "/" y el valor
a coincidir, un ejemplo de filtro usando condicional "like":

/api/v1/movies?filter=name/Movie

En este caso la consulta devolverá todos los datos que tienen en el atributo
"name" la palabra "movie" ya sea en mayusculas o minusculas, por lo que un
ejemplo de respuesta sería el siguiente:

{
"data":{
"data":[
{
"id":1,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
},
{
"id":2,
"name":"Movie 2",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
},
{
"id":3,
"name":"un nombre pero que tiene la palabra movie",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
}
]
}
}


MAYOR QUE E MENOR QUE

Para filtrar datos con la condicional "Mayor que" pasamos el nombre del atributo
seguido de ">" y el valor a coincidir, un ejemplo de filtro usando condicional
">":

/api/v1/movies?filter=id>1

Aquí filtramos los datos donde su id sea mayor a 1, en el caso de menor que
sería exactamente igual solo que en vez de ">" pasamos "<" un ejemplo de
condicional "<":

/api/v1/movies?filter=id<100


MÚLTIPLES CONDICIONALES CON "AND" Y "OR"

Anteriormente hablamos de las condicionales "=", "!=", "like", ">" y "<" pero
también sabemos que es muy necesario hacer uso de todas estas en una sola
consulta, lo podemos hacer usando separadores "and" u "or", el condicionante
"and" se encarga de validar que todas las condiciones pasadas por url se
cumplan, mientras que or se encarga de validar que alguna de estas condiciones
se cumplan.
para separar las condicionales por "and" podemos hacerlo usando "," y para
separarlas por "or" lo hacemos con "|".
un ejemplo de condicionales múltiples usando "and"

/api/v1/movies?filter=id>0,id<100,id!200,name/movie

En el ejemplo anterior usamos la separación "and" lo cual validará que todas las
condicionales se cumplan
en el caso de "or" se validará que al menos una de todas las condiciones pasadas
a la url se cumplan, un ejemplo de condicionales múltiples usando "or"

/api/v1/movies?filter=id>0|id<100|id!200|name/movie


SELECT

es importante saber que las condiciones "and" y "or" no pueden ir juntas al
tiempo por lo que la siguiente consulta no funcionaría:

/api/v1/movies?filter=id>0,id<100|id!200,name/movie

En estos casos se le dará prioridad a "or", sin embargo podemos usar el
parámetro "select" para separar las consultas "or" de las "and" o las "and" de
las "or", lo impórtate es saber que nuestra consulta no debe llevar
condicionales "and" y "or" mezcladas. sin embargo es obvio que existan casos
donde debamos aplicarlas a ambos, en estos casos usamos a "select" como un sobre
filtro para "filter" por lo que nuestro filtro anterior quedaría de la siguiente
manera

/api/v1/movies?filter=id>0|id<100&select=id!200,name/movie

el parámetro "select" actúa como un sobre filtro de "filter" por lo que primero
se ejecutara "filter" y a ese resultado lo filtramos con las condicionales
enviadas por "select". esto nos sirve para separar las condicionales, obteniendo
primero una consulta usando por ejemplo "or" y sobre ese resultado usando
"select" para filtrar usando "and" o usando "filter" para filtrar por "and" y
"select" para filtrar la consulta de "filter" por "or".

Nota: el parámetro "select" no aplica para consultas multitabla, solo para
atributos proporcionados directamente por el modelo.


ORDERBY

El orderBy parámetro se encarga de ordenar la colección de datos de menor a
mayor en el caso de números y fechas, y alfabéticamente en el caso de tratarse
de una cadena de texto según el atributo pasado en el parámetro ejemplo:

/api/v1/movies?orderBy=name

En este caso se ordenará alfabéticamente ya que estamos ordenando los datos por
un atributo de tipo string como lo es el nombre, en el caso de tratarse de un
entero como por ejemplo el id se ordenarán los datos de mayor a menor según el
valor del id:

/api/v1/movies?orderBy=id

Normalmente las colecciones de datos devueltas por la api ya están ordenadas de
menor a mayor por id, otro ejemplo podría ser la fecha de creación, que en el
caso de que el atributo especificado sea de tipo fecha se ordenará igualmente de
menor a mayor:

/api/v1/movies?orderBy=created_at

En este ejemplo ordenamos los datos por el atributo 'created_at' que nos
ordenará los datos del más viejo al más reciente, siendo el más reciente el
último de todos.
Por último es importante saber que puedes combinar el resto de parámetros con
orderBy un ejemplo de esto sería un filtro:

/api/v1/movies?orderBy=created_at&filter=id<20

En este caso se llaman solo los datos con id menor a 20 y ordenados del más
viejo al más reciente.


ORDERBYDESC

Al igual que el parámetro orderBy este sirve para ordenar colecciones de datos
devueltas por la api. la única diferencia es que orderByDesc lo hace
inversamente, en los casos de atributos con tipo string se ordenarán
alfabéticamente pero de la Z a la A, en el caso de enteros se ordenará de mayor
a menor siendo el menor el último, y en el caso de fechas se ordenará del más
reciente al más viejo siendo el más viejo el último.
Al igual que orderBy puedes combinar otros parámetros con orderByDesc por
ejemplo un filtro:

/api/v1/movies?orderByDesc=created_at&filter=id<20

En este caso se llaman solo los datos con id menor a 20 y ordenados del más
reciente al más viejo.


CONSULTAS MÚLTITABLA

Anteriormente hablamos de los include para llamar entidades relacionadas como
ejemplo tomamos a movies llamando su categoría relacionada de esta manera:

/api/v1/movies?include=category

con una respuesta como esta:

{
"data":{
"data":[
{
"id":1,
"name":"Movie 1",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524",
"category":{
"id":1,
"name":"category example"
}
},
{
"id":2,
"name":"Movie 2",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524",
"category":{
"id":2,
"name":"category example"
}
}
]
}
}

ok, ya sabemos qué movies está relacionada con categories, que pasa si queremos
filtrar las películas de una categoría en específico?
podemos hacerlo con la "foreign key" que normalmente se declara con el nombre de
la tabla en singular y seguido de un "_" y un "id". entonces la "fk" en este
caso sería "category_id" y nuestro filtro quedaría de la siguiente manera:

/api/v1/movies?filter=category_id:2

ok, pero y si queremos hacer el filtro por el nombre de la categoría? aquí es
donde entran las consultas multitabla. para hacer esto necesitamos especificar
el nombre de la tabla relacionada seguido de "." seguido de la propiedad que
deseamos usar para el filtro y seguido del valor usado por el filtro.
un ejemplo de consultas multitabla usando un filtro por nombre de categoría

/api/v1/movies?filter=categories.name:category 1

ok, y cómo podemos saber el nombre de la tabla para especificar por la url?
en la documentación se encuentra el esquema de la base de datos en formato pdf
solo tienes que dar click en el botón "workbench" o también puedes ver en cada
endpoint una lista de tablas relacionadas con el recurso.


CONSULTAS ANIDADAS

También puedes anidar consultas. supongamos que categories tabla está
relacionada con statuses tabla, y nuestro filtro a aplicar es: las películas
cuyas categorías están en un estado habilitado. nuestro filtro quedaría de la
siguiente manera:

/api/v1/movies?filter=categories.statuses.name:Habilitado

puedes anidar tantas tablas como gustes.


FIRST

En ocasiones necesitaremos obtener únicamente un objeto de un modelo especifico.
Para esto podemos usar un filtro por id y luego pasar el parámetro “first” para
obtener el primer objeto como respuesta en lugar de una colección de datos.
Normalmente usando un filtro como este:

/api/v1/movies?filter=id:5

Obtendríamos una respuesta como esta:

{
"data":{
"data":[
{
"id":5,
"name":"Movie 5",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
}
]
}
}

Para traer únicamente el objeto en lugar de la colección pasamos el parámetro
“first”:

/api/v1/movies?filter=id:5&first

Que nos devolverá el primer registro en un objeto en lugar de una colección de
datos. Por lo cual obtendríamos una respuesta como esta:

{
"data":{
"data":{
"id":5,
"name":"Movie 5",
"description":"lorem ipsum dolor",
"link_video":"unvideofake.com",
"foto":"unafotofake.com",
"views":"5454124524"
}
}
}


REGISTROS ELIMINADOS

Normalmente tenemos que eliminar registros de la base datos, lo cual puede ser
un problema si se trata de información muy delicada en el sistema, por lo que no
podríamos recuperar esta información y se daría por perdida. Para solucionar
este problema se aplica la eliminación suave que simplemente pondrá el registro
en un estado inactivo que lo hará invisible a los ojos de quienes usan el
sistema.


TRASHED

Para poder visualizar únicamente los registros eliminados lo hacemos pasando el
parámetro “trashed” en la url:

/api/v1/movies?trashed


ALL

Ahora para traer todos los datos incluidos registros eliminados y no eliminados
lo hacemos pasando el parámetro “all” en la url

/api/v1/movies?all

Los parámetros filter, select, first etc… pueden combinarse junto con “trashed”
y “all”.

/api/v1/movies?trashed&filter=id>0&select=name/movie


EXPORTAR PDF

Existen casos donde podemos exportar una colección de datos en formato pdf, para
hacer esto solo necesitamos pasar el parámetro “pdf” en la url:

/api/v1/movies?pdf

También podemos filtrar los datos que se cargaran en el pdf combinando el
parámetro “pdf” junto con filter, select etc…

/api/v1/movies?pdf&filter=id<20&select=name/movie

Por defecto se visualiza el pdf en el navegador, si lo que deseas es descargarlo
de inmediato puedes hacerlo pasando el parámetro "download" en la url:

/api/v1/movies?pdf&download
Nota: no todos los módulos implementan esta funcionalidad por lo que en estos
casos simplemente se devolverá la colección de datos


EXPORTAR EXCEL

También existen casos donde podemos exportar un csv de datos, para hacerlo
simplemente pasamos el parámetro “export” a la url

/api/v1/movies?export

También es posible filtrar los resultados combinado export con filter, select
etc…

/api/v1/movies?export&filter=id<20&select=name/movie
Nota: no todos los módulos implementan esta funcionalidad por lo que en estos
casos simplemente se devolverá la colección de datos


FILTRANDO AL USUARIO ACTUAL

Normalmente filtramos información del usuario actual, un ejemplo de esto sería
una consulta a las películas del usuario logueado, podríamos usar un filtro para
esto que quedaría de la siguiente manera:

/api/v1/movies?filter=user_id:1

o también con una consulta multitabla:

/api/v1/movies?filter=users.id:1

Sin embargo el tener que pasar el id del usuario por la url tendríamos que
primero obtener la información del usuario usando un endpoint "auth/me" para
obtener ese id, ademas de que tendríamos que enviarlo en todas las peticiones y
eso nos obliga a hacer un proceso extra para obtener ese id de donde sea que lo
hayamos guardado. para evitar esto la api provee una convención para acceder la
información del usuario por la url de la siguiente manera:

/api/v1/movies?filter=users.id:{auth.user.id}

aquí solamente cambiamos el id plano por "{auth.user.id}" que autománticamente
usara el id del usuario logueado, esto no funciona únicamente para el id puedes
usarlo con cualquier atributo del usuario por ejemplo el nombre:

/api/v1/movies?filter=users.name:{auth.user.name}


FORCEALL

En ocasiones la API esta configurada con filtros por defecto, un ejemplo podría
ser una consulta a la lista de películas cuya fecha de lanzamiento es menor a 1
año, esto significa que el endpoint api/v1/movies siempre nos traerá
independientemente del filtro que usemos las películas ya filtradas de esta
manera.
Para forzar a la API a devolver todos los datos e ignore el filtro por defecto
podemos hacerlo pasando el parámetro forceAll a la url:

/api/v1/movies?forceAll


MÚLTIPLES PARÁMETROS

Por último es importante aclarar que puedes hacer uso de todos los parámetros
mencionados anteriormente separándolos por "&" y saber que "include" no
necesariamente deber ir de primeras. para poner todos los ejemplos juntos
tomemos el ejemplo de una consulta de películas cuyas categorías están
habilitadas, paginadas por 20 datos , tomamos el lote número 3 e incluimos al
usuario y a la categoría en cada uno de los modelos devueltos:

/api/v1/movies?filter=categories.statuses.name:Habilitado&include=category,user&top=20&page=3