From ee9331e6cd923be331c77005f407d0a5a83c43ac Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 24 Jan 2026 12:07:12 +0300 Subject: [PATCH] 201 intermediate commit for state navigation --- README.md | 30 +++++- v1/Application.cfc | 2 +- v1/lib/expression_parser.cfc | 50 ++++++++-- v1/resources/instance_operation.cfc | 15 ++- v1/resources/instance_operation_cfs_param.cfc | 31 +++++- .../instance_operation_cfs_param_ls.cfc | 4 +- v1/resources/instance_operation_default.cfc | 9 +- v1/resources/resource_realm_ls.cfc | 2 + v1/resources/svc_operation.cfc | 1 + .../svc_operation_cfs_param_compute.cfc | 2 +- .../svc_operation_cfs_subparam_compute.cfc | 98 +++++++++++++++++++ 11 files changed, 222 insertions(+), 22 deletions(-) create mode 100644 v1/resources/svc_operation_cfs_subparam_compute.cfc diff --git a/README.md b/README.md index 0fb68a4..13dbf85 100644 --- a/README.md +++ b/README.md @@ -1 +1,29 @@ -Тут должно быть описание микросервиса svc-api +# Тут должно быть описание микросервиса svc-api + +# Функции для навигации по стейтам и конфигам + +Перечисленные ниже функции являются методами CFS параметра операции инстанса (пока сделано так, но, возможно, придется их переместить - может быть, в параметр операции сервиса или в отдельный объект). +Прежде чем вызывать методы, как правило, нужно инициализировать объект параметра, закинув в него контекст. Самый простой контекст - это ключ (UID) сохраненного параметра - если параметр сохранен, про него примерно все известно (разве что соседние параметры могут не быть сохранены). Для еще не сохраненного параметра мы передаем с контекстом то, что знаем - значения соседних параметров, от которых мы зависим, ключи инстанса, операции или сервиса. Сохраненный параметр мы, возможно, захотим поменять - поэтому значения переданных с фронта параметров имеют приоритет перед сохраненными. +Аргументами функций могут быть строковые константы, значения соседних параметров и другие предопределенные функции (см. список ниже). Глубина вложенности функций не ограничивается. Как правило, корневая функция возвращает список + +## Ссылки на параметры + +* params.name ("params" - ключевое слово, другие скоупы не поддерживаются) +* params.name.subparam (можно ссылаться на в выражениях субпараметры, и субпараметры могут вычисляться как выражения - но это относится только к субпараметрам сервиса, но не к субпараметрам инстанса, которые произвольно задаются пользователем) + +## Функции + +* string getKeyListFromStruct(struct struct, string path) - по замыслу всегда корневая функция, возвращает список ключей MAP из структуры (можно считать, что это разобранный JSON) по заданному пути. В API форматируется как массив. Можно в корне использовать функцию, которая вернет строку, тогда получится выпадающий список с единственным значением, но непонятно, зачем (разве что при отладке) +* string getArrayAsListFromStruct(struct struct, string path) - корневая функция, возвращает список элементов массива. Пока подразумевается, что в массиве простые элементы (если надо не простые - нужно придумать им какой-то метод toString, то есть разумный способ преобразования в строку) +* string getValueFromStruct(struct struct, string path) - получить скаляр (строку) из структуры +* string concat(string[] args) - просто сшивает строки (константы, параметры, результаты функций), число аргументов любое. Например, чтобы собрать путь из фрагментов +* (для отладки) any dummy(any arg)- возвращает свое значение. Для тестирования +* string getResourceRealm() - возвращает имя текущей (то есть в переданном контексте) ресурсной платформы. Важно: если у сервиса нет ресурсной платформы, пытается найти ее у родительских инстансов (глубина рекурсии до 10). 2DO: добавить ограничения на поиск платформ определенного типа +* struct getResourceRealmConfig(string resourceRealm) - возвращает распаршенный конфиг указанной ресурсной платформы +* struct getResourceRealmConfig() - без параметров возвращает распаршенный конфиг текущей ресурсной платформы (можно ожидать, что только такой вариант и нужен) +* struct getInstanceState(uuid instanceUid) - возвращает распаршенный стейт инстанса по ключу +* struct getInstanceState() - без параметров возвращает распаршенный стейт текущего инстанса +* (использовать не нужно) string getCfsParam(string param) - то же, что params.param, только длиннее и не добавляет параметр в список зависимостей +* (использовать не нужно) string getCfsParam(string param, string subparam) - то же, что params.param.subparam, но не добавляет параметр в список зависимостей + +Списки с пустым значением пока не поддерживаются (если надо будет, сделаем) diff --git a/v1/Application.cfc b/v1/Application.cfc index c26a758..c3fe9b7 100644 --- a/v1/Application.cfc +++ b/v1/Application.cfc @@ -57,7 +57,7 @@ //variables.framework.docs={}; variables.framework.docs.APIName="svc-api"; - variables.framework.docs.APIVersion="0.199"; /*$ git config --global --unset user.password*/ + variables.framework.docs.APIVersion="0.201"; /*$ git config --global --unset user.password*/ variables.framework.globalHeaders = structNew(); variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location"; diff --git a/v1/lib/expression_parser.cfc b/v1/lib/expression_parser.cfc index 8bb207e..bc839d0 100644 --- a/v1/lib/expression_parser.cfc +++ b/v1/lib/expression_parser.cfc @@ -35,6 +35,14 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,16 +178,6 @@ expression parse-evaluate - - diff --git a/v1/resources/instance_operation.cfc b/v1/resources/instance_operation.cfc index e3da44f..a2504b9 100644 --- a/v1/resources/instance_operation.cfc +++ b/v1/resources/instance_operation.cfc @@ -160,6 +160,8 @@ sop.config::text as config null as nested_ref_data sop.state_path + sop.depends_on_cfs_params + sop.expression sop.is_sensitive from svc_operation_cfs_param sop @@ -206,8 +208,19 @@ argumentCollection=#args# returnVariable="local.qCfsParam.value_list" /> + + - + diff --git a/v1/resources/instance_operation_cfs_param.cfc b/v1/resources/instance_operation_cfs_param.cfc index 84f3624..3126932 100644 --- a/v1/resources/instance_operation_cfs_param.cfc +++ b/v1/resources/instance_operation_cfs_param.cfc @@ -36,7 +36,7 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In - + select p.instance_operation_uid, o.instance_uid, p.svc_operation_cfs_param_id from instance_operation_cfs_param p @@ -274,7 +274,12 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In AND s.svc_operation_cfs_param = - + + + + + + @@ -628,6 +633,8 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In ,sp.regex ,sp.sort ,sp.is_sensitive + ,sp.depends_on_cfs_params + ,sp.expression --,sp.func from svc_operation_cfs_subparam sp where sp.svc_operation_cfs_param_id= @@ -649,6 +656,7 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In + "isRequired":#request.castToBool(local.qSubparam.is_required)#, "isSensitive":#request.castToBool(local.qSubparam.is_sensitive)#, - "isModifiableDefinition":false + "isModifiableDefinition":false, + "dependsOnCfsParams":"#local.qSubparam.depends_on_cfs_params#", + "expression":"#local.qSubparam.expression#" + }, true ) /> diff --git a/v1/resources/instance_operation_cfs_param_ls.cfc b/v1/resources/instance_operation_cfs_param_ls.cfc index 2149c39..e0769be 100644 --- a/v1/resources/instance_operation_cfs_param_ls.cfc +++ b/v1/resources/instance_operation_cfs_param_ls.cfc @@ -31,7 +31,8 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In login={prefix="iop", type="string"}, creator_id={prefix="iop", type="integer"}, sort={prefix="sop", type="integer"}, - is_sensitive={prefix="sop", type="boolean"} + is_sensitive={prefix="sop", type="boolean"}, + depends_on_cfs_params={prefix="sop", type="string"} null as nested_ref_data p.state_path - p.depends_on_params + p.depends_on_cfs_params p.expression ( select 1 from svc_operation_cfs_param m @@ -160,6 +160,8 @@ ,sp.label ,sp.data_type ,sp.value_list + ,sp.depends_on_cfs_params + ,sp.expression ,sp.is_required ,sp.descr ,sp.man @@ -176,7 +178,7 @@ - + "isRequired":#request.castToBool(local.qSubparam.is_required)#, "isSensitive":#request.castToBool(local.qSubparam.is_sensitive)#, "isModifiableDefinition":false diff --git a/v1/resources/resource_realm_ls.cfc b/v1/resources/resource_realm_ls.cfc index f16bdc9..39a6149 100644 --- a/v1/resources/resource_realm_ls.cfc +++ b/v1/resources/resource_realm_ls.cfc @@ -59,6 +59,8 @@ r.mgmt_api_url p.resource_realm as parent t.resource_realm_type + r.descr + r.man to_char(r.dt_created, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') as dt_created to_char(r.dt_updated, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') as dt_updated diff --git a/v1/resources/svc_operation.cfc b/v1/resources/svc_operation.cfc index bc15ea8..156fab6 100644 --- a/v1/resources/svc_operation.cfc +++ b/v1/resources/svc_operation.cfc @@ -51,6 +51,7 @@ p.descr p.man p.sort + p.depends_on_cfs_params ( select 1 from svc_operation_cfs_param m join svc_operation om on (m.svc_operation_id=om.svc_operation_id) diff --git a/v1/resources/svc_operation_cfs_param_compute.cfc b/v1/resources/svc_operation_cfs_param_compute.cfc index 1700247..56e68c5 100644 --- a/v1/resources/svc_operation_cfs_param_compute.cfc +++ b/v1/resources/svc_operation_cfs_param_compute.cfc @@ -38,7 +38,7 @@ arguments.requestArguments.specificationId=usrCustomerInfo.specificationId; //In - + diff --git a/v1/resources/svc_operation_cfs_subparam_compute.cfc b/v1/resources/svc_operation_cfs_subparam_compute.cfc new file mode 100644 index 0000000..8015992 --- /dev/null +++ b/v1/resources/svc_operation_cfs_subparam_compute.cfc @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + + sop.data_type + sop.svc_operation_cfs_subparam + sop.expression + + from svc_operation_cfs_subparam sop + where sop.svc_operation_cfs_subparam_id + = + + + + + + + + + + + + + + + + + + + + + + + + +