---
# System prepended metadata

title: v1.17

---

# v1.17

## Feature and tasks

### Use localization objects for all API responses
* Update UI interface logic for using localizationMongoId from response
* Стандартизація API responses:
    | method | status code | response format | description |
    | ------ | ----------- | --------------- | ----------- |
    | POST   | 200 | ```{}``` | return object what was created or null
    | GET    | 200 | ```{} || [{}]``` | return object was founded or array of objects or null
    | PUT, PATCH | 200 | ```{}``` | return current state of object what was updated
    | * | 400 | ```{ message: localizaedMessageByDefaultLanguage, localizationId: mongoOjectId, code: number, data: {}  }``` |
    | * | 401 | ```{ message: localizaedMessageByDefaultLanguage, localizationId: mongoOjectId, data: {} }``` | повертається у випадку коли авторизаційний токен не є активний
    | * | 403 | ```{ message: localizaedMessageByDefaultLanguage, localizationId: mongoOjectId, data: {} }``` | повертається у випадку коли авторизаційний токен не дає права на використання цього API запиту
    | * | 404 | ```{ message: localizaedMessageByDefaultLanguage, localizationId: mongoOjectId, data: {} }``` | returned only in case when route was not found
    | * | 500 | ```{ message: localizaedMessageByDefaultLanguage, localizationId: mongoOjectId, data: {}}``` | Повертається у випадку не передбачуваної помилки
* Винести кожне API повідомлення в локалізацію, і добавити в поле errorCode для відповідних локалізацій
* Зміни у структурі БД:
    * localizations
    ```
    before:
    {
        _id: mongoOjectId,
        languages: [{ code: string, text: string }],
    }
    
    now:
    {
        _id: mongoOjectId,
        languages: [{ code: string, text: string }],
        errorCode: { type: number, unique: true },
        systemReference: { type: string, unique: true }
    }
    ```
* Додати в редіс кешований об'єкт кодів помилок відносно локалізації
```
localization_errorCode: {
   [localizationMongoId]: { errorCode: number },
}
```
* Стоврити enum для простішого доступу до значень локалізацій. Використати схему з івентами 
* Створити мідлвеєр який буде тягнути для кожного запиту системну стандартну мову
* Конвертувати усі API responses
    ```
    before:
    return res.status(400).send({ message: string, code?: number });

    now:
    return errorResponse(res, localizationMongoId, { [propertyName]: value })
    
    Examples:
    return res.status(400).send({ message: 'Field entityId was not found', code: 56});
    return errorResponse(res, localizationEnum.http.missed, { field: 'entityId' })
    
    return res.status(400).send({ message: 'Field workspaceId was not found', code: 56});
    return errorResponse(res, localizationEnum.http.missed, { field: 'workspaceId' })
    
    return res.status(400).send({ message: 'Field workspaceId has incorrect value format', code: 57});
    return errorResponse(res, localizationEnum.http.typeMismatch, { field: 'workspaceId' })
    ```

### System events in RabbitMQ 
* Create new service for rabbitmq events
    * JIRA: https://chatbots-studio.atlassian.net/browse/W5GOL-2917
    * service name: rabbitmq-events-handler
    * ENV: google app engine
    * Schema:
    ![](https://i.imgur.com/2MLD81N.png)
    * Додати логіку по мінотирнгу стомп черг, да видалнню пустих. TTL: 30s
    * Видалити логіку binding черги до топіка системних івентів на сервісах:
        * main worker
        * user app worker
    * Додати логіку на redis-rabbitmq-event-handler для відловлювання стомп ключів

### External API "1 for all" 

* Усі між системні(server-to-server) виклики будуть використовувати домени сервісів. Інтерфейси в свою чергу будуть використовувати https://api.rake.ai
* API documentation has complete method reference
    - Get all API paramaters, request bodies, response bodies, and field descriptions into documentation
* Create Get Token method for using API
* Зміни у структурі БД:
    * systemFunctions
    ```
    before:
    {
        systemApplicationId": 0,
        systemFunctionId": 535,
        function": "/zapier",
        description": "Zapier platform",
        parentId": 66,
        permissionLevel": "workspace",
        availablePermissionTypeIds": [ 1, 2, 3, 4 ]
    }
    
    now:
    {
        systemApplicationId": 0,
        systemFunctionId": 535,
        function": "/zapier",
        description": "Zapier platform",
        parentId": 66,
        permissionLevel": "workspace",
        availablePermissionTypeIds": [ 1, 2, 3, 4 ],
        regExp: "^/zapier$"
    }
    ```
* Додати в редіс кешовані дані для регулярних виразів
```
systemFunctions_regExp: [{ 
    regEx: systemFunction.regEx,
    systemfunctionId: systemFunction.systemFunctionId
}]
```  
## Create new service for handle request on domain: api.rake.ai
    
* JIRA: 
* service name: api-service
* ENV: 
    * cloud run - простіший алгоритм маштабування, який базується на кількості конкуретних запитів на сервіс
    * google app engine
* Schema
    ![](https://i.imgur.com/fjHCXEw.png)
* Впершу чергу перевірити швидкість опрацювання запитів в сиутація, коли ми будем мати обробник з псевдо редірктом
* Convert Rake Direct call from secret to token/system function.

### System events
* add to each system event correct description in DB
* create documentation when this system event will be created

### Event triggers
* add to each event trigger correct description in 

### Localizations
* Зміни у структурі БД:
    ```
    before:
    {
        _id: mongoOjectId,
        languages: [{ code: string, text: string }],
    }
    
    now:
    {
        _id: mongoOjectId,
        languages: [{ code: string, text: string }],
        systemAplicationIds: [number]
    }
    ```
### Update invitation collection structure
We need to use the scope field.
Current structure:
```json=
{
	"channelIds" : number[],
	"invitationTypeId" : number,
	"conditions" : number[],
	"roleIds" : number[],
	"token" : string,
	"workspaceId" : number,
	"projectId" : number,
	"organizationId" : number,
	"createdAt" : ISODate,
	"invitationId" : number,
}
```
Must be:
```json=
{
	"channelIds" : number[],
	"invitationTypeId" : number,
	"conditions" : number[],
	"roleIds" : number[],
	"token" : string,
	"scope": {
		"type": string, RENAME TO (typeId) as string => 
        because in roles collections we have such naming,
        it would be better to have consistent ???
		"id": number
	},
	"createdAt" : ISODate,
	"invitationId" : number,
}
 ```

Update structure of DB collection and write a script to convert existsting records

Update API methods where we use invitations(registration, system user permission(invite by link))
1) /projects/:projectId/system-users
2) /organizations/:organizationId/system-users
3) /workspaces/:workspaceId/system-users
4) /system-users/invite
5) /workspaces/:workspaceId/invitations POST, DELETE, GET, PUT
6) /workspaces/:workspaceId/invitations/default POST
7) /workspaces/:workspaceId/invitations/system-users/:systemUserId
8) /system-users/register