Таблица public.actions
cодержит код действий, выполняемых на стороне сервера функций, которые работают внутри одной транзакции. Действия имеют доступ к API FunDB, и ограничиваются ролью пользователя, который вызвал действие.
Действие -- это модуль ECMAScript, экспортирующий по умолчанию функцию-обработчик. Сигнатуру функций-действий и API, доступный внутри, можно изучить в виде сигнатур TypeScript здесь.
https://bitbucket.org/ozma/ozma-api/src/master/src/serverside_api.d.ts
Колонка | Описание |
---|---|
schema_id |
Схема, к которой привязано данное действие. |
name |
Название процедуры |
function |
Код действия на языке JavaScript. |
Экшн может принимать аргументы, которые передаются во время вызова в FunDB, и возвращать данные, которые будут переданы назад клиенту:
{ ok: true }
В примере ниже приведены куски кода одной процедуры, в которой используются разные вызововы FunDB. Экшн:
FunDB.getUserView()
(строки 9-12)export default async function handleEvent(args) {
const accountId = args.id;
const queryStr = `{ $account reference(fin.accounts) }:
SELECT id, amount, account
FROM fin.transactions
WHERE account = $account`;
const exprResult = await FunDB.getUserView(
{ type: "anonymous", query: queryStr },
{ account: accountId }
);
var result = [];
for (var row of exprResult.result.rows) {
var resultRow = {};
for (let i = 0; i < row.values.length; i++) {
var fieldName = exprResult.info.columns[i].name;
var fieldValue = row.values[i].value;
resultRow[fieldName] = fieldValue;
}
result.push(resultRow);
}
/* ... */
FunDB.insertEntity()
(строки 5-10) /* ... */
const dateTime = new Date();
const fixAmountId = await FunDB.insertEntity(
{ schema: 'fin', name: 'fix_amount'},
{
account: accountId,
created_datetime: dateTime
}
);
/* ... */
FunDB.updateEntity()
(строки 8-12) /* ... */
let amount = 0;
for (const transaction of result) {
amount += transaction.amount;
}
await FunDB.updateEntity(
{ schema: 'fin', name: 'fix_amount'},
fixAmountId,
{ amount: amount }
);
/* ... */
FunDB.deleteEntity()
(строки 4-7) /* ... */
for (const transaction of result) {
await FunDB.deleteEntity(
{ schema: 'fin', name: 'transactions'},
transaction.id
);
}
return { ok: true }
Вызов процедуры может быть инициирован по кнопке в интерфейсе или другим экшном.
Чтобы добавить кнопку, вызывающую экшн, нужно в атрибуте @buttons
нужного представления добавить объект, описывающий кнопку:
action: { schema: 'action_schema', name: 'action_name' }
- ссылка на экшнargs: { arg1: 'value1', arg2: value2 }
- произвольные данные, которые будут переданы в экшнdisplay
, icon
, variant
, caption
- дополнительные параметры для задания кнопки, подробнее про них тутSELECT
/*...*/
@buttons = [
{
display: 'desktop',
icon: 'playlist_add',
variant: 'success',
caption: 'Зафиксировать сумму',
action: {
schema: 'fin',
name: 'fix_amount_for_contact'
},
args: {
id: $id
},
}],
По клику на кнопку выполнится код процедуры. При успешном исполнении ozma вернет статус OK (200). Если в процессе исполнения процедуры возникнет ошибка - появится сообщение в интерфейсе и в консоли, все изменения, инициированные экшном, откатятся до начального состояния.
Процедура вместо результата OK может инициировать вызов другого экшна (или того же, но, например, с другими аргументами)
export default async function handleEvent(args) {
return {
action: {
"schema": "action_schema",
"name": "action_name"
},
args: {
"arg1": value,
}
}
}
В таком случае после успешного выполнения экшна будет инициирован вызов другого экшна уже в другой транзакции.