letopis 1.4.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT-CHEATSHEET.md +516 -398
- package/CHANGELOG.md +739 -0
- package/LICENSE +75 -21
- package/LICENSE-COMMERCIAL.md +49 -0
- package/README.md +1312 -1190
- package/api-contract.json +381 -0
- package/dist/acl.d.ts +81 -1
- package/dist/acl.js +281 -13
- package/dist/admin.d.ts +11 -141
- package/dist/admin.js +28 -186
- package/dist/auth.d.ts +20 -5
- package/dist/auth.js +80 -21
- package/dist/cache.d.ts +8 -1
- package/dist/cache.js +30 -8
- package/dist/chain.d.ts +46 -48
- package/dist/chain.js +556 -223
- package/dist/cli.js +73 -96
- package/dist/demo/booking.d.ts +352 -36
- package/dist/describe.d.ts +47 -0
- package/dist/describe.js +195 -0
- package/dist/errors.d.ts +77 -13
- package/dist/errors.js +231 -30
- package/dist/index.d.ts +62 -74
- package/dist/index.js +312 -155
- package/dist/internal.d.ts +7 -0
- package/dist/jsonschema.js +18 -17
- package/dist/load.d.ts +29 -17
- package/dist/load.js +235 -190
- package/dist/log.d.ts +121 -0
- package/dist/log.js +633 -0
- package/dist/mcp.d.ts +5 -7
- package/dist/mcp.js +194 -225
- package/dist/messages/access.d.ts +90 -0
- package/dist/messages/access.js +113 -0
- package/dist/messages/api.d.ts +237 -0
- package/dist/messages/api.js +304 -0
- package/dist/messages/boot.d.ts +201 -0
- package/dist/messages/boot.js +256 -0
- package/dist/messages/codes.d.ts +172 -0
- package/dist/messages/codes.js +173 -0
- package/dist/messages/index.d.ts +98 -0
- package/dist/messages/index.js +121 -0
- package/dist/messages/log.d.ts +229 -0
- package/dist/messages/log.js +102 -0
- package/dist/messages/mcp.d.ts +306 -0
- package/dist/messages/mcp.js +387 -0
- package/dist/messages/model.d.ts +256 -0
- package/dist/messages/model.js +314 -0
- package/dist/messages/query.d.ts +141 -0
- package/dist/messages/query.js +171 -0
- package/dist/messages/sql-access.d.ts +70 -0
- package/dist/messages/sql-access.js +87 -0
- package/dist/messages/sql-core.d.ts +164 -0
- package/dist/messages/sql-core.js +198 -0
- package/dist/messages/sql-time.d.ts +86 -0
- package/dist/messages/sql-time.js +111 -0
- package/dist/messages/sql-write.d.ts +246 -0
- package/dist/messages/sql-write.js +270 -0
- package/dist/messages/time.d.ts +23 -0
- package/dist/messages/time.js +29 -0
- package/dist/messages/types.d.ts +27 -0
- package/dist/messages/types.js +5 -0
- package/dist/messages/write.d.ts +452 -0
- package/dist/messages/write.js +572 -0
- package/dist/model.d.ts +77 -60
- package/dist/model.js +43 -34
- package/dist/ops.d.ts +35 -0
- package/dist/ops.js +101 -0
- package/dist/pglite.d.ts +0 -9
- package/dist/pglite.js +3 -1
- package/dist/registry.d.ts +3 -19
- package/dist/registry.js +3 -16
- package/dist/signals.d.ts +1 -5
- package/dist/signals.js +1 -5
- package/dist/sql.d.ts +9 -1
- package/dist/sql.js +175 -107
- package/dist/sync.d.ts +10 -4
- package/dist/sync.js +90 -17
- package/dist/tx.d.ts +21 -2
- package/dist/tx.js +76 -13
- package/dist/typed.d.ts +252 -53
- package/dist/types.d.ts +93 -90
- package/dist/types.js +17 -14
- package/dist/up.d.ts +56 -35
- package/dist/up.js +229 -83
- package/dist/uuid.d.ts +8 -0
- package/dist/uuid.js +14 -6
- package/dist/validate.d.ts +13 -1
- package/dist/validate.js +82 -33
- package/dist/watch.d.ts +10 -16
- package/dist/watch.js +36 -77
- package/dist/write.d.ts +87 -17
- package/dist/write.js +441 -206
- package/llms.txt +48 -31
- package/package.json +13 -14
- package/sql/10-core.sql +7 -50
- package/sql/15-errors.sql +64 -10
- package/sql/20-context.sql +18 -9
- package/sql/30-validate.sql +79 -30
- package/sql/40-class.sql +41 -115
- package/sql/50-acl.sql +8 -13
- package/sql/60-write.sql +220 -676
- package/sql/70-read.sql +11 -13
- package/sql/80-auth.sql +109 -42
- package/sql/90-time.sql +108 -947
- package/sql/95-seed.system.sql +7 -14
- package/sql/99-revision.sql +6 -1
- package/sql/README.md +32 -24
- package/sql/migrate/0009-restore-rev.tenants-name.sql +10 -0
- package/sql/migrate/0010-impersonation-no-account.sql +5 -0
- package/sql/migrate/0011-key-lock.otp-enabled.sql +7 -0
- package/sql/migrate/README.md +18 -0
- package/AGENT-CHEATSHEET.en.md +0 -488
- package/MIGRATION.md +0 -190
- package/README.en.md +0 -2910
- package/dist/import.d.ts +0 -185
- package/dist/import.js +0 -820
- package/dist/project.d.ts +0 -359
- package/dist/project.js +0 -1258
- package/sql/75-history.sql +0 -436
- package/sql/88-derived.sql +0 -1236
- package/sql/migrate/0006-changed-paths.sql +0 -3
- package/sql/migrate/0007-secret-account-fk.sql +0 -12
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
export const sqlCore = {
|
|
2
|
+
// 20-context.sql, ctx(): рабочий арендатор чужой, а членства в нём нет (или арендатор выключен)
|
|
3
|
+
'sql-core.no_membership': {
|
|
4
|
+
code: 'tenant_denied',
|
|
5
|
+
ru: 'нет членства в арендаторе',
|
|
6
|
+
},
|
|
7
|
+
// 20-context.sql, ctx(): настройка letopis.account — не uuid включённого аккаунта
|
|
8
|
+
'sql-core.account_not_id': {
|
|
9
|
+
code: 'acl_denied',
|
|
10
|
+
ru: 'letopis.account — не id аккаунта',
|
|
11
|
+
},
|
|
12
|
+
// 20-context.sql, ctx(): имперсонация без права auth.impersonate
|
|
13
|
+
'sql-core.no_impersonate_right': {
|
|
14
|
+
code: 'acl_denied',
|
|
15
|
+
ru: 'нет права auth.impersonate',
|
|
16
|
+
},
|
|
17
|
+
// 20-context.sql, ctx(): имперсонация аккаунта, которого нет (не заводили или удалён); id — значение letopis.account
|
|
18
|
+
'sql-core.impersonation_no_account': {
|
|
19
|
+
code: 'target_not_found',
|
|
20
|
+
ru: 'аккаунт {id} не найден',
|
|
21
|
+
hint: 'id аккаунта — из ответа verifyPassword(), createTenant() или db.auth.tenants(); удалённый аккаунт через as() не вернуть',
|
|
22
|
+
},
|
|
23
|
+
// 20-context.sql, ctx(): имперсонация System, сервиса или системного администратора не системным администратором
|
|
24
|
+
'sql-core.impersonation_denied': {
|
|
25
|
+
code: 'acl_denied',
|
|
26
|
+
ru: 'действовать от имени этого аккаунта нельзя',
|
|
27
|
+
},
|
|
28
|
+
// 20-context.sql, ctx(): настройка letopis.tenant — не uuid
|
|
29
|
+
'sql-core.tenant_not_id': {
|
|
30
|
+
code: 'tenant_denied',
|
|
31
|
+
ru: 'letopis.tenant — не id арендатора',
|
|
32
|
+
},
|
|
33
|
+
// 20-context.sql, login_apikey(): ключа нет, он отозван, истёк или аккаунт выключен
|
|
34
|
+
'sql-core.bad_api_key': {
|
|
35
|
+
code: 'no_session',
|
|
36
|
+
ru: 'неверный ключ',
|
|
37
|
+
hint: 'ключ сервиса перевыпускает up({ fresh: true }): возьмите новый serviceKey из ответа up() или задайте свой — up({ serviceKey })',
|
|
38
|
+
},
|
|
39
|
+
// 30-validate.sql, jp_pattern(): pattern JSON Schema не переводится в регулярное выражение PostgreSQL
|
|
40
|
+
'sql-core.pattern_trailing_backslash': {
|
|
41
|
+
code: 'invalid_class',
|
|
42
|
+
ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (обратная косая черта в конце шаблона)',
|
|
43
|
+
},
|
|
44
|
+
// 30-validate.sql, jp_pattern(): \D, \W, \S внутри [ ]; escape — сама последовательность
|
|
45
|
+
'sql-core.pattern_escape_in_set': {
|
|
46
|
+
code: 'invalid_class',
|
|
47
|
+
ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL ({escape} внутри набора [ ] не переводится)',
|
|
48
|
+
},
|
|
49
|
+
// 30-validate.sql, jp_pattern(): \b, \B; escape — сама последовательность
|
|
50
|
+
'sql-core.pattern_word_boundary': {
|
|
51
|
+
code: 'invalid_class',
|
|
52
|
+
ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL ({escape} в PostgreSQL значит другое)',
|
|
53
|
+
},
|
|
54
|
+
// 30-validate.sql, jp_pattern(): \p, \P
|
|
55
|
+
'sql-core.pattern_unicode_property': {
|
|
56
|
+
code: 'invalid_class',
|
|
57
|
+
ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (\\p{…} не поддерживается)',
|
|
58
|
+
},
|
|
59
|
+
// 30-validate.sql, jp_pattern(): \k и \1–\9
|
|
60
|
+
'sql-core.pattern_backreference': {
|
|
61
|
+
code: 'invalid_class',
|
|
62
|
+
ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (обратные ссылки не поддерживаются)',
|
|
63
|
+
},
|
|
64
|
+
// 30-validate.sql, jp_pattern(): (?<имя>…)
|
|
65
|
+
'sql-core.pattern_named_group': {
|
|
66
|
+
code: 'invalid_class',
|
|
67
|
+
ru: 'шаблон {pattern} несовместим с регулярными выражениями PostgreSQL (именованные группы не поддерживаются)',
|
|
68
|
+
},
|
|
69
|
+
// 30-validate.sql, jp_compile(): node — путь узла описания массивом JSON
|
|
70
|
+
'sql-core.schema_node_not_object': {
|
|
71
|
+
code: 'invalid_class',
|
|
72
|
+
ru: 'описание узла {node} — не объект',
|
|
73
|
+
},
|
|
74
|
+
// 30-validate.sql, jp_compile()
|
|
75
|
+
'sql-core.keyword_unsupported': {
|
|
76
|
+
code: 'invalid_class',
|
|
77
|
+
ru: 'ключевое слово {keyword} не поддерживается (узел {node})',
|
|
78
|
+
},
|
|
79
|
+
// 30-validate.sql, jp_compile()
|
|
80
|
+
'sql-core.unknown_type': {
|
|
81
|
+
code: 'invalid_class',
|
|
82
|
+
ru: 'неизвестный тип в узле {node}',
|
|
83
|
+
},
|
|
84
|
+
// 30-validate.sql, jp_compile()
|
|
85
|
+
'sql-core.enum_objects_in_any_of': {
|
|
86
|
+
code: 'invalid_class',
|
|
87
|
+
ru: 'перечисление объектов внутри anyOf не поддерживается (узел {node})',
|
|
88
|
+
},
|
|
89
|
+
// 30-validate.sql, jp_compile()
|
|
90
|
+
'sql-core.format_unsupported': {
|
|
91
|
+
code: 'invalid_class',
|
|
92
|
+
ru: 'format {format} не поддерживается (узел {node})',
|
|
93
|
+
},
|
|
94
|
+
// 30-validate.sql, jp_compile()
|
|
95
|
+
'sql-core.format_in_any_of': {
|
|
96
|
+
code: 'invalid_class',
|
|
97
|
+
ru: 'format {format} внутри anyOf не поддерживается (узел {node})',
|
|
98
|
+
},
|
|
99
|
+
// 30-validate.sql, jp_compile()
|
|
100
|
+
'sql-core.string_length_in_any_of': {
|
|
101
|
+
code: 'invalid_class',
|
|
102
|
+
ru: 'длина строки внутри anyOf не поддерживается (узел {node})',
|
|
103
|
+
},
|
|
104
|
+
// 30-validate.sql, jp_compile()
|
|
105
|
+
'sql-core.unique_items_in_any_of': {
|
|
106
|
+
code: 'invalid_class',
|
|
107
|
+
ru: 'uniqueItems внутри anyOf не поддерживается (узел {node})',
|
|
108
|
+
},
|
|
109
|
+
// 30-validate.sql, jp_compile()
|
|
110
|
+
'sql-core.min_properties_in_any_of': {
|
|
111
|
+
code: 'invalid_class',
|
|
112
|
+
ru: 'minProperties внутри anyOf не поддерживается (узел {node})',
|
|
113
|
+
},
|
|
114
|
+
// 30-validate.sql, validate_data(): сообщения нарушений issues[].message — тексты не для ошибки (lt_text)
|
|
115
|
+
// minLength, maxLength: limit — граница из описания (длина в символах)
|
|
116
|
+
'sql-core.issue_string_too_short': {
|
|
117
|
+
code: 'invalid_data',
|
|
118
|
+
ru: 'длина строки меньше {limit}',
|
|
119
|
+
},
|
|
120
|
+
'sql-core.issue_string_too_long': {
|
|
121
|
+
code: 'invalid_data',
|
|
122
|
+
ru: 'длина строки больше {limit}',
|
|
123
|
+
},
|
|
124
|
+
'sql-core.issue_unique_items': {
|
|
125
|
+
code: 'invalid_data',
|
|
126
|
+
ru: 'элементы повторяются',
|
|
127
|
+
},
|
|
128
|
+
'sql-core.issue_date': {
|
|
129
|
+
code: 'invalid_data',
|
|
130
|
+
ru: 'такой даты не бывает',
|
|
131
|
+
},
|
|
132
|
+
'sql-core.issue_property_count': {
|
|
133
|
+
code: 'invalid_data',
|
|
134
|
+
ru: 'число ключей вне границ',
|
|
135
|
+
},
|
|
136
|
+
'sql-core.issue_enum': {
|
|
137
|
+
code: 'invalid_data',
|
|
138
|
+
ru: 'значение не из перечисления: допустимо {values}',
|
|
139
|
+
},
|
|
140
|
+
// лишний ключ объекта (additionalProperties: false); keys — имена лишних ключей через запятую
|
|
141
|
+
'sql-core.issue_additional': {
|
|
142
|
+
code: 'invalid_data',
|
|
143
|
+
ru: 'лишний ключ {keys}',
|
|
144
|
+
},
|
|
145
|
+
'sql-core.issue_rule': {
|
|
146
|
+
code: 'invalid_data',
|
|
147
|
+
ru: 'нарушено правило {keyword}',
|
|
148
|
+
},
|
|
149
|
+
'sql-core.issue_schema': {
|
|
150
|
+
code: 'invalid_data',
|
|
151
|
+
ru: 'данные не проходят описание',
|
|
152
|
+
},
|
|
153
|
+
// 40-class.sql, class_resolve(): предка из parent нет ни у арендатора, ни в System
|
|
154
|
+
'sql-core.parent_not_found': {
|
|
155
|
+
code: 'invalid_class',
|
|
156
|
+
ru: 'предок {parent} не найден',
|
|
157
|
+
},
|
|
158
|
+
// 40-class.sql, class_resolve(): cls — класс, на котором замкнулась цепочка предков
|
|
159
|
+
'sql-core.inheritance_cycle': {
|
|
160
|
+
code: 'invalid_class',
|
|
161
|
+
ru: 'цикл в наследовании через {cls}',
|
|
162
|
+
},
|
|
163
|
+
// 40-class.sql, class_prepare(): detail.issues — нарушения метасхемы
|
|
164
|
+
'sql-core.class_metaschema': {
|
|
165
|
+
code: 'invalid_data',
|
|
166
|
+
ru: 'описание класса не проходит метасхему',
|
|
167
|
+
},
|
|
168
|
+
// 40-class.sql, class_prepare()
|
|
169
|
+
'sql-core.meta_too_large': {
|
|
170
|
+
code: 'invalid_class',
|
|
171
|
+
ru: 'meta класса больше 64 КБ',
|
|
172
|
+
},
|
|
173
|
+
// 40-class.sql, class_prepare()
|
|
174
|
+
'sql-core.key_field_type': {
|
|
175
|
+
code: 'invalid_class',
|
|
176
|
+
ru: 'поле ключа {field} должно быть обязательной строкой',
|
|
177
|
+
},
|
|
178
|
+
// 40-class.sql, class_prepare()
|
|
179
|
+
'sql-core.key_end_type': {
|
|
180
|
+
code: 'invalid_class',
|
|
181
|
+
ru: 'конец ключа {end} должен быть обязательным и одиночным',
|
|
182
|
+
},
|
|
183
|
+
// 40-class.sql, class_prepare()
|
|
184
|
+
'sql-core.key_unknown_name': {
|
|
185
|
+
code: 'invalid_class',
|
|
186
|
+
ru: 'ключ ссылается на неизвестное поле или конец {name}',
|
|
187
|
+
},
|
|
188
|
+
// 40-class.sql, class_prepare()
|
|
189
|
+
'sql-core.unset_required_end': {
|
|
190
|
+
code: 'invalid_class',
|
|
191
|
+
ru: 'onDelete unset недопустим для обязательного конца {end}',
|
|
192
|
+
},
|
|
193
|
+
// 40-class.sql, class_prepare()
|
|
194
|
+
'sql-core.system_history_off': {
|
|
195
|
+
code: 'invalid_class',
|
|
196
|
+
ru: 'history: false для системных классов запрещён',
|
|
197
|
+
},
|
|
198
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export declare const sqlTime: {
|
|
2
|
+
'sql-time.signals_denied': {
|
|
3
|
+
code: "acl_denied";
|
|
4
|
+
ru: string;
|
|
5
|
+
};
|
|
6
|
+
'sql-time.target_not_found': {
|
|
7
|
+
code: "target_not_found";
|
|
8
|
+
ru: string;
|
|
9
|
+
};
|
|
10
|
+
'sql-time.no_session': {
|
|
11
|
+
code: "no_session";
|
|
12
|
+
ru: string;
|
|
13
|
+
};
|
|
14
|
+
'sql-time.restore_not_deleted': {
|
|
15
|
+
code: "not_deleted";
|
|
16
|
+
ru: string;
|
|
17
|
+
};
|
|
18
|
+
'sql-time.restore_id_taken': {
|
|
19
|
+
code: "not_deleted";
|
|
20
|
+
ru: string;
|
|
21
|
+
hint: string;
|
|
22
|
+
};
|
|
23
|
+
'sql-time.restore_already': {
|
|
24
|
+
code: "not_deleted";
|
|
25
|
+
ru: string;
|
|
26
|
+
hint: string;
|
|
27
|
+
};
|
|
28
|
+
'sql-time.restore_stale': {
|
|
29
|
+
code: "not_deleted";
|
|
30
|
+
ru: string;
|
|
31
|
+
hint: string;
|
|
32
|
+
};
|
|
33
|
+
'sql-time.restore_class_row': {
|
|
34
|
+
code: "invalid_class";
|
|
35
|
+
ru: string;
|
|
36
|
+
};
|
|
37
|
+
'sql-time.class_not_found': {
|
|
38
|
+
code: "invalid_class";
|
|
39
|
+
ru: string;
|
|
40
|
+
};
|
|
41
|
+
'sql-time.class_deleted': {
|
|
42
|
+
code: "invalid_class";
|
|
43
|
+
ru: string;
|
|
44
|
+
};
|
|
45
|
+
'sql-time.class_abstract': {
|
|
46
|
+
code: "invalid_class";
|
|
47
|
+
ru: string;
|
|
48
|
+
};
|
|
49
|
+
'sql-time.invalid_data': {
|
|
50
|
+
code: "invalid_data";
|
|
51
|
+
ru: string;
|
|
52
|
+
};
|
|
53
|
+
'sql-time.restore_key_changed': {
|
|
54
|
+
code: "id_mismatch";
|
|
55
|
+
ru: string;
|
|
56
|
+
};
|
|
57
|
+
'sql-time.no_write_row': {
|
|
58
|
+
code: "acl_denied";
|
|
59
|
+
ru: string;
|
|
60
|
+
};
|
|
61
|
+
'sql-time.purge_self': {
|
|
62
|
+
code: "acl_denied";
|
|
63
|
+
ru: string;
|
|
64
|
+
};
|
|
65
|
+
'sql-time.account_purge_denied': {
|
|
66
|
+
code: "acl_denied";
|
|
67
|
+
ru: string;
|
|
68
|
+
};
|
|
69
|
+
'sql-time.account_not_found': {
|
|
70
|
+
code: "target_not_found";
|
|
71
|
+
ru: string;
|
|
72
|
+
};
|
|
73
|
+
'sql-time.last_owner': {
|
|
74
|
+
code: "acl_denied";
|
|
75
|
+
ru: string;
|
|
76
|
+
hint: string;
|
|
77
|
+
};
|
|
78
|
+
'sql-time.account_referenced': {
|
|
79
|
+
code: "delete_restricted";
|
|
80
|
+
ru: string;
|
|
81
|
+
};
|
|
82
|
+
'sql-time.maintain_denied': {
|
|
83
|
+
code: "acl_denied";
|
|
84
|
+
ru: string;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export const sqlTime = {
|
|
2
|
+
// 90-time.sql, signal_key()
|
|
3
|
+
'sql-time.signals_denied': {
|
|
4
|
+
code: 'acl_denied',
|
|
5
|
+
ru: 'нет права letopis.signals',
|
|
6
|
+
},
|
|
7
|
+
// 90-time.sql, last_version_visible()
|
|
8
|
+
'sql-time.target_not_found': {
|
|
9
|
+
code: 'target_not_found',
|
|
10
|
+
ru: 'цель не найдена',
|
|
11
|
+
},
|
|
12
|
+
// 90-time.sql, restore(), account_purge()
|
|
13
|
+
'sql-time.no_session': {
|
|
14
|
+
code: 'no_session',
|
|
15
|
+
ru: 'нет действующей сессии',
|
|
16
|
+
},
|
|
17
|
+
// 90-time.sql, restore()
|
|
18
|
+
'sql-time.restore_not_deleted': {
|
|
19
|
+
code: 'not_deleted',
|
|
20
|
+
ru: 'объект не удалён: restore — только для удалённых',
|
|
21
|
+
},
|
|
22
|
+
// 90-time.sql, restore(): живой объект, за последним надгробием которого — create: id занял новый объект с тем же
|
|
23
|
+
// ключом; detail — { id, rev }
|
|
24
|
+
'sql-time.restore_id_taken': {
|
|
25
|
+
code: 'not_deleted',
|
|
26
|
+
ru: 'id {id} занят новым объектом с тем же ключом — create по ключу удалённого берёт его id, восстанавливать нечего',
|
|
27
|
+
hint: 'объект с этим ключом уже живёт: прочитайте его; перед create() по ключу удалённого проверьте db.Класс({ ключ }).withDeleted()',
|
|
28
|
+
},
|
|
29
|
+
// 90-time.sql, restore(): живой объект, за последним надгробием которого — restore: уже восстановлен (другой запрос
|
|
30
|
+
// успел первым); detail — { id, rev }; библиотека отдаёт его как write.restore_already
|
|
31
|
+
'sql-time.restore_already': {
|
|
32
|
+
code: 'not_deleted',
|
|
33
|
+
ru: 'restore: {id} уже восстановлен — объект живой, восстанавливать нечего',
|
|
34
|
+
hint: 'его вернул другой запрос: прочитайте объект; восстанавливать снова не нужно',
|
|
35
|
+
},
|
|
36
|
+
// 90-time.sql, restore(p_id, p_rev): последняя версия id не p_rev, и это не «уже восстановлен» и не «id занят» (удалён
|
|
37
|
+
// снова, не удалялся, гонка). detail — { id, rev, expected, after, deleted, live }: after — вид записи журнала сразу
|
|
38
|
+
// за p_rev (в тексте «—», если её нет). Код базы — not_deleted (conflict в каталоге базы нет); библиотека отдаёт его
|
|
39
|
+
// как write.restore_stale (conflict)
|
|
40
|
+
'sql-time.restore_stale': {
|
|
41
|
+
code: 'not_deleted',
|
|
42
|
+
ru: 'restore: {id} уже не тот, что удаляли — последняя версия {rev}, ожидалась {expected}; после того удаления — {after}',
|
|
43
|
+
hint: 'объект менялся после показанного удаления (detail.after, detail.deleted, detail.live): вещь уже у другого — сообщить пользователю, а не восстанавливать',
|
|
44
|
+
},
|
|
45
|
+
// 90-time.sql, restore()
|
|
46
|
+
'sql-time.restore_class_row': {
|
|
47
|
+
code: 'invalid_class',
|
|
48
|
+
ru: 'описание класса восстанавливается созданием строки Class',
|
|
49
|
+
},
|
|
50
|
+
// 90-time.sql, restore()
|
|
51
|
+
'sql-time.class_not_found': {
|
|
52
|
+
code: 'invalid_class',
|
|
53
|
+
ru: 'класс {cls} не найден',
|
|
54
|
+
},
|
|
55
|
+
// 90-time.sql, restore()
|
|
56
|
+
'sql-time.class_deleted': {
|
|
57
|
+
code: 'invalid_class',
|
|
58
|
+
ru: 'класс {cls} удалён',
|
|
59
|
+
},
|
|
60
|
+
// 90-time.sql, restore()
|
|
61
|
+
'sql-time.class_abstract': {
|
|
62
|
+
code: 'invalid_class',
|
|
63
|
+
ru: 'класс {cls} абстрактный',
|
|
64
|
+
},
|
|
65
|
+
// 90-time.sql, restore()
|
|
66
|
+
'sql-time.invalid_data': {
|
|
67
|
+
code: 'invalid_data',
|
|
68
|
+
ru: 'данные не проходят описание класса {cls}',
|
|
69
|
+
},
|
|
70
|
+
// 90-time.sql, restore()
|
|
71
|
+
'sql-time.restore_key_changed': {
|
|
72
|
+
code: 'id_mismatch',
|
|
73
|
+
ru: 'ключ класса {cls} изменился: id объекта не равен v5 от ключа',
|
|
74
|
+
},
|
|
75
|
+
// 90-time.sql, restore()
|
|
76
|
+
'sql-time.no_write_row': {
|
|
77
|
+
code: 'acl_denied',
|
|
78
|
+
ru: 'нет права WRITE на строку класса {cls}',
|
|
79
|
+
},
|
|
80
|
+
// 90-time.sql, account_purge()
|
|
81
|
+
'sql-time.purge_self': {
|
|
82
|
+
code: 'acl_denied',
|
|
83
|
+
ru: 'удалить себя нельзя',
|
|
84
|
+
},
|
|
85
|
+
// 90-time.sql, account_purge()
|
|
86
|
+
'sql-time.account_purge_denied': {
|
|
87
|
+
code: 'acl_denied',
|
|
88
|
+
ru: 'удалить аккаунт может системный администратор или владелец его арендатора',
|
|
89
|
+
},
|
|
90
|
+
// 90-time.sql, account_purge()
|
|
91
|
+
'sql-time.account_not_found': {
|
|
92
|
+
code: 'target_not_found',
|
|
93
|
+
ru: 'аккаунт не найден',
|
|
94
|
+
},
|
|
95
|
+
// 90-time.sql, account_purge(): аккаунт — единственный включённый владелец чужого арендатора; detail.tenant — он же
|
|
96
|
+
'sql-time.last_owner': {
|
|
97
|
+
code: 'acl_denied',
|
|
98
|
+
ru: 'аккаунт — последний владелец арендатора {tenant}',
|
|
99
|
+
hint: 'сначала дать роль owner в этом арендаторе другому аккаунту (db.acl.roles от фасада арендатора), затем удалять',
|
|
100
|
+
},
|
|
101
|
+
// 90-time.sql, account_purge()
|
|
102
|
+
'sql-time.account_referenced': {
|
|
103
|
+
code: 'delete_restricted',
|
|
104
|
+
ru: 'на аккаунт ссылаются другие строки',
|
|
105
|
+
},
|
|
106
|
+
// 90-time.sql, maintain()
|
|
107
|
+
'sql-time.maintain_denied': {
|
|
108
|
+
code: 'acl_denied',
|
|
109
|
+
ru: 'нет права letopis.maintain',
|
|
110
|
+
},
|
|
111
|
+
};
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
export declare const sqlWrite: {
|
|
2
|
+
'sql-write.lock_row_not_created': {
|
|
3
|
+
code: "internal";
|
|
4
|
+
ru: string;
|
|
5
|
+
};
|
|
6
|
+
'sql-write.lock_row_not_found': {
|
|
7
|
+
code: "internal";
|
|
8
|
+
ru: string;
|
|
9
|
+
};
|
|
10
|
+
'sql-write.invalid_data': {
|
|
11
|
+
code: "invalid_data";
|
|
12
|
+
ru: string;
|
|
13
|
+
};
|
|
14
|
+
'sql-write.links_not_object': {
|
|
15
|
+
code: "invalid_data";
|
|
16
|
+
ru: string;
|
|
17
|
+
};
|
|
18
|
+
'sql-write.end_undeclared': {
|
|
19
|
+
code: "undeclared_end";
|
|
20
|
+
ru: string;
|
|
21
|
+
};
|
|
22
|
+
'sql-write.end_not_list': {
|
|
23
|
+
code: "invalid_data";
|
|
24
|
+
ru: string;
|
|
25
|
+
};
|
|
26
|
+
'sql-write.end_not_uuid': {
|
|
27
|
+
code: "invalid_data";
|
|
28
|
+
ru: string;
|
|
29
|
+
};
|
|
30
|
+
'sql-write.end_target_repeated': {
|
|
31
|
+
code: "invalid_data";
|
|
32
|
+
ru: string;
|
|
33
|
+
};
|
|
34
|
+
'sql-write.end_too_few': {
|
|
35
|
+
code: "invalid_data";
|
|
36
|
+
ru: string;
|
|
37
|
+
};
|
|
38
|
+
'sql-write.end_too_many': {
|
|
39
|
+
code: "invalid_data";
|
|
40
|
+
ru: string;
|
|
41
|
+
};
|
|
42
|
+
'sql-write.end_required': {
|
|
43
|
+
code: "invalid_data";
|
|
44
|
+
ru: string;
|
|
45
|
+
};
|
|
46
|
+
'sql-write.end_target_missing': {
|
|
47
|
+
code: "target_not_found";
|
|
48
|
+
ru: string;
|
|
49
|
+
};
|
|
50
|
+
'sql-write.problem_abstract': {
|
|
51
|
+
code: "tightening_conflict";
|
|
52
|
+
ru: string;
|
|
53
|
+
};
|
|
54
|
+
'sql-write.problem_data': {
|
|
55
|
+
code: "tightening_conflict";
|
|
56
|
+
ru: string;
|
|
57
|
+
};
|
|
58
|
+
'sql-write.problem_key': {
|
|
59
|
+
code: "tightening_conflict";
|
|
60
|
+
ru: string;
|
|
61
|
+
};
|
|
62
|
+
'sql-write.problem_ref': {
|
|
63
|
+
code: "tightening_conflict";
|
|
64
|
+
ru: string;
|
|
65
|
+
};
|
|
66
|
+
'sql-write.problem_ref_hidden': {
|
|
67
|
+
code: "tightening_conflict";
|
|
68
|
+
ru: string;
|
|
69
|
+
};
|
|
70
|
+
'sql-write.reparent_needs_all': {
|
|
71
|
+
code: "acl_denied";
|
|
72
|
+
ru: string;
|
|
73
|
+
};
|
|
74
|
+
'sql-write.history_needs_all': {
|
|
75
|
+
code: "acl_denied";
|
|
76
|
+
ru: string;
|
|
77
|
+
};
|
|
78
|
+
'sql-write.tighten_needs_all': {
|
|
79
|
+
code: "acl_denied";
|
|
80
|
+
ru: string;
|
|
81
|
+
};
|
|
82
|
+
'sql-write.change_needs_all': {
|
|
83
|
+
code: "acl_denied";
|
|
84
|
+
ru: string;
|
|
85
|
+
};
|
|
86
|
+
'sql-write.system_name_reserved': {
|
|
87
|
+
code: "invalid_class";
|
|
88
|
+
ru: string;
|
|
89
|
+
};
|
|
90
|
+
'sql-write.system_flag': {
|
|
91
|
+
code: "invalid_class";
|
|
92
|
+
ru: string;
|
|
93
|
+
};
|
|
94
|
+
'sql-write.system_name_taken': {
|
|
95
|
+
code: "invalid_class";
|
|
96
|
+
ru: string;
|
|
97
|
+
};
|
|
98
|
+
'sql-write.link_name_reserved': {
|
|
99
|
+
code: "invalid_class";
|
|
100
|
+
ru: string;
|
|
101
|
+
};
|
|
102
|
+
'sql-write.hub_name_reserved': {
|
|
103
|
+
code: "invalid_class";
|
|
104
|
+
ru: string;
|
|
105
|
+
};
|
|
106
|
+
'sql-write.alias_taken': {
|
|
107
|
+
code: "invalid_class";
|
|
108
|
+
ru: string;
|
|
109
|
+
};
|
|
110
|
+
'sql-write.name_is_alias': {
|
|
111
|
+
code: "invalid_class";
|
|
112
|
+
ru: string;
|
|
113
|
+
};
|
|
114
|
+
'sql-write.alias_orphan_history': {
|
|
115
|
+
code: "invalid_class";
|
|
116
|
+
ru: string;
|
|
117
|
+
};
|
|
118
|
+
'sql-write.end_other_class': {
|
|
119
|
+
code: "invalid_class";
|
|
120
|
+
ru: string;
|
|
121
|
+
};
|
|
122
|
+
'sql-write.no_session': {
|
|
123
|
+
code: "no_session";
|
|
124
|
+
ru: string;
|
|
125
|
+
};
|
|
126
|
+
'sql-write.foreign_tenant': {
|
|
127
|
+
code: "tenant_denied";
|
|
128
|
+
ru: string;
|
|
129
|
+
};
|
|
130
|
+
'sql-write.account_tenant': {
|
|
131
|
+
code: "tenant_denied";
|
|
132
|
+
ru: string;
|
|
133
|
+
};
|
|
134
|
+
'sql-write.class_not_found': {
|
|
135
|
+
code: "invalid_class";
|
|
136
|
+
ru: string;
|
|
137
|
+
};
|
|
138
|
+
'sql-write.class_deleted': {
|
|
139
|
+
code: "invalid_class";
|
|
140
|
+
ru: string;
|
|
141
|
+
};
|
|
142
|
+
'sql-write.class_abstract': {
|
|
143
|
+
code: "invalid_class";
|
|
144
|
+
ru: string;
|
|
145
|
+
};
|
|
146
|
+
'sql-write.member_tenant': {
|
|
147
|
+
code: "invalid_data";
|
|
148
|
+
ru: string;
|
|
149
|
+
};
|
|
150
|
+
'sql-write.id_from_db': {
|
|
151
|
+
code: "id_from_db";
|
|
152
|
+
ru: string;
|
|
153
|
+
};
|
|
154
|
+
'sql-write.id_mismatch': {
|
|
155
|
+
code: "id_mismatch";
|
|
156
|
+
ru: string;
|
|
157
|
+
};
|
|
158
|
+
'sql-write.history_recreate': {
|
|
159
|
+
code: "invalid_class";
|
|
160
|
+
ru: string;
|
|
161
|
+
};
|
|
162
|
+
'sql-write.owner_not_found': {
|
|
163
|
+
code: "target_not_found";
|
|
164
|
+
ru: string;
|
|
165
|
+
};
|
|
166
|
+
'sql-write.immutable_columns': {
|
|
167
|
+
code: "immutable_key";
|
|
168
|
+
ru: string;
|
|
169
|
+
};
|
|
170
|
+
'sql-write.class_immutable': {
|
|
171
|
+
code: "immutable_key";
|
|
172
|
+
ru: string;
|
|
173
|
+
};
|
|
174
|
+
'sql-write.key_changed': {
|
|
175
|
+
code: "immutable_key";
|
|
176
|
+
ru: string;
|
|
177
|
+
};
|
|
178
|
+
'sql-write.tightening_mismatch': {
|
|
179
|
+
code: "tightening_conflict";
|
|
180
|
+
ru: string;
|
|
181
|
+
};
|
|
182
|
+
'sql-write.delete_isolation': {
|
|
183
|
+
code: "isolation_level";
|
|
184
|
+
ru: string;
|
|
185
|
+
};
|
|
186
|
+
'sql-write.system_account_delete': {
|
|
187
|
+
code: "acl_denied";
|
|
188
|
+
ru: string;
|
|
189
|
+
};
|
|
190
|
+
'sql-write.recreated_in_statement': {
|
|
191
|
+
code: "recreated_in_statement";
|
|
192
|
+
ru: string;
|
|
193
|
+
};
|
|
194
|
+
'sql-write.class_not_empty': {
|
|
195
|
+
code: "invalid_class";
|
|
196
|
+
ru: string;
|
|
197
|
+
};
|
|
198
|
+
'sql-write.class_has_history': {
|
|
199
|
+
code: "invalid_class";
|
|
200
|
+
ru: string;
|
|
201
|
+
};
|
|
202
|
+
'sql-write.cascade_delete_denied': {
|
|
203
|
+
code: "acl_denied";
|
|
204
|
+
ru: string;
|
|
205
|
+
};
|
|
206
|
+
'sql-write.cascade_delete_denied_hidden': {
|
|
207
|
+
code: "acl_denied";
|
|
208
|
+
ru: string;
|
|
209
|
+
};
|
|
210
|
+
'sql-write.unset_write_denied': {
|
|
211
|
+
code: "acl_denied";
|
|
212
|
+
ru: string;
|
|
213
|
+
};
|
|
214
|
+
'sql-write.unset_write_denied_hidden': {
|
|
215
|
+
code: "acl_denied";
|
|
216
|
+
ru: string;
|
|
217
|
+
};
|
|
218
|
+
'sql-write.delete_restricted': {
|
|
219
|
+
code: "delete_restricted";
|
|
220
|
+
ru: string;
|
|
221
|
+
};
|
|
222
|
+
'sql-write.links_patch_op': {
|
|
223
|
+
code: "invalid_data";
|
|
224
|
+
ru: string;
|
|
225
|
+
};
|
|
226
|
+
'sql-write.inc_args': {
|
|
227
|
+
code: "invalid_data";
|
|
228
|
+
ru: string;
|
|
229
|
+
};
|
|
230
|
+
'sql-write.inc_path_missing': {
|
|
231
|
+
code: "invalid_data";
|
|
232
|
+
ru: string;
|
|
233
|
+
};
|
|
234
|
+
'sql-write.inc_path_not_object': {
|
|
235
|
+
code: "invalid_data";
|
|
236
|
+
ru: string;
|
|
237
|
+
};
|
|
238
|
+
'sql-write.inc_no_field': {
|
|
239
|
+
code: "invalid_data";
|
|
240
|
+
ru: string;
|
|
241
|
+
};
|
|
242
|
+
'sql-write.inc_not_number': {
|
|
243
|
+
code: "invalid_data";
|
|
244
|
+
ru: string;
|
|
245
|
+
};
|
|
246
|
+
};
|