feat: init
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
---
|
||||
description: Drive on Twake
|
||||
---
|
||||
|
||||
# 📁 Drive
|
||||
|
||||
## description
|
||||
|
||||
**Drive** or **Documents** is the Nodejs drive implementation for twake, it contains drive items.
|
||||
|
||||
A **Drive item** can be:
|
||||
|
||||
- a file
|
||||
- a directory
|
||||
- the root folder
|
||||
- the trash
|
||||
|
||||
## wording
|
||||
|
||||
**version** each file in the drive has a version associated to each update.
|
||||
|
||||
## Models and APIs
|
||||
|
||||
[database-models](database-models.md)
|
||||
|
||||
[rest-api](rest-apis.md)
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
---
|
||||
description: Documents database models
|
||||
---
|
||||
|
||||
# Database models
|
||||
|
||||
**DriveFile**
|
||||
|
||||
```javascript
|
||||
{
|
||||
// Primary Key
|
||||
"company_id": uuid;
|
||||
"id": uuid;
|
||||
|
||||
"parent_id": string;
|
||||
"is_in_trash": boolean;
|
||||
"is_directory": boolean;
|
||||
"name": string;
|
||||
"extension": string;
|
||||
"description": string;
|
||||
"tags": string[];
|
||||
"added": string;
|
||||
"last_modified": string;
|
||||
"access_info": AccessInformation;
|
||||
"content_keywords": string;
|
||||
"hidden_data": unknown;
|
||||
"last_version_cache": Partial<FileVersion>;
|
||||
}
|
||||
|
||||
type AccessInformation = {
|
||||
public: {
|
||||
token: string;
|
||||
level: publicAccessLevel;
|
||||
};
|
||||
entities: AuthEntity[];
|
||||
};
|
||||
|
||||
type AuthEntity = {
|
||||
type: "user" | "channel" | "company" | "folder";
|
||||
id: string | "parent";
|
||||
level: publicAccessLevel | DriveFileAccessLevel;
|
||||
};
|
||||
```
|
||||
|
||||
**FileVersion**
|
||||
|
||||
```javascript
|
||||
{
|
||||
"id": string;
|
||||
"provider": "internal" | "drive" | string;
|
||||
"file_id": string;
|
||||
"file_metadata": DriveFileMetadata;
|
||||
"date_added": number;
|
||||
"creator_id": string;
|
||||
"application_id": string;
|
||||
"realname": string;
|
||||
"key": string;
|
||||
"mode": string | "OpenSSL-2";
|
||||
"file_size": number;
|
||||
"filename": string;
|
||||
"data": unknown;
|
||||
}
|
||||
|
||||
type DriveFileMetadata = {
|
||||
source: "internal" | "drive" | string;
|
||||
external_id: string;
|
||||
|
||||
name?: string;
|
||||
mime?: string;
|
||||
size?: number;
|
||||
thumbnails?: DriveFileThumbnail;
|
||||
};
|
||||
|
||||
type DriveFileThumbnail = {
|
||||
index: number;
|
||||
id: string;
|
||||
|
||||
type: string;
|
||||
size: number;
|
||||
width: number;
|
||||
height: number;
|
||||
|
||||
url: string;
|
||||
full_url?: string;
|
||||
};
|
||||
```
|
||||
@@ -0,0 +1,360 @@
|
||||
---
|
||||
description: Documents API
|
||||
---
|
||||
|
||||
# Authentication
|
||||
|
||||
All the following routes require the usual authentication header. But you can also use other ways of authentication:
|
||||
|
||||
- For the download routes, you can use a token generated by the `/internal/services/documents/v1/companies/:company_id/download/token` route (see bellow).
|
||||
- All the routes can use a query string `?public_token=token` to authenticate the user.
|
||||
- All the routes can use a query string `?twake_tab_token=token` to authenticate the user in the context of a channel tab for instance.
|
||||
|
||||
# Navigation and drive capabilities
|
||||
|
||||
## Fetch a drive item
|
||||
|
||||
Used to fetch a drive item
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/:id`
|
||||
|
||||
**Method** : `GET`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
### Success Response
|
||||
|
||||
**Code** : `200 OK`
|
||||
|
||||
**Content example**
|
||||
|
||||
```javascript
|
||||
{
|
||||
item: {
|
||||
id: string;
|
||||
company_id: string;
|
||||
|
||||
parent_id: string;
|
||||
in_trash: boolean;
|
||||
is_directory: string;
|
||||
name: string;
|
||||
extension: string;
|
||||
description: string;
|
||||
tags: [];
|
||||
|
||||
added: string;
|
||||
last_modified: string;
|
||||
last_version_cache: DriveItemVersion;
|
||||
|
||||
access_info: DriveItemAccessInfo;
|
||||
}
|
||||
versions: {
|
||||
id: string;
|
||||
|
||||
provider: string | "drive" | "internal";
|
||||
file_id: string;
|
||||
file_metadata: FileMetadata;
|
||||
|
||||
date_added: number;
|
||||
creator_id: string;
|
||||
application_id: string;
|
||||
}
|
||||
[];
|
||||
children: {
|
||||
id: string;
|
||||
company_id: string;
|
||||
|
||||
parent_id: string;
|
||||
in_trash: boolean;
|
||||
is_directory: string;
|
||||
name: string;
|
||||
extension: string;
|
||||
description: string;
|
||||
tags: [];
|
||||
|
||||
added: string;
|
||||
last_modified: string;
|
||||
last_version_cache: DriveItemVersion;
|
||||
|
||||
access_info: DriveItemAccessInfo;
|
||||
}
|
||||
[];
|
||||
}
|
||||
```
|
||||
|
||||
### Error Responses
|
||||
|
||||
If the item cannot be fetched the server will return an error with one of the following status codes:
|
||||
|
||||
- 401 Unauthorized - The user is not authorized.
|
||||
- 500 Internal Server Error - An error occurred while performing the operation.
|
||||
|
||||
## Create a drive item
|
||||
|
||||
Used to create a drive item
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item`
|
||||
|
||||
**Method** : `POST`
|
||||
|
||||
**Headers**: `Content-Type: application/json` OR `Content-Type: multipart/form-data`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
**Data constraints**
|
||||
|
||||
```javascript
|
||||
{
|
||||
item: {
|
||||
id: string;
|
||||
company_id: string;
|
||||
|
||||
parent_id: string;
|
||||
in_trash: boolean;
|
||||
is_directory: string;
|
||||
name: string;
|
||||
extension: string;
|
||||
description: string;
|
||||
tags: [];
|
||||
|
||||
added: string;
|
||||
last_modified: string;
|
||||
last_version_cache: DriveItemVersion;
|
||||
|
||||
access_info: DriveItemAccessInfo;
|
||||
},
|
||||
version: {
|
||||
id: string;
|
||||
|
||||
provider: string | 'drive' | 'internal';
|
||||
file_id: string;
|
||||
file_metadata: FileMetadata;
|
||||
|
||||
date_added: number;
|
||||
creator_id: string;
|
||||
application_id: string;
|
||||
},
|
||||
file?: File // The multipart/form-data file to be uploaded ( optional )
|
||||
}
|
||||
```
|
||||
|
||||
### Success Response
|
||||
|
||||
**Code** : `200 OK`
|
||||
|
||||
### Error Responses
|
||||
|
||||
If the request is missing required fields or the item cannot be created, the server will return an error with one of the following status codes:
|
||||
|
||||
- 400 Bad Request - The request is missing required fields.
|
||||
- 401 Unauthorized - The user is not authorized.
|
||||
- 500 Internal Server Error - An error occurred while performing the operation.
|
||||
|
||||
## Update a drive item
|
||||
|
||||
Used to update a drive item
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/:id`
|
||||
|
||||
**Method** : `POST`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
**Data constraints**
|
||||
|
||||
```javascript
|
||||
{
|
||||
id: string;
|
||||
company_id: string;
|
||||
|
||||
parent_id: string;
|
||||
in_trash: boolean;
|
||||
is_directory: string;
|
||||
name: string;
|
||||
extension: string;
|
||||
description: string;
|
||||
tags: [];
|
||||
|
||||
added: string;
|
||||
last_modified: string;
|
||||
last_version_cache: DriveItemVersion;
|
||||
|
||||
access_info: DriveItemAccessInfo;
|
||||
}
|
||||
```
|
||||
|
||||
### Success Response
|
||||
|
||||
**Code** : `200 OK`
|
||||
|
||||
### Error Responses
|
||||
|
||||
If the request is missing required fields or the item cannot be updated, the server will return an error with one of the following status codes:
|
||||
|
||||
- 400 Bad Request - The request is missing required fields.
|
||||
- 401 Unauthorized - The user is not authorized.
|
||||
- 500 Internal Server Error - An error occurred while performing the operation.
|
||||
|
||||
## Delete a drive item
|
||||
|
||||
Used to delete a drive item
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/:id`
|
||||
|
||||
**Method** : `DELETE`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
### Success Response
|
||||
|
||||
**Code** : `200 OK`
|
||||
|
||||
## Create a drive item version
|
||||
|
||||
Used to create a drive item version
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/:id/version`
|
||||
|
||||
**Method** : `POST`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
**Data constraints**
|
||||
|
||||
```javascript
|
||||
{
|
||||
id: string;
|
||||
|
||||
provider: string | 'drive' | 'internal';
|
||||
file_id: string;
|
||||
file_metadata: {
|
||||
source: 'internal' | 'drive' | string;
|
||||
external_id: string | any;
|
||||
|
||||
name?: string;
|
||||
mime?: string;
|
||||
size?: number;
|
||||
thumbnails?: {
|
||||
index: number;
|
||||
id: string;
|
||||
|
||||
type: string;
|
||||
size: number;
|
||||
width: number;
|
||||
height: number;
|
||||
|
||||
url: string;
|
||||
full_url?: string;
|
||||
}[];
|
||||
};
|
||||
|
||||
date_added: number;
|
||||
creator_id: string;
|
||||
application_id: string;
|
||||
}
|
||||
```
|
||||
|
||||
### Success Response
|
||||
|
||||
**Code** : `200 OK`
|
||||
|
||||
# Download
|
||||
|
||||
## Get a download token
|
||||
|
||||
Before to download, if you can't pass an authorisation token (for example in the browser context) you can generate a token that you will pass in the query string to download the file using the next routes.
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/download/token?items=id1,id2,id3&version_id:optional_id`
|
||||
|
||||
**Method** : `GET`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
### Success Response
|
||||
|
||||
```
|
||||
{
|
||||
"token": string
|
||||
}
|
||||
```
|
||||
|
||||
## Download
|
||||
|
||||
Shortcut to download a file (you can also use the file-service directly).
|
||||
If the item is a folder, a zip will be automatically generated.
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/:id/download?version_id=:optional_id`
|
||||
|
||||
**Method** : `GET`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
## Zip download
|
||||
|
||||
Used to create a zip archive containing the requested drive items ( files and folders ).
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/item/download/zip?items=id1,id2,id3`
|
||||
|
||||
**Method** : `GET`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
# Tabs (for Twake)
|
||||
|
||||
If you want to use the Twake tabs, you must store the configuration of the tabs in the database.
|
||||
|
||||
## Get tab configuration
|
||||
|
||||
Get a tab configuration to get the attached folder/document id.
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/tabs/:id`
|
||||
|
||||
**Method** : `GET`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
### Success Response
|
||||
|
||||
```
|
||||
{
|
||||
"company_id": string;
|
||||
"tab_id": string;
|
||||
"channel_id": string;
|
||||
"item_id": string;
|
||||
"level": "read" | "write";
|
||||
}
|
||||
```
|
||||
|
||||
## Set tab configuration
|
||||
|
||||
Get a tab configuration to get the attached folder/document id.
|
||||
|
||||
**URL** : `/internal/services/documents/v1/companies/:company_id/tabs/:id`
|
||||
|
||||
**Method** : `POST`
|
||||
|
||||
**Auth required** : Yes
|
||||
|
||||
**Data constraints** :
|
||||
|
||||
```
|
||||
{
|
||||
"company_id": string;
|
||||
"tab_id": string;
|
||||
"channel_id": string;
|
||||
"item_id": string;
|
||||
"level": "read" | "write";
|
||||
}
|
||||
```
|
||||
|
||||
### Success Response
|
||||
|
||||
```
|
||||
{
|
||||
"company_id": string;
|
||||
"tab_id": string;
|
||||
"channel_id": string;
|
||||
"item_id": string;
|
||||
"level": "read" | "write";
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user