feat: init

This commit is contained in:
montaghanmy
2023-03-23 11:03:16 +01:00
commit 10fe6f78d1
11518 changed files with 509786 additions and 0 deletions
@@ -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)
@@ -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";
}
```