[Table of contents](README.md#table-of-contents)

# Not synchronized directories

## What we want?

The directories in the Virtual File System can be ignored for synchronization
purpose by some clients. For example, a user may want to not synchronize their
`Videos` directory as it takes too much space for their laptop. Or they may want
to not synchronize a directory with personal documents on the desktop owned by
their employer. By default, all the directories are synchronized everywhere but
it is possible to tell for each directory the devices where the directory won't
be synchronized. The stack tracks this with a `not_synchronized_on` field on
the directory documents.

### Example

```json
{
  "data": {
    "type": "io.cozy.files",
    "id": "6494e0ac-dfcb-11e5-88c1-472e84a9cbee",
    "meta": {
      "rev": "1-ff3beeb456eb"
    },
    "attributes": {
      "type": "directory",
      "name": "phone",
      "path": "/Documents/phone",
      "created_at": "2016-09-19T12:35:08Z",
      "updated_at": "2016-09-19T12:35:08Z",
      "tags": ["bills", "konnectors"],
      "cozyMetadata": {
        "doctypeVersion": "1",
        "metadataVersion": 1,
        "createdAt": "2016-09-20T18:32:48Z",
        "createdByApp": "drive",
        "createdOn": "https://cozy.example.com/",
        "updatedAt": "2016-09-20T18:32:48Z"
      }
    },
    "relationships": {
      "parent": {
        "links": {
          "related": "/files/fce1a6c0-dfc5-11e5-8d1a-1f854d4aaf81"
        },
        "data": {
          "type": "io.cozy.files",
          "id": "fce1a6c0-dfc5-11e5-8d1a-1f854d4aaf81"
        }
      },
      "not_synchronized_on": {
        "links": {
          "self": "/files/6494e0ac-dfcb-11e5-88c1-472e84a9cbee/relationships/not_synchronized_on"
        },
        "data": [
          {
            "type": "io.cozy.oauth.clients",
            "id": "653dfdb0-0595-0139-92df-543d7eb8149c"
          }
        ]
      }
    },
    "links": {
      "self": "/files/6494e0ac-dfcb-11e5-88c1-472e84a9cbee"
    }
  }
}
```

## Routes

### POST /files/:dir-id/relationships/not_synchronized_on

Ask to not synchronize a directory on one or several devices.

#### Request

```http
POST /files/6494e0ac-dfcb-11e5-88c1-472e84a9cbee/relationships/not_synchronized_on HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
```

```json
{
    "data": [
        {
            "type": "io.cozy.oauth.clients",
            "id": "f9ef4dc0-0596-0139-92e0-543d7eb8149c"
        }
    ]
}
```

#### Response

```http
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json
```

```json
{
    "meta": {
        "rev": "3-485d439530110",
        "count": 2
    },
    "data": [
        {
            "type": "io.cozy.oauth.clients",
            "id": "653dfdb0-0595-0139-92df-543d7eb8149c"
        },
        {
            "type": "io.cozy.oauth.clients",
            "id": "f9ef4dc0-0596-0139-92e0-543d7eb8149c"
        }
    ]
}
```

### DELETE /files/:file-id/relationships/not_synchronized_on

Ask to synchronize again the directory on one or several devices.

#### Request

```http
DELETE /files/6494e0ac-dfcb-11e5-88c1-472e84a9cbee/relationships/not_synchronized_on HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
```

```json
{
    "data": [
        {
            "type": "io.cozy.oauth.clients",
            "id": "f9ef4dc0-0596-0139-92e0-543d7eb8149c"
        }
    ]
}
```

#### Response

```http
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json
```

```json
{
    "meta": {
        "rev": "4-1f7ef1be3cb",
        "count": 1
    },
    "data": [
        {
            "type": "io.cozy.oauth.clients",
            "id": "653dfdb0-0595-0139-92df-543d7eb8149c"
        }
    ]
}
```

### GET /data/:type/:doc-id/relationships/not_synchronizing

Returns all the directory ids that are not synchronized on the given device.

Contents is paginated following [jsonapi conventions](http-api.md#pagination).
The default limit is 100 entries. The maximal number of entries per page is
1000.

It is possible to include the whole documents for the directories by adding
`include=files` to the query string.

#### Request

```http
GET /data/io.cozy.oauth.clients/653dfdb0-0595-0139-92df-543d7eb8149c/relationships/not_synchronizing HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
```

#### Response

```http
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json
```

```json
{
    "data": [
        {
            "type": "io.cozy.files",
            "id": "11400320-07b7-0139-4fe8-543d7eb8149c"
        },
        {
            "type": "io.cozy.files",
            "id": "6494e0ac-dfcb-11e5-88c1-472e84a9cbee"
        }
    ]
}
```

### POST /data/:type/:doc-id/relationships/not_synchronizing

When configuring a device, it's tedious to add the `not_synchronized_on` for
each directory individually. This route allows to make it in bulk.

#### Request

```http
POST /data/io.cozy.oauth.clients/653dfdb0-0595-0139-92df-543d7eb8149c/relationships/not_synchronizing HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
```

```json
{
    "data": [
        {
            "type": "io.cozy.files",
            "id": "38086350-07c0-0139-4fe9-543d7eb8149c"
        },
        {
            "type": "io.cozy.files",
            "id": "3d447470-07c0-0139-4fea-543d7eb8149c"
        }
    ]
}
```

#### Response

```http
HTTP/1.1 204 No Content
Content-Type: application/vnd.api+json
```

**Note**: if one of the id is a file, the response will be a 400 Bad Request.
References are only for directories.

### DELETE /data/:type/:doc-id/relationships/not_synchronizing

This bulk deletion of not_synchronized_on on many directories can be useful
when configuring a device.

#### Request

```http
DELETE /data/io.cozy.oauth.clients/653dfdb0-0595-0139-92df-543d7eb8149c/relationships/not_synchronizing HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
```

```json
{
    "data": [
        {
            "type": "io.cozy.files",
            "id": "38086350-07c0-0139-4fe9-543d7eb8149c"
        },
        {
            "type": "io.cozy.files",
            "id": "3d447470-07c0-0139-4fea-543d7eb8149c"
        }
    ]
}
```

#### Response

```http
HTTP/1.1 204 No Content
Content-Type: application/vnd.api+json
```

## Usage

When an OAuth client makes a request for the changes feed on the
`io.cozy.files` doctype (via `/data/io.cozy.files/_changes`), the output will
be filtered. If a directory or file is inside a directory with the
`not_synchronized_on` attribute set on for this client, the document will be
replaced by a fake entry with `_deleted: true`.
