Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • perxis/perxis-proto
1 result
Show changes
Commits on Source (87)
Showing
with 681 additions and 245 deletions
......@@ -2,7 +2,7 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
option go_package = "git.perx.ru/perxis/perxis-go/clients;clients";
option go_package = "git.perx.ru/perxis/perxis-go/proto/clients;clients";
package content.clients;
......@@ -36,12 +36,7 @@ message Client {
// Приложение отключено и не может авторизоваться
optional bool disabled = 7;
// // Приложение имеет доступ к указанным окружениям пространства (ID или Alias)
// repeated string environments = 8;
//
// // Список правил доступа к коллекциям
// repeated common.Rule rules = 9;
// Идентификатор роли клиента
string role_id = 8;
OAuth oauth = 10;
......
......@@ -3,7 +3,7 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
import "common/common.proto";
option go_package = "git.perx.ru/perxis/perxis-go/collaborators;collaborators";
option go_package = "git.perx.ru/perxis/perxis-go/proto/collaborators;collaborators";
package content.collaborators;
......
......@@ -4,15 +4,20 @@ import "google/protobuf/empty.proto";
import "common/common.proto";
import "google/protobuf/timestamp.proto";
option go_package = "git.perx.ru/perxis/perxis-go/collections;collections";
option go_package = "git.perx.ru/perxis/perxis-go/proto/collections;collections";
package content.collections;
message Access {
repeated common.Action actions = 1;
repeated string hidden_fields = 5;
// Deprecated
repeated string readonly_fields = 6;
repeated string writeonly_fields = 7;
repeated string deny_read_fields = 8;
repeated string deny_write_fields = 9;
}
message Collection {
......@@ -20,8 +25,14 @@ message Collection {
string space_id = 2;
string env_id = 3;
string name = 4;
// Коллекция может содержать ровно одну запись. При работе с записью в такой коллекции идентификатор записи в
// обращениях в API можно не указывать и предполагать, что запись всегда есть (ее не нужно создавать)
optional bool single = 5;
optional bool system = 6;
// Коллекция не содержит данных. Возможно создание таких коллекций для использования как подключаемые подсхемы в
// других коллекциях
optional bool no_data = 12;
string schema = 7;
bool hidden = 13;
......@@ -49,7 +60,7 @@ message Collection {
StateInfo state_info = 10;
repeated string tags = 16;
Access access = 20;
Access access = 20; // Возможные действия с коллекцией на основе контекста запроса
}
message CreateRequest {
......@@ -110,10 +121,30 @@ message DeleteRequest {
}
service Collections {
// Создать коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Create` игнорируется
rpc Create(CreateRequest) returns(CreateResponse) {}
// Получить коллекцию. Схема коллекции возвращается полная, т.е. включая все подключаемые подсхемы, если не указано
// обратное в `GetRequest.options`
rpc Get(GetRequest) returns(GetResponse) {}
// Возвращает список коллекций, отсортированных в алфавитном порядке. По умолчанию не возвращает коллекции без данных
// и скрытые коллекции, подробнее см. `ListRequest.filter`
rpc List(ListRequest) returns(ListResponse) {}
// Обновить коллекцию. Установка схемы производится через отдельный метод `SetSchema` и методом `Update` игнорируется
rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
// Установить схему коллекции. По результатам вызова метода не происходит *применение* схемы - например,
// не перестраиваются индексы БД коллекции, поскольку это может быть длительный процесс. После редактирования всех
// необходимых схем окружения необходимо их применить - выполнить миграцию путем вызова метода `Environments.Migrate`.
// Если схема коллекции изменена, но миграция еще не была запущена, коллекция будет находиться в состоянии `CHANGED`.
//
// Если в процессе миграции возникли ошибки, в соответствующие коллекции в поле `Collection.state_info` будет записано
// содержание ошибки и установлено состояние `ERROR`
rpc SetSchema(SetSchemaRequest) returns(google.protobuf.Empty) {}
// Удалить коллекцию
rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
}
syntax = "proto3";
option go_package = "git.perx.ru/perxis/perxis-go/common;common";
option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
package common;
import "google/protobuf/struct.proto";
message Error {
message BadRequest {
message FieldViolation {
string field = 1;
string description = 2;
}
repeated FieldViolation errors = 1;
}
message Help {
message Link {
string description =1;
string url = 2;
}
repeated Link links = 1;
}
message DebugInfo {
repeated string stack_trace = 1;
string detail = 2;
}
message LocalizedMessage {
string locale = 1;
string message = 2;
}
uint64 error_code = 1; // Код ошибки
string error_id = 2; // ID конкретного инцидента, ID уникальна для каждого случая.
string reason = 3; // ???
string domain = 4; // Сервис,Пакет к которому относится ошибка
map<string,string> metadata = 9; // Мета-информация
BadRequest bad_request = 10; // Ошибка запроса
DebugInfo debug_info = 11; // Отладочная информация
Help help = 100; // Пользовательская информации и инструкции
repeated LocalizedMessage localized_messages = 200; // Перевод сообщения об ошибке
}
message Filter {
string op = 1;
string field = 2;
......@@ -52,10 +14,13 @@ message Filter {
message FindOptions {
repeated string sort = 1;
int32 page_num = 2;
int32 page_size = 3;
int32 page_num = 2; // Deprecated
int32 page_size = 3; // Deprecated
repeated string fields = 4;
bool exclude_fields = 5;
int32 offset = 6;
int32 limit = 7;
}
......@@ -78,10 +43,15 @@ message Rule {
repeated Action actions = 2;
Access access = 3;
repeated string hidden_fields = 5;
// Deprecated
repeated string readonly_fields = 6;
repeated string writeonly_fields = 7;
string read_filter = 8;
string write_filter = 9;
repeated string deny_read_fields = 10;
repeated string deny_write_fields = 11;
}
message Collaborator {
......
syntax = "proto3";
option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
package common;
import "google/protobuf/struct.proto";
message Error {
message BadRequest {
message FieldViolation {
string field = 1;
string description = 2;
}
repeated FieldViolation errors = 1;
}
message Help {
message Link {
string description =1;
string url = 2;
}
repeated Link links = 1;
}
message DebugInfo {
repeated string stack_trace = 1;
string detail = 2;
}
message LocalizedMessage {
string locale = 1;
string message = 2;
}
uint64 error_code = 1; // Код ошибки
string error_id = 2; // ID конкретного инцидента, ID уникальна для каждого случая.
string reason = 3; // ???
string domain = 4; // Сервис, пакет к которому относится ошибка
string message = 5; // Текст ошибки
string details = 6; // Дополнительные детали об ошибке
map<string,string> metadata = 9; // Мета-информация
BadRequest bad_request = 10; // Ошибка запроса
DebugInfo debug_info = 11; // Отладочная информация
Help help = 100; // Пользовательская информации и инструкции
repeated LocalizedMessage localized_messages = 200; // Перевод сообщения об ошибке
repeated Error errors = 500; // Вложенные ошибки
}
syntax = "proto3";
package common;
import "google/protobuf/timestamp.proto";
import "google/protobuf/any.proto";
import "common/error.proto";
option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
// Операция
message Operation {
// ID операции
string id = 1;
// Описание операции
string description = 2;
// Время создания операции
google.protobuf.Timestamp created_at = 3;
// Создатель операции
string created_by = 4;
// Время последнего изменения операции
google.protobuf.Timestamp modified_at = 6;
// Операция завершена
bool done = 7;
// Метаданные операции
google.protobuf.Any metadata = 8;
// Результат выполнения операции
oneof result {
// Результат выполнения операции в случае успеха
google.protobuf.Any response = 9;
// Результат выполнения операции в случае ошибки
Error error = 10;
}
}
syntax = "proto3";
option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
package common;
import "common/operation.proto";
import "common/validation.proto";
service OperationService {
// Возвращает статус операции и ее результат, если она завершена
rpc Get (GetOperationRequest) returns (Operation) {}
// Отменяет выполнение операции, если это поддерживается сервисом
rpc Cancel (CancelOperationRequest) returns (Operation) {}
}
message GetOperationRequest {
string operation_id = 1 [(required) = true];
}
message CancelOperationRequest {
string operation_id = 1 [(required) = true];
}
syntax = "proto3";
package common;
option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
import "google/protobuf/descriptor.proto";
extend google.protobuf.OneofOptions {
bool exactly_one = 101400;
}
extend google.protobuf.FieldOptions {
bool required = 101501;
string pattern = 101502;
string value = 101503;
string size = 101504;
string length = 101505;
bool unique = 101506;
MapKeySpec map_key = 101510;
string bytes = 101511;
}
message MapKeySpec {
string value = 1;
string pattern = 2;
string length = 3;
}
\ No newline at end of file
......@@ -6,7 +6,7 @@ import "collections/collections.proto";
import "items/items.proto";
import "google/protobuf/struct.proto";
option go_package = "git.perx.ru/perxis/perxis-go/delivery;delivery";
option go_package = "git.perx.ru/perxis/perxis-go/proto/delivery;delivery";
package delivery;
......
......@@ -3,7 +3,7 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
option go_package = "git.perx.ru/perxis/perxis-go/environments;environments";
option go_package = "git.perx.ru/perxis/perxis-go/proto/environments;environments";
package content.environments;
......@@ -92,7 +92,8 @@ message MigrateRequest {
message MigrateOptions {
// Ожидать завершения миграции в синхронном режиме. Если в запрос передан контекст с таймаутом,
// то после истечения таймаута миграция продолжится в асинхронном режиме
bool wait = 1;
bool wait = 1; // Deprecated - миграция по умолчанию выполняется синхронно
bool async = 2; // Выполнить миграцию в асинхронном режиме
}
service Environments {
......@@ -103,5 +104,13 @@ service Environments {
rpc SetAlias(SetAliasRequest) returns(google.protobuf.Empty) {}
rpc RemoveAlias(RemoveAliasRequest) returns(google.protobuf.Empty) {}
rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
// Выполнить миграцию окружения. По умолчанию выполняется в синхронном режиме, для асинхронного выполнения можно
// передать соответствующую настройку в опциях `MigrateRequest.options`
//
// При вызове миграции:
// - выполняются миграции для всех коллекций окружения
//
// В случае возникновения ошибок миграции они записываются в поле `Environment.state`
rpc Migrate(MigrateRequest) returns(google.protobuf.Empty) {}
}
\ No newline at end of file
......@@ -10,157 +10,27 @@
*/
syntax = "proto3";
option go_package = "git.perx.ru/perxis/perxis-go/extensions;extensions";
option go_package = "git.perx.ru/perxis/perxis-go/proto/extensions;extensions";
package extensions;
import "references/references.proto";
// Extension - API расширения
service Extension {
// Для установки расширения выполняется запрос к сервису с указанием расширений которые должны быть установлены. Если
// расширение уже установлено процесс возвращает ошибку.
rpc Install(InstallRequest) returns (InstallResponse) {}
// Можно запросить проверку статуса установки для расширения. При этом расширение проверяет наличие необходимых данных в
// пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
// производится.
rpc Check(CheckRequest) returns (CheckResponse) {}
// Сервис выполняет необходимые действия с данными и миграции для соответствия нужной версии расширения.
// Если расширение не установлено процесс обновления возвращает ошибку.
rpc Update(UpdateRequest) returns (UpdateResponse) {}
// Удаление расширения из пространства.
rpc Uninstall(UninstallRequest) returns (UninstallResponse) {} // Удаление расширений
// Пользовательские Действия (Actions)
//
// Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
// добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
// сервере или переход в интерфейсе.
//
// Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
// Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
// доступное для всех пользователей.
//
// Примеры пользовательских действий:
// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
// параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
// параметры space_id, env_id.
//
// Приложения так же могут использовать действия для вызова обработки в других приложениях при
// необходимости.
rpc Action(ActionRequest) returns(ActionResponse) {} // Выполнить указанное действие
}
message InstallRequest {
repeated string extensions = 10000; // Список расширений для установки
string space_id = 10010; // Пространство для установки расширений
string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
bool force = 10100; // Игнорировать и автоматически исправлять ошибки установки
}
message ExtensionRequestResult {
enum State {
OK = 0; // Запрос завершен
ERROR = 1; // Возникла ошибка
PENDING = 2; // Запрос ожидает выполнения
IN_PROGRESS = 3; // Запрос выполняется
PARAMETERS_REQUIRED= 4; // Требуются дополнительные данные для выполнения запроса
}
State state = 10000; // Состояние расширение
string extension = 10100; // Имя расширения
string msg = 10200; // Сообщение
string error = 10300; // Ошибка (state == ERROR)
bool update_available = 10400; // Доступно обновление
}
message InstallResponse {
repeated ExtensionRequestResult results = 10000; // Список состояний расширений после установки
}
message UninstallRequest {
repeated string extensions = 10000; // Список расширений для удаления
string space_id = 10010; // Пространство для удаления расширений
string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
bool remove = 10100; // Удалить все коллекции и данные
bool force = 10200; // Удалять расширения вне зависимости от возможных ошибок, без учета зависимостей
}
message UninstallResponse {
repeated ExtensionRequestResult results = 10000; // Список состояний расширений после удаления
}
message UpdateRequest {
repeated string extensions = 10000; // Список расширений для удаления
string space_id = 10010; // Пространство для удаления расширений
string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
bool force = 10100; // Выполнять обновление и автоматически исправлять ошибки
}
message UpdateResponse {
repeated ExtensionRequestResult results = 10000; // Список состояний расширений после удаления
}
message CheckRequest {
repeated string extensions = 10000; // Список расширений для удаления
string space_id = 10010; // Пространство для удаления расширений
string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
}
message CheckResponse {
repeated ExtensionRequestResult results = 10000; // Список состояний расширений
}
// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
message ActionRequest {
string extension = 1000;
string action = 10100;
string space_id = 10500;
string env_id = 10510;
string collection_id = 10520;
string item_id = 10530;
repeated string item_ids = 10540;
// Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
// полей которые пользователь выбрал для отображения в интерфейсе.
repeated string fields = 10550;
map<string,string> metadata = 11000;
// Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
repeated content.references.Reference refs = 11010;
// Ссылка на документ с параметрами выполнения Action.
// Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
content.references.Reference params = 11020;
}
message ActionResponse {
enum State {
DONE = 0; // Запрос завершен
ERROR = 1; // Возникла ошибка
PENDING = 2; // Запрос ожидает выполнения
IN_PROGRESS = 3; // Запрос выполняется
PARAMETERS_REQUIRED = 4; // Требуются дополнительные данные для выполнения запроса
}
State state = 10000; // Состояние расширение
string msg = 10100; // Сообщение о выполнении действия
string error = 10200; // Сообщение в случае ошибки
repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
map<string,string>metadata = 10400; // Метаданные запроса
repeated content.references.Reference refs = 10320; // Ссылки на записи (назначение ссылок зависит от действия и расширения)
// Target - определяет как открывать результат выполнения действия в пользовательском интерфейсе
enum Target {
DEFAULT = 0; // По умолчанию (если нет других условий, то MODAL)
MODAL = 1; // Открывать в модальном окне
WIDE = 2; // Открывать в широком модальном окне
MAIN = 4; // Открывать в главной рабочей области (часть без меню)
DRAWER = 5; // Открывать в боковой панели
NOTIFICATION = 6; // Открывать виде всплывающего уведомлении
BLANK = 7; // Открывать в новой вкладке
NONE = 100; // Не отображать результат
}
/**
Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
Action описывает как коллекцию в системе с предустановленными действиями, так и возможные дальнейшие действия после
получения ответа (см. `ActionResponse.next`)
Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
......@@ -178,7 +48,7 @@ message Action {
// Kind описывает c какой сущность системы связано действие и что требуется передать в качестве параметров
// Интерфейс загружает пользовательские действия и отображает их в интерфейсе в зависимости от ActionType.
enum Kind {
DEFAULT = 0; // Действие не отображается в интерфейсе и могут используется для выполнения дополнительных запросов (см. `ActionResponse.next`) или напрямую из сторонних приложений.
DEFAULT = 0; // Действие не отображается в интерфейсе и может использоваться для выполнения дополнительных запросов (см. `ActionResponse.next`) или напрямую из сторонних приложений.
SPACE = 1; // Действие связано с пространством (требуется передача space_id). Отображается в меню "Действия".
ENVIRONMENT = 2; // Действие связано с окружением (требуется передача space_id, env_id). Отображается в меню "Действия".
COLLECTION = 3; // Действие связано с коллекцией (требуется передача space_id, env_id, collection_id). Отображается на экране списка записей.
......@@ -188,14 +58,43 @@ message Action {
CREATE = 7; // Действие создание записи (требуется передача space_id, env_id, collection_id).
}
// DEPRECATED: Используйте `action` в формате URI
string extension = 10000; // Расширение
string action = 10100; // Идентификатор действия
// Идентификатор действия (в формате URI)
// Варианты использования:
// - пустой - никаких действий не выполняется
// - `action_id` - простое действие (если установлено значение `extension`, то оно используется)
// - `grpc:///extension_id/action_id` - полное действие с указанием расширения
// - `https://host/path` - действие по HTTP(S)
// - `ui:///path` - действие в интерфейсе
// - `/path` - действие в интерфейсе - DEPRECATED: Используйте `ui:///path`
//
// Пример: `https://example.com/api/v1/action` - будет выполнен запрос HTTP по указанному URL.
// Сервер может вернуть ответ в формате JSON или HTML/MD. Дальнейшие действия определяется оп заголовку ответа
// `Content-Type`:
// - `application/json` - ответ в формате JSON. Структура ответа соответствует `ActionResponse` и интерпретируется
// тем же способом что и ответ от GRPC.
// - `text/html` - ответ в формате HTML. Интерфейс отображает ответ в виде сообщения в IFrame
// - `text/markdown` - ответ в формате MD. Интерфейс отображает ответ в виде сообщения.
//
// Переменные `:var` заменяются на текуще значение в пользовательском интерфейсе
// Перечень переменных для подстановки:
// - :spaceId
// - :envId
// - :colId
// - :itemId
//
// Пример: `ui:///spaces/:spaceId/envs/:envId/cols/:colId` - будет выполнено действие в интерфейсе.
string action = 10100;
Target target = 10110; // как должен отображаться результат действия
string parent = 10120; // Идентификатор родительского действия (для отображения в меню)
string name = 10200; // Название действия для отображения в интерфейсе (пункт меню, кнопка).
string description = 10210; // Описание действия для отображения в интерфейсе
string icon = 10220; // Название иконки для отображения действия в интерфейсе
content.references.Reference image = 10230; // Изображение для отображения в действия в интерфейсе
repeated string groups = 10240; // Группы отображения действия в интерфейсе
Kind kind = 10300; // Указывает на что направлено действие
Kind kind = 10300; // Указывает область действия (где отображается действие)
repeated string classes = 10310; // Классы данных к которым применимо действие (название коллекций или специальных групп в рамках которых данное действие применимо)
// Для `CREATE` действуют следующие правила:
// - Для создание записей в коллекции применимы действия которые содержат в classes название коллекции
......@@ -209,6 +108,8 @@ message Action {
string params_collection = 10330;
ActionRequest request = 10400; // Параметры запроса (используется в случае `ActionResponse.next`)
// DEPRECATED: Используйте `action` вместо `navigation_route`
bool navigation_action = 10500; // Флаг указывающий что действие переносить пользователя в другую часть интерфейса, а не отправляет запрос на сервер
// navigation_route - Строка шаблон для перехода в интерфейсе
......@@ -222,5 +123,48 @@ message Action {
// - :colId
// - :itemId
//
// DEPRECATED: Используйте `action`
string navigation_route = 10510;
}
\ No newline at end of file
// Параметр указывающий что действие выполняется автоматически
// Если указано, то действие выполняется автоматически каждый раз при загрузке приложения
bool autorun = 10520;
// Параметр указывающий что действие требует подтверждения пользователя
// Перед выполнением действия пользователю отображается информация о действии и кнопки подтверждения/отмены
bool confirm = 10530;
enum View {
DEFAULT_VIEW = 0; // Отображать в интерфейсе по умолчанию
HIDDEN_VIEW = 1; // Не отображать в интерфейсе
MAIN_MENU_VIEW = 2; // Отображать в главном меню
MAIN_MENU_BOTTOM_VIEW = 3; // Отображать в главном меню внизу
}
View view = 10540; // Отображение действия в интерфейсе
int32 order = 10550; // Порядок отображения действия в интерфейсе (Для пунктов меню)
}
// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
message ActionRequest {
string extension = 1000;
string action = 10100;
string space_id = 10500;
string env_id = 10510;
string collection_id = 10520;
string item_id = 10530;
repeated string item_ids = 10540;
// Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
// полей которые пользователь выбрал для отображения в интерфейсе.
repeated string fields = 10550;
map<string,string> metadata = 11000;
// Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
repeated content.references.Reference refs = 11010;
// Ссылка на документ с параметрами выполнения Action.
// Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
content.references.Reference params = 11020;
}
/**
# Расширения (Extensions)
Расширения представляют собой отдельные сервисы предоставляющие дополнительные возможности для пользователей. Сервис
может предоставлять несколько расширений одновременно.
Для координации взаимодействия используется сервис менеджер расширений (Extension Manager). Для предоставления своих функций в систему сервис должен
зарегистрироваться на контроллере.
*/
syntax = "proto3";
option go_package = "git.perx.ru/perxis/perxis-go/proto/extensions;extensions";
package extensions;
import "references/references.proto";
import "common/operation.proto";
import "extensions/extension.proto";
// ExtensionService - API расширения
// Сервис должен реализовывать методы `common.OperationService` для работы операциями.
service ExtensionService {
// Install выполняет установку указанных расширений. Если
// расширение уже установлены выполняет процесс переустановки. Возвращает longtime операцию
rpc Install(InstallRequest) returns (common.Operation) {}
// Uninstall выполняет удаление указанных расширений.
rpc Uninstall(UninstallRequest) returns (common.Operation) {}
// Check выполняет проверку установки для расширения. При этом расширение проверяет наличие необходимых данных в
// пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
// производится.
rpc Check(CheckRequest) returns (common.Operation) {}
// Пользовательские Действия (Actions)
//
// Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
// добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
// сервере или переход в интерфейсе.
//
// Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
// Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
// доступное для всех пользователей.
//
// Примеры пользовательских действий:
// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
// параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
// параметры space_id, env_id.
//
// Приложения так же могут использовать действия для вызова обработки в других приложениях при
// необходимости.
rpc Action(ActionRequest) returns(ActionResponse) {} // Выполнить указанное действие
}
// InstallRequest - запрос на установку расширений
message InstallRequest {
repeated string extensions = 10000; // Список расширений для установки
string space_id = 10010; // Пространство для установки расширений
string env_id = 10020; // Идентификатор окружения для установки
bool force = 10100; // Устанавливать расширения вне зависимости от возможных ошибок
}
// UninstallRequest - запрос на удаление расширений
message UninstallRequest {
repeated string extensions = 10000; // Список расширений для удаления
string space_id = 10010; // Пространство для удаления расширений
string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
bool remove = 10100; // Удалить сделанные расширением изменения в пространстве, если возможно
bool force = 10200; // Удалять расширения вне зависимости от возможных ошибок, без учета зависимостей
}
// CheckRequest - запрос на проверку статуса установки расширений
message CheckRequest {
repeated string extensions = 10000; // Список расширений для проверки
string space_id = 10010; // Пространство
string env_id = 10020; // Идентификатор окружения (по умолчанию master)
}
message ActionResponse {
enum State {
DONE = 0; // Запрос завершен
ERROR = 1; // Возникла ошибка
PENDING = 2; // Запрос ожидает выполнения
IN_PROGRESS = 3; // Запрос выполняется
PARAMETERS_REQUIRED = 4; // Требуются дополнительные данные для выполнения запроса
}
enum Format {
PLAIN = 0;
HTML = 1;
MARKDOWN = 2;
}
State state = 10000; // Состояние расширение
Target target = 10010; // Как открывать результат выполнения действия в пользовательском интерфейсе (переопределяет значение в Action)
Format format = 10050; // Формат полей msg и error
string msg = 10100; // Сообщение о выполнении действия
string title = 10110; // Текст для отображения в интерфейсе
string image = 10140; // Изображение для отображения в интерфейсе (шапке окна)
string error = 10200; // Сообщение в случае ошибки (дополнительно к msg)
repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
map<string,string>metadata = 10400; // Метаданные запроса
repeated content.references.Reference refs = 10320; // Ссылки на записи (назначение ссылок зависит от действия и расширения)
}
......@@ -27,33 +27,72 @@
*/
syntax = "proto3";
option go_package = "git.perx.ru/perxis/perxis-go/extensions;extensions";
option go_package = "git.perx.ru/perxis/perxis-go/proto/extensions;extensions";
package extensions;
// ExtensionManager - менеджер расширений. Должен реализовывать так же сервис Extension
service ExtensionManager {
service ExtensionManagerService {
// ## Регистрация расширений
//
// Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
// Регистрация\Дерегистрация происходит через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
// о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
// 1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
// так и пользовательские, которые могут быть использованы в интерфейсе;
// ~~1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
// так и пользовательские, которые могут быть использованы в интерфейсе;~~
// 2. Имя сервиса/расширения - название сервиса внутри системы;
// 3. Версия сервиса - сервис сообщает текущую версию сервиса. Контроллер сообщает пользователю о возможности обновления
// расширения при смене версии;
// 4. Описание версии - содержит информацию об изменениях в последних версиях расширения;
// 5. Зависимости - перечень расширений которые необходимы сервису для функционирования. При установке сервиса
// все расширения от которых он зависит, будут так же установлены.
// все расширения, от которых он зависит, будут также установлены.
rpc RegisterExtensions(RegisterExtensionsRequest) returns (RegisterExtensionsResponse) {}
rpc UnregisterExtensions(UnregisterExtensionsRequest) returns (UnregisterExtensionsResponse) {}
// Получить список зарегистрированных сервисов
rpc ListExtensions(ListExtensionsRequest) returns (ListExtensionsResponse) {} // Получить список сервисов
rpc ListRegisteredExtensions(ListRegisteredExtensionsRequest) returns (ListRegisteredExtensionsResponse) {} // Получить список сервисов
// ListExtensions - получить информацию о расширениях
rpc ListExtensions(ListExtensionsRequest) returns (ListExtensionsResponse) {} // Получить описание сервиса
}
// ServiceDescription описание сервиса
// ListExtensionsRequest - запрос на получение статуса расширений в пространстве и окружении
message ListExtensionsRequest {
// Имя расширения (опционально), regexp. Фильтр по расширениям является приоритетным
// относительно остальных фильтров - если в `ListExtensionsRequest.extensions` передано
// [ a, b, c ], то в `ListExtensionsResponse.extensions` вернется три элемента с информацией о
// каждом из расширений
repeated string extensions = 1;
string space_id = 2; // Пространство имен расширения
string env_id = 3; // Идентификатор окружения
// Вернуть список расширений, которые находятся в одном из переданных состояний
// Если список состояний пустой, по умолчанию возвращаются расширения в любом состоянии,
// кроме NOT_INSTALLED
repeated State state = 4;
}
// ListExtensionsResponse - описание расширений. Результирующий список возвращается всегда
// в отсортированном виде:
// - Если `ListExtensionsRequest.extensions` пустой, то отсортированный по идентификатору расширения
// - Если `ListExtensionsRequest.extensions` заполнен, то возвращаются расширения в соответствующем
// запросу порядке
message ListExtensionsResponse {
message ExtensionInfo {
string extension = 10100; // Имя расширения
string title = 10110;
State state = 10120;
string msg = 10200; // Сообщение
string error = 10300; // Ошибка (state == ERROR)
bool not_found = 10350; // Расширение не найдено
bool update_available = 10500; // Доступно обновление
string installed_version = 10510; // Установленная версия расширения
string available_version = 10520; // Доступная версия расширения
}
repeated ExtensionInfo extensions = 1;
}
// ExtensionDescriptor описание расширения (возвращается сервисом при регистрации)
message ExtensionDescriptor {
string extension = 10000; // Имя расширения
string title = 10010; // Название расширения
......@@ -78,30 +117,26 @@ message UnregisterExtensionsRequest {
message UnregisterExtensionsResponse {}
message ListExtensionsFilter {
message ListRegisteredExtensionsRequest {
repeated string extension = 1; // Список имен сервисов для получения результатов. Список может содержать регулярные выражения.
// repeated string action = 2; // Список действий обрабатываемых сервисами. Список может содержать регулярные выражения.
}
message ListExtensionsRequest {
ListExtensionsFilter filter = 1;
}
message ListExtensionsResponse {
message ListRegisteredExtensionsResponse {
repeated ExtensionDescriptor extensions = 1;
}
// Описание коллекций
// space_extensions (Пространство/Расширения)
enum State {
NOT_INSTALLED = 0;
INSTALLED = 1;
IN_PROGRESS = 2;
FAIL = 3;
PENDING = 4;
}
message SpaceExtensions {
enum State {
PENDING = 0;
INSTALLED = 1;
IN_PROGRESS = 2;
FAIL = 3;
}
string extension = 10000;
string title = 10010;
string version = 10100;
......@@ -109,4 +144,4 @@ message SpaceExtensions {
State state = 10300;
string status_error = 10400; // Сообщение к ошибке
string status_msg = 10500; // Сообщение к статусу
}
\ No newline at end of file
}
......@@ -2,7 +2,7 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
option go_package = "git.perx.ru/perxis/perxis-go/files;files";
option go_package = "git.perx.ru/perxis/perxis-go/proto/files;files";
package files;
......
......@@ -2,7 +2,7 @@ syntax = "proto3";
import "files/files.proto";
option go_package = "git.perx.ru/perxis/perxis-go/images;images";
option go_package = "git.perx.ru/perxis/perxis-go/proto/images;images";
package images;
......
......@@ -4,7 +4,7 @@ import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";
option go_package = "git.perx.ru/perxis/perxis-go/invitations;invitations";
option go_package = "git.perx.ru/perxis/perxis-go/proto/invitations;invitations";
package content.invitations;
......
......@@ -10,10 +10,11 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
import "common/common.proto";
import "common/error.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/struct.proto";
option go_package = "git.perx.ru/perxis/perxis-go/items;items";
option go_package = "git.perx.ru/perxis/perxis-go/proto/items;items";
package content.items;
......@@ -66,10 +67,7 @@ message Item {
google.protobuf.Struct data = 11;
map<string, google.protobuf.Struct> translations = 12;
string revision_id = 13;
google.protobuf.Timestamp published_at = 14;
string published_by = 15;
google.protobuf.Timestamp archived_at = 16;
string archived_by = 17;
string revision_description = 14;
string locale = 18;
bool deleted = 19;
bool hidden = 20;
......@@ -123,7 +121,7 @@ message Filter {
}
message CreateOptions {
bool update_attrs = 1;
bool update_attrs = 1; // позволяет обновить системные поля: created_by, created_at, created_rev_at, updated_by, updated_at
}
message FindOptions {
......@@ -135,7 +133,7 @@ message FindOptions {
}
message UpdateOptions {
bool update_attrs = 1;
bool update_attrs = 1; // позволяет обновить системные поля: created_by, created_at, created_rev_at, updated_by, updated_at
}
message GetPublishedOptions {
......@@ -143,11 +141,20 @@ message GetPublishedOptions {
}
message DeleteOptions {
bool erase = 1;
bool update_attrs = 1; // позволяет обновить системные поля: created_by, created_at, created_rev_at, updated_by, updated_at
bool erase = 2; // полное удаление без сохранения удаленной версии объекта
}
message UndeleteOptions {
bool update_attrs = 1; // позволяет обновить системные поля: created_by, created_at, created_rev_at, updated_by, updated_at
}
message PublishOptions {
bool update_attrs = 1;
bool update_attrs = 1; // позволяет обновить системные поля: created_by, created_at, created_rev_at, updated_by, updated_at
}
message UnpublishOptions {
bool update_attrs = 1; // позволяет обновить системные поля: created_by, created_at, created_rev_at, updated_by, updated_at
}
message FindPublishedOptions {
......@@ -230,18 +237,13 @@ message UpdateRequest {
}
message DeleteRequest {
string space_id = 1;
string env_id = 2;
string collection_id = 3;
string item_id = 4;
DeleteOptions options = 5;
Item item = 1; // важны только переданные внутри идентификаторы или, если указана опция update_attrs, поля которые изменяются: created_by, created_at, created_rev_at, updated_by, updated_at
DeleteOptions options = 2;
}
message UndeleteRequest {
string space_id = 1;
string env_id = 2;
string collection_id = 3;
string item_id = 4;
Item item = 1;
UndeleteOptions options = 2;
}
message PublishRequest {
......@@ -251,6 +253,7 @@ message PublishRequest {
message UnpublishRequest {
Item item = 1;
UnpublishOptions options = 2;
}
message GetPublishedRequest {
......
......@@ -2,7 +2,7 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
option go_package = "git.perx.ru/perxis/perxis-go/locales;locales";
option go_package = "git.perx.ru/perxis/perxis-go/proto/locales;locales";
package content.locales;
......
syntax = "proto3";
package logs;
import "google/protobuf/timestamp.proto";
import "google/protobuf/any.proto";
import "common/error.proto";
option go_package = "git.perx.ru/perxis/perxis-go/proto/logs;logs";
// LogLevel задает уровень журналирования.
enum LogLevel {
// INFO - обозначает сообщения с нормальным, операционным уровнем журналирования.
INFO = 0;
// WARNING - обозначает сообщения, которые содержат потенциально вредные ситуации.
WARNING = 1;
// ERROR - обозначает другие ошибки в работе.
ERROR = 2;
// CRITICAL - обозначает серьезные ошибки, из-за которых программа может не выполнять некоторые функции.
CRITICAL = 3;
// FATAL - обозначает очень серьезные ошибки, которые могут привести к остановке приложения.
FATAL = 4;
}
// LogEntry представляет собой структуру данных для хранения информации о журнале.
message LogEntry {
// id является уникальным идентификатором каждой записи в журнале.
string id = 1;
// timestamp указывает на временную метку, указывающую когда было создано данное сообщение.
google.protobuf.Timestamp timestamp = 2;
// level это поле, обозначающее уровень приоритета сообщения в логе.
LogLevel level = 3;
// message это основное сообщение, которое требуется записать в лог.
string message = 4;
// category указывает на категорию события.
// Примеры:
// -
string category = 5;
// component обозначает компонент системы, где произошло данное событие.
// Примеры:
// - Items.Service
// - Items.API
// - Users.Service
// - Users.API
// - Janitor.Service
// - Tasks.Worker
string component = 6;
// action описывает действие, которое было произведено. Это поле может принимать разные значения в зависимости от сервиса.
// Примеры:
// - item.create
// - item.update
// - organization.create
// - action.run
// - reference.create
string event = 7;
// object это идентификатор объекта связанного с событием
// Идентификатор объекта должен быть в формате GlobalID:
// <контекст>/<тип объекта>/<идентификатор объекта>
// где:
// - <контекст> - представляет собой иднетификатор родительского объекта, если таковой имеется
// - <тип объекта> - представляет собой тип объекта, например:
// spaces, envs, cols, items, revs, fields, clients, roles, orgs, users
// - <идентификатор объекта> - представляет собой идентификатор объекта
//
// Примеры:
// /spaces/<space_id> - пространство
// /spaces/<space_id>/envs/<env_id> - окружение
// /spaces/<space_id>/envs/<env_id>/cols/<collection_id> - коллекция
// /spaces/<space_id>/cols/<collection_id> - коллекция в окружении "master"
// /spaces/<space_id>/envs/<env_id>/schema/<collection_id> - схема коллекции
// /spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id> - элемент коллекции
// /spaces/<space_id>/cols/<collection_id>/items/<item_id> - элемент коллекции в окружении "master"
// /spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name> - поле элемента коллекции
// /spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id> - ревизия элемента коллекции
// /spaces/<space_id>/clients/<client_id> - клиент
// /spaces/<space_id>/roles/<role_id> - роль
// /orgs/<org_id> - организация
// /users/<user_id> - пользователь
// /services/<service_id> - сервис
string object_id = 8;
// caller содержит идентификатор сущности вызвавшей событиe, аналогично полю object
//
// Примеры:
// /users/<user_id> - пользователь
// /spaces/<space_id>/clients/<client_id> - клиент
// /services/<service_id> - сервис
string caller_id = 9;
// attr содержит дополнительные связанные с событием атрибуты в формате Any
// позволяет добавить дополнительные данные в событие
google.protobuf.Any attr = 10;
// tags содержит теги связанные с событием, на усмотрение сервиса
repeated string tags = 11;
}
\ No newline at end of file
syntax = "proto3";
package logs;
import "common/common.proto";
import "common/error.proto";
import "logs/log.proto";
import "google/protobuf/timestamp.proto";
option go_package = "git.perx.ru/perxis/perxis-go/proto/logs;logs";
// Сервис для записи активности в системе
// Позволяет всем компонентам системы записывать логи в единое хранилище и получать их оттуда
service LogsService {
// Метод для записи логов
rpc Log(LogRequest) returns (LogResponse) {}
// Метод для поиска логов по заданным параметрам
rpc Find(FindRequest) returns (FindResponse) {}
// Метод для удаления логов по заданным параметрам
rpc Delete(DeleteRequest) returns (DeleteResponse) {}
}
// Запрос для лога
message LogRequest {
// Запись лога
repeated LogEntry entries = 1;
}
// Ответ сервера на запрос лога
message LogResponse {
// Содержит информацию об ошибке, если таковая имеется
common.Error error = 1;
}
message Filter {
// Запрос на поиск логов
// Примеры:
// 1. `timestamp > '2019-01-01' AND timestamp < '2019-01-02'`
// 2. `timestamp > '2019-01-01' AND timestamp < '2019-01-02' AND level = 'error'`
// 3. `component = 'api' AND object_id = '123' AND object_type = 'item' AND space = 'spc1'`
// 4. `id in ['1', '2', '3']`
repeated string q = 3; // Список выражений для фильтрации
}
// Запрос на поиск логов
message FindRequest {
// Фильтры для поиска
Filter filter = 2;
// Опции поиска
common.FindOptions options = 3;
}
// Результат поиска
message FindResult {
// Найденные записи лога
repeated LogEntry entries = 1;
// Использовавшийся для поиска фильтр
// Для
Filter filter = 2;
// Использовавшиеся для поиска опции
common.FindOptions options = 3;
// Общее количество найденных записей
uint32 total = 4;
}
// Ответ сервера на запрос поиска
message FindResponse {
oneof response {
// Результаты поиска
FindResult result = 1;
// Информация об ошибке, если таковая имеется
common.Error error = 2;
}
}
// Запрос на удаление логов
message DeleteRequest {
// Фильтры для удаления
Filter filter = 2;
}
// Ответ сервера на запрос удаления
message DeleteResponse {
// Информация об ошибке, если таковая имеется
common.Error error = 1;
}
\ No newline at end of file