diff --git a/.gitmodules b/.gitmodules index 5971b5a..9fa4a1b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "build_utils"] path = build_utils - url = ../build_utils.git + url = git@github.com:rbkmoney/build_utils.git + branch = master diff --git a/proto/limiter.thrift b/proto/limiter.thrift index 7b9d2dc..0658a3a 100644 --- a/proto/limiter.thrift +++ b/proto/limiter.thrift @@ -1,7 +1,156 @@ namespace java com.rbkmoney.limiter namespace erlang limiter -include "proto/msgpack.thrift" +include "proto/shumpune.thrift" +include "proto/base.thrift" -typedef string Test +typedef string LimitID +typedef string PlanID +typedef i64 BatchID +typedef i64 AccountID +typedef string LimitRef +typedef i64 DomainRevision +typedef shumpune.Clock Clock +typedef shumpune.Balance Balance +typedef base.InvalidRequest InvalidRequest + +enum LimitType { + cash + count +} + +struct Sublimit { + 1: required AccountID account_id + 2: required LimitTimeRange time_range +} + +/** +* Структура данных, описывающая свойства счета: +* id -идентификатор машины лимита +* ref - идентификатор лимита в domain конфигурации +* domain_revision - ревизия конфигурации +* type - тип лимита +* sublimits - сублимиты лимита +* description - описание (неизменяемо после создания лимита) +*/ +struct Limit { + 1: required LimitID id + 2: required LimitRef ref + 3: required DomainRevision domain_revision + 4: required LimitType type + 5: required list sublimits + 6: optional string description +} + +/** +* Описывает одно изменение лимита в системе, может быть следующих типов: +* cash - изменение валютного лимита +* count - изменение счетного лимита +*/ + +union LimitUnit { + 1: LimitUnitCash cash + 2: LimitUnitCount count +} + +struct LimitUnitCash { + 1: required base.Amount amount + 2: required base.CurrencySymbolicCode currency_sym_code +} + +struct LimitUnitCount { + 1: required base.Amount amount +} + +/** +* Описывает батч - набор изменений лимита, служит единицей атомарности операций в системе: +* id - идентификатор набора, уникален в пределах плана +* units - набор изменений лимита +*/ +struct LimitBatch { + 1: required BatchID id + 2: required list units +} + +/** + * План состоит из набора батчей, который можно пополнить, подтвердить или отменить: + * id - идентификатор плана, уникален в рамках системы + * batch_list - набор батчей, связанный с данным планом +*/ +struct LimitPlan { + 1: required PlanID id + 2: required list batch_list +} + +/** +* Описывает параметры создания лимита: +* ref - идентификатор лимита в domain конфигурации +* domain_revision - ревизия конфигурации +* create_time - время старта нового временного интервала лимита +*/ +struct LimitCreateParams { + 1: required LimitRef ref + 2: required DomainRevision domain_revision + 3: required base.Timestamp create_time +} + +/** +* Описывает единицу изменения плана: +* id - id плана, к которому применяется данное изменение +* batch - набор изменений, который нужно добавить в план +* create_params - если такого лимита нет или срок дейтсвия сублимита истек, то эти параметры +* будут использованы чтобы проинициализировать новый лимит/сублимит. + Так как мы не знаем существует ли лимит, то всегда прикладываем эти параметры. +*/ +struct LimitPlanChange { + 1: required PlanID id + 2: required LimitBatch batch + 3: required LimitCreateParams create_params +} + +/** +* Описывает время действия лимита: +* start_time - начало действия лимита +* end_time - конец, если не бесконечно +*/ +struct LimitTimeRange { + 1: required base.Timestamp start_time + 2: optional base.Timestamp end_time +} + +/** +* Описывает точку во времени жизни лимита: +* clock - clock состояния счета аккаунта, привязанного к сублимиту +* time_range - время действия сублимита, чтобы можно было его найти в лимите +*/ +struct LimitClock { + 1: required Clock clock + 2: required LimitTimeRange time_range +} + +exception LimitNotFound { + 1: required LimitID limit_id +} + +exception PlanNotFound { + 1: required PlanID plan_id +} + +/** +* Возникает в случае, если переданы некорректные параметры в одном или нескольких изменениях лимита +*/ +exception InvalidLimitParams { + 1: required map wrong_limits +} + +exception ClockInFuture {} + +service Accounter { + LimitClock Hold(1: LimitPlanChange plan_change) throws (1: InvalidLimitParams e1, 2: base.InvalidRequest e2) + LimitClock CommitPlan(1: LimitPlan plan) throws (1: InvalidLimitParams e1, 2: base.InvalidRequest e2) + LimitClock RollbackPlan(1: LimitPlan plan) throws (1: InvalidLimitParams e1, 2: base.InvalidRequest e2) + LimitPlan GetPlan(1: PlanID id) throws (1: PlanNotFound e1) + Limit GetLimitByID(1: LimitID id) throws (1:LimitNotFound e1) + Balance GetBalanceByID(1: LimitID id, 2: LimitClock clock) throws (1:LimitNotFound e1, 2: ClockInFuture e2) +} diff --git a/rebar.config b/rebar.config index a2350ad..91d1c0f 100644 --- a/rebar.config +++ b/rebar.config @@ -29,6 +29,10 @@ {msgpack_proto, {git, "git@github.com:rbkmoney/msgpack-proto.git", {branch, "master"}} + }, + {shumpune_proto, + {git, "git@github.com:rbkmoney/shumpune-proto.git", + {branch, "master"}} } ]}. diff --git a/rebar.lock b/rebar.lock new file mode 100644 index 0000000..d6f2163 --- /dev/null +++ b/rebar.lock @@ -0,0 +1,8 @@ +[{<<"msgpack_proto">>, + {git,"git@github.com:rbkmoney/msgpack-proto.git", + {ref,"b558b0d9a91f2130e241bd186db171aee3e81e36"}}, + 0}, + {<<"shumpune_proto">>, + {git,"git@github.com:rbkmoney/shumpune-proto.git", + {ref,"4c87f03591cae3dad41504eb463d962af536b1ab"}}, + 0}].