# File System Operations (FSO) API
Implementa los servicios de un Resources Directory (según el RAAM de Induxsoft) a través de una API pública (web services) y
privada (biblioteca de funciones).
## Enrutamiento público
La extensión .fso está dirigida hacia los programas de la API FSO que exponen servicios, revise el ```ext.map``` de la BWL.
## Servicios Web
### Listar carpetas y/o archivos
End point: uri/lst.fso
Método HTTP: GET
Devuelve un objeto JSON con información del contenido de la URI desde la que se invocó o bien,
la que se haya especificado en los parámetros de la URL (GET) si están admitidos.
#### Parámetros GET admitidos (todos son opcionales):
* filter. Una cadena de filtro para los archivos, p.e. *.txt
* deep. Numérico que indica la profundidad de búsqueda en sub-carpetas, predeterminado 999
* search. Una cadena que será buscada en el contenido de archivos
* mode. Numérico: 0 (predeterminado) - Devuelve archivos y carpetas, 1-Solo carpetas, 2- Solo archivos y 3-Solo resultados de búsqueda en archivos
* base_path. Una cadena con la ruta del sistema local (en el servidor) usada como base para la uri
* host. Una cadena con el nombre de un host en el servidor para tomar su ubicación de archivos como base.
* uri. Una cadena que representa un URI concatenado sobre la ruta de base (base_path) para la obtención de resultados
De manera predeterminada, los parámetros en la URL base_path y host son excluyentes entre sí y son ignorados a menos que establezca ```@dklfso_multisites=@true``` en fso.config.dkl
Si se omite el parámetro uri, se asume que la URI es la que corresponde a la invocación del servicio lst.fso.
#### Privilegios requeridos
Se requiere que el usuario esté autenticado y cuente con alguno de los siguientes:
* dkl_fso_list
* read + plus
* write
* admin
Ejemplos:
```
https://misitioweb.tld/lst.fso
https://misitioweb.tld/lst.fso?filter=*.txt
https://misitioweb.tld/lst.fso?search=guanabanas&filter=*.txt&mode=3
```
### Obtener metadatos de una carpeta o archivo
Devuelve un objeto JSON con los metadatos de un archivo o carpeta
End point: uri/get.fso
Método HTTP: GET
#### Parámetros GET admitidos (todos son opcionales):
* base_path. Una cadena con la ruta del sistema local (en el servidor) usada como base para la uri
* host. Una cadena con el nombre de un host en el servidor para tomar su ubicación de archivos como base.
* uri. Una cadena que representa un URI concatenado sobre la ruta de base (base_path) para la obtención de resultados
De manera predeterminada, los parámetros en la URL base_path y host son excluyentes entre sí y son ignorados a menos que establezca ```@dklfso_multisites=@true``` en fso.config.dkl
Si se omite el parámetro uri, se asume que la URI es la que corresponde a la invocación del servicio get.fso.
#### Privilegios requeridos
Se requiere que el usuario esté autenticado y cuente con alguno de los siguientes:
* dkl_fso_getprops
* read + plus
* write
* admin
Ejemplo:
```
https://misitioweb.tld/documento.docx/get.fso
```
### Establecer metadatos de una o varias carpetas o archivos
End point: uri/set.fso
Método HTTP: POST o PUT
Se admiten los siguientes parámetros en la URL de solicitud (todos son opcionales):
* base_path. Una cadena con la ruta del sistema local (en el servidor) usada como base para la uri
* host. Una cadena con el nombre de un host en el servidor para tomar su ubicación de archivos como base.
* uri. Una cadena que representa un URI concatenado sobre la ruta de base (base_path) para la obtención de resultados
De manera predeterminada, los parámetros en la URL base_path y host son excluyentes entre sí y son ignorados a menos que establezca ```@dklfso_multisites=@true``` en fso.config.dkl
Si se omite el parámetro uri, se asume que la URI es la que corresponde a la invocación del servicio set.fso.
Cuerpo de la solicitud (payload):
```
Content-Type: application/json;charset=utf-8
{
"uri1":{
"properties":{"clave":"valor",...}
"privileges":{
"write":[{"user":"admin",...},...]
}
},
"uri2":{...},
...
"uriN":{...}
}
```
Las claves "uri1",..."uriN" del cuerpo de la solicitud y que indican los recursos a actualizar, son relativas a la uri de la URL a menos que inicien con el caracter ```/```. Para indicar que el recurso a afectar es la URL desde la que se invoca el servicio, use como clave ```.```.
Ejemplos:
Asumiendo la URL de solicitud como: ```https://misitioweb.tld/carpeta_ejemplo/set.fso```
Las uri de los recursos a afectar indicadas:
```
{
".":{ -- Afecta a la carpeta 'carpeta_ejemplo' -- },
"subcarpeta/archivo.txt":{ -- Afecta al archivo '/carpeta_ejemplo/subcarpeta/archivo.txt' -- }
"notas.txt":{ -- Afecta al archivo '/carpeta_ejemplo/notas.txt' -- }
"/otra_carpeta/texto.txt":{ -- Afecta al archivo '/otra_carpeta/texto.txt' -- }
}
```
Respuesta de ejemplo:
```
Content-Type: application/json;charset=utf-8
{
"success":true,
"data":
{
"uri1":{"props_done":true, "privs_done":true },
...
}
}
```
#### Privilegios requeridos
Se requiere que el usuario esté autenticado y cuente con alguno de los siguientes:
* dkl_fso_setprops
* write
* admin
### Subir uno o varios archivos
Este servicio permite subir archivos codificados como ```multipart/form-data``` en la ubicación (URI) de carpeta indicada.
Si los archivos ya existen, serán sobre-escritos (si el usuario que invoca el servicio tiene los privilegios suficientes).
End point: uri/upl.fso
Método HTTP: POST o PUT
Content-Type: multipart/form-data
Se admiten los siguientes parámetros en la URL de solicitud (todos son opcionales):
* base_path. Una cadena con la ruta del sistema local (en el servidor) usada como base para la uri
* host. Una cadena con el nombre de un host en el servidor para tomar su ubicación de archivos como base.
* uri. Una cadena que representa un URI concatenado sobre la ruta de base (base_path) para la obtención de resultados
De manera predeterminada, los parámetros en la URL base_path y host son excluyentes entre sí y son ignorados a menos que establezca ```@dklfso_multisites=@true``` en fso.config.dkl
Si se omite el parámetro uri, se asume que la URI es la que corresponde a la invocación del servicio upl.fso.
Fragmento HTML de ejemplo:
``` html
<html>
<body>
<h1>Ejemplo: Subir archivo</h1>
<form action="upl.cmd" enctype="multipart/form-data" method="POST">
<input type="file" id="myFile" name="filename">
<input type="submit">
</form>
</body>
</html>
```
Ejemplo de respuesta (JSON) tras enviar dos archivos:
```
Content-Type: application/json;charset=utf-8
{
"success":true,
"data":
{
"nombre_archivo1":{"done":true},
"nombre_archivo2":{"done":false,"message":"No autorizado"},
...
}
}
```
#### Privilegios requeridos
Se requiere que el usuario esté autenticado y cuente con alguno de los siguientes:
* dkl_fso_upload
* write
* admin
Adicionalmente, para permitir subir archivos de extensiones consideradas de riesgo configuradas en la variable ```@dklfso_danger_files_ext``` de fso.config.dk, se requiere alguno de los siguientes:
* dkl_fso_danger
* write + plus
* admin
### Acciones sobre el sistema de archivos
Este servicio permite las siguientes acciones directamente sobre el sistema de archivos:
* Crear una carpeta
* Eliminar una carpeta y todo su contenido
* Copiar un archivo
* Mover un archivivo
* Renombrar un archivo
* Eliminar un archivo
End point: uri/do.fso
Método HTTP: POST o PUT
Se admiten los siguientes parámetros en la URL de solicitud (todos son opcionales):
* base_path. Una cadena con la ruta del sistema local (en el servidor) usada como base para la uri
* host. Una cadena con el nombre de un host en el servidor para tomar su ubicación de archivos como base.
* uri. Una cadena que representa un URI concatenado sobre la ruta de base (base_path) para la obtención de resultados
De manera predeterminada, los parámetros en la URL base_path y host son excluyentes entre sí y son ignorados a menos que establezca ```@dklfso_multisites=@true``` en fso.config.dkl
Si se omite el parámetro uri, se asume que la URI es la que corresponde a la invocación del servicio do.fso.
Las claves "uri1",..."uriN" del cuerpo de la solicitud y que indican los recursos a actualizar, son relativas a la uri de la URL a menos que inicien con el caracter ```/```. Para indicar que el recurso a afectar es la URL desde la que se invoca el servicio, use como clave ```.```.
Cuerpo de la solicitud (payload):
```
Content-Type: application/json;charset=utf-8
{
"uri1":{ "action":"delete" },
"uri2":{ "action":"mkdir" },
"uri3":{ "action":"copy", "to":"uri_destino"},
"uri4":{ "action":"move", "to":"uri_destino"},
"uri5":{ "action":"rename", "as":"nuevo_nombre"}
...
"uriN":{...}
}
```
Ejemplo de respuesta (JSON):
```
Content-Type: application/json;charset=utf-8
{
"success":true,
"data":
{
"uri1":{"done":true},
"uri2":{"done":false,"message":"No autorizado"},
...
}
}
```
#### Privilegios requeridos
Se requiere que el usuario esté autenticado y cuente con alguno de los siguientes:
* dkl_fso_mkdir - Para crear carpetas
* dkl_fso_copy - Para copiar archivos
* dkl_fso_move - Para mover archivos
* dkl_fso_delete - Para eliminar archivos y carpetas
* dkl_fso_rename - Para renombrar archivos
* dkl_fso_overwrite - Para sobrescribir archivos en el destino al copiar o mover
* write (crear carpetas, copiar, mover, eliminar, sobrescribir y renombrar)
* write + plus (Igual que write, pero incluyendo extensiones de archivos con extensiones de riesgo)
* admin (Igual que write + plus)
Adicionalmente, para permitir escribir o renombrar archivos con extensiones consideradas de riesgo configuradas en la variable ```@dklfso_danger_files_ext``` de fso.config.dk, se requiere alguno de los siguientes:
* dkl_fso_danger
* write + plus
* admin
## Funciones disponibles en fso.dk
fso.dk requiere que previamente se incluya el archivo de configuraciones fso.config.dk y depende de functions.dkh, serialize.dkh y webauth.dkl
Ejemplo:
```
#include "dkli.dkh"
#!
program "ejemplo"
{
#include "functions.dkh"
#include "serialize.dkh"
#include "webauth.dkl"
#include "_protected/fso/fso.config.dk"
#include "_protected/fso/fso.dk"
//..su código
}
```
fso.dk contiene las siguientes funciones de interés para el programador del back-end:
### dklfso.isprotected::uri
Devuelve ```@true``` si la cadena uri indicada es una subcarpeta o archivo en una subcarpeta del carpeta protegida del sitio Web.
### dklfso.createObjectInfo::base_path,uri
Devuelve una referencia a una estructura de datos con toda la información de metadatos de un archivo o carpeta en el sistema local, o bien @null si no se encuentra el recurso.
* base_path - Es una cadena que representa la ruta de base del sitio Web en el sistema local
* uri - Es una cadena que representa la ruta relativa a base_path del recurso (archivo o carpeta) en el sistema local
### dklfso.list::¶ms
Devuelve un objeto con toda la información de carpetas y archivos, es la misma respuesta que el servicio lst.fso invocado desde el propio backend.
```params``` es una referencia a una estructura que puede tener los siguientes parámetros:
* base_path. (Requerido) Una cadena con la ruta del sistema local (en el servidor) usada como base para la uri
* uri. (Requerido) Una cadena que representa un URI concatenado sobre la ruta de base (base_path) para la obtención de resultados
* host. Una cadena con el nombre de un host en el servidor para tomar su ubicación de archivos como base, si se indica este parámetro no se ignorará base_path por lo que este último puede excluirse.
* filter. (Opcional) Una cadena de filtro para los archivos, p.e. *.txt
* deep. (Opcional) Numérico que indica la profundidad de búsqueda en sub-carpetas, predeterminado 999
* search. (Opcional) Una cadena que será buscada en el contenido de archivos
* mode. (Opcional) Numérico: 0 (predeterminado) - Devuelve archivos y carpetas, 1-Solo carpetas, 2- Solo archivos y 3-Solo resultados de búsqueda en archivos
## Metadatos
Los metadatos asociados a una carpeta o archivo son propiedades extendidas (clave/valor) o el manifiesto de privilegios.
### Propiedades extendidas
Se almacenan en archivos en formato JSON con extensión ```._m_``` a menos que indique lo contrario en fso.config.dk
Las propiedades extendidas de una carpeta se encuentran en el archivo ```._m_``` (archivo sin nombre, solo extensión) dentro de la misma.
Para las propiedades extendidas de los archivos, se emplean archivos con el mismo nombre y extensión, más la extensión ```._m_```, p.e. para un archivo denominado ```notas.docx```, existirá un archivo de propiedades extendidas llamado ```notas.docx._m_```
Si no existe el archivo ```._m_``` de propiedades extendidas, las únicas propiedades del archivo o carpeta son las que corresponden al sistema de archivos: nombre (incluyendo extensión), fecha y hora de creación, fecha y hora de último acceso y fecha y hora de última escritura (todas las fechas y horas en formato UTC)
### Manifiesto de privilegios
Se almacenan en archivos en formato JSON con extensión ```._p_``` a menos que indique lo contrario en fso.config.dk
El manifiesto de privilegios de una carpeta se encuentran en el archivo ```._p_``` (archivo sin nombre, solo extensión) dentro de la misma.
Para el manifiesto de privilegios de los archivos, se emplean archivos con el mismo nombre y extensión, más la extensión ```._p_```, p.e. para un archivo denominado ```notas.docx```, existirá un archivo de manifiesto de privilegios llamado ```notas.docx._p_```
Si no existe un archivo de manifiesto de privilegios para un archivo o carpeta, aplica la herencia ascendente, es decir, se heredan los privilegios del manifiesto de la carpeta padre y si no existe, entonces la del padre del padre, etc.
### Importante
Ni los archivos de propiedades extendidas ni los archivos de manifiesto de privilegios se generan o existen de forma predeterminada, deberá crearlos manualmente o a través del servicio set.fso
## Privilegios de operaciones específicas
FSO API asume que existen los privilegios básicos de BWL: read, write, plus y admin
Adicionalmente, define privilegios para operaciones específicas y sus equivalencias (mapa de resolución de privilegios) con respecto a los privilegios básicos en fso.config.dk, lea el código fuente para comprender mejor o realizar personalizaciones.