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 (85)
Showing
with 533 additions and 31 deletions
stages:
- pre-release
- release
# Расчет новой версии и формирование Changelog
get_changelog:
stage: pre-release
image:
name: orhunp/git-cliff:latest
entrypoint: [ "" ]
rules:
- if: '$CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE == "true"'
- if: $CI_PIPELINE_SOURCE == "web"
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 0
script:
- echo "$(git-cliff --unreleased | sed '1,6d' | sed '$d')" > current_changelog.md
artifacts:
reports:
dotenv: vars.env
paths:
- current_changelog.md
# Выпуск релиза и публикация артефактов с новой версией и списком изменений
prepare_release:
stage: pre-release
image: bitnami/git:latest
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 0
rules:
- if: '$CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE == "true"'
- if: $CI_PIPELINE_SOURCE == "web"
needs:
- job: get_changelog
artifacts: true
script:
- |
CURRENT_VERSION=$(git describe --tags --abbrev=0)
RELEASE_VERSION=$CURRENT_VERSION
# Релиз perxis-proto - это всегда изменения апи и хотфиксом быть не может. Выполняется только при наличии изменений
if [ $HOTFIX_RELEASE != "true" ] && [ $(git rev-list $CURRENT_VERSION..HEAD --count) -gt 0 ]; then
RELEASE_VERSION=$PERXIS_RELEASE_VERSION
fi
# Если новая версия совпадает со старой, значит изменений не было, и выпускать новый релиз не нужно
NEEDS_RELEASE=false
if [ "$RELEASE_VERSION" != "$CURRENT_VERSION" ]; then
NEEDS_RELEASE=true
fi
echo "PERXIS_PROTO_CURRENT_VERSION=$CURRENT_VERSION" >> vars.env
echo "PERXIS_PROTO_RELEASE_VERSION=$RELEASE_VERSION" >> vars.env
echo "PERXIS_PROTO_NEEDS_RELEASE=$NEEDS_RELEASE" >> vars.env
printf '### Release perxis-proto
PERXIS_RELEASE_VERSION: %s
HOTFIX_RELEASE: %s
CURRENT_VERSION: %s
RELEASE_VERSION: %s
NEEDS_RELEASE: %s' $PERXIS_RELEASE_VERSION $HOTFIX_RELEASE $CURRENT_VERSION $RELEASE_VERSION $NEEDS_RELEASE
artifacts:
when: always
paths:
- vars.env
- current_changelog.md
expire_in: 1 week
# ----- release -----
release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE != "true"
- if: $CI_PIPELINE_SOURCE == "web"
when: manual
script:
- echo "Start release $VERSION"
- |
if [ $NEEDS_RELEASE != "true" ]; then
exit 203
fi
allow_failure:
exit_codes:
- 203
release:
name: 'Release $VERSION'
description: '$CI_COMMIT_TAG'
tag_name: '$VERSION'
## Описание
Issue: #(номер User Story или ссылка)
- (описание, что было сделано)
- (описание, что было сделано)
### Требует влития MR:
- (ссылка на MR)
- (ссылка на MR)
### Требуется для MR:
- (ссылка на MR)
- (ссылка на MR)
\ No newline at end of file
# git-cliff ~ default configuration file
# https://git-cliff.org/docs/configuration
#
# Lines starting with "#" are comments.
# Configuration options are organized into tables and keys.
# See documentation for more information on available options.
[bump]
features_always_bump_minor = true
breaking_always_bump_major = true
[changelog]
# changelog header
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits %}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | upper_first }} \
{% if commit.links %}\
({% for link in commit.links %}\
[{{ link.text }}]({{ link.href }})\
{% if not loop.last %}, {% endif %}\
{% endfor %})\
{% endif %}\
-([{{ commit.id | truncate(length=7, end="") }}]($REPO/-/commit/{{ commit.id }}))\
{% endfor %}
{% endfor %}\n
"""
# template for the changelog footer
footer = """
<!-- generated by git-cliff -->
"""
# remove the leading and trailings
trim = true
# postprocessors
postprocessors = [
{ pattern = '\$REPO', replace = "https://git.perx.ru/perxis/perxis-proto" },
]
[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = true
# process each line of a commit as an individual commit
split_commits = false
# regex for preprocessing the commit messages
commit_preprocessors = [
{ pattern = 'Feat:', replace = "feat:"},
{ pattern = 'WIP:', replace = ""},
{ pattern = 'wip:', replace = ""}
# Replace issue numbers
#{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
# Check spelling of the commit with https://github.com/crate-ci/typos
# If the spelling is incorrect, it will be automatically fixed.
#{ pattern = '.*', replace_command = 'typos --write-changes -' },
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->🚀 Features" },
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
{ message = "^perf", group = "<!-- 4 -->⚡ Performance" },
{ message = "^refactor", group = "<!-- 2 -->🚜 Refactor", skip = true },
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
{ message = "^test", group = "<!-- 6 -->🧪 Testing" },
{ message = "^chore\\(release\\): prepare for", skip = true },
{ message = "^chore\\(deps.*\\)", skip = true },
{ message = "^chore\\(pr\\)", skip = true },
{ message = "^chore\\(pull\\)", skip = true },
{ message = "^chore|^ci", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },
{ message = "^irefac", skip = true },
]
# protect breaking changes from being skipped due to matching a skipping commit_parser
protect_breaking_commits = false
# filter out the commits that are not matched by commit parsers
filter_commits = false
# regex for matching git tags
# tag_pattern = "v[0-9].*"
# regex for skipping tags
skip_tags = "v0.([0-9]\\.|1[0-8]).*"
# regex for ignoring tags
# ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"
# limit the number of commits included in the changelog.
# limit_commits = 42
link_parsers = [
{ pattern = "#(PRXS-(\\d+))", href = "https://tracker.yandex.ru/$1"},
{ pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"},
]
\ No newline at end of file
......@@ -3,6 +3,7 @@ syntax = "proto3";
import "google/protobuf/empty.proto";
import "common/common.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/duration.proto";
option go_package = "git.perx.ru/perxis/perxis-go/proto/collections;collections";
......@@ -18,6 +19,9 @@ message Access {
repeated string deny_read_fields = 8;
repeated string deny_write_fields = 9;
// Скрыть коллекцию в интерфейсе от пользователя
bool hidden = 10;
}
message Collection {
......@@ -61,6 +65,23 @@ message Collection {
repeated string tags = 16;
Access access = 20; // Возможные действия с коллекцией на основе контекста запроса
// Коллекция без истории изменений (ревизии)
// История изменений записей в коллекции не будет сохраняться и вернуться к предыдущим версиям будет нельзя
bool no_revisions = 30;
uint32 max_revisions = 31; // старые ревизии сверх указанного количества будут автоматически удаляться. 0, пусто - без ограничений
google.protobuf.Duration revision_ttl = 32; // ревизии старше указанного времени хранения будут автоматически удалятся. 0, пусто - без ограничений
// Коллекция без архива
// Включение опции приведет к удалению всех записей в архиве, а функция архивирования станет недоступна
bool no_archive = 35;
// Коллекция без публикации
// Все записи коллекции считаются опубликованными, функции публикации и снятия с публикации недоступны.
// При включении параметра коллекции "без публикации" все записи, независимо от статуса, будут считаться опубликованными.
// При отключении параметра "без публикации" статусы публикации будут восстановлены.
bool no_publish = 40;
}
message CreateRequest {
......@@ -93,6 +114,7 @@ message ListRequest {
bool include_hidden = 6;
repeated string name = 3;
repeated string id = 4;
repeated string tag = 7;
}
string space_id = 1;
......
......@@ -6,6 +6,9 @@ package common;
import "google/protobuf/struct.proto";
// Deprecated
// Поддержка этой реализации фильтра осталась только в запросе поиска записей (Items.Find)
// Возможно, его поддержка будет прекращена в следующих версиях системы
message Filter {
string op = 1;
string field = 2;
......@@ -44,14 +47,13 @@ message Rule {
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;
// скрыть коллекцию в интерфейсе от пользователя
bool hidden = 12;
}
message Collaborator {
......
......@@ -155,6 +155,9 @@ message ActionRequest {
string item_id = 10530;
repeated string item_ids = 10540;
// Идентификатор локали в пространстве: поле может использоваться расширением, если действие возможно выполнить на разных локалях
string locale_id = 11050;
// Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
// полей которые пользователь выбрал для отображения в интерфейсе.
repeated string fields = 10550;
......@@ -167,4 +170,14 @@ message ActionRequest {
// Ссылка на документ с параметрами выполнения Action.
// Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
content.references.Reference params = 11020;
// Параметры запроса пользователя
message UserPreferences {
string timezone = 1000; // Timezone в формате IANA. Пример: "Europe/Moscow", "America/New_York" https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
string locale = 1020; // Текущая локаль пользователя в UI
string theme = 1030; // Текущая тема пользователя в UI
string agent = 1040; // Браузера или приложение пользователя
}
UserPreferences user = 11030;
}
......@@ -11,17 +11,18 @@ package files;
message File {
string id = 1; // Уникальный идентификатор файла в хранилище
string name = 2; // Имя файла
int32 size = 3; // Размер файла
uint64 size = 3; // Размер файла
string mime_type = 4; // Mime-type файла
string url = 5; // Адрес для загрузки файла
bool temporary = 6; // Находится ли файл во временном хранилище
}
message MultipartUpload {
File file = 1;
string upload_id = 2; // Идентификатор загрузки хранилища
int32 part_size = 3; // Размер блока для загрузки
repeated string part_urls = 4; // Адреса для загрузки пол
repeated CompletedPart parts = 5; // Идентификаторы загруженных блоков (S3 ETAGs)
string upload_id = 2; // Идентификатор загрузки хранилища
uint64 part_size = 3; // Размер блока для загрузки
repeated string part_urls = 4; // Адреса для загрузки пол
repeated CompletedPart parts = 5; // Идентификаторы загруженных блоков (S3 ETAGs)
}
message Upload {
......
......@@ -3,6 +3,7 @@ syntax = "proto3";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";
import "common/common.proto";
option go_package = "git.perx.ru/perxis/perxis-go/proto/invitations;invitations";
......@@ -17,6 +18,8 @@ message Invitation {
string role = 6;
google.protobuf.Timestamp created_at = 7;
google.protobuf.Timestamp valid_until = 8;
uint32 uses = 9; // Количество пользователей, принявших приглашение.
uint32 max_uses = 10; // Максимальное количество пользователей, которые могут принять приглашение.
}
message Filter {
......@@ -28,12 +31,6 @@ message Filter {
repeated string role = 6;
}
message FindOptions {
repeated string sort = 1;
int32 page_num = 2;
int32 page_size = 3;
}
message CreateRequest {
Invitation invitation = 1;
}
......@@ -69,7 +66,7 @@ message AcceptInvitationResponse {}
message FindRequest {
Filter filter = 1;
FindOptions opts = 2;
common.FindOptions options = 3;
}
message FindResponse {
......
......@@ -65,14 +65,36 @@ message Item {
string updated_by = 9; // id пользователя обновившего текущую ревизию
google.protobuf.Timestamp updated_at = 10; // дата обновления текущей ревизии
google.protobuf.Struct data = 11;
map<string, google.protobuf.Struct> translations = 12;
string revision_id = 13;
string revision_description = 14;
string locale = 18;
bool deleted = 19;
bool hidden = 20;
bool template = 21;
Permissions permissions = 22;
double search_score = 23; // релеватность элемента при полнотекстовом поиске
// string locale = 18; // DEPRECATED: используется locale_id
// Идентификатор локали полученной записи.
// При создании или обновлении идентификатор локали, в которой создается запись, опционально.
// Если указан, то создается перевод для указанного языка, поле translations игнорируется
string locale_id = 100;
// Позволяет одновременно установить/получить несколько переводов и производить манипуляции с переводами
// Ключами является идентификатор локали, значениями - данные переводы
// При обновлении не происходит валидация или модификация каждого из переводов в соответствие со схемой,
// поэтому обновление через поле `translations` стоит выполнять с аккуратностью
// Для удаления переводов реализована следующая логика:
// - {"lang":nil|{}} - сброс перевода для языка
// - {"lang":map{...}} - установка перевода для языка
// - {"lang":map{...}, "*":nil} - установка перевода для языка, сброс остальных переводов
// - {"*":nil} - сброс всех переводов
map<string, google.protobuf.Struct> translations = 12;
// Список идентификаторов локалей, для которых есть переводы
// Соотвествует списку переводов в translations, при получении записи всегда возвращается
// полный список. Невозможно обновить вручную: формируется системой
repeated string translations_ids = 101;
}
/**
......@@ -130,6 +152,11 @@ message FindOptions {
bool regular = 4;
bool hidden = 5;
bool templates = 6;
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
// Список идентификаторов переводов/локалей, которых должны быть включены в результат
// Возможно указание '*' для получения всех переводов
repeated string translations_ids = 8;
}
message UpdateOptions {
......@@ -137,7 +164,11 @@ message UpdateOptions {
}
message GetPublishedOptions {
string locale_id = 1;
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
// Список идентификаторов переводов/локалей, которых должны быть включены в результат
// Возможно указание '*' для получения всех переводов
repeated string translations_ids = 8;
}
message DeleteOptions {
......@@ -159,20 +190,44 @@ message UnpublishOptions {
message FindPublishedOptions {
common.FindOptions options = 2;
string locale_id = 3;
// string locale_id = 3; // язык для поиска переводов. Если не указан, то возвращаются данные для языка по умолчанию
bool regular = 4;
bool hidden = 5;
bool templates = 6;
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
// Список идентификаторов переводов/локалей, которых должны быть включены в результат
// Возможно указание '*' для получения всех переводов
repeated string translations_ids = 8;
}
message FindArchivedOptions {
common.FindOptions options = 2;
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
repeated string translations_ids = 8; // Список идентификаторов переводов/локалей, которых должны быть включены в результат
}
message ListRevisionsOptions {
common.FindOptions options = 2;
int32 offset = 9;
int32 limit = 10;
repeated string fields = 11;
bool exclude_fields = 12;
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
repeated string translations_ids = 8; // Список идентификаторов переводов/локалей, которых должны быть включены в результат
}
message GetRevisionOptions {
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
repeated string translations_ids = 8; // Список идентификаторов переводов/локалей, которых должны быть включены в результат
}
message GetArchivedOptions {
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
repeated string translations_ids = 8; // Список идентификаторов переводов/локалей, которых должны быть включены в результат
}
// Fields - поля которые должны быть возвращены или вычислены в результате.
// Ключ (string) - имя поля под которым будет добавляться результат.
// Значение (string) - является выражением, вычисление которого сформирует результат
......@@ -190,6 +245,8 @@ message AggregateOptions {
message AggregatePublishedOptions {
map<string, string> fields = 1;
// TODO: Каким образом будет организована работа с переводами и требуется ли она?
}
message CreateRequest {
......@@ -209,12 +266,19 @@ message IntrospectResponse {
repeated common.Error.BadRequest.FieldViolation validation_errors = 3;
}
message GetOptions {
string locale_id = 7; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
repeated string translations_ids = 8; // Список идентификаторов переводов/локалей, которых должны быть включены в результат
}
message GetRequest {
string space_id = 1;
string env_id = 2;
string collection_id = 3;
string item_id = 4;
GetOptions options = 5;
}
message GetResponse {
Item item = 1;
}
......@@ -246,6 +310,18 @@ message UndeleteRequest {
UndeleteOptions options = 2;
}
message CheckoutRevisionRequest {
string space_id = 1;
string env_id = 2;
string collection_id = 3;
string item_id = 4;
string revision_id = 5;
}
message CheckoutRevisionResponse {
string stored_revision_id = 1; // Версия ревизии которая была создана или соответствует предыдущему рабочему контенту
}
message PublishRequest {
Item item = 1;
PublishOptions options = 2;
......@@ -256,6 +332,7 @@ message UnpublishRequest {
UnpublishOptions options = 2;
}
message GetPublishedRequest {
string space_id = 1;
string env_id = 2;
......@@ -310,6 +387,7 @@ message GetRevisionRequest {
string collection_id = 3;
string item_id = 4;
string revision_id = 5;
GetRevisionOptions options = 10;
}
message GetRevisionResponse {
Item item = 1;
......@@ -324,6 +402,7 @@ message ListRevisionsRequest {
}
message ListRevisionsResponse {
repeated Item items = 1;
int32 total = 2;
}
/**
......@@ -349,6 +428,17 @@ message FindArchivedResponse{
int32 total = 2;
}
message GetArchivedRequest {
string space_id = 1;
string env_id = 2;
string collection_id = 3;
string item_id = 4;
GetArchivedOptions options = 10;
}
message GetArchivedResponse {
Item item = 1;
}
/**
* Сервис API элементов
*/
......@@ -380,6 +470,7 @@ service Items {
rpc Unpublish(UnpublishRequest) returns(google.protobuf.Empty) {}
rpc GetPublished(GetPublishedRequest) returns(GetPublishedResponse) {}
rpc FindPublished(FindPublishedRequest) returns(FindPublishedResponse) {}
rpc CheckoutRevision(CheckoutRevisionRequest) returns(CheckoutRevisionResponse) {}
/**
* Расчет значений по существующим данным. Например, получение среднего значения поля
......@@ -398,4 +489,5 @@ service Items {
rpc Archive(ArchiveRequest) returns(google.protobuf.Empty) {}
rpc FindArchived(FindArchivedRequest) returns(FindArchivedResponse) {}
rpc Unarchive(UnarchiveRequest) returns(google.protobuf.Empty) {}
rpc GetArchived(GetArchivedRequest) returns(GetArchivedResponse) {}
}
......@@ -7,9 +7,17 @@ option go_package = "git.perx.ru/perxis/perxis-go/proto/locales;locales";
package content.locales;
message Locale {
string id = 1;
string space_id = 2;
string name = 3;
string id = 1; // Идентификатор локали, генерируется автоматически. Для локали по умолчанию устанавливается как "default".
string space_id = 2; // Идентификатор пространства.
string name = 3; // Название локали. Опционально, заполняется автоматически (Пример: russian, english)
string native_name = 4; // Название локали на языке локали. Опционально, заполняется автоматически (Пример: Русский, English)
string code = 5; // Код локали https://en.wikipedia.org/wiki/IETF_language_tag
string fallback = 6; // Идентификатор локали, который будет использоваться при отсутствии перевода
string direction = 7; // Направление письма - слева направо (ltr) или справа налево (rtl). По умолчанию устанавливается ltr.
int64 weight = 8; // Вес локали.
bool no_publish = 100; // Не публиковать контент данной локали. Не будет доступен контент через Delivery API. (кроме default)
bool disabled = 101; // Запретить использование локали. Нельзя создавать и редактировать контент для данной локали (кроме default)
}
message CreateRequest {
......@@ -20,6 +28,10 @@ message CreateResponse {
Locale locale = 1;
}
message UpdateRequest {
Locale locale = 1;
}
message ListRequest {
string space_id = 1;
}
......@@ -28,12 +40,20 @@ message ListResponse {
}
message DeleteRequest {
string space_id = 1;
string locale_id = 2;
string id = 1;
string space_id = 2;
}
service Locales {
// Создать локаль
rpc Create(CreateRequest) returns(CreateResponse) {}
// Обновить локаль
rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
// Получить список локалей
rpc List(ListRequest) returns(ListResponse) {}
// Удалить локаль
rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
}
\ No newline at end of file
......@@ -99,4 +99,6 @@ message LogEntry {
// tags содержит теги связанные с событием, на усмотрение сервиса
repeated string tags = 11;
reserved 12;
}
\ No newline at end of file
......@@ -46,13 +46,33 @@ message Filter {
repeated string q = 3; // Список выражений для фильтрации
}
// Опции поиска по логам
message FindOptions {
// Сортировка результатов
repeated string sort = 1;
reserved 2;
reserved 3;
// Ограничение количества результатов
int32 limit = 4;
// Ограничение результатов по времени начиная с этим временем (pagination)
google.protobuf.Timestamp after = 5;
// Ограничение результатов по времени заканчивая этим временем (pagination)
google.protobuf.Timestamp before = 6;
}
// Запрос на поиск логов
message FindRequest {
// Фильтры для поиска
// Фильтр для поиска
Filter filter = 2;
// Опции поиска
common.FindOptions options = 3;
FindOptions options = 3;
}
// Результат поиска
......@@ -65,10 +85,16 @@ message FindResult {
Filter filter = 2;
// Использовавшиеся для поиска опции
common.FindOptions options = 3;
FindOptions options = 3;
// Общее количество найденных записей
uint32 total = 4;
uint32 total = 4; // DEPRECATED
// Запрос для получения следующей страницы
FindRequest next = 5;
// Запрос для получения предыдущей страницы
FindRequest prev = 6;
}
// Ответ сервера на запрос поиска
......
syntax = "proto3";
import "google/protobuf/empty.proto";
import "common/common.proto";
import "google/protobuf/timestamp.proto";
option go_package = "git.perx.ru/perxis/perxis-go/api/mailbox;mailbox";
package perxis.mailbox;
// Сообщение для уведомления
message Message {
string id = 1; // Уникальный идентификатор уведомления
string object_id = 2; // Идентификатор объекта события
string from = 3; // Идентификатор отправителя пользователя/сервиса/подсистемы
string to = 4; // Идентификатор получателя пользователя/сервиса/подсистемы
string title = 5; // Заголовок уведомления
string message = 6; // Текст уведомления
google.protobuf.Timestamp created_at = 7; // Время создания
bool is_read = 8; // Статус прочтения
}
// Отправить уведомление
message SendMessageRequest {
repeated string to = 1; // список получателей пользователей/сервисов/подсистем
Message message = 2;
}
// Запрос на получение уведомлений
message ListMessageRequest {
FindOptions options = 10;
}
// Ответ на получение уведомлений
message ListMessageResponse {
repeated Message message = 1;
}
// Пометка уведомлений как прочитанных
message MarkMessagesRequest {
bool unread = 1; // Установить статус сообщения не/прочитано
FindOptions options = 10;
}
message FindOptions {
string recipient = 1;
repeated string message_ids = 3;
google.protobuf.Timestamp after = 4;
google.protobuf.Timestamp before = 5;
optional bool unread = 6;
common.FindOptions options = 10;
}
// Сервис уведомлений
service Mailbox {
// Отправка уведомления
rpc Send(SendMessageRequest) returns(google.protobuf.Empty) {};
// Получение уведомлений, поле to в Message всегда содержит только получателя из запроса
rpc List(ListMessageRequest) returns(ListMessageResponse);
// Пометка уведомлений как прочитанных
rpc MarkAsRead(MarkMessagesRequest) returns(google.protobuf.Empty) {};
}
......@@ -49,7 +49,7 @@ message Filter {
message FindRequest {
Filter filter = 1;
common.FindOptions opts = 2;
common.FindOptions options = 2;
}
message FindResponse {
......
......@@ -17,6 +17,7 @@ message GetRequest {
string space_id = 1;
string env_id = 2;
repeated Reference references = 3;
GetOptions options = 4; // Дополнительные параметры поиска
}
message GetResponse {
......@@ -40,6 +41,11 @@ message PublishResponse {
repeated Reference unpublished = 4; // Список не опубликованных записей, требующих публикации
}
message GetOptions {
string locale_id = 1; // Язык перевода который будет использоваться. Если не указан, то возвращаются данные для языка по умолчанию
repeated string translations_ids = 2; // Список идентификаторов переводов/локалей, которых должны быть включены в результат
}
// References сервис предназначен для работы со ссылками на записи
service References {
......
......@@ -6,6 +6,7 @@ package content.spaces;
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
import "common/common.proto";
message Space {
string id = 1;
......@@ -103,10 +104,31 @@ message MoveRequest {
string org_id = 2; // Идентификатор организации, в которую пространство должно быть перемещено. Обязателен для заполнения только в случае запросов с системным уровнем доступа, в остальных случаях опционален
}
message Filter {
repeated string id = 1; // Список ID пространств
repeated string org_id = 2; // Список организаций
repeated string name = 3; // Список названий
repeated State state = 4; // Список состояний
repeated string transfer_to_org = 5; // Список организаций, в которые запрошен перенос пространства
}
message FindRequest {
// Фильтры для поиска
Filter filter = 1;
// Опции поиска
common.FindOptions options = 2;
}
message FindResponse {
repeated Space spaces = 1;
int32 total = 2;
}
service Spaces {
rpc Create(CreateRequest) returns(CreateResponse) {}
rpc Get(GetRequest) returns(GetResponse) {}
rpc List(ListRequest) returns(ListResponse) {}
rpc Find(FindRequest) returns(FindResponse) {}
rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
rpc UpdateConfig(UpdateConfigRequest) returns(google.protobuf.Empty) {}
rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
......
......@@ -29,6 +29,15 @@ message Filter {
google.protobuf.BoolValue system = 10;
}
message LoginRequest {
string email = 1;
string identity = 2;
}
message LoginResponse {
User user = 1;
}
message CreateRequest {
User create = 1;
}
......@@ -73,7 +82,14 @@ message GetByIdentityResponse {
User user = 1;
}
service Users {
// Метод для авторизации пользователя. Возвращает информацию о пользователе
// Пользователь может быть авторизован в разных системах IdP, поэтому
// авторизация происходит по email и identity. Если для одного email есть
// несколько identity, то они будут объединены в одного пользователя
rpc Login(LoginRequest) returns(LoginResponse) {}
// Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
rpc Create(CreateRequest) returns(CreateResponse) {}
......