cozy-client-js
Version:
Javascript library to interact with a cozy
408 lines (274 loc) • 16.7 kB
Markdown
# Files API
### `cozy.client.files.create(data, options)`
`cozy.client.files.create(data, options)` is used to upload a new file onto your cozy
It returns a promise for the document of the file created.
- `data` can be of the following type: `Blob`, `File`, `ArrayBuffer`, `ArrayBufferView`, `stream.Readable` (node) or `string`.
- `options` is an object with the following fields:
* `name`: specify the name of the file. optional for a data of type `File`, type, mandatory otherwise.
* `dirID`: specify identifier of the file's directory. if empty, it is the root directory.
* `contentType`: specify the content type of the uploaded data. For a `File` type, it is handled automatically in browsers (default: `application/octet-stream`). For nodejs, you can rely on an external module like [mime](https://github.com/broofa/node-mime)
* `checksum`: the base64-encoded (with padding) MD5 digest of the file (optional).
* `lastModifiedDate`: a date to specify the last modification time to use for the uploaded file. If the given `data` is a `File` instance, the `lastModifiedDate` is automatically used (not overridden).
* `noSanitize`: by default, the filename is sanitized to remove trailing whitespace; this option disables it.
* `metadata`: (object) metadata associated to the file
* `sourceAccount`: (string) allow to associate the file with the given account id in cozyMetadata
* `sourceAccountIdentifier`: (string) allow to associate the file with the given account
identifier (mostly the user login in the account) in cozyMetadata
**Warning**: this API is not v2 compatible.
```javascript
const created = await cozy.client.files.create(blob, {
name: "filename",
dirID: "123456",
})
const fileCreated = await cozy.client.files.create(fileInput.files[0], {
dirID: "",
checksum: "rL0Y20zC+Fzt72VPzMSk2A==",
lastModifiedDate: new Date()
})
```
### `cozy.client.files.createDirectory(options)`
`cozy.client.files.createDirectory(options)` is used to create a new directory.
It returns a promise for the document of the directory created.
- `options` is an object with the following fields:
* `name`: specify the name of the directory
* `dirID`: specify identifier of the file's directory. if empty, it is the root directory.
* `lastModifiedDate`: a date to specify the last modification time to use for the directory.
```javascript
const created = await cozy.client.files.createDirectory({
name: "mydir",
dirID: "123456",
lastModifiedDate: new Date()
})
```
### `cozy.client.files.createDirectoryByPath(path)`
`cozy.client.files.createDirectoryByPath(path)` is used to create one or more directories for a given path.
It returns a promise for the document of the last directory created.
- `path` is a string
```javascript
const barDirectory = await cozy.client.files.createDirectoryByPath('/Foo/Bar')
```
### `cozy.client.files.updateById(id, data, options)`
`cozy.client.files.updateById(id, data, options)` is used to update the content of an already existing file.
It returns a promise for the document of the file updated.
- `id` is a string specifying the identifier of the file to modify.
- `data` can be of the following type: `Blob`, `File`, `ArrayBuffer`, `ArrayBufferView` or `string`.
- `options` is an object with the following fields:
* `contentType`: specify the content type of the uploaded data. For a `File` type, it is be handled automatically. default: `application/octet-stream`.
* `checksum`: the base64-encoded (with padding) MD5 digest of the file (optional).
* `lastModifiedDate`: a date to specify the last modification time to use for the uploaded file. If the given `data` is a `File` instance, the `lastModifiedDate` is automatically used (not overridden).
* `ifMatch`: the previous revision of the file (optional). The update will be rejected if the remote revision doesn't match the given one.
* `metadata`: (object) metadata associated to the file
```javascript
const updated = await cozy.client.files.updateById("654321", blob, {
contentType: "text/plain",
checksum: "rL0Y20zC+Fzt72VPzMSk2A==",
lastModifiedDate: new Date(),
ifMatch: "1-0e6d5b72",
metadata: {
"brand": "newBrand"
}
})
```
### `cozy.client.files.updateAttributesById(id, attrs, options)`
`cozy.client.files.updateAttributesById(id, attrs, options)` is used to update the attributes associated to a file or directory specified by its id.
It returns a promise for the document of the updated directory or file.
- `id` is a string specifying the identifier of the file or directory to update
- `attrs` is an object containing the changes
- `options` is an object with the following fields:
* `ifMatch`: the previous revision of the file (optional). The update will be rejected if the remote revision doesn't match the given one.
```javascript
const updated = await cozy.client.files.updateAttributesById("12345", { tags: ["foo"] }, { ifMatch: "1-0e6d5b72" })
```
### `cozy.client.files.updateAttributesByPath(path, attrs, options)`
`cozy.client.files.updateAttributesByPath(path, attrs, options)` is used to update the attributes associated to a file or directory specified by the given path.
It returns a promise for the document of the updated directory or file.
- `path`: string specifying the path of the file or directory to update
- `attrs` is an object containing the changes
- `options` is an object with the following fields:
* `ifMatch`: the previous revision of the file (optional). The update will be rejected if the remote revision doesn't match the given one.
```javascript
const updated = await cozy.client.files.updateAttributes("/foo/bar", { executable: true }, { ifMatch: "1-0e6d5b72" })
```
### `cozy.client.files.statById(id, offline, options)`
`cozy.client.files.statById(id, offline, options)` is used to get the metadata of a file specified by its id.
It returns a promise for the information of the file or directory. In the case of a directory, it contains the list of files and sub-directories inside it. This list is limited to 30 items by default, but the `options` argument allows you
to fetch more items.
- `id` is a string specifying the file’s or directory’s identifier
- `offline` is a boolean (default to `true`)
- `options` is an object with the following fields:
* `skip`: number of items to skip (optional)
* `limit`: maximum number of items to return (optional).
By default, `statById` will fetch the metadata from the local database, if it is available. Set the second parameter to `false` to query the server.
Returned directory have a `relations()` method that allow to access to their content:
```javascript
const dir = await cozy.client.files.statById("io.cozy.files.root-dir");
dir.relations('contents').forEach( (file) => … )
```
### `cozy.client.files.statByPath(path)`
`cozy.client.files.statByPath(path)` is used to get the metadata of a file specified by its path.
- `path`: string specifying the path of the file or directory;
### `cozy.client.files.trashById(id, options)`
`cozy.client.files.trashById(id, options)` is used to move the file or directory identified by the given id to trash.
It returns a promise for the document of the file or directory moved to trash.
- `id` is a string specifying the identifier of the file or directory
- `options` is an object with the following fields:
* `ifMatch`: the previous revision of the file (optional). The update will be rejected if the remote revision doesn't match the given one.
```javascript
const trashed = await cozy.client.files.trashById("1234567")
```
### `cozy.client.files.destroyById(id, options)`
`cozy.client.files.destroyById(id, options)` is used to shred (destroy definitively) a file or directory identified by the given id.
The file must be in the trash folder first.
It returns a promise for completion
- `id` is a string specifying the identifier of the file or directory
- `options` is an object with the following fields:
* `ifMatch`: the previous revision of the file (optional). The update will be rejected if the remote revision doesn't match the given one.
```javascript
const trashed = await cozy.client.files.trashById("1234567")
await cozy.client.files.destroyById("1234567")
```
### `cozy.client.files.restoreById(id)`
`cozy.client.files.restoreById(id)` is used to restore a file or directory identified by the given id. The file must be in the trash folder.
It returns a promise for the restored doc. (with updated parent)
- `id` is a string specifying the identifier of the file or directory
```javascript
const trashed = await cozy.client.files.trashById("1234567")
const restored = await cozy.client.files.restoreById("1234567")
```
### `cozy.client.files.listTrash()`
`cozy.client.files.listTrash()` returns a promise for the list of all files in the trash.
```javascript
const trashedFilesAndFolders = await cozy.client.files.listTrash()
```
### `cozy.client.files.clearTrash()`
`cozy.client.files.clearTrash()` destroys definitively all trash content.
```javascript
await cozy.client.files.clearTrash()
```
### `cozy.client.files.downloadById(id)`
`cozy.client.files.downloadById(id)` is used to download a file identified by the given id. The file is downloaded through the browser fetch method, use this if you plan to use the file in javascript after.
It returns a promise of a fetch `Response` object. This response object can be used to extract the information in the wanted form.
- `id` is a string specifying the identifier of the file
```javascript
const response = await cozy.client.files.downloadById("1234567")
const blob = await response.blob()
const text = await response.text()
const buff = await response.arrayBuffer()
response.pipe(fs.createWriteStream('/some/file'))
```
### `cozy.client.files.downloadByPath(path)`
`cozy.client.files.downloadByPath(path)` is used to download a file identified by the given path. The file is downloaded through the browser fetch method, use this if you plan to use the file in javascript after.
It returns a promise of a fetch `Response` object. This response object can be used to extract the information in the wanted form.
- `path` is a string specifying the path of the file
```javascript
const response = await cozy.client.files.downloadByPath("/foo/hello.txt")
const blob = await response.blob()
const text = await response.text()
const buff = await response.arrayBuffer()
response.pipe(fs.createWriteStream('/some/file'))
```
### `cozy.client.files.getDownloadLinkById(id)`
`cozy.client.files.getDownloadLinkById(id)` is used to get a download link for the file identified by the given id.
It returns a promise for the download link.
Download link are only valid for a short while (default 1 hour)
You can use this link to start a browser download like this:
```javascript
const href = await cozy.client.files.getDownloadLinkById("id424242")
const link = document.createElement('a')
link.href = href
link.download = fileName
document.body.appendChild(link) && link.click()
```
- `id` is a string specifying the id of the file
### `cozy.client.files.getDownloadLinkByPath(path)`
`cozy.client.files.getDownloadLinkByPath(path)` is used to get a download link for the file identified by the given path.
It returns a promise for the download link.
Download link are only valid for a short while (default 1 hour)
You can use this link to start a browser download like this:
```javascript
const href = await cozy.client.files.getDownloadLinkByPath("/foo/hello.txt")
const link = document.createElement('a')
link.href = href
link.download = fileName
document.body.appendChild(link) && link.click()
```
- `path` is a string specifying the path of the file
### `cozy.client.files.getArchiveLinkByPaths(paths, name)`
`cozy.client.files.getArchiveLinkByPaths(paths, name)` is used to get a download link for a zip file containing all the files identified by the given paths.
It returns a promise for the download link.
Download link are only valid for a short while (default 1 hour)
You can use this link to start a browser download (see code in getDownloadLinkById)
```javascript
const href = await cozy.client.files.getArchiveLinkByPaths([
"/foo/hello.txt",
"/bar/test.txt"
])
// href === "/files/archive/b1c127c25d99f0b37ac2c2a907f36069/files.zip"
const href = await cozy.client.files.getArchiveLinkByPaths(["/foo/hello.txt"], "secretproject")
// href === "/files/archive/bc2a901c127c25d99f0b37a36069c27f/secretproject.zip"
```
- `paths` is an array of paths
- `name` is the optional name for the generated archive file (default "files").
### `cozy.client.files.getArchiveLinkByIds(ids, name)`
`cozy.client.files.getArchiveLinkByIds(ids, name)` is used to get a download link for a zip file containing all the files identified by the given ids.
It returns a promise for the download link.
Download link are only valid for a short while (default 1 hour)
You can use this link to start a browser download (see code in getDownloadLinkById)
```javascript
const href = await cozy.client.files.getArchiveLinkByIds([
"1234567",
"9876543"
])
// href === "/files/archive/b1c127c25d99f0b37ac2c2a907f36069/files.zip"
const href = await cozy.client.files.getArchiveLinkByIds(["1592673"], "secretproject")
// href === "/files/archive/bc2a901c127c25d99f0b37a36069c27f/secretproject.zip"
```
- `ids` is an array of ids
- `name` is the optional name for the generated archive file (default "files").
### `cozy.client.files.getFilePath(file, folder)`
`cozy.client.files.getFilePath(file, folder)` is a helper that generates the file path from root directory. It may be used to specify the path parameter for functions like
`cozy.client.files.downloadByPath`, `cozy.client.files.getDownloadLinkByPath` or `cozy.client.files.getArchiveLinkByPaths`.
### `cozy.client.data.addReferencedFiles(doc, fileIds)`
`cozy.client.data.addReferencedFiles(doc, fileIds)` binds the files to the document.
(see cozy-stack [documentation](https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/) for more details)
### `cozy.client.data.removeReferencedFiles(doc, fileIds)`
`cozy.client.data.removeReferencedFiles(doc, fileIds)` unbinds the files to the document.
(see cozy-stack [documentation](https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/) for more details)
### `cozy.client.data.listReferencedFiles(doc)`
`cozy.client.data.listReferencedFiles(doc)` list the files bound to the document.
(see cozy-stack [documentation](https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/) for more details).
It returns a promise for a list of filesIds. Files must then be fetched separately.
### `cozy.client.data.fetchReferencedFiles(doc, options, sort)`
`cozy.client.data.fetchReferencedFiles(doc, options, sort)` fetches the files bound to the document.
(see cozy-stack [documentation](https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/) for more details).
It returns a promise for a list of files.
There are 2 alternatives for pagination, that can be used through the `option` parameter: `cursor` and `skip`. For more details, see how the stack handles [pagination](https://docs.cozy.io/en/cozy-stack/jsonapi/#pagination). Note that cursor-based pagination performs way better than skip-based on large volumes.
* `option` is an object with the following fields:
* `cursor` (recommended): specify the view's key and the starting docid. The starting docid can be empty for the first query and take the last returned docid for the next ones.
* `skip` (not recommended): ignore the first x results for pagination.
* `limit`: maximum number of results.
* `sort` is a string which can be `datetime` (default) or `id`. *Warning:* `datetime` is not compatible with cursor-based pagination.
```javascript
const key = [DOCTYPE_ALBUMS, album._id]
const cursor = [key, startDocid]
const result = await cozyClient.data.fetchReferencedFiles(
album,
{ cursor },
'id'
)
```
### `cozy.client.files.query(indexReference, query)`
`cozy.client.files.query(indexReference, query)` find files using an index.
It returns a promise with a list of files matching the query. Results will be returned in the order defined for the index.
- `query` is an object with the following fields:
* `selector`: a mango selector
* `limit`: maximum number of results
* `skip`: ignore the first x results (pagination)
* `wholeResponse`: when set to true, the whole query response will be returned instead of just the docs. This is useful when paginating, because you'll get the `next` property in the response object.
```javascript
const results = await cozy.client.files.query(photosByDate, {
"selector": {"class": "image"},
"limit": 3,
"skip": 1
})
```