ApiLogicServer 15.0.65__py3-none-any.whl → 15.1.0__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.
Files changed (519) hide show
  1. api_logic_server_cli/api_logic_server.py +2 -2
  2. api_logic_server_cli/database/basic_demo.sqlite +0 -0
  3. api_logic_server_cli/prototypes/base/.github/.copilot-instructions.md +25 -2
  4. api_logic_server_cli/prototypes/basic_demo/customizations/database/db.sqlite +0 -0
  5. api_logic_server_cli/prototypes/basic_demo/iteration/database/db.sqlite +0 -0
  6. api_logic_server_cli/prototypes/manager/.vscode/launch.json +2 -1
  7. api_logic_server_cli/prototypes/manager/samples/basic_demo/.devcontainer-option/For_VSCode.dockerfile +10 -0
  8. api_logic_server_cli/prototypes/manager/samples/basic_demo/.devcontainer-option/devcontainer.json +64 -0
  9. api_logic_server_cli/prototypes/manager/samples/basic_demo/.devcontainer-option/readme.md +1 -0
  10. api_logic_server_cli/prototypes/manager/samples/basic_demo/.devcontainer-option/setup.sh +10 -0
  11. api_logic_server_cli/prototypes/manager/samples/basic_demo/.env +4 -0
  12. api_logic_server_cli/prototypes/manager/samples/basic_demo/.github/.copilot-instructions.md +581 -0
  13. api_logic_server_cli/prototypes/manager/samples/basic_demo/.gitignore +9 -0
  14. api_logic_server_cli/prototypes/manager/samples/basic_demo/.idea/runConfigurations/ApiLogicServer.xml +24 -0
  15. api_logic_server_cli/prototypes/manager/samples/basic_demo/.idea/runConfigurations/Report_Behave_Logic.xml +24 -0
  16. api_logic_server_cli/prototypes/manager/samples/basic_demo/.idea/runConfigurations/Run_Behave.xml +24 -0
  17. api_logic_server_cli/prototypes/manager/samples/basic_demo/.idea/runConfigurations/Windows_Run_Behave.xml +24 -0
  18. api_logic_server_cli/prototypes/manager/samples/basic_demo/.idea/runConfigurations/run___No_Security.xml +25 -0
  19. api_logic_server_cli/prototypes/manager/samples/basic_demo/.idea/runConfigurations/run_docker.xml +59 -0
  20. api_logic_server_cli/prototypes/manager/samples/basic_demo/.vscode/launch.json +314 -0
  21. api_logic_server_cli/prototypes/manager/samples/basic_demo/.vscode/settings.json +40 -0
  22. api_logic_server_cli/prototypes/manager/samples/basic_demo/.vscode/venv_init.sh +64 -0
  23. api_logic_server_cli/prototypes/manager/samples/basic_demo/_config.yml +8 -0
  24. api_logic_server_cli/prototypes/manager/samples/basic_demo/_layouts/redirect.html +15 -0
  25. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/__init__.py +0 -0
  26. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/auto_discovery.py +27 -0
  27. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/mcp_discovery.py +97 -0
  28. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/mcp_expose_api_models.py +53 -0
  29. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/new_service.py +21 -0
  30. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/newer_service.py +21 -0
  31. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/ontimize_api.py +495 -0
  32. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/order_b2b_service.py +60 -0
  33. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/api_discovery/system.py +77 -0
  34. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/customize_api.py +63 -0
  35. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/expose_api_models.py +52 -0
  36. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/json_encoder.py +17 -0
  37. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/readme_customize_api.md +103 -0
  38. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/api_utils.py +171 -0
  39. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/custom_endpoint.py +1085 -0
  40. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/expression_parser.py +685 -0
  41. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/gen_csv_report.py +41 -0
  42. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/gen_pdf_report.py +215 -0
  43. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/opt_locking/opt_locking.py +158 -0
  44. api_logic_server_cli/prototypes/manager/samples/basic_demo/api/system/opt_locking/readme.md +225 -0
  45. api_logic_server_cli/prototypes/manager/samples/basic_demo/api_logic_server_run.py +162 -0
  46. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/__init__.py +0 -0
  47. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/activate_logicbank.py +46 -0
  48. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/config.py +772 -0
  49. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/default.env +16 -0
  50. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/logging-reduced.yml +112 -0
  51. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/logging.yml +123 -0
  52. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/mypy.ini +25 -0
  53. api_logic_server_cli/prototypes/manager/samples/basic_demo/config/server_setup.py +459 -0
  54. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/api/api_discovery/openapi.py +92 -0
  55. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/config/default.env +13 -0
  56. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/database/db.sqlite +0 -0
  57. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/database/models.py +130 -0
  58. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/docs/mcp_learning/mcp_discovery.json +108 -0
  59. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/logic/cocktail-napkin.jpg +0 -0
  60. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/logic/declare_logic.py +106 -0
  61. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/logic/logic_discovery/email_request.py +49 -0
  62. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/logic/logic_discovery/simple_constraints.py +25 -0
  63. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/security/declare_security.py +60 -0
  64. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/admin/admin.yaml +162 -0
  65. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/admin/home.js +48 -0
  66. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/README.md +17 -0
  67. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/README_create_react_app.md +70 -0
  68. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/package-lock.json +18469 -0
  69. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/package.json +47 -0
  70. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/public/favicon.ico +0 -0
  71. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/public/index.html +43 -0
  72. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/public/logo192.png +0 -0
  73. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/public/logo512.png +0 -0
  74. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/public/manifest.json +25 -0
  75. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/public/robots.txt +3 -0
  76. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/App.css +38 -0
  77. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/App.js +61 -0
  78. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/App.test.js +8 -0
  79. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Config-reference.js +527 -0
  80. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Config.js +527 -0
  81. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Customer-reference.js +216 -0
  82. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Customer.js +230 -0
  83. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Item.js +170 -0
  84. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Order.js +207 -0
  85. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/Product.js +140 -0
  86. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/SysEmail.js +157 -0
  87. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/SysMcp.js +110 -0
  88. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/app_loader.js +24 -0
  89. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/index.css +13 -0
  90. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/index.js +17 -0
  91. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/logo.svg +1 -0
  92. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/.eslintrc +5 -0
  93. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/.yarnrc.yml +4 -0
  94. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/default-settings.js +25 -0
  95. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/default-settings.ts +25 -0
  96. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/errors.js +116 -0
  97. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/errors.ts +116 -0
  98. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/index.test.tsx +7 -0
  99. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/index.tsx +11 -0
  100. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/ra-jsonapi-client.js +577 -0
  101. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/ra-jsonapi-client.ts +577 -0
  102. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/resourceLookup.js +124 -0
  103. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/resourceLookup.ts +124 -0
  104. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/rav4-jsonapi-client/styles.module.css +9 -0
  105. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/reportWebVitals.js +13 -0
  106. api_logic_server_cli/prototypes/manager/samples/basic_demo/customizations/ui/reference_react_app/src/setupTests.js +5 -0
  107. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/__init__.py +0 -0
  108. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic/alembic_run.py +98 -0
  109. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic/env.py +78 -0
  110. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic/readme_alembic.md +36 -0
  111. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic/script.py.mako +24 -0
  112. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic/versions/ae6a5c2fdc47_autogenerated.py +34 -0
  113. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic/versions/readme.md +1 -0
  114. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/alembic.ini +103 -0
  115. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/authentication_db.sqlite +0 -0
  116. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/bind_dbs.py +25 -0
  117. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/customize_models.py +19 -0
  118. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/database_discovery/authentication_models.py +183 -0
  119. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/database_discovery/auto_discovery.py +27 -0
  120. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/db.sqlite +0 -0
  121. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/db_debug/db_debug.py +90 -0
  122. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/mcp_db.sqlite +0 -0
  123. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/mcp_models.py +58 -0
  124. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/models.py +132 -0
  125. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/system/SAFRSBaseX.py +139 -0
  126. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/test_data/alp_init.py +40 -0
  127. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/test_data/readme.md +13 -0
  128. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/test_data/response2code.py +148 -0
  129. api_logic_server_cli/prototypes/manager/samples/basic_demo/database/test_data/test_data_preamble.py +83 -0
  130. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/auth-db/authdb_mysql.Dockerfile +65 -0
  131. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/auth-db/authdb_mysql.sql +112 -0
  132. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/auth-db/authdb_postgres.sql +57 -0
  133. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-compose-dev-azure/azure-deploy.sh +98 -0
  134. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-compose-dev-local/docker-compose-dev-local.yml +38 -0
  135. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-compose-dev-local/docker-compose.sh +34 -0
  136. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-image/build_image.dockerfile +20 -0
  137. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-image/build_image.sh +67 -0
  138. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-image/env.list +35 -0
  139. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-image/run_image.sh +23 -0
  140. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-standard-image/docker-compose-standard-image.yml +33 -0
  141. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/docker-standard-image/env.list +55 -0
  142. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/h2/keycloakdb.mv.db +0 -0
  143. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/h2/keycloakdb.trace.db +236 -0
  144. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/import/kcals-realm.json +1807 -0
  145. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/import/kcals-users-0.json +24 -0
  146. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/import/master-realm.json +1953 -0
  147. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/import/master-users-0.json +23 -0
  148. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/data/tmp/kc-gzip-cache/nnbna/js/keycloak.js.gz +0 -0
  149. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/docker-compose-dev-network.yml +31 -0
  150. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/docker-compose-nginx.yml +48 -0
  151. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/docker-compose.yml +24 -0
  152. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/import/kcals-realm.json +1898 -0
  153. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/import/kcals-users-0.json +319 -0
  154. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/import/master-realm.json +1953 -0
  155. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/import/master-users-0.json +23 -0
  156. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/nginx/cert.pem +25 -0
  157. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/nginx/key.pem +28 -0
  158. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/nginx/nginx.conf +73 -0
  159. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/startup_log_nginx.txt +0 -0
  160. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/startup_log_no_nginx.txt +0 -0
  161. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/unused/auth_provider.py +80 -0
  162. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/keycloak/unused/unused-docker-compose-keycloak.sh +13 -0
  163. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/python-anywhere/python_anywhere_wsgi.py +116 -0
  164. api_logic_server_cli/prototypes/manager/samples/basic_demo/devops/readme-devops.md +31 -0
  165. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/db.dbml +14 -0
  166. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/graphics/readme.md +12 -0
  167. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/logic/readme.md +19 -0
  168. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/logic_suggestions/readme_logic_suggestions.md +3 -0
  169. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/mcp_learning/mcp.prompt +39 -0
  170. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/mcp_learning/mcp_schema.json +30 -0
  171. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/models-not-code.png +0 -0
  172. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/runtime engines.png +0 -0
  173. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/system-creation-vibe.md +158 -0
  174. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/admin_app_1_context.prompt.md +43 -0
  175. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/admin_app_2_functionality.prompt.md +69 -0
  176. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/admin_app_3_architecture.prompt.md +29 -0
  177. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/logic_bank_api.prompt +342 -0
  178. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/logic_example.py +41 -0
  179. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/react_map.prompt.md +13 -0
  180. api_logic_server_cli/prototypes/manager/samples/basic_demo/docs/training/react_tree.prompt.md +10 -0
  181. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/kafka/kafka_consumer.py +60 -0
  182. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/kafka/kafka_producer.py +127 -0
  183. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/kafka/kafka_readme.md +3 -0
  184. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/examples/mcp_context_results.txt +142 -0
  185. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/examples/mcp_discovery_response.json +150 -0
  186. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/examples/mcp_request.prompt +46 -0
  187. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/examples/mcp_schema.txt +47 -0
  188. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/examples/mcp_tool_context_response.json +34 -0
  189. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/examples/mcp_tool_context_response_get.json +18 -0
  190. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/mcp_client_executor.py +545 -0
  191. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/mcp_server_discovery.json +9 -0
  192. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/mcp/readme-mcp.md +9 -0
  193. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/n8n/N8N_WebHook_from_ApiLogicServer.json +394 -0
  194. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/n8n/n8n_producer.py +172 -0
  195. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/n8n/n8n_readme.md +67 -0
  196. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/row_dict_maps/OrderB2BMapper.py +54 -0
  197. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/row_dict_maps/row_dict_maps_readme.md +3 -0
  198. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/system/FlaskKafka.py +105 -0
  199. api_logic_server_cli/prototypes/manager/samples/basic_demo/integration/system/RowDictMapper.py +416 -0
  200. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/api/api_discovery/order_b2b.py +92 -0
  201. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/database/db.sqlite +0 -0
  202. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/docs/er_diagram.png +0 -0
  203. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/integration/row_dict_maps/OrderB2B.py +36 -0
  204. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/integration/row_dict_maps/OrderShipping.py +30 -0
  205. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/logic/declare_logic.py +147 -0
  206. api_logic_server_cli/prototypes/manager/samples/basic_demo/iteration/ui/admin/admin.yaml +175 -0
  207. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/declarative-vs-procedural-comparison.html +110 -0
  208. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/declare_logic.py +81 -0
  209. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/load_verify_rules.py +217 -0
  210. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/logic_discovery/app_integration.py +23 -0
  211. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/logic_discovery/auto_discovery.py +52 -0
  212. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/logic_discovery/check_credit.py +44 -0
  213. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/logic_discovery/mcp_client_executor_request.py +50 -0
  214. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/logic_discovery/readme_logic_discovery.md +9 -0
  215. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/logic_discovery/use_case.py +31 -0
  216. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/procedural/credit_service.py +204 -0
  217. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md +295 -0
  218. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/procedural/declarative-vs-procedural-comparison.png +0 -0
  219. api_logic_server_cli/prototypes/manager/samples/basic_demo/logic/readme_logic.md +249 -0
  220. api_logic_server_cli/prototypes/manager/samples/basic_demo/readme.md +495 -0
  221. api_logic_server_cli/prototypes/manager/samples/basic_demo/readme_project.md +43 -0
  222. api_logic_server_cli/prototypes/manager/samples/basic_demo/readme_standard.md +492 -0
  223. api_logic_server_cli/prototypes/manager/samples/basic_demo/readme_vibe.md +353 -0
  224. api_logic_server_cli/prototypes/manager/samples/basic_demo/requirements.txt +3 -0
  225. api_logic_server_cli/prototypes/manager/samples/basic_demo/run.ps1 +30 -0
  226. api_logic_server_cli/prototypes/manager/samples/basic_demo/run.sh +55 -0
  227. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/__init__.py +0 -0
  228. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/authentication_provider/__init__.py +0 -0
  229. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/authentication_provider/abstract_authentication_provider.py +34 -0
  230. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/authentication_provider/keycloak/auth_provider.py +238 -0
  231. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/authentication_provider/memory/auth_provider.py +161 -0
  232. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/authentication_provider/memory/auth_provider_no_swagger.py +98 -0
  233. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/authentication_provider/sql/auth_provider.py +127 -0
  234. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/declare_security.py +49 -0
  235. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/readme_security.md +16 -0
  236. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/system/authentication.py +129 -0
  237. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/system/authorization.py +473 -0
  238. api_logic_server_cli/prototypes/manager/samples/basic_demo/security/system/custom_swagger.json +62 -0
  239. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/__init__.py +0 -0
  240. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/__init__.py +0 -0
  241. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/behave_logic_report.py +256 -0
  242. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/behave_run.py +64 -0
  243. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/features/about.feature +12 -0
  244. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/features/steps/about.py +20 -0
  245. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/features/steps/test_utils.py +133 -0
  246. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/logs/behave.log +0 -0
  247. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/reports/Behave Logic Report Intro micro.md +4 -0
  248. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/reports/Behave Logic Report Intro.md +75 -0
  249. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/api_logic_server_behave/reports/Behave Logic Report Sample.md +1180 -0
  250. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/basic/server_test.py +33 -0
  251. api_logic_server_cli/prototypes/manager/samples/basic_demo/test/readme_test.md +395 -0
  252. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/__init__.py +0 -0
  253. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/admin/admin.yaml +173 -0
  254. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/admin/admin_loader.py +217 -0
  255. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/admin/authentication_admin.yaml +99 -0
  256. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/admin/home.js +48 -0
  257. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/admin/mcp_admin.yaml +53 -0
  258. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/.browserslistrc +12 -0
  259. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/.dockerignore +47 -0
  260. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/.editorconfig +16 -0
  261. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/.eslintrc.json +51 -0
  262. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/.gitignore +47 -0
  263. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/README.md +42 -0
  264. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/angular.json +206 -0
  265. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/app_model.yaml +303 -0
  266. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/docker-compose-ontimize.yml +54 -0
  267. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/e2e/protractor.conf.js +32 -0
  268. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/e2e/src/app.e2e-spec.ts +23 -0
  269. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/e2e/src/app.po.ts +11 -0
  270. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/e2e/tsconfig.json +13 -0
  271. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/karma.conf.js +32 -0
  272. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/nginx/nginx.conf +29 -0
  273. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/ngsw-config.json +29 -0
  274. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/package-lock.json +22651 -0
  275. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/package.json +69 -0
  276. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app-routing.module.ts +25 -0
  277. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app.component.html +1 -0
  278. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app.component.scss +1 -0
  279. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app.component.spec.ts +35 -0
  280. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app.component.ts +9 -0
  281. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app.config.ts +43 -0
  282. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/app.module.ts +37 -0
  283. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/login/login-routing.module.ts +12 -0
  284. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/login/login.component.html +58 -0
  285. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/login/login.component.scss +155 -0
  286. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/login/login.component.ts +81 -0
  287. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/login/login.module.ts +18 -0
  288. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/login/login.theme.scss +51 -0
  289. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/Customer-routing.module.ts +37 -0
  290. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/Customer.module.ts +19 -0
  291. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/detail/Customer-detail.component.html +90 -0
  292. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/detail/Customer-detail.component.scss +0 -0
  293. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/detail/Customer-detail.component.ts +32 -0
  294. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/home/Customer-home.component.html +44 -0
  295. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/home/Customer-home.component.scss +0 -0
  296. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/home/Customer-home.component.ts +23 -0
  297. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/new/Customer-new.component.html +26 -0
  298. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/new/Customer-new.component.scss +0 -0
  299. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Customer/new/Customer-new.component.ts +18 -0
  300. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/Item-routing.module.ts +30 -0
  301. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/Item.module.ts +19 -0
  302. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/detail/Item-detail.component.html +72 -0
  303. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/detail/Item-detail.component.scss +0 -0
  304. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/detail/Item-detail.component.ts +32 -0
  305. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/home/Item-home.component.html +55 -0
  306. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/home/Item-home.component.scss +0 -0
  307. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/home/Item-home.component.ts +23 -0
  308. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/new/Item-new.component.html +60 -0
  309. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/new/Item-new.component.scss +0 -0
  310. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Item/new/Item-new.component.ts +18 -0
  311. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/Order-routing.module.ts +37 -0
  312. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/Order.module.ts +19 -0
  313. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/detail/Order-detail.component.html +114 -0
  314. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/detail/Order-detail.component.scss +0 -0
  315. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/detail/Order-detail.component.ts +32 -0
  316. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/home/Order-home.component.html +48 -0
  317. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/home/Order-home.component.scss +0 -0
  318. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/home/Order-home.component.ts +23 -0
  319. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/new/Order-new.component.html +43 -0
  320. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/new/Order-new.component.scss +0 -0
  321. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Order/new/Order-new.component.ts +18 -0
  322. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/Product-routing.module.ts +37 -0
  323. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/Product.module.ts +19 -0
  324. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/detail/Product-detail.component.html +91 -0
  325. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/detail/Product-detail.component.scss +0 -0
  326. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/detail/Product-detail.component.ts +32 -0
  327. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/home/Product-home.component.html +35 -0
  328. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/home/Product-home.component.scss +0 -0
  329. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/home/Product-home.component.ts +23 -0
  330. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/new/Product-new.component.html +20 -0
  331. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/new/Product-new.component.scss +0 -0
  332. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/Product/new/Product-new.component.ts +18 -0
  333. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/about/about-routing.module.ts +13 -0
  334. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/about/about.component.html +39 -0
  335. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/about/about.component.scss +35 -0
  336. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/about/about.component.ts +17 -0
  337. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/about/about.module.ts +18 -0
  338. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/about/about.theme.scss +14 -0
  339. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/home/home-routing.module.ts +17 -0
  340. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/home/home.component.html +1 -0
  341. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/home/home.component.scss +3 -0
  342. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/home/home.component.ts +21 -0
  343. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/home/home.module.ts +18 -0
  344. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/main-routing.module.ts +32 -0
  345. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/main-theme.scss +56 -0
  346. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/main.component.html +8 -0
  347. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/main.component.scss +1 -0
  348. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/main.component.ts +20 -0
  349. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/main.module.ts +22 -0
  350. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/settings/settings-routing.module.ts +14 -0
  351. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/settings/settings.component.html +14 -0
  352. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/settings/settings.component.scss +44 -0
  353. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/settings/settings.component.ts +46 -0
  354. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/main/settings/settings.module.ts +18 -0
  355. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Customer-card/Customer-card.component.html +1 -0
  356. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Customer-card/Customer-card.component.scss +0 -0
  357. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Customer-card/Customer-card.component.ts +16 -0
  358. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Item-card/Item-card.component.html +1 -0
  359. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Item-card/Item-card.component.scss +0 -0
  360. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Item-card/Item-card.component.ts +16 -0
  361. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Order-card/Order-card.component.html +1 -0
  362. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Order-card/Order-card.component.scss +0 -0
  363. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Order-card/Order-card.component.ts +16 -0
  364. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Product-card/Product-card.component.html +1 -0
  365. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Product-card/Product-card.component.scss +0 -0
  366. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/Product-card/Product-card.component.ts +16 -0
  367. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/app.menu.config.ts +45 -0
  368. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/app.services.config.ts +5 -0
  369. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/constant.ts +4 -0
  370. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/app/shared/shared.module.ts +15 -0
  371. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/.gitkeep +0 -0
  372. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/css/app.scss +20 -0
  373. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/css/loader.css +173 -0
  374. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/i18n/en.json +44 -0
  375. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/i18n/es.json +42 -0
  376. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize128.png +0 -0
  377. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize16.png +0 -0
  378. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize256.png +0 -0
  379. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize32.png +0 -0
  380. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize48.png +0 -0
  381. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize64.png +0 -0
  382. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize72.png +0 -0
  383. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/icons/ontimize96.png +0 -0
  384. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/github.png +0 -0
  385. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/login_bg.png +0 -0
  386. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/no-image-transparent.png +0 -0
  387. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/no-image.png +0 -0
  388. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/ontimize.png +0 -0
  389. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/ontimize_web_log.png +0 -0
  390. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/sidenav-closed.png +0 -0
  391. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/sidenav-closed.svg +1 -0
  392. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/sidenav-opened.png +0 -0
  393. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/sidenav-opened.svg +1 -0
  394. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/images/user_profile.png +0 -0
  395. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/js/domchange.js +110 -0
  396. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/assets/js/keyboard.js +24 -0
  397. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/environments/environment.prod.ts +11 -0
  398. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/environments/environment.ts +15 -0
  399. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/favicon.ico +0 -0
  400. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/index.html +30 -0
  401. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/main.ts +15 -0
  402. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/manifest.webmanifest +59 -0
  403. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/polyfills.ts +66 -0
  404. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/styles.scss +1 -0
  405. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/src/test.ts +16 -0
  406. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/tsconfig.app.json +18 -0
  407. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/tsconfig.json +25 -0
  408. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/app/tsconfig.spec.json +18 -0
  409. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/andrew.jpg +0 -0
  410. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/anne.jpg +0 -0
  411. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/janet.jpg +0 -0
  412. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/laura.jpg +0 -0
  413. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/margaret.jpg +0 -0
  414. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/michael.jpg +0 -0
  415. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/nancy.jpg +0 -0
  416. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/robert.jpg +0 -0
  417. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Employee/steven.jpg +0 -0
  418. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/beverages.gif +0 -0
  419. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/cereals.gif +0 -0
  420. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/condiments.gif +0 -0
  421. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/confections.gif +0 -0
  422. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/diary.gif +0 -0
  423. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/meat.gif +0 -0
  424. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/produce.gif +0 -0
  425. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/images/Product/seafood.gif +0 -0
  426. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/README.md +16 -0
  427. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/README_create_react_app.md +70 -0
  428. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/package-lock.json +18469 -0
  429. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/package.json +47 -0
  430. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/public/favicon.ico +0 -0
  431. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/public/index.html +43 -0
  432. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/public/logo192.png +0 -0
  433. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/public/logo512.png +0 -0
  434. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/public/manifest.json +25 -0
  435. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/public/robots.txt +3 -0
  436. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/App.css +38 -0
  437. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/App.js +80 -0
  438. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/App.test.js +8 -0
  439. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/Config.js +527 -0
  440. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/Customer.js +218 -0
  441. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/Item.js +190 -0
  442. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/Order.js +189 -0
  443. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/Product.js +159 -0
  444. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/app_loader.js +24 -0
  445. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/index.css +13 -0
  446. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/index.js +17 -0
  447. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/logo.svg +1 -0
  448. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/.eslintrc +5 -0
  449. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/.yarnrc.yml +4 -0
  450. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/default-settings.js +25 -0
  451. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/default-settings.ts +25 -0
  452. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/errors.js +116 -0
  453. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/errors.ts +116 -0
  454. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/index.test.tsx +7 -0
  455. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/index.tsx +11 -0
  456. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/ra-jsonapi-client.js +577 -0
  457. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/ra-jsonapi-client.ts +577 -0
  458. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/resourceLookup.js +124 -0
  459. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/resourceLookup.ts +124 -0
  460. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/rav4-jsonapi-client/styles.module.css +9 -0
  461. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/reportWebVitals.js +13 -0
  462. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app/src/setupTests.js +5 -0
  463. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/README.md +20 -0
  464. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/README_create_react_app.md +72 -0
  465. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/package-lock.json +18469 -0
  466. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/package.json +47 -0
  467. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/product-cards.png +0 -0
  468. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/public/favicon.ico +0 -0
  469. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/public/index.html +43 -0
  470. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/public/logo192.png +0 -0
  471. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/public/logo512.png +0 -0
  472. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/public/manifest.json +25 -0
  473. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/public/robots.txt +3 -0
  474. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/App.css +38 -0
  475. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/App.js +80 -0
  476. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/App.test.js +8 -0
  477. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/Config.js +527 -0
  478. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/Customer.js +218 -0
  479. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/Item.js +190 -0
  480. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/Order.js +189 -0
  481. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/Product.js +241 -0
  482. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/app_loader.js +24 -0
  483. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/index.css +13 -0
  484. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/index.js +17 -0
  485. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/logo.svg +1 -0
  486. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/.eslintrc +5 -0
  487. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/.yarnrc.yml +4 -0
  488. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/default-settings.js +25 -0
  489. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/default-settings.ts +25 -0
  490. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/errors.js +116 -0
  491. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/errors.ts +116 -0
  492. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/index.test.tsx +7 -0
  493. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/index.tsx +11 -0
  494. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/ra-jsonapi-client.js +577 -0
  495. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/ra-jsonapi-client.ts +577 -0
  496. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/resourceLookup.js +124 -0
  497. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/resourceLookup.ts +124 -0
  498. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/rav4-jsonapi-client/styles.module.css +9 -0
  499. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/reportWebVitals.js +13 -0
  500. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/my-react-app-cards/src/setupTests.js +5 -0
  501. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/templates/bar_chart.jinja +64 -0
  502. api_logic_server_cli/prototypes/manager/samples/basic_demo/ui/templates/content.html +3 -0
  503. api_logic_server_cli/prototypes/manager/samples/basic_demo/venv_setup/py.py +121 -0
  504. api_logic_server_cli/prototypes/manager/samples/basic_demo/venv_setup/readme_venv.md +20 -0
  505. api_logic_server_cli/prototypes/manager/samples/basic_demo/venv_setup/requirements-no-cli.txt +33 -0
  506. api_logic_server_cli/prototypes/manager/samples/basic_demo/venv_setup/venv-linux.sh +28 -0
  507. api_logic_server_cli/prototypes/manager/samples/basic_demo/venv_setup/venv.ps1 +21 -0
  508. api_logic_server_cli/prototypes/manager/samples/basic_demo/venv_setup/venv.sh +28 -0
  509. api_logic_server_cli/prototypes/manager/samples/dbs/readme_dbs.md +4 -4
  510. api_logic_server_cli/prototypes/manager/samples/readme_samples.md +13 -6
  511. api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace +3 -2
  512. {apilogicserver-15.0.65.dist-info → apilogicserver-15.1.0.dist-info}/METADATA +1 -1
  513. {apilogicserver-15.0.65.dist-info → apilogicserver-15.1.0.dist-info}/RECORD +517 -17
  514. api_logic_server_cli/prototypes/manager/.vscode/.copilot-instructions.md +0 -58
  515. api_logic_server_cli/prototypes/manager/.vscode/ApiLogicServer.code-workspace +0 -15
  516. {apilogicserver-15.0.65.dist-info → apilogicserver-15.1.0.dist-info}/WHEEL +0 -0
  517. {apilogicserver-15.0.65.dist-info → apilogicserver-15.1.0.dist-info}/entry_points.txt +0 -0
  518. {apilogicserver-15.0.65.dist-info → apilogicserver-15.1.0.dist-info}/licenses/LICENSE +0 -0
  519. {apilogicserver-15.0.65.dist-info → apilogicserver-15.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,238 @@
1
+ from security.authentication_provider.abstract_authentication_provider import Abstract_Authentication_Provider
2
+ import sqlalchemy as sqlalchemy
3
+ import database.database_discovery.authentication_models as authentication_models
4
+ from flask import Flask
5
+ import safrs
6
+ from safrs.errors import JsonapiError
7
+ from dotmap import DotMap # a dict, but you can say aDict.name instead of aDict['name']... like a row
8
+ from sqlalchemy import inspect
9
+ from http import HTTPStatus
10
+ import logging
11
+ from flask_jwt_extended import JWTManager
12
+ from flask_jwt_extended import create_access_token
13
+ # from flask_jwt_extended import jwt_required
14
+ from flask_jwt_extended import jwt_required as jwt_required_ori
15
+ import flask_jwt_extended as flask_jwt_extended
16
+ from flask import jsonify
17
+ import requests # not working - 404
18
+ import json
19
+ import sys
20
+ import time
21
+ from jwt.algorithms import RSAAlgorithm
22
+ from flask import g
23
+
24
+
25
+ # **********************
26
+ # keycloak auth provider
27
+ # **********************
28
+
29
+ db = None
30
+ session = None
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+ class ALSError(JsonapiError):
35
+
36
+ def __init__(self, message, status_code=HTTPStatus.BAD_REQUEST):
37
+ super().__init__()
38
+ self.message = message
39
+ self.status_code = status_code
40
+
41
+
42
+ class DotMapX(DotMap):
43
+ """ DotMap, with extended support for auth providers """
44
+ def check_password(self, password=None):
45
+ # print(password)
46
+ return password == self.password_hash
47
+
48
+
49
+ class Authentication_Provider(Abstract_Authentication_Provider):
50
+
51
+ @staticmethod
52
+ def configure_auth(flask_app: Flask):
53
+ """ Called by authentication.py on server start, to
54
+ - initialize jwt
55
+ - establish Flask end points for login.
56
+
57
+ Args:
58
+ flask_app (Flask): _description_
59
+ database (object): _description_
60
+ method_decorators (object): _description_
61
+ Returns:
62
+ _type_: (no return)
63
+ """
64
+ flask_app.config['JWT_ALGORITHM'] = 'RS256'
65
+ flask_app.config["JWT_PUBLIC_KEY"] = Authentication_Provider.get_jwt_public_key('RS256')
66
+ do_priv_key = False
67
+ if do_priv_key:
68
+ flask_app.config["JWT_PRIVATE_KEY"] = \
69
+ Authentication_Provider.get_jwt_pubkey()
70
+ return
71
+
72
+ @staticmethod
73
+ def get_jwt_public_key(alg, kid=None):
74
+ """
75
+ Retrieve the public key of the JWK keypair used by keycloak to sign the JWTs.
76
+ JWTs signed with this key are trusted by ALS.
77
+ """
78
+ from flask import jsonify, request
79
+ from config.config import Args # circular import error if at top
80
+
81
+ jwks_uri = Args.instance.keycloak_base_url + '/protocol/openid-connect/certs'
82
+ for i in range(100):
83
+ # we retry a couple of times in case there are connection problems
84
+ try:
85
+ keys = requests.get(jwks_uri).json()['keys']
86
+ break
87
+ except:
88
+ # waiting .. keycloak may still be sleeping
89
+ time.sleep(1)
90
+ else:
91
+ print(f'Failed to load jwks_uri {jwks_uri}')
92
+ sys.exit(1)
93
+ for key in keys:
94
+ # loop over all keys until we find the one we're looking for
95
+ if key['alg'] == alg or key['kid'] == kid:
96
+ logger.info(f"Found JWK: {key['kid']}")
97
+ return RSAAlgorithm.from_jwk(json.dumps(key))
98
+ print(f"Couldn't find key with ALG {alg} or kid {kid}")
99
+ exit(1)
100
+
101
+ # @jwt_required # so, maybe jwt requires no pwd?
102
+ def get_jwt_user(id: str) -> object: # for experiment: jwt_get_raw_jwt
103
+ from flask_jwt_extended import get_jwt
104
+ from flask import has_request_context
105
+
106
+ return_jwt = None
107
+ if has_request_context():
108
+ # flask_jwt_extended.verify_jwt_in_request() # blows stack; if omitted, following fails
109
+ # return_jwt = raw_jwt = flask_jwt_extended.get_jwt() # You must call `@jwt_required()` or `verify_jwt_in_request()` before using this method
110
+ request_global_debug = g
111
+ return_jwt = g.als_jwt # it's not set, lost since different request??
112
+ else:
113
+ pass # TODO - what to do here?
114
+ return return_jwt
115
+
116
+ @staticmethod
117
+ def get_user_from_jwt(jwt_data: dict) -> object:
118
+ """return DotMapX (user+roles) from jwt_data
119
+
120
+ Args:
121
+ jwt_data (dict): jwt, as saved in password
122
+
123
+ Returns:
124
+ object: ApiLogicServer user (with roles) DotMapX object
125
+ """
126
+ rtn_user = DotMapX()
127
+ rtn_user.client_id = 1 # hack until user data in place
128
+ rtn_user.name = jwt_data["preferred_username"]
129
+ rtn_user.password_hash = None
130
+
131
+ # get extended properties (e.g, client_id in sample app)
132
+ if "attributes" in jwt_data:
133
+ # return rtn_user
134
+ attributes = jwt_data['attributes']
135
+ for each_name, each_value in attributes.items():
136
+ rtn_user[each_name] = each_value
137
+
138
+ rtn_user.UserRoleList = []
139
+ role_names = jwt_data["realm_access"]["roles"]
140
+ # role_names.append("customer") #Temp role for testing
141
+ for each_role_name in role_names:
142
+ each_user_role = DotMapX()
143
+ each_user_role.role_name = each_role_name
144
+ rtn_user.UserRoleList.append(each_user_role)
145
+ return rtn_user
146
+
147
+ @staticmethod
148
+ def get_user(id: str, password: str = "") -> object:
149
+ """ Must return a row object or UserAndRole(DotMap) with attributes:
150
+ * name
151
+ * role_list: a list of row objects with attribute name
152
+
153
+ Args:
154
+ id (str): the user login id
155
+ password (str, optional): for keycloak, there is no password, so use this for jwt_data.
156
+
157
+ Returns:
158
+ object: row object is a SQLAlchemy row
159
+ """
160
+ from config.config import Args # circular import error if at top
161
+
162
+ use_db = False
163
+ if use_db: # old code - get user info from sqlite db
164
+ global db, session
165
+ def row_to_dotmap(row, row_class):
166
+ rtn_dotmap = DotMapX()
167
+ mapper = inspect(row_class)
168
+ for each_column in mapper.columns:
169
+ rtn_dotmap[each_column.name] = getattr(row, each_column.name)
170
+ return rtn_dotmap
171
+ if db is None:
172
+ db = safrs.DB # Use the safrs.DB for database access
173
+ session = db.session # sqlalchemy.orm.scoping.scoped_session
174
+
175
+ user = session.query(authentication_models.User).filter(authentication_models.User.id == id).one_or_none()
176
+ if user is None: #Val - change note to remove try, use 1st user if none (as a temp hack?)
177
+ logger.info(f'*****\nauth_provider: Create user for: {id}\n*****\n')
178
+ user = session.query(authentication_models.User).first()
179
+ return user
180
+ logger.info(f'*****\nauth_provider: User: {user}\n*****\n')
181
+ use_db_row = True # prior version did not return class with check_password; now fixed
182
+ if use_db_row:
183
+ return user
184
+ else:
185
+ pass
186
+ rtn_user = row_to_dotmap(user, authentication_models.User)
187
+ rtn_user.UserRoleList = []
188
+ user_roles = getattr(user, "UserRoleList")
189
+ for each_row in user_roles:
190
+ each_user_role = row_to_dotmap(each_row, authentication_models.UserRole)
191
+ rtn_user.UserRoleList.append(each_user_role)
192
+ return rtn_user # returning user fails per caution above
193
+ # get user / roles from kc
194
+ try_kc = 'authentication#user_lookup_callback' # activate favorite experiment
195
+ if try_kc == 'jwt_create':
196
+ """ To retrieve user info from the jwt, you may want to look into these functions:
197
+ https://flask-jwt-extended.readthedocs.io/en/stable/automatic_user_loading.html
198
+ as used in security/system/authentication.py
199
+ """
200
+ user = {"id": id, "password": password} # is this == kwargs?
201
+ user_identity = DotMapX()
202
+ user_identity.id = id
203
+ user_identity.password = password
204
+ # JWT_PRIVATE_KEY must be set to use asymmetric cryptography algorithm "RS256"
205
+ access_token = create_access_token(identity=user_identity)
206
+ # now decode for user/roles info; also see jwt.io
207
+ jswon_jwt = jsonify(access_token=user) # this returns something with SQLAlchemy row
208
+ pass
209
+
210
+ # jwt = JWTManager(g_flask_app) # can't use this...
211
+ # fails with: AssertionError: The setup method 'errorhandler' can no longer be called on the application. It has already handled its first request, any changes will not be applied consistently.
212
+ # Make sure all imports, decorators, functions, etc. needed to set up the application are done before running it.
213
+ elif try_kc == "jwt_get_raw_jwt": # https://flask-jwt-extended.readthedocs.io/en/3.0.0_release/api/
214
+ # verified_jwt = flask_jwt_extended.verify_jwt_in_request() # blows stack
215
+ # raw_jwt = flask_jwt_extended.get_jwt() # You must call `@jwt_required()` or `verify_jwt_in_request()` before using this method
216
+ Authentication_Provider.get_jwt_user(id=id)
217
+ pass
218
+ elif try_kc == 'api': # get jwt for user info & roles
219
+ KC_BASE = Args.instance.keycloak_base
220
+ data = {
221
+ "grant_type": "password",
222
+ "client_id": "alsclient",
223
+ "username" :f"{id}",
224
+ "password": f"{password}"
225
+ }
226
+ msg_url = f'{KC_BASE}/.well-known/openid-configuration'
227
+ resp = requests.post(msg_url, data)
228
+ if resp.status_code == 200:
229
+ resp_data = json.loads(resp.text)
230
+ # no no access_token = resp_data["access_token"]
231
+ # instead, create user/roles UserRoleList, caller will create jwt
232
+ return jsonify(access_token=access_token)
233
+ elif try_kc == 'authentication#user_lookup_callback':
234
+ # from flask import g
235
+ # jwt_data = g.jwt_data # saved in authentication#user_lookup_callback()
236
+ jwt_data : dict = password
237
+ rtn_user = Authentication_Provider.get_user_from_jwt(jwt_data)
238
+ return rtn_user
@@ -0,0 +1,161 @@
1
+ from security.authentication_provider.abstract_authentication_provider import Abstract_Authentication_Provider
2
+ from typing import List, Optional
3
+ import safrs
4
+ from safrs import jsonapi_rpc
5
+ from safrs import SAFRSBase
6
+ from flask_jwt_extended import get_jwt_identity
7
+ from flask_jwt_extended import create_refresh_token
8
+ from flask_jwt_extended import create_access_token
9
+ from flask import abort
10
+
11
+ # **********************
12
+ # in mem auth provider
13
+ # **********************
14
+
15
+ users = {}
16
+
17
+ from dataclasses import dataclass
18
+
19
+ @dataclass
20
+ class DataClassUserRole:
21
+ role_name: str
22
+
23
+
24
+ class DataClassUser(safrs.JABase):
25
+ """
26
+ Required machinery for swagger visibility
27
+ """
28
+
29
+ def __init__(self, name: str, id: str, client_id: int, password: str):
30
+ self.id = id
31
+ self.password= password
32
+ self.client_id = client_id
33
+ self.name = name
34
+ self.UserRoleList = []
35
+
36
+ # called by authentication
37
+ def check_password(self, password=None):
38
+ # print(password)
39
+ return password == self.password
40
+
41
+ @classmethod
42
+ @jsonapi_rpc(http_methods=["POST"])
43
+ def login(self, *args, **kwargs): # yaml comment => swagger description
44
+ """ # yaml creates Swagger description
45
+ args :
46
+ id: u1
47
+ password: p
48
+ """
49
+
50
+ # test using swagger -> try it out (includes sample data, above)
51
+
52
+ id = kwargs.get("id", None)
53
+ password = kwargs.get("password", None)
54
+
55
+ user = users[id]
56
+ if not user or not user.check_password(password):
57
+ abort(401, "Wrong username or password")
58
+
59
+ access_token = create_access_token(identity=user)
60
+ return { "access_token" : access_token}
61
+
62
+ @dataclass
63
+ class DataClassUserZ(SAFRSBase):
64
+ name: str
65
+ client_id: int
66
+ id: str
67
+ password: str
68
+ UserRoleList: Optional [List[DataClassUserRole]] = None
69
+
70
+ # called by authentication
71
+ def check_password(self, password=None):
72
+ # print(password)
73
+ return password == self.password
74
+
75
+ @classmethod
76
+ @jsonapi_rpc(valid_jsonapi=False)
77
+ def login(cls, *args, **kwargs):
78
+ """
79
+ description: Login - Generate a JWT access token
80
+ args:
81
+ username: user
82
+ password: password
83
+ """
84
+ username = kwargs.get("username", None)
85
+ password = kwargs.get("password", None)
86
+
87
+ user = users[id]
88
+ if not user or not user.check_password(password):
89
+ abort(401, "Wrong username or password")
90
+
91
+ access_token = create_access_token(identity=user)
92
+ return { "access_token" : access_token}
93
+
94
+
95
+ class Authentication_Provider(Abstract_Authentication_Provider):
96
+ """ Sample auth provider using in-memory data
97
+
98
+ This illustrates the basic operation of an auth provider.
99
+ It is mainly used for internal testing, and illustration.
100
+
101
+ Typically, a real-world system would use a Keycloak or sql provider.
102
+
103
+ Args:
104
+ Abstract_Authentication_Provider (_type_): _description_
105
+
106
+ Returns:
107
+ _type_: _description_
108
+ """
109
+
110
+ @staticmethod
111
+ def get_user(id: str, password: str) -> object:
112
+ """
113
+ Must return a row object with attributes name and UserRoleList (others as required)
114
+ role_list is a list of row objects with attribute name
115
+
116
+ row object is a DotMap (as here) or a SQLAlchemy row
117
+ """
118
+ return users[id]
119
+
120
+
121
+ @staticmethod
122
+ def initialize(api):
123
+ api.expose_object(DataClassUser)
124
+
125
+ def add_user(name: str, id: int, password: str):
126
+ user = DataClassUser( name=name, id=name, client_id=id, password=password)
127
+ users[name] = user
128
+ return user
129
+
130
+ sam = add_user("sam", 1, "p")
131
+ sam_role_list = [DataClassUserRole(role_name="manager")]
132
+ sam.UserRoleList = sam_role_list
133
+
134
+ aneu = add_user("aneu", 1, "p")
135
+ aneu_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="tenant")]
136
+ aneu.UserRoleList = aneu_role_list
137
+
138
+ c1 = add_user("u1", 1, "p")
139
+ c1_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="tenant")]
140
+ c1.UserRoleList = c1_role_list
141
+
142
+ c2 = add_user("u2", 2, "p")
143
+ c2_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="renter")]
144
+ c2.UserRoleList = c1_role_list
145
+
146
+ m = add_user("mary", 5, "p")
147
+ m_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="tenant")]
148
+ m.UserRoleList = c1_role_list
149
+
150
+ sam_row = Authentication_Provider.get_user("sam", "")
151
+ print(f'Sam: {sam_row}')
152
+
153
+ """
154
+ this is a super-simplistic auth_provider, to demonstrate the "provide your own" approach
155
+ will typically user provider for sql
156
+
157
+ to test
158
+ 1. Create project: nw-
159
+ 2. Use memory.auth_provider in config.py
160
+ 3. Disable api/authentication_expose_api.py
161
+ """
@@ -0,0 +1,98 @@
1
+ from security.authentication_provider.abstract_authentication_provider import Abstract_Authentication_Provider
2
+ from typing import List, Optional
3
+ from safrs import jsonapi_rpc
4
+
5
+ # **********************
6
+ # in mem auth provider
7
+ # **********************
8
+
9
+ users = {}
10
+
11
+ from dataclasses import dataclass
12
+
13
+ @dataclass
14
+ class DataClassUserRole:
15
+ role_name: str
16
+
17
+ @dataclass
18
+ class DataClassUser:
19
+ name: str
20
+ client_id: int
21
+ id: str
22
+ password: str
23
+ UserRoleList: Optional [List[DataClassUserRole]] = None
24
+
25
+ # called by authentication
26
+ def check_password(self, password=None):
27
+ # print(password)
28
+ return password == self.password
29
+
30
+ @classmethod
31
+ @jsonapi_rpc(valid_jsonapi=False)
32
+ def login(cls, *args, **kwargs):
33
+ """
34
+ description: Login - Generate a JWT access token
35
+ args:
36
+ username: user
37
+ password: password
38
+ """
39
+ username = kwargs.get("username", None)
40
+ password = kwargs.get("password", None)
41
+
42
+ user = users[id]
43
+ if not user or not user.check_password(password):
44
+ abort(401, "Wrong username or password")
45
+
46
+ access_token = create_access_token(identity=user)
47
+ return { "access_token" : access_token}
48
+
49
+
50
+ class Authentication_Provider(Abstract_Authentication_Provider):
51
+
52
+ @staticmethod
53
+ def get_user(id: str, password: str) -> object:
54
+ """
55
+ Must return a row object with attributes name and UserRoleList (others as required)
56
+ role_list is a list of row objects with attribute name
57
+
58
+ row object is a DotMap (as here) or a SQLAlchemy row
59
+ """
60
+ return users[id]
61
+
62
+ def add_user(name: str, id: int, password: str):
63
+ user = DataClassUser( name=name, id=name, client_id=id, password=password)
64
+ users[name] = user
65
+ return user
66
+
67
+ sam = add_user("sam", 1, "p")
68
+ sam_role_list = [DataClassUserRole(role_name="manager")]
69
+ sam.UserRoleList = sam_role_list
70
+
71
+ aneu = add_user("aneu", 1, "p")
72
+ aneu_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="tenant")]
73
+ aneu.UserRoleList = aneu_role_list
74
+
75
+ c1 = add_user("u1", 1, "p")
76
+ c1_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="tenant")]
77
+ c1.UserRoleList = c1_role_list
78
+
79
+ c2 = add_user("u2", 2, "p")
80
+ c2_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="renter")]
81
+ c2.UserRoleList = c1_role_list
82
+
83
+ m = add_user("mary", 5, "p")
84
+ m_role_list = [DataClassUserRole(role_name="manager"), DataClassUserRole(role_name="tenant")]
85
+ m.UserRoleList = c1_role_list
86
+
87
+ sam_row = Authentication_Provider.get_user("sam", "")
88
+ print(f'Sam: {sam_row}')
89
+
90
+ """
91
+ this is a super-simplistic auth_provider, to demonstrate the "provide your own" approach
92
+ will typically user provider for sql
93
+
94
+ to test
95
+ 1. Create project: nw-
96
+ 2. Use memory.auth_provider in config.py
97
+ 3. Disable api/authentication_expose_api.py
98
+ """
@@ -0,0 +1,127 @@
1
+ from security.authentication_provider.abstract_authentication_provider import Abstract_Authentication_Provider
2
+ import sqlalchemy as sqlalchemy
3
+ import database.database_discovery.authentication_models as authentication_models
4
+ from flask import Flask
5
+ import safrs
6
+ from safrs.errors import JsonapiError
7
+ from dotmap import DotMap # a dict, but you can say aDict.name instead of aDict['name']... like a row
8
+ from sqlalchemy import inspect
9
+ from http import HTTPStatus
10
+ import logging
11
+
12
+
13
+ # **********************
14
+ # sql auth provider
15
+ # **********************
16
+
17
+ db = None
18
+ session = None
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ class ALSError(JsonapiError):
23
+
24
+ def __init__(self, message, status_code=HTTPStatus.BAD_REQUEST):
25
+ super().__init__()
26
+ self.message = message
27
+ self.status_code = status_code
28
+
29
+
30
+ class DotMapX(DotMap):
31
+ """
32
+ A DotMap (provides for extended user-defined attributes)
33
+
34
+ Preserving dot notation - callers do use object.attr, *not* object['attr']
35
+
36
+ With check_password method
37
+
38
+ Args:
39
+ DotMap (_type_): _description_
40
+ """
41
+ def check_password(self, password=None):
42
+ logger.warning("Insecure check_password method, using insecure default, override this method for password verification!")
43
+ return password == self.password_hash
44
+
45
+
46
+ class Authentication_Provider(Abstract_Authentication_Provider):
47
+
48
+ @staticmethod #val - option for auth provider setup
49
+ def configure_auth(flask_app: Flask):
50
+ """ Called by authentication.py on server start, e.g., to
51
+ - initialize jwt
52
+ - establish Flask end points for login.
53
+
54
+ Args:
55
+ flask_app (Flask): _description_
56
+ database (object): _description_
57
+ method_decorators (object): _description_
58
+ Returns:
59
+ _type_: (no return)
60
+ """
61
+ return
62
+
63
+
64
+ @staticmethod
65
+ def get_user(id: str, password: str = "") -> object:
66
+ """
67
+ Must return a DotMapX row or SQLAlchemy row, with attributes:
68
+ * name
69
+ * role_list: a list of row objects with attribute name
70
+
71
+ Args:
72
+ id (str): _description_
73
+ password (str, optional): _description_. Defaults to "".
74
+
75
+ Returns:
76
+ object: row object is a SQLAlchemy row
77
+ """
78
+
79
+ def row_to_dotmap(row, row_class):
80
+ rtn_dotmap = DotMapX()
81
+ mapper = inspect(row_class)
82
+ for each_column in mapper.columns:
83
+ rtn_dotmap[each_column.name] = getattr(row, each_column.name)
84
+ return rtn_dotmap
85
+
86
+ global db, session
87
+ if db is None:
88
+ db = safrs.DB # Use the safrs.DB for database access
89
+ session = db.session # sqlalchemy.orm.scoping.scoped_session
90
+
91
+ try:
92
+ user = session.query(authentication_models.User).filter(authentication_models.User.id == id).one()
93
+ except Exception as e:
94
+ logger.info(f'*****\nauth_provider FAILED looking for: {id}\n*****\n')
95
+ logger.info(f'excp: {str(e)}\n')
96
+ # raise e
97
+ raise ALSError(f"User {id} is not authorized for this system")
98
+ use_db_row = False
99
+ if use_db_row:
100
+ return user
101
+ else:
102
+ pass
103
+ rtn_user = row_to_dotmap(user, authentication_models.User)
104
+ rtn_user.UserRoleList = []
105
+ user_roles = getattr(user, "UserRoleList")
106
+ for each_row in user_roles:
107
+ each_user_role = row_to_dotmap(each_row, authentication_models.UserRole)
108
+ rtn_user.UserRoleList.append(each_user_role)
109
+ return rtn_user # returning user fails per caution above
110
+
111
+ @staticmethod
112
+ def check_password(user: object, password: str = "") -> bool:
113
+ """checks whether user-supplied password matches database
114
+
115
+ This hides implementation (eg, delegated or now) from authentication caller
116
+
117
+ Args:
118
+ user (object): DotMap or SQLAlchemy row containing id attribute
119
+ password (str, optional): password as entered by user. Defaults to "".
120
+
121
+ Returns:
122
+ bool: _description_
123
+ """
124
+ # return user.check_password(password = password) : review
125
+ logger.warning("Checking plaintext password")
126
+ return password == user.password_hash
127
+
@@ -0,0 +1,49 @@
1
+ from security.system.authorization import Grant, Security, Security, DefaultRolePermission, GlobalFilter
2
+ import logging
3
+ from database import models
4
+ import safrs
5
+
6
+ db = safrs.DB
7
+ session = db.session
8
+
9
+ app_logger = logging.getLogger(__name__)
10
+
11
+ declare_security_message = "No Grants Yet" # printed in api_logic_server.py
12
+
13
+ """
14
+ First, Activate Security: https://apilogicserver.github.io/Docs/Security-Activation/
15
+
16
+ Then, Declare Security here: https://apilogicserver.github.io/Docs/Security-Authorization/
17
+
18
+ See documentation: https://apilogicserver.github.io/Docs/Security-Overview/
19
+
20
+ Security is invoked on server start (api_logic_server_run), per activation in `config.py`
21
+
22
+ Your Code Goes Here - alter the starter code below to suit your needs
23
+ """
24
+
25
+ class Roles():
26
+ """ For code completion (auth data is the source of truth)
27
+
28
+ Revise these for your app's roles"""
29
+ manager = "manager"
30
+ teller = "teller"
31
+ tenant = "tenant"
32
+ customer = "customer"
33
+ read_only = "readonly"
34
+ admin = "CS_ADMIN"
35
+ public="public" # p1/p (no roles, but gets public)
36
+ sa="sa"
37
+ default_roles_kcals = "default-roles-kcals"
38
+ uma_authorization = "uma_authorization"
39
+
40
+ DefaultRolePermission(to_role=Roles.sa, can_read=True, can_update=True, can_insert=True, can_delete=True)
41
+ DefaultRolePermission(to_role=Roles.tenant, can_read=True, can_delete=True)
42
+ DefaultRolePermission(to_role=Roles.admin, can_read=True, can_insert=True,can_update=True, can_delete=True)
43
+ DefaultRolePermission(to_role=Roles.manager, can_read=True, can_insert=True,can_update=True, can_delete=False)
44
+ DefaultRolePermission(to_role=Roles.teller, can_read=True, can_insert=True,can_update=True, can_delete=False)
45
+ DefaultRolePermission(to_role=Roles.customer, can_read=True, can_insert=True,can_update=True, can_delete=False)
46
+ DefaultRolePermission(to_role=Roles.read_only, can_read=True, can_insert=False,can_update=False, can_delete=False)
47
+ DefaultRolePermission(to_role=Roles.public, can_read=True, can_insert=False,can_update=False, can_delete=False)
48
+ DefaultRolePermission(to_role=Roles.default_roles_kcals, can_read=True, can_insert=True,can_update=True, can_delete=False)
49
+ DefaultRolePermission(to_role=Roles.uma_authorization, can_read=True, can_insert=True,can_update=True, can_delete=False)
@@ -0,0 +1,16 @@
1
+ You can add Role Based Access Control (RBAC) to your project, providing:
2
+
3
+ * authentication: based on sql tables for users / roles, and
4
+ * authorization: declarative for-filters for roles.
5
+
6
+ Common commands:
7
+
8
+ ```bash
9
+ als add-auth --provider-type=sql --db-url=
10
+ als add-auth --provider-type=sql --db_url=postgresql://postgres:p@localhost/authdb
11
+
12
+ als add-auth --provider-type=keycloak --db-url=localhost
13
+ als add-auth --provider-type=keycloak --db-url=hardened
14
+
15
+ als add-auth --provider-type=None # to disable
16
+ ```