nsj-rest-lib2 0.0.35__py3-none-any.whl → 0.0.37__py3-none-any.whl
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.
- nsj_rest_lib2/compiler/compiler.py +111 -3
- nsj_rest_lib2/compiler/dto_compiler.py +5 -1
- nsj_rest_lib2/compiler/edl_model/api_model.py +18 -6
- nsj_rest_lib2/compiler/model.py +12 -0
- nsj_rest_lib2/compiler/response_dto_compiler.py +104 -0
- nsj_rest_lib2/compiler/util/type_naming_util.py +83 -1
- nsj_rest_lib2/controller/dynamic_controller.py +87 -5
- nsj_rest_lib2/service/entity_config_writer.py +19 -44
- nsj_rest_lib2/service/entity_loader.py +421 -70
- nsj_rest_lib2/settings.py +10 -0
- nsj_rest_lib2-0.0.37.dist-info/METADATA +203 -0
- {nsj_rest_lib2-0.0.35.dist-info → nsj_rest_lib2-0.0.37.dist-info}/RECORD +14 -13
- nsj_rest_lib2-0.0.35.dist-info/METADATA +0 -27
- {nsj_rest_lib2-0.0.35.dist-info → nsj_rest_lib2-0.0.37.dist-info}/WHEEL +0 -0
- {nsj_rest_lib2-0.0.35.dist-info → nsj_rest_lib2-0.0.37.dist-info}/top_level.txt +0 -0
|
@@ -1,18 +1,34 @@
|
|
|
1
1
|
import datetime
|
|
2
2
|
import json
|
|
3
|
+
import os
|
|
3
4
|
import re
|
|
4
5
|
import sys
|
|
5
6
|
import threading
|
|
6
7
|
import types
|
|
8
|
+
from typing import Any
|
|
7
9
|
|
|
8
10
|
from nsj_rest_lib.settings import get_logger
|
|
9
11
|
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
from nsj_rest_lib2.compiler.compiler import EDLCompiler
|
|
15
|
+
from nsj_rest_lib2.compiler.edl_model.entity_model import EntityModel
|
|
16
|
+
from nsj_rest_lib2.compiler.edl_model.entity_model_base import EntityModelBase
|
|
17
|
+
from nsj_rest_lib2.compiler.edl_model.entity_model_root import EntityModelRoot
|
|
10
18
|
from nsj_rest_lib2.compiler.edl_model.primitives import REGEX_EXTERNAL_REF
|
|
11
|
-
from nsj_rest_lib2.compiler.model import RelationDependency
|
|
12
|
-
from nsj_rest_lib2.compiler.util.type_naming_util import
|
|
19
|
+
from nsj_rest_lib2.compiler.model import CompilerResult, RelationDependency
|
|
20
|
+
from nsj_rest_lib2.compiler.util.type_naming_util import (
|
|
21
|
+
build_entity_hash as build_entity_hash_util,
|
|
22
|
+
compile_namespace_keys,
|
|
23
|
+
resolve_namespace_key as resolve_namespace_key_util,
|
|
24
|
+
)
|
|
25
|
+
from nsj_rest_lib2.dto.escopo_dto import EscopoDTO
|
|
13
26
|
from nsj_rest_lib2.exception import MissingEntityConfigException
|
|
14
|
-
from nsj_rest_lib2.
|
|
15
|
-
|
|
27
|
+
from nsj_rest_lib2.settings import (
|
|
28
|
+
EDLS_FROM_REDIS,
|
|
29
|
+
ESCOPO_RESTLIB2,
|
|
30
|
+
MIN_TIME_SOURCE_REFRESH,
|
|
31
|
+
)
|
|
16
32
|
|
|
17
33
|
|
|
18
34
|
class LoadedEntity:
|
|
@@ -24,6 +40,7 @@ class LoadedEntity:
|
|
|
24
40
|
self.api_expose: bool = False
|
|
25
41
|
self.api_verbs: list[str] = []
|
|
26
42
|
self.relations_dependencies: list[RelationDependency] = []
|
|
43
|
+
self.never_expire: bool = False
|
|
27
44
|
self.service_account: str | None = None
|
|
28
45
|
self.insert_function_class_name: str | None = None
|
|
29
46
|
self.update_function_class_name: str | None = None
|
|
@@ -35,6 +52,18 @@ class LoadedEntity:
|
|
|
35
52
|
self.get_function_type_class_name: str | None = None
|
|
36
53
|
self.list_function_type_class_name: str | None = None
|
|
37
54
|
self.delete_function_type_class_name: str | None = None
|
|
55
|
+
self.retrieve_after_insert: bool = False
|
|
56
|
+
self.retrieve_after_update: bool = False
|
|
57
|
+
self.retrieve_after_partial_update: bool = False
|
|
58
|
+
self.post_response_dto_class_name: str | None = None
|
|
59
|
+
self.put_response_dto_class_name: str | None = None
|
|
60
|
+
self.patch_response_dto_class_name: str | None = None
|
|
61
|
+
self.custom_json_post_response: bool = False
|
|
62
|
+
self.custom_json_put_response: bool = False
|
|
63
|
+
self.custom_json_patch_response: bool = False
|
|
64
|
+
self.custom_json_get_response: bool = False
|
|
65
|
+
self.custom_json_list_response: bool = False
|
|
66
|
+
self.custom_json_delete_response: bool = False
|
|
38
67
|
|
|
39
68
|
|
|
40
69
|
class Namespace:
|
|
@@ -49,8 +78,10 @@ namespaces_dict: dict[str, Namespace] = {}
|
|
|
49
78
|
|
|
50
79
|
|
|
51
80
|
class EntityLoader:
|
|
52
|
-
def __init__(self) -> types.NoneType:
|
|
81
|
+
def __init__(self, edls_path: str | None = None) -> types.NoneType:
|
|
53
82
|
self._lock = threading.Lock()
|
|
83
|
+
if edls_path:
|
|
84
|
+
self._load_edls_from_disk(edls_path)
|
|
54
85
|
|
|
55
86
|
def load_entity_source(
|
|
56
87
|
self,
|
|
@@ -75,6 +106,19 @@ class EntityLoader:
|
|
|
75
106
|
str | None,
|
|
76
107
|
str | None,
|
|
77
108
|
str | None,
|
|
109
|
+
str | None,
|
|
110
|
+
bool,
|
|
111
|
+
bool,
|
|
112
|
+
bool,
|
|
113
|
+
str | None,
|
|
114
|
+
str | None,
|
|
115
|
+
str | None,
|
|
116
|
+
bool,
|
|
117
|
+
bool,
|
|
118
|
+
bool,
|
|
119
|
+
bool,
|
|
120
|
+
bool,
|
|
121
|
+
bool,
|
|
78
122
|
]:
|
|
79
123
|
# Assumind o escopo default se necessário
|
|
80
124
|
if not escopo:
|
|
@@ -122,6 +166,37 @@ class EntityLoader:
|
|
|
122
166
|
loaded_entity.delete_function_type_class_name
|
|
123
167
|
)
|
|
124
168
|
|
|
169
|
+
cached_result = (
|
|
170
|
+
dto_class_name,
|
|
171
|
+
entity_class_name,
|
|
172
|
+
entities_dict,
|
|
173
|
+
api_expose,
|
|
174
|
+
api_verbs,
|
|
175
|
+
service_account,
|
|
176
|
+
insert_function_class_name,
|
|
177
|
+
update_function_class_name,
|
|
178
|
+
insert_function_name,
|
|
179
|
+
update_function_name,
|
|
180
|
+
get_function_name,
|
|
181
|
+
list_function_name,
|
|
182
|
+
delete_function_name,
|
|
183
|
+
get_function_type_class_name,
|
|
184
|
+
list_function_type_class_name,
|
|
185
|
+
delete_function_type_class_name,
|
|
186
|
+
loaded_entity.retrieve_after_insert,
|
|
187
|
+
loaded_entity.retrieve_after_update,
|
|
188
|
+
loaded_entity.retrieve_after_partial_update,
|
|
189
|
+
loaded_entity.post_response_dto_class_name,
|
|
190
|
+
loaded_entity.put_response_dto_class_name,
|
|
191
|
+
loaded_entity.patch_response_dto_class_name,
|
|
192
|
+
loaded_entity.custom_json_post_response,
|
|
193
|
+
loaded_entity.custom_json_put_response,
|
|
194
|
+
loaded_entity.custom_json_patch_response,
|
|
195
|
+
loaded_entity.custom_json_get_response,
|
|
196
|
+
loaded_entity.custom_json_list_response,
|
|
197
|
+
loaded_entity.custom_json_delete_response,
|
|
198
|
+
)
|
|
199
|
+
|
|
125
200
|
# Verificando se alguma de suas dependências precisariam ser recarregadas
|
|
126
201
|
for rd in relations_dependencies:
|
|
127
202
|
if rd.entity_resource is None or rd.entity_scope is None:
|
|
@@ -137,6 +212,9 @@ class EntityLoader:
|
|
|
137
212
|
force_reload=force_reload,
|
|
138
213
|
)
|
|
139
214
|
|
|
215
|
+
if loaded_entity.never_expire or not EDLS_FROM_REDIS:
|
|
216
|
+
return cached_result
|
|
217
|
+
|
|
140
218
|
# Se o tempo entre o carregamento e agora for maior do que MIN_TIME_SOURCE_REFRESH minutos,
|
|
141
219
|
# verifica se precisa de refresh
|
|
142
220
|
time_diff = datetime.datetime.now() - loaded_entity.loaded_at
|
|
@@ -160,24 +238,7 @@ class EntityLoader:
|
|
|
160
238
|
|
|
161
239
|
# Se não achar no redis, usa o que estava em memória
|
|
162
240
|
if not loaded_config:
|
|
163
|
-
return
|
|
164
|
-
dto_class_name,
|
|
165
|
-
entity_class_name,
|
|
166
|
-
entities_dict,
|
|
167
|
-
api_expose,
|
|
168
|
-
api_verbs,
|
|
169
|
-
service_account,
|
|
170
|
-
insert_function_class_name,
|
|
171
|
-
update_function_class_name,
|
|
172
|
-
insert_function_name,
|
|
173
|
-
update_function_name,
|
|
174
|
-
get_function_name,
|
|
175
|
-
list_function_name,
|
|
176
|
-
delete_function_name,
|
|
177
|
-
get_function_type_class_name,
|
|
178
|
-
list_function_type_class_name,
|
|
179
|
-
delete_function_type_class_name,
|
|
180
|
-
)
|
|
241
|
+
return cached_result
|
|
181
242
|
|
|
182
243
|
# Desempacotando resultado
|
|
183
244
|
entity_config_key, entity_config_str = loaded_config
|
|
@@ -192,24 +253,7 @@ class EntityLoader:
|
|
|
192
253
|
|
|
193
254
|
# Se não carregou novo código, usa o que estava em memória
|
|
194
255
|
if result_execute is None:
|
|
195
|
-
return
|
|
196
|
-
dto_class_name,
|
|
197
|
-
entity_class_name,
|
|
198
|
-
entities_dict,
|
|
199
|
-
api_expose,
|
|
200
|
-
api_verbs,
|
|
201
|
-
service_account,
|
|
202
|
-
insert_function_class_name,
|
|
203
|
-
update_function_class_name,
|
|
204
|
-
insert_function_name,
|
|
205
|
-
update_function_name,
|
|
206
|
-
get_function_name,
|
|
207
|
-
list_function_name,
|
|
208
|
-
delete_function_name,
|
|
209
|
-
get_function_type_class_name,
|
|
210
|
-
list_function_type_class_name,
|
|
211
|
-
delete_function_type_class_name,
|
|
212
|
-
)
|
|
256
|
+
return cached_result
|
|
213
257
|
else:
|
|
214
258
|
(
|
|
215
259
|
dto_class_name,
|
|
@@ -228,6 +272,18 @@ class EntityLoader:
|
|
|
228
272
|
get_function_type_class_name,
|
|
229
273
|
list_function_type_class_name,
|
|
230
274
|
delete_function_type_class_name,
|
|
275
|
+
retrieve_after_insert,
|
|
276
|
+
retrieve_after_update,
|
|
277
|
+
retrieve_after_partial_update,
|
|
278
|
+
post_response_dto_class_name,
|
|
279
|
+
put_response_dto_class_name,
|
|
280
|
+
patch_response_dto_class_name,
|
|
281
|
+
custom_json_post_response,
|
|
282
|
+
custom_json_put_response,
|
|
283
|
+
custom_json_patch_response,
|
|
284
|
+
custom_json_get_response,
|
|
285
|
+
custom_json_list_response,
|
|
286
|
+
custom_json_delete_response,
|
|
231
287
|
) = result_execute
|
|
232
288
|
return (
|
|
233
289
|
dto_class_name,
|
|
@@ -246,27 +302,25 @@ class EntityLoader:
|
|
|
246
302
|
get_function_type_class_name,
|
|
247
303
|
list_function_type_class_name,
|
|
248
304
|
delete_function_type_class_name,
|
|
305
|
+
retrieve_after_insert,
|
|
306
|
+
retrieve_after_update,
|
|
307
|
+
retrieve_after_partial_update,
|
|
308
|
+
post_response_dto_class_name,
|
|
309
|
+
put_response_dto_class_name,
|
|
310
|
+
patch_response_dto_class_name,
|
|
311
|
+
custom_json_post_response,
|
|
312
|
+
custom_json_put_response,
|
|
313
|
+
custom_json_patch_response,
|
|
314
|
+
custom_json_get_response,
|
|
315
|
+
custom_json_list_response,
|
|
316
|
+
custom_json_delete_response,
|
|
249
317
|
)
|
|
250
318
|
else:
|
|
251
319
|
# Se não deu o intervalo de verificação do refresh, retorna o que está em memória
|
|
252
|
-
return
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
api_expose,
|
|
257
|
-
api_verbs,
|
|
258
|
-
service_account,
|
|
259
|
-
insert_function_class_name,
|
|
260
|
-
update_function_class_name,
|
|
261
|
-
insert_function_name,
|
|
262
|
-
update_function_name,
|
|
263
|
-
get_function_name,
|
|
264
|
-
list_function_name,
|
|
265
|
-
delete_function_name,
|
|
266
|
-
get_function_type_class_name,
|
|
267
|
-
list_function_type_class_name,
|
|
268
|
-
delete_function_type_class_name,
|
|
269
|
-
)
|
|
320
|
+
return cached_result
|
|
321
|
+
|
|
322
|
+
if not EDLS_FROM_REDIS:
|
|
323
|
+
raise MissingEntityConfigException()
|
|
270
324
|
|
|
271
325
|
# Se não conseguir recuperar a entidade, procura no redis:
|
|
272
326
|
loaded_config = self._load_entity_config_from_redis(
|
|
@@ -311,6 +365,18 @@ class EntityLoader:
|
|
|
311
365
|
get_function_type_class_name,
|
|
312
366
|
list_function_type_class_name,
|
|
313
367
|
delete_function_type_class_name,
|
|
368
|
+
retrieve_after_insert,
|
|
369
|
+
retrieve_after_update,
|
|
370
|
+
retrieve_after_partial_update,
|
|
371
|
+
post_response_dto_class_name,
|
|
372
|
+
put_response_dto_class_name,
|
|
373
|
+
patch_response_dto_class_name,
|
|
374
|
+
custom_json_post_response,
|
|
375
|
+
custom_json_put_response,
|
|
376
|
+
custom_json_patch_response,
|
|
377
|
+
custom_json_get_response,
|
|
378
|
+
custom_json_list_response,
|
|
379
|
+
custom_json_delete_response,
|
|
314
380
|
) = result_execute
|
|
315
381
|
|
|
316
382
|
return (
|
|
@@ -330,6 +396,18 @@ class EntityLoader:
|
|
|
330
396
|
get_function_type_class_name,
|
|
331
397
|
list_function_type_class_name,
|
|
332
398
|
delete_function_type_class_name,
|
|
399
|
+
retrieve_after_insert,
|
|
400
|
+
retrieve_after_update,
|
|
401
|
+
retrieve_after_partial_update,
|
|
402
|
+
post_response_dto_class_name,
|
|
403
|
+
put_response_dto_class_name,
|
|
404
|
+
patch_response_dto_class_name,
|
|
405
|
+
custom_json_post_response,
|
|
406
|
+
custom_json_put_response,
|
|
407
|
+
custom_json_patch_response,
|
|
408
|
+
custom_json_get_response,
|
|
409
|
+
custom_json_list_response,
|
|
410
|
+
custom_json_delete_response,
|
|
333
411
|
)
|
|
334
412
|
|
|
335
413
|
def clear_namespaces(self):
|
|
@@ -342,6 +420,178 @@ class EntityLoader:
|
|
|
342
420
|
with self._lock:
|
|
343
421
|
namespaces_dict.clear()
|
|
344
422
|
|
|
423
|
+
def _load_edls_from_disk(self, edls_path: str) -> None:
|
|
424
|
+
if namespaces_dict:
|
|
425
|
+
return
|
|
426
|
+
|
|
427
|
+
resolved_path = self._resolve_edls_path(edls_path)
|
|
428
|
+
if not resolved_path:
|
|
429
|
+
return
|
|
430
|
+
|
|
431
|
+
if os.path.isdir(resolved_path):
|
|
432
|
+
edl_files = self._list_edl_files(resolved_path)
|
|
433
|
+
elif os.path.isfile(resolved_path) and self._is_edl_file(resolved_path):
|
|
434
|
+
edl_files = [resolved_path]
|
|
435
|
+
else:
|
|
436
|
+
return
|
|
437
|
+
|
|
438
|
+
if not edl_files:
|
|
439
|
+
return
|
|
440
|
+
|
|
441
|
+
entities: dict[str, EntityModelBase] = {}
|
|
442
|
+
for file_path in edl_files:
|
|
443
|
+
edl_json = self._read_edl_file(file_path)
|
|
444
|
+
if not isinstance(edl_json, dict):
|
|
445
|
+
continue
|
|
446
|
+
|
|
447
|
+
if edl_json.get("mixin", False):
|
|
448
|
+
entity_model = EntityModelRoot(**edl_json)
|
|
449
|
+
else:
|
|
450
|
+
entity_model = EntityModel(**edl_json)
|
|
451
|
+
|
|
452
|
+
complete_entity_id = f"{entity_model.escopo}/{entity_model.id}"
|
|
453
|
+
entities[complete_entity_id] = entity_model
|
|
454
|
+
|
|
455
|
+
if not entities:
|
|
456
|
+
return
|
|
457
|
+
|
|
458
|
+
escopos: dict[str, EscopoDTO] = {}
|
|
459
|
+
for entity_model in entities.values():
|
|
460
|
+
if entity_model.escopo not in escopos:
|
|
461
|
+
escopos[entity_model.escopo] = EscopoDTO(
|
|
462
|
+
codigo=entity_model.escopo,
|
|
463
|
+
service_account=None,
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
compiler = EDLCompiler()
|
|
467
|
+
dependencies = list(entities.items())
|
|
468
|
+
|
|
469
|
+
for entity_model in entities.values():
|
|
470
|
+
escopo_dto = escopos.get(entity_model.escopo)
|
|
471
|
+
if escopo_dto is None:
|
|
472
|
+
continue
|
|
473
|
+
|
|
474
|
+
compiler_result = compiler.compile_model(
|
|
475
|
+
entity_model,
|
|
476
|
+
dependencies,
|
|
477
|
+
escopo=escopo_dto,
|
|
478
|
+
)
|
|
479
|
+
if not compiler_result:
|
|
480
|
+
continue
|
|
481
|
+
|
|
482
|
+
entity_config = self._build_entity_payload(
|
|
483
|
+
entity_model,
|
|
484
|
+
compiler_result,
|
|
485
|
+
)
|
|
486
|
+
entity_resource = entity_config.get("api_resource")
|
|
487
|
+
if not entity_resource:
|
|
488
|
+
continue
|
|
489
|
+
|
|
490
|
+
entity_config_key = self._resolve_namespace_key(entity_model)
|
|
491
|
+
self._execute_entity_source(
|
|
492
|
+
json.dumps(entity_config, ensure_ascii=False),
|
|
493
|
+
entity_config_key,
|
|
494
|
+
entity_resource,
|
|
495
|
+
from_disk=True,
|
|
496
|
+
skip_dependency_load=not EDLS_FROM_REDIS,
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
def _resolve_edls_path(self, edls_path: str) -> str | None:
|
|
500
|
+
edls_path = edls_path.strip()
|
|
501
|
+
if not edls_path:
|
|
502
|
+
return None
|
|
503
|
+
if os.path.isabs(edls_path):
|
|
504
|
+
return edls_path
|
|
505
|
+
return os.path.join(os.getcwd(), edls_path)
|
|
506
|
+
|
|
507
|
+
def _is_edl_file(self, file_path: str) -> bool:
|
|
508
|
+
lower_name = file_path.lower()
|
|
509
|
+
return lower_name.endswith(".json") or lower_name.endswith(
|
|
510
|
+
".yml"
|
|
511
|
+
) or lower_name.endswith(".yaml")
|
|
512
|
+
|
|
513
|
+
def _list_edl_files(self, root_path: str) -> list[str]:
|
|
514
|
+
edl_files: list[str] = []
|
|
515
|
+
for current_root, _, files in os.walk(root_path):
|
|
516
|
+
for file_name in files:
|
|
517
|
+
file_path = os.path.join(current_root, file_name)
|
|
518
|
+
if self._is_edl_file(file_path):
|
|
519
|
+
edl_files.append(file_path)
|
|
520
|
+
edl_files.sort()
|
|
521
|
+
return edl_files
|
|
522
|
+
|
|
523
|
+
def _read_edl_file(self, file_path: str) -> dict[str, Any] | None:
|
|
524
|
+
with open(file_path, "r", encoding="utf-8") as file_handler:
|
|
525
|
+
if file_path.lower().endswith(".json"):
|
|
526
|
+
return json.load(file_handler)
|
|
527
|
+
return yaml.safe_load(file_handler)
|
|
528
|
+
|
|
529
|
+
def _resolve_namespace_key(self, entity_model: EntityModelBase) -> str:
|
|
530
|
+
tenant = getattr(entity_model, "tenant", None)
|
|
531
|
+
grupo_empresarial = getattr(entity_model, "grupo_empresarial", None)
|
|
532
|
+
|
|
533
|
+
return resolve_namespace_key_util(tenant, grupo_empresarial)
|
|
534
|
+
|
|
535
|
+
def _build_entity_payload(
|
|
536
|
+
self,
|
|
537
|
+
entity_model: EntityModelBase,
|
|
538
|
+
compiler_result: CompilerResult,
|
|
539
|
+
) -> dict[str, Any]:
|
|
540
|
+
api_resource = compiler_result.api_resource
|
|
541
|
+
if not api_resource:
|
|
542
|
+
if isinstance(entity_model, EntityModel) and entity_model.api:
|
|
543
|
+
api_resource = entity_model.api.resource
|
|
544
|
+
if not api_resource:
|
|
545
|
+
raise ValueError("api.resource é obrigatório para carregar EDLs.")
|
|
546
|
+
|
|
547
|
+
relations = [
|
|
548
|
+
rd.to_dict()
|
|
549
|
+
for rd in (compiler_result.relations_dependencies or [])
|
|
550
|
+
]
|
|
551
|
+
|
|
552
|
+
return {
|
|
553
|
+
"dto_class_name": compiler_result.dto_class_name,
|
|
554
|
+
"entity_class_name": compiler_result.entity_class_name,
|
|
555
|
+
"service_account": compiler_result.service_account,
|
|
556
|
+
"insert_function_class_name": compiler_result.insert_function_class_name,
|
|
557
|
+
"insert_function_name": compiler_result.insert_function_name,
|
|
558
|
+
"source_insert_function": compiler_result.source_insert_function,
|
|
559
|
+
"update_function_class_name": compiler_result.update_function_class_name,
|
|
560
|
+
"update_function_name": compiler_result.update_function_name,
|
|
561
|
+
"source_update_function": compiler_result.source_update_function,
|
|
562
|
+
"get_function_name": compiler_result.get_function_name,
|
|
563
|
+
"list_function_name": compiler_result.list_function_name,
|
|
564
|
+
"delete_function_name": compiler_result.delete_function_name,
|
|
565
|
+
"get_function_type_class_name": compiler_result.get_function_type_class_name,
|
|
566
|
+
"list_function_type_class_name": compiler_result.list_function_type_class_name,
|
|
567
|
+
"delete_function_type_class_name": compiler_result.delete_function_type_class_name,
|
|
568
|
+
"source_get_function_type": compiler_result.source_get_function_type,
|
|
569
|
+
"source_list_function_type": compiler_result.source_list_function_type,
|
|
570
|
+
"source_delete_function_type": compiler_result.source_delete_function_type,
|
|
571
|
+
"retrieve_after_insert": compiler_result.retrieve_after_insert,
|
|
572
|
+
"retrieve_after_update": compiler_result.retrieve_after_update,
|
|
573
|
+
"retrieve_after_partial_update": compiler_result.retrieve_after_partial_update,
|
|
574
|
+
"post_response_dto_class_name": compiler_result.post_response_dto_class_name,
|
|
575
|
+
"put_response_dto_class_name": compiler_result.put_response_dto_class_name,
|
|
576
|
+
"patch_response_dto_class_name": compiler_result.patch_response_dto_class_name,
|
|
577
|
+
"custom_json_post_response": compiler_result.custom_json_post_response,
|
|
578
|
+
"custom_json_put_response": compiler_result.custom_json_put_response,
|
|
579
|
+
"custom_json_patch_response": compiler_result.custom_json_patch_response,
|
|
580
|
+
"custom_json_get_response": compiler_result.custom_json_get_response,
|
|
581
|
+
"custom_json_list_response": compiler_result.custom_json_list_response,
|
|
582
|
+
"custom_json_delete_response": compiler_result.custom_json_delete_response,
|
|
583
|
+
"source_dto": compiler_result.dto_code,
|
|
584
|
+
"source_entity": compiler_result.entity_code,
|
|
585
|
+
"entity_hash": self._build_entity_hash(compiler_result),
|
|
586
|
+
"api_expose": compiler_result.api_expose,
|
|
587
|
+
"api_resource": api_resource,
|
|
588
|
+
"api_verbs": compiler_result.api_verbs or [],
|
|
589
|
+
"relations_dependencies": relations,
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
def _build_entity_hash(self, compiler_result: CompilerResult) -> str:
|
|
593
|
+
return build_entity_hash_util(compiler_result)
|
|
594
|
+
|
|
345
595
|
def _ensure_dynamic_package(self):
|
|
346
596
|
"""
|
|
347
597
|
Garante que exista um pacote 'dynamic' em sys.modules.
|
|
@@ -360,6 +610,8 @@ class EntityLoader:
|
|
|
360
610
|
entity_config_key: str,
|
|
361
611
|
entity_resource: str,
|
|
362
612
|
check_refresh: bool = False,
|
|
613
|
+
from_disk: bool = False,
|
|
614
|
+
skip_dependency_load: bool = False,
|
|
363
615
|
) -> tuple[
|
|
364
616
|
str,
|
|
365
617
|
str,
|
|
@@ -377,6 +629,18 @@ class EntityLoader:
|
|
|
377
629
|
str | None,
|
|
378
630
|
str | None,
|
|
379
631
|
str | None,
|
|
632
|
+
bool,
|
|
633
|
+
bool,
|
|
634
|
+
bool,
|
|
635
|
+
str | None,
|
|
636
|
+
str | None,
|
|
637
|
+
str | None,
|
|
638
|
+
bool,
|
|
639
|
+
bool,
|
|
640
|
+
bool,
|
|
641
|
+
bool,
|
|
642
|
+
bool,
|
|
643
|
+
bool,
|
|
380
644
|
] | None:
|
|
381
645
|
# Interpretando o json de configuração da entidade
|
|
382
646
|
try:
|
|
@@ -414,6 +678,42 @@ class EntityLoader:
|
|
|
414
678
|
delete_function_type_class_name = entity_config.get(
|
|
415
679
|
"delete_function_type_class_name"
|
|
416
680
|
)
|
|
681
|
+
retrieve_after_insert = entity_config.get(
|
|
682
|
+
"retrieve_after_insert", False
|
|
683
|
+
)
|
|
684
|
+
retrieve_after_update = entity_config.get(
|
|
685
|
+
"retrieve_after_update", False
|
|
686
|
+
)
|
|
687
|
+
retrieve_after_partial_update = entity_config.get(
|
|
688
|
+
"retrieve_after_partial_update", False
|
|
689
|
+
)
|
|
690
|
+
post_response_dto_class_name = entity_config.get(
|
|
691
|
+
"post_response_dto_class_name"
|
|
692
|
+
)
|
|
693
|
+
put_response_dto_class_name = entity_config.get(
|
|
694
|
+
"put_response_dto_class_name"
|
|
695
|
+
)
|
|
696
|
+
patch_response_dto_class_name = entity_config.get(
|
|
697
|
+
"patch_response_dto_class_name"
|
|
698
|
+
)
|
|
699
|
+
custom_json_post_response = entity_config.get(
|
|
700
|
+
"custom_json_post_response", False
|
|
701
|
+
)
|
|
702
|
+
custom_json_put_response = entity_config.get(
|
|
703
|
+
"custom_json_put_response", False
|
|
704
|
+
)
|
|
705
|
+
custom_json_patch_response = entity_config.get(
|
|
706
|
+
"custom_json_patch_response", False
|
|
707
|
+
)
|
|
708
|
+
custom_json_get_response = entity_config.get(
|
|
709
|
+
"custom_json_get_response", False
|
|
710
|
+
)
|
|
711
|
+
custom_json_list_response = entity_config.get(
|
|
712
|
+
"custom_json_list_response", False
|
|
713
|
+
)
|
|
714
|
+
custom_json_delete_response = entity_config.get(
|
|
715
|
+
"custom_json_delete_response", False
|
|
716
|
+
)
|
|
417
717
|
get_function_code = entity_config.get("source_get_function_type")
|
|
418
718
|
list_function_code = entity_config.get("source_list_function_type")
|
|
419
719
|
delete_function_code = entity_config.get("source_delete_function_type")
|
|
@@ -433,18 +733,19 @@ class EntityLoader:
|
|
|
433
733
|
return None
|
|
434
734
|
|
|
435
735
|
# Verificando se alguma de suas dependências precisariam ser carregadas (ou recarregadas)
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
736
|
+
if not skip_dependency_load:
|
|
737
|
+
for rd in relations_dependencies:
|
|
738
|
+
if rd.entity_resource is None or rd.entity_scope is None:
|
|
739
|
+
raise RuntimeError(
|
|
740
|
+
f"Erro: Dependência de entidade mal formada na entidade {entity_resource}."
|
|
741
|
+
)
|
|
441
742
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
743
|
+
self.load_entity_source(
|
|
744
|
+
rd.entity_resource,
|
|
745
|
+
str(rd.tenant),
|
|
746
|
+
str(rd.grupo_empresarial),
|
|
747
|
+
rd.entity_scope,
|
|
748
|
+
)
|
|
448
749
|
|
|
449
750
|
# Verificando se a entidade precisa ou não de refresh
|
|
450
751
|
if check_refresh:
|
|
@@ -546,6 +847,7 @@ class EntityLoader:
|
|
|
546
847
|
loaded_entity.api_verbs = api_verbs
|
|
547
848
|
loaded_entity.service_account = service_account
|
|
548
849
|
loaded_entity.relations_dependencies = relations_dependencies
|
|
850
|
+
loaded_entity.never_expire = from_disk
|
|
549
851
|
loaded_entity.insert_function_class_name = insert_function_class_name
|
|
550
852
|
loaded_entity.update_function_class_name = update_function_class_name
|
|
551
853
|
loaded_entity.insert_function_name = insert_function_name
|
|
@@ -562,6 +864,38 @@ class EntityLoader:
|
|
|
562
864
|
loaded_entity.delete_function_type_class_name = (
|
|
563
865
|
delete_function_type_class_name
|
|
564
866
|
)
|
|
867
|
+
loaded_entity.retrieve_after_insert = bool(retrieve_after_insert)
|
|
868
|
+
loaded_entity.retrieve_after_update = bool(retrieve_after_update)
|
|
869
|
+
loaded_entity.retrieve_after_partial_update = bool(
|
|
870
|
+
retrieve_after_partial_update
|
|
871
|
+
)
|
|
872
|
+
loaded_entity.post_response_dto_class_name = (
|
|
873
|
+
post_response_dto_class_name
|
|
874
|
+
)
|
|
875
|
+
loaded_entity.put_response_dto_class_name = (
|
|
876
|
+
put_response_dto_class_name
|
|
877
|
+
)
|
|
878
|
+
loaded_entity.patch_response_dto_class_name = (
|
|
879
|
+
patch_response_dto_class_name
|
|
880
|
+
)
|
|
881
|
+
loaded_entity.custom_json_post_response = bool(
|
|
882
|
+
custom_json_post_response
|
|
883
|
+
)
|
|
884
|
+
loaded_entity.custom_json_put_response = bool(
|
|
885
|
+
custom_json_put_response
|
|
886
|
+
)
|
|
887
|
+
loaded_entity.custom_json_patch_response = bool(
|
|
888
|
+
custom_json_patch_response
|
|
889
|
+
)
|
|
890
|
+
loaded_entity.custom_json_get_response = bool(
|
|
891
|
+
custom_json_get_response
|
|
892
|
+
)
|
|
893
|
+
loaded_entity.custom_json_list_response = bool(
|
|
894
|
+
custom_json_list_response
|
|
895
|
+
)
|
|
896
|
+
loaded_entity.custom_json_delete_response = bool(
|
|
897
|
+
custom_json_delete_response
|
|
898
|
+
)
|
|
565
899
|
|
|
566
900
|
namespace.loaded_entities[entity_resource] = loaded_entity
|
|
567
901
|
|
|
@@ -582,6 +916,18 @@ class EntityLoader:
|
|
|
582
916
|
get_function_type_class_name,
|
|
583
917
|
list_function_type_class_name,
|
|
584
918
|
delete_function_type_class_name,
|
|
919
|
+
bool(retrieve_after_insert),
|
|
920
|
+
bool(retrieve_after_update),
|
|
921
|
+
bool(retrieve_after_partial_update),
|
|
922
|
+
post_response_dto_class_name,
|
|
923
|
+
put_response_dto_class_name,
|
|
924
|
+
patch_response_dto_class_name,
|
|
925
|
+
bool(custom_json_post_response),
|
|
926
|
+
bool(custom_json_put_response),
|
|
927
|
+
bool(custom_json_patch_response),
|
|
928
|
+
bool(custom_json_get_response),
|
|
929
|
+
bool(custom_json_list_response),
|
|
930
|
+
bool(custom_json_delete_response),
|
|
585
931
|
)
|
|
586
932
|
|
|
587
933
|
def _safe_exec(self, source_code, context, description):
|
|
@@ -600,6 +946,11 @@ class EntityLoader:
|
|
|
600
946
|
entity_config_key: str | None,
|
|
601
947
|
escopo: str,
|
|
602
948
|
) -> tuple[str, str] | None:
|
|
949
|
+
if not EDLS_FROM_REDIS:
|
|
950
|
+
return None
|
|
951
|
+
|
|
952
|
+
from nsj_rest_lib2.redis_config import get_redis
|
|
953
|
+
|
|
603
954
|
get_logger().debug(
|
|
604
955
|
f"Procurando a configuração da entidade {entity_resource} no redis. Tenant key: {tenant_key} e Grupo key: {grupo_key}"
|
|
605
956
|
)
|
nsj_rest_lib2/settings.py
CHANGED
|
@@ -12,5 +12,15 @@ else:
|
|
|
12
12
|
MIN_TIME_SOURCE_REFRESH = int(os.getenv("MIN_TIME_SOURCE_REFRESH", "15"))
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
def _get_env_bool(name: str, default: bool) -> bool:
|
|
16
|
+
value = os.getenv(name)
|
|
17
|
+
if value is None:
|
|
18
|
+
return default
|
|
19
|
+
return value.strip().lower() in ("1", "true", "t", "yes", "y", "on")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
EDLS_FROM_REDIS = _get_env_bool("EDLS_FROM_REDIS", True)
|
|
23
|
+
|
|
24
|
+
|
|
15
25
|
def get_logger():
|
|
16
26
|
return logging.getLogger(APP_NAME)
|