ethyca-fides 2.71.1b1__py2.py3-none-any.whl → 2.74.0rc1__py2.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.

Potentially problematic release.


This version of ethyca-fides might be problematic. Click here for more details.

Files changed (495) hide show
  1. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/METADATA +3 -2
  2. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/RECORD +377 -327
  3. fides/_version.py +3 -3
  4. fides/api/alembic/alembic.ini +5 -1
  5. fides/api/alembic/migrations/env.py +7 -1
  6. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +68 -0
  7. fides/api/alembic/migrations/versions/65a1bc82ae09_adds_experience_config_for_delete_.py +53 -0
  8. fides/api/alembic/migrations/versions/7db29f9cd77b_create_new_sub_request_table.py +95 -0
  9. fides/api/alembic/migrations/versions/a55e12c2c2df_add_tagging_instructions_to_data_.py +29 -0
  10. fides/api/alembic/migrations/versions/b97e92b038d2_add_digest_execution_model.py +117 -0
  11. fides/api/alembic/migrations/versions/c09e76282dd1_add_privacy_request_duplication_cols.py +64 -0
  12. fides/api/alembic/migrations/versions/xx_2025_10_17_1603_5093e92e2a5a_add_consent_data_v3_to_the_database.py +72 -0
  13. fides/api/alembic/migrations/versions/xx_2025_10_27_1834_67f0f2f4748e_adding_identity_definition_model.py +45 -0
  14. fides/api/alembic/migrations/versions/xx_2025_10_29_1659_80d28dea3b6b_added_duplicate_group_table.py +79 -0
  15. fides/api/alembic/migrations/versions/xx_2025_11_05_0200_f1a2b3c4d5e6_create_staged_resource_error_table.py +82 -0
  16. fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
  17. fides/api/api/v1/endpoints/generic_overrides.py +75 -6
  18. fides/api/api/v1/endpoints/privacy_request_endpoints.py +60 -6
  19. fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
  20. fides/api/api/v1/endpoints/system.py +11 -43
  21. fides/api/api/v1/endpoints/user_endpoints.py +8 -1
  22. fides/api/app_setup.py +1 -3
  23. fides/api/common_exceptions.py +8 -0
  24. fides/api/db/base.py +2 -0
  25. fides/api/db/database.py +257 -2
  26. fides/api/email_templates/get_email_template.py +3 -0
  27. fides/api/email_templates/template_names.py +1 -0
  28. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  29. fides/api/main.py +2 -2
  30. fides/api/models/attachment.py +1 -0
  31. fides/api/models/detection_discovery/__init__.py +2 -0
  32. fides/api/models/detection_discovery/core.py +10 -0
  33. fides/api/models/detection_discovery/monitor_task.py +1 -0
  34. fides/api/models/detection_discovery/staged_resource_error.py +25 -0
  35. fides/api/models/digest/__init__.py +2 -0
  36. fides/api/models/digest/digest_config.py +10 -1
  37. fides/api/models/digest/digest_execution.py +142 -0
  38. fides/api/models/event_audit.py +17 -0
  39. fides/api/models/identity_definition.py +65 -0
  40. fides/api/models/messaging_template.py +7 -0
  41. fides/api/models/privacy_experience.py +11 -0
  42. fides/api/models/privacy_preference.py +2 -0
  43. fides/api/models/privacy_request/duplicate_group.py +84 -0
  44. fides/api/models/privacy_request/privacy_request.py +56 -8
  45. fides/api/models/privacy_request/request_task.py +98 -1
  46. fides/api/models/sql_models.py +3 -0
  47. fides/api/models/taxonomy.py +14 -4
  48. fides/api/models/v3/__init__.py +0 -0
  49. fides/api/models/v3/privacy_preferences.py +85 -0
  50. fides/api/models/worker_task.py +8 -0
  51. fides/api/schemas/application_config.py +28 -0
  52. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  53. fides/api/schemas/messaging/messaging.py +15 -0
  54. fides/api/schemas/privacy_request.py +17 -3
  55. fides/api/schemas/saas/async_polling_configuration.py +81 -0
  56. fides/api/schemas/saas/saas_config.py +10 -3
  57. fides/api/schemas/saas/strategy_configuration.py +0 -12
  58. fides/api/schemas/taxonomy_extensions.py +8 -0
  59. fides/api/service/async_dsr/handlers/__init__.py +0 -0
  60. fides/api/service/async_dsr/handlers/polling_attachment_handler.py +155 -0
  61. fides/api/service/async_dsr/handlers/polling_request_handler.py +88 -0
  62. fides/api/service/async_dsr/handlers/polling_response_handler.py +261 -0
  63. fides/api/service/async_dsr/handlers/polling_sub_request_handler.py +123 -0
  64. fides/api/service/async_dsr/strategies/__init__.py +0 -0
  65. fides/api/service/async_dsr/strategies/async_dsr_strategy.py +52 -0
  66. fides/api/service/async_dsr/strategies/async_dsr_strategy_callback.py +199 -0
  67. fides/api/service/async_dsr/strategies/async_dsr_strategy_factory.py +72 -0
  68. fides/api/service/async_dsr/strategies/async_dsr_strategy_polling.py +686 -0
  69. fides/api/service/async_dsr/utils.py +130 -0
  70. fides/api/service/connectors/bigquery_connector.py +34 -16
  71. fides/api/service/connectors/fides/fides_client.py +63 -1
  72. fides/api/service/connectors/query_configs/saas_query_config.py +160 -79
  73. fides/api/service/connectors/saas/connector_registry_service.py +1 -138
  74. fides/api/service/connectors/saas_connector.py +116 -94
  75. fides/api/service/connectors/sql_connector.py +14 -4
  76. fides/api/service/deps.py +8 -0
  77. fides/api/service/messaging/message_dispatch_service.py +38 -1
  78. fides/api/service/privacy_request/attachment_handling.py +9 -2
  79. fides/api/service/privacy_request/duplication_detection.py +424 -0
  80. fides/api/service/privacy_request/request_runner_service.py +46 -84
  81. fides/api/service/privacy_request/request_service.py +47 -74
  82. fides/api/service/saas_request/saas_request_override_factory.py +71 -1
  83. fides/api/task/execute_request_tasks.py +17 -9
  84. fides/api/task/filter_results.py +35 -2
  85. fides/api/task/graph_task.py +37 -8
  86. fides/api/tasks/__init__.py +0 -1
  87. fides/api/util/connection_util.py +99 -215
  88. fides/api/util/event_audit_util.py +230 -0
  89. fides/api/util/logger_context_utils.py +3 -1
  90. fides/api/util/masking_util.py +31 -0
  91. fides/api/util/memory_watchdog.py +118 -0
  92. fides/api/util/saas_config_updater.py +66 -0
  93. fides/api/util/saas_util.py +28 -1
  94. fides/common/api/scope_registry.py +0 -7
  95. fides/common/api/v1/urn_registry.py +2 -0
  96. fides/config/__init__.py +10 -1
  97. fides/config/celery_settings.py +42 -0
  98. fides/config/config_proxy.py +10 -0
  99. fides/config/duplicate_detection_settings.py +31 -0
  100. fides/config/execution_settings.py +7 -3
  101. fides/config/utils.py +5 -0
  102. fides/data/language/languages.yml +2 -0
  103. fides/service/connection/__init__.py +0 -0
  104. fides/service/connection/connection_service.py +651 -0
  105. fides/service/event_audit_service.py +16 -22
  106. fides/service/privacy_request/privacy_request_service.py +162 -43
  107. fides/service/taxonomy/handlers/legacy_handler.py +3 -3
  108. fides/service/taxonomy/taxonomy_service.py +15 -15
  109. fides/ui-build/static/admin/404.html +1 -1
  110. fides/ui-build/static/admin/_next/static/FZTEUgamBvOhgPWce135w/_buildManifest.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/{1115-90baef2a89f361ad.js → 1115-0da062111df309bf.js} +1 -1
  112. fides/ui-build/static/admin/_next/static/chunks/{6148-59a59d5c5925344f.js → 1533-84e250d1f26e6d7d.js} +1 -1
  113. fides/ui-build/static/admin/_next/static/chunks/1817-508b16628e8eb225.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/1840-5bbe6d878ed73fb4.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/{1975.78e719130cfe3fd6.js → 1975.afe8cad52f904fcf.js} +1 -1
  116. fides/ui-build/static/admin/_next/static/chunks/{2040-fdecc41a18e40bdc.js → 2040-fe1a06d82c0413f1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/2397-40b8db1cb2f23e2a.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/2921-b10bbc3a9104933b.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/3214-90ce0a366b0f461a.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/3377-eb5cd82b3ee6ab0c.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/3615-5e2d062d684b8fa1.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/3655-93ecd09f1cb9dbef.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/{3696-90c8b336bbc46782.js → 3696-6db05a35ae806825.js} +1 -1
  124. fides/ui-build/static/admin/_next/static/chunks/{3923-98bea73b618292aa.js → 3923-44255a63d6d80ff5.js} +1 -1
  125. fides/ui-build/static/admin/_next/static/chunks/401-fe8db8b5d8f600de.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/{4259.d1507e0db19cbed7.js → 4259.05038c9b78467244.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/4277-13bcf4516326d474.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/431-e01ee730c8ad9ece.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/4496-bed72bd5639075be.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/454-d5c2c84f1a14e4f1.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/4817-d29f40d4ce729f37.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/5185-b2ac9fecc00b67e7.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/5258-4672eae0656430f9.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/5487-8dedd1ca94fbba54.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/549-6e2442db533a711e.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/5643-55d758444a8d7162.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/5724-1e40975cefa405f0.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/{5783-d119cb132abd8a91.js → 5783-6055edba275155ca.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/6084-82e2df433fe5ba85.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/6344-3e21444374f8059f.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/6362-12e3fd23130ccf15.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/6372-a8d0f08dac1ebd0e.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/6780-3db5133c1f4c6f1e.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/6853-1adbdf6418ec3d62.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/6954-aa0c60ee1092be8e.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/7059-12be23a345a94c1e.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/7079-6e6efc3396ff1ebb.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/7218-d297a4a06f924b09.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/7245-686665c197b58e68.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/{7476-d055aa931da47ac0.js → 7476-a43c046c24de37cc.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/chunks/7630-c654c61ba98d8c74.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/7654-716cf37a020b3d11.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/{796-02086581996a0548.js → 796-e83ace3c6ab99ac7.js} +1 -1
  154. fides/ui-build/static/admin/_next/static/chunks/8212-b9e8295ca883c9f8.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/8939-4925751c57c51f87.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/9014-eeae6f581158e645.js +1 -0
  157. fides/ui-build/static/admin/_next/static/chunks/9046-e4daf28840a69fd6.js +1 -0
  158. fides/ui-build/static/admin/_next/static/chunks/{5596-29a7c8322530b7cf.js → 9195-550bd50d538c5f79.js} +3 -3
  159. fides/ui-build/static/admin/_next/static/chunks/9330-e519adec48222d45.js +1 -0
  160. fides/ui-build/static/admin/_next/static/chunks/9341-bfc0e59bcc56c604.js +1 -0
  161. fides/ui-build/static/admin/_next/static/chunks/9450-b7b7bb1d755ecf57.js +1 -0
  162. fides/ui-build/static/admin/_next/static/chunks/{9676.b86ecbcfe5afd25d.js → 9676.7d029a5383595b69.js} +1 -1
  163. fides/ui-build/static/admin/_next/static/chunks/9682-da69ac5d06f281da.js +1 -0
  164. fides/ui-build/static/admin/_next/static/chunks/{9826-ccedc28e978ca9e1.js → 9826-657652d55936a8c6.js} +1 -1
  165. fides/ui-build/static/admin/_next/static/chunks/9911-ece086f2230e34f0.js +1 -0
  166. fides/ui-build/static/admin/_next/static/chunks/9965-56c5e4fc9cd3b3a5.js +1 -0
  167. fides/ui-build/static/admin/_next/static/chunks/pages/{404-2eb8aed4939f1142.js → 404-d079b8bf35250874.js} +1 -1
  168. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-c1c2f757b1f3da12.js → _app-e64fd8510033a27c.js} +63 -63
  169. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-ddd9d7d40847fc28.js +1 -0
  170. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-b4d18c1f4d414f5f.js +1 -0
  171. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-d451bc8932330141.js +1 -0
  172. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-7a258b7ecd6da4b8.js → add-vendors-c24663cd5dec57db.js} +1 -1
  173. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-fb5017ff5fa54fcc.js → configure-d93418688bd258eb.js} +1 -1
  174. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-e1e2fd704ac2d71d.js → [id]-9b1f2b1c06968166.js} +1 -1
  175. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{new-a5e738a234dadc7e.js → new-115a085e5d42de45.js} +1 -1
  176. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d9b7b311195df29e.js +1 -0
  177. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-5fc78b78a51c239c.js → [id]-3de34624829cbce8.js} +1 -1
  178. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-b79bcb93b5f4c734.js → new-dc95e7ed278d1a29.js} +1 -1
  179. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-cdfc9bb19f47c709.js +1 -0
  180. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-069f4e3ee96ebf77.js → properties-0b995b01dc4dbd1f.js} +1 -1
  181. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-e3ad3a55624e302a.js +1 -0
  182. fides/ui-build/static/admin/_next/static/chunks/pages/{consent-d2bf72508c3cad55.js → consent-b37ed76849330edd.js} +1 -1
  183. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2fa4b3a58f75f81d.js → [resourceUrn]-dd82729296dee5c5.js} +1 -1
  184. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-49e5477eb1a11b92.js +1 -0
  185. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-dfc1ead4a12c9ffa.js +1 -0
  186. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-5b31e3d7727b917a.js → [resourceUrn]-8442eb219958ac7e.js} +1 -1
  187. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-feda358d1801c18d.js +1 -0
  188. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-d16acb6fc07aad46.js +1 -0
  189. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore/[monitorId]-c51a1e98c45d231a.js +1 -0
  190. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/datastore-4498881c26f1458d.js +1 -0
  191. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]/[systemId]-bcfe38eebca30f8c.js +1 -0
  192. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website/[monitorId]-f66d0655897c4400.js +1 -0
  193. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/website-5b3e0009d442bc3f.js +1 -0
  194. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-6f1e012cd641da19.js +1 -0
  195. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-581d6248fcf98d17.js +1 -0
  196. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-844a8de0d1b506e2.js → [resourceUrn]-ddc1c1641e1e9430.js} +1 -1
  197. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-11b07cf2d91b17ef.js → detection-2b48f7e524743b2b.js} +1 -1
  198. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-5525cf287d4ab493.js → [resourceUrn]-862b67418600251e.js} +1 -1
  199. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-ed4723e1b67d890e.js → discovery-0ffec855f5df262c.js} +1 -1
  200. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-6a030ab8c2e2b0db.js +1 -0
  201. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-6cb66f649b8ca4bf.js +1 -0
  202. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-0b008dad90b00aaa.js +1 -0
  203. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-5566edf9a9d1be2d.js +1 -0
  204. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4ca1f485b6e9e02.js +1 -0
  205. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-85dee7e81dc4bafb.js +1 -0
  206. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-e905e018a2cab35d.js +1 -0
  207. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-912723bc86299b1a.js +1 -0
  208. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-f1f0affc18327033.js +1 -0
  209. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-1f4335dca5c09860.js → fides-js-docs-5235760b3e508d7d.js} +1 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/{index-b74d1e8608ae5b5d.js → index-692d27dbe9392c9f.js} +1 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-1b94e2d769a182b2.js +1 -0
  212. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adfe6c5ac5b703d0.js +1 -0
  213. fides/ui-build/static/admin/_next/static/chunks/pages/new-privacy-requests-f9be7080ebbb7445.js +1 -0
  214. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/[id]-caaa8602a1d449b1.js +1 -0
  215. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests/new-9b106b1d2d93985b.js +1 -0
  216. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/digests-6a1ded8cdde836c4.js +1 -0
  217. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/[key]-f94e3accf9507ebf.js +1 -0
  218. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers/new-5e83220ff1f2a250.js +1 -0
  219. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/providers-a03cbd698a23e5b3.js +1 -0
  220. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/[id]-3cde574b3c8447c0.js +1 -0
  221. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates/add-template-0448bb4ae8536c58.js +1 -0
  222. fides/ui-build/static/admin/_next/static/chunks/pages/notifications/templates-1621a4b87c432117.js +1 -0
  223. fides/ui-build/static/admin/_next/static/chunks/pages/notifications-4ea28f6b1dd63642.js +1 -0
  224. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-e02516d9fd314528.js +1 -0
  225. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-fec08bea801b4918.js +1 -0
  226. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-d911e5fbf5a4a888.js +1 -0
  227. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-91b1adcac6a57b2d.js +1 -0
  228. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-de309d8813b1ebfb.js +1 -0
  229. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-f2943c1309062284.js +1 -0
  230. fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-29fb7b39f8962650.js → table-migration-03eda417711ae909.js} +1 -1
  231. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-1fe486f3af832c80.js +1 -0
  232. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-ea6f78fa8b2d3f6c.js +1 -0
  233. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-8f577df28ebca869.js → configure-bda7b474493e7128.js} +1 -1
  234. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-2c0ec8fed16c20ae.js +1 -0
  235. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-57a75c7e9659271a.js → [id]-30d298a47e85709f.js} +1 -1
  236. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-8964c2300206bc89.js → add-property-438084cca0d0f10d.js} +1 -1
  237. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-08472b2a6bf1d392.js → properties-17fd44d98f5bd5b6.js} +1 -1
  238. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-baf77d34a3b3bece.js +1 -0
  239. fides/ui-build/static/admin/_next/static/chunks/pages/sandbox/privacy-notices-8c80391025ca7339.js +1 -0
  240. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-7c19810858b708cc.js +1 -0
  241. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-ee8820fe0fa14c77.js +1 -0
  242. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{[id]-bd1042a0e9be6aff.js → [id]-8eb862182f19a6c2.js} +1 -1
  243. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields/{new-469ad83c8cfa1290.js → new-37c29ef618e9fe3c.js} +1 -1
  244. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-1db425150dcb1b6b.js +1 -0
  245. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-744f669431b84f71.js → domain-records-e334b43fa5c5b1e6.js} +1 -1
  246. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-9d18eb5c38d85522.js +1 -0
  247. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-604790638c656fbd.js → email-templates-cb937ed7c4b1e5a8.js} +1 -1
  248. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-be2a885150adc133.js → locations-835281251f0785cd.js} +1 -1
  249. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c86162afe9759df.js → organization-7fd050c92866938c.js} +1 -1
  250. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-59ea66130fca0d05.js +1 -0
  251. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-4fe3b90747d885e5.js → regulations-b0fe1051d908f366.js} +1 -1
  252. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-f108bf5015144d2f.js +1 -0
  253. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-4d470bbf199a2f9c.js → [id]-0e7c7228d01290ea.js} +1 -1
  254. fides/ui-build/static/admin/_next/static/chunks/pages/systems-adc13b542e10a37d.js +1 -0
  255. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-23dd250da26511c5.js +1 -0
  256. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-98f737e735eaa0f0.js → [id]-aed30fb22ae7c9ec.js} +1 -1
  257. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-562624e5461083ec.js → user-management-6b88ca3e02ee67c9.js} +1 -1
  258. fides/ui-build/static/admin/_next/static/chunks/webpack-6f97ebe373e7ef6b.js +1 -0
  259. fides/ui-build/static/admin/_next/static/css/012b10627a654d5c.css +1 -0
  260. fides/ui-build/static/admin/_next/static/css/05d05fc31d09638b.css +1 -0
  261. fides/ui-build/static/admin/_next/static/css/0fd6e0884cfcc5f3.css +1 -0
  262. fides/ui-build/static/admin/_next/static/css/14ba79c49597d37a.css +1 -0
  263. fides/ui-build/static/admin/_next/static/css/{34a7eb08b86ddb57.css → 3d6582469f7d56e0.css} +1 -1
  264. fides/ui-build/static/admin/_next/static/css/4861ca3e088f2d05.css +1 -0
  265. fides/ui-build/static/admin/_next/static/css/65ae906f224cd8ae.css +1 -0
  266. fides/ui-build/static/admin/_next/static/css/a1800714b486e230.css +1 -0
  267. fides/ui-build/static/admin/_next/static/css/af32fcac7a177a0e.css +1 -0
  268. fides/ui-build/static/admin/_next/static/css/cb417f0587918f85.css +1 -0
  269. fides/ui-build/static/admin/_next/static/css/d5701118537cbdd2.css +1 -0
  270. fides/ui-build/static/admin/_next/static/css/dd15c278b964de80.css +1 -0
  271. fides/ui-build/static/admin/_next/static/css/{5f393dea1c0d031c.css → f89607996ad54f4b.css} +1 -1
  272. fides/ui-build/static/admin/_next/static/css/f9a2a44d3d34c904.css +1 -0
  273. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  274. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  275. fides/ui-build/static/admin/add-systems.html +1 -1
  276. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  277. fides/ui-build/static/admin/consent/configure.html +1 -1
  278. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  279. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  280. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  281. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  282. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  283. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  284. fides/ui-build/static/admin/consent/properties.html +1 -1
  285. fides/ui-build/static/admin/consent/reporting.html +1 -1
  286. fides/ui-build/static/admin/consent.html +1 -1
  287. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  288. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  289. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  290. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  291. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  292. fides/ui-build/static/admin/data-catalog.html +1 -1
  293. fides/ui-build/static/admin/data-discovery/action-center/datastore/[monitorId].html +1 -0
  294. fides/ui-build/static/admin/data-discovery/action-center/datastore.html +1 -0
  295. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId]/[systemId].html +1 -0
  296. fides/ui-build/static/admin/data-discovery/action-center/website/[monitorId].html +1 -0
  297. fides/ui-build/static/admin/data-discovery/action-center/website.html +1 -0
  298. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  299. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  300. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  301. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  302. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  303. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  304. fides/ui-build/static/admin/datamap.html +1 -1
  305. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  306. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  307. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  308. fides/ui-build/static/admin/dataset/new.html +1 -1
  309. fides/ui-build/static/admin/dataset.html +1 -1
  310. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  311. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  312. fides/ui-build/static/admin/datastore-connection.html +1 -1
  313. fides/ui-build/static/admin/index.html +1 -1
  314. fides/ui-build/static/admin/integrations/[id].html +1 -1
  315. fides/ui-build/static/admin/integrations.html +1 -1
  316. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  317. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  318. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  319. fides/ui-build/static/admin/lib/fides-tcf.js +3 -3
  320. fides/ui-build/static/admin/lib/fides.js +3 -3
  321. fides/ui-build/static/admin/login/[provider].html +1 -1
  322. fides/ui-build/static/admin/login.html +1 -1
  323. fides/ui-build/static/admin/new-privacy-requests.html +1 -0
  324. fides/ui-build/static/admin/notifications/digests/[id].html +1 -0
  325. fides/ui-build/static/admin/notifications/digests/new.html +1 -0
  326. fides/ui-build/static/admin/notifications/digests.html +1 -0
  327. fides/ui-build/static/admin/notifications/providers/[key].html +1 -0
  328. fides/ui-build/static/admin/notifications/providers/new.html +1 -0
  329. fides/ui-build/static/admin/notifications/providers.html +1 -0
  330. fides/ui-build/static/admin/notifications/templates/[id].html +1 -0
  331. fides/ui-build/static/admin/notifications/templates/add-template.html +1 -0
  332. fides/ui-build/static/admin/notifications/templates.html +1 -0
  333. fides/ui-build/static/admin/notifications.html +1 -0
  334. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  335. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  336. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  337. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  338. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  339. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  340. fides/ui-build/static/admin/poc/forms.html +1 -1
  341. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  342. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  343. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  344. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  345. fides/ui-build/static/admin/privacy-requests.html +1 -1
  346. fides/ui-build/static/admin/properties/[id].html +1 -1
  347. fides/ui-build/static/admin/properties/add-property.html +1 -1
  348. fides/ui-build/static/admin/properties.html +1 -1
  349. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  350. fides/ui-build/static/admin/sandbox/privacy-notices.html +1 -0
  351. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  352. fides/ui-build/static/admin/settings/about.html +1 -1
  353. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  354. fides/ui-build/static/admin/settings/consent.html +1 -1
  355. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  356. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  357. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  358. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  359. fides/ui-build/static/admin/settings/domains.html +1 -1
  360. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  361. fides/ui-build/static/admin/settings/locations.html +1 -1
  362. fides/ui-build/static/admin/settings/organization.html +1 -1
  363. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  364. fides/ui-build/static/admin/settings/regulations.html +1 -1
  365. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  366. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  367. fides/ui-build/static/admin/systems.html +1 -1
  368. fides/ui-build/static/admin/taxonomy.html +1 -1
  369. fides/ui-build/static/admin/user-management/new.html +1 -1
  370. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  371. fides/ui-build/static/admin/user-management.html +1 -1
  372. fides/api/service/async_dsr/async_dsr_service.py +0 -195
  373. fides/api/service/async_dsr/async_dsr_strategy.py +0 -5
  374. fides/api/service/async_dsr/async_dsr_strategy_callback.py +0 -16
  375. fides/api/service/async_dsr/async_dsr_strategy_factory.py +0 -63
  376. fides/api/service/async_dsr/async_dsr_strategy_polling.py +0 -94
  377. fides/ui-build/static/admin/_next/static/_IxwgneyQjdSaZFEF3Tqu/_buildManifest.js +0 -1
  378. fides/ui-build/static/admin/_next/static/chunks/1316-2606e19807c08aa5.js +0 -1
  379. fides/ui-build/static/admin/_next/static/chunks/1467-8808ec8836e033f9.js +0 -1
  380. fides/ui-build/static/admin/_next/static/chunks/155-b4337d0826d5addc.js +0 -1
  381. fides/ui-build/static/admin/_next/static/chunks/1817-1ad037b7d6d2f6d2.js +0 -1
  382. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +0 -1
  383. fides/ui-build/static/admin/_next/static/chunks/2150-930ffaf2c4718edc.js +0 -1
  384. fides/ui-build/static/admin/_next/static/chunks/255-1bc0cbef7a59cdc6.js +0 -1
  385. fides/ui-build/static/admin/_next/static/chunks/2921-66f65496c3a09316.js +0 -1
  386. fides/ui-build/static/admin/_next/static/chunks/2962-e92d525bf570a9a3.js +0 -1
  387. fides/ui-build/static/admin/_next/static/chunks/346-aa3b88efb85f2e28.js +0 -1
  388. fides/ui-build/static/admin/_next/static/chunks/3550-83cb70e80cbe41ba.js +0 -1
  389. fides/ui-build/static/admin/_next/static/chunks/3585-f728d32fda6f1ac1.js +0 -1
  390. fides/ui-build/static/admin/_next/static/chunks/3855-ed226b8a8050bd40.js +0 -1
  391. fides/ui-build/static/admin/_next/static/chunks/3872-04d3afbfa41a7782.js +0 -1
  392. fides/ui-build/static/admin/_next/static/chunks/401-ffe4e8436e1eceb9.js +0 -1
  393. fides/ui-build/static/admin/_next/static/chunks/409-5c3d31163028339f.js +0 -1
  394. fides/ui-build/static/admin/_next/static/chunks/431-78bf05f35d7eec4f.js +0 -1
  395. fides/ui-build/static/admin/_next/static/chunks/4558-8305aee48def1dcd.js +0 -1
  396. fides/ui-build/static/admin/_next/static/chunks/4608-0c6ef78e30a51f84.js +0 -1
  397. fides/ui-build/static/admin/_next/static/chunks/4718-3a412bdb90add82f.js +0 -1
  398. fides/ui-build/static/admin/_next/static/chunks/502-0d9f4ac29ef34a1c.js +0 -1
  399. fides/ui-build/static/admin/_next/static/chunks/504-88caa30c03374e9b.js +0 -1
  400. fides/ui-build/static/admin/_next/static/chunks/5163-e682273cd76a7d07.js +0 -1
  401. fides/ui-build/static/admin/_next/static/chunks/5185-51eaa78e3ed6bfb7.js +0 -1
  402. fides/ui-build/static/admin/_next/static/chunks/5279-12c9cbdc67ad7b14.js +0 -1
  403. fides/ui-build/static/admin/_next/static/chunks/5309-3b6cf0cc9d0c6a83.js +0 -1
  404. fides/ui-build/static/admin/_next/static/chunks/5574-c31ea831371610d5.js +0 -1
  405. fides/ui-build/static/admin/_next/static/chunks/5619-9b50cec521203989.js +0 -1
  406. fides/ui-build/static/admin/_next/static/chunks/5643-10a36584c399526c.js +0 -1
  407. fides/ui-build/static/admin/_next/static/chunks/6277-182efc294d413f64.js +0 -1
  408. fides/ui-build/static/admin/_next/static/chunks/6419-9b3a86af57c86791.js +0 -1
  409. fides/ui-build/static/admin/_next/static/chunks/6853-7004a8c420b1ca02.js +0 -1
  410. fides/ui-build/static/admin/_next/static/chunks/6882-dbe0a25dcf1a8ee0.js +0 -1
  411. fides/ui-build/static/admin/_next/static/chunks/6954-4b24e1731c1cc3b3.js +0 -1
  412. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +0 -1
  413. fides/ui-build/static/admin/_next/static/chunks/7045-14e955890f1147e4.js +0 -1
  414. fides/ui-build/static/admin/_next/static/chunks/7079-50571e9f3269d74d.js +0 -1
  415. fides/ui-build/static/admin/_next/static/chunks/7158-04745cc8d684b2e7.js +0 -1
  416. fides/ui-build/static/admin/_next/static/chunks/7218-e2983b96b95e33b4.js +0 -1
  417. fides/ui-build/static/admin/_next/static/chunks/7630-d0d3a0fe3f95e971.js +0 -1
  418. fides/ui-build/static/admin/_next/static/chunks/7725-f2a7be705b75dcc3.js +0 -1
  419. fides/ui-build/static/admin/_next/static/chunks/7929-0fd0d4948bc8d70e.js +0 -1
  420. fides/ui-build/static/admin/_next/static/chunks/8002-ed832921ad190832.js +0 -1
  421. fides/ui-build/static/admin/_next/static/chunks/8765-f622a35b40a7ec63.js +0 -1
  422. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +0 -1
  423. fides/ui-build/static/admin/_next/static/chunks/9046-b6616ba7b59d947e.js +0 -1
  424. fides/ui-build/static/admin/_next/static/chunks/9187-7438242f0d380bb0.js +0 -1
  425. fides/ui-build/static/admin/_next/static/chunks/9226-4a7027057f55ca2a.js +0 -1
  426. fides/ui-build/static/admin/_next/static/chunks/9278-08cc704317fe535e.js +0 -1
  427. fides/ui-build/static/admin/_next/static/chunks/9729-fcf6ff4e3534e4a8.js +0 -1
  428. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-4ec03eed67572861.js +0 -1
  429. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-2ca59996860a33c5.js +0 -1
  430. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-19214babd1f219e3.js +0 -1
  431. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-92182be6603c2842.js +0 -1
  432. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-ab54b19609bff325.js +0 -1
  433. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-c1a3caf3c286bf5d.js +0 -1
  434. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-4a1af12d2d7cd660.js +0 -1
  435. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-99573a1ee3ef8f4c.js +0 -1
  436. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources-6e429b7511028d60.js +0 -1
  437. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-b7326c51d88cc2cc.js +0 -1
  438. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-5b57f9132426fe52.js +0 -1
  439. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-0d512528b498d75c.js +0 -1
  440. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-040813022f0890c9.js +0 -1
  441. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-a28cc0e23bbe4fc8.js +0 -1
  442. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-7d22222608ec3aac.js +0 -1
  443. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-0abd30eada811b5b.js +0 -1
  444. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-007965429368d9a3.js +0 -1
  445. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-60a4a9eb4aab4c11.js +0 -1
  446. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d514cd4ec62e3b03.js +0 -1
  447. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-0e3a6ac4797ffbbb.js +0 -1
  448. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-816e02b6cbe4a684.js +0 -1
  449. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-b6838162200141b3.js +0 -1
  450. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-223c2d1ded51bfb1.js +0 -1
  451. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-153eb88ab4e7dc6d.js +0 -1
  452. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-331544e9b85c4ac2.js +0 -1
  453. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-e8d2140787045acd.js +0 -1
  454. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-e3f93462a08251bf.js +0 -1
  455. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-b5f7d6afdecd013d.js +0 -1
  456. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-248ad9f65a872442.js +0 -1
  457. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-aedb66a62042b10a.js +0 -1
  458. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-018df38b7cd77fdb.js +0 -1
  459. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-6ca9099d03aab817.js +0 -1
  460. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-0f2c90786ea005a4.js +0 -1
  461. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-200b51a725f8b2d1.js +0 -1
  462. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-7dac2302f573f5ee.js +0 -1
  463. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-479890582973deaf.js +0 -1
  464. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-7af00f72cf694077.js +0 -1
  465. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-f7753e9effae3816.js +0 -1
  466. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-f3e6e74e0efb005c.js +0 -1
  467. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-4d658222ec800511.js +0 -1
  468. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-2fcd95c41e578d57.js +0 -1
  469. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a3275554ffe8e640.js +0 -1
  470. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-77239269acc2d31a.js +0 -1
  471. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-8bf1821722b082e9.js +0 -1
  472. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-8d92be437793c96f.js +0 -1
  473. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-97221067330c0c27.js +0 -1
  474. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-2deb6becece69d46.js +0 -1
  475. fides/ui-build/static/admin/_next/static/chunks/pages/systems-6c91bdea40875227.js +0 -1
  476. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-3059aba38adefa56.js +0 -1
  477. fides/ui-build/static/admin/_next/static/chunks/webpack-2766492c5dbceb0a.js +0 -1
  478. fides/ui-build/static/admin/_next/static/css/073713cd1eddda79.css +0 -1
  479. fides/ui-build/static/admin/_next/static/css/23cf870196941c9a.css +0 -1
  480. fides/ui-build/static/admin/_next/static/css/295d729ea1b11885.css +0 -1
  481. fides/ui-build/static/admin/_next/static/css/304c6f148886a8d4.css +0 -1
  482. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +0 -1
  483. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +0 -1
  484. fides/ui-build/static/admin/messaging/[id].html +0 -1
  485. fides/ui-build/static/admin/messaging/add-template.html +0 -1
  486. fides/ui-build/static/admin/messaging.html +0 -1
  487. fides/ui-build/static/admin/settings/messaging-providers/[key].html +0 -1
  488. fides/ui-build/static/admin/settings/messaging-providers/new.html +0 -1
  489. fides/ui-build/static/admin/settings/messaging-providers.html +0 -1
  490. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/WHEEL +0 -0
  491. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/entry_points.txt +0 -0
  492. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/licenses/LICENSE +0 -0
  493. {ethyca_fides-2.71.1b1.dist-info → ethyca_fides-2.74.0rc1.dist-info}/top_level.txt +0 -0
  494. /fides/ui-build/static/admin/_next/static/{_IxwgneyQjdSaZFEF3Tqu → FZTEUgamBvOhgPWce135w}/_ssgManifest.js +0 -0
  495. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-7dce2916cc589c54.js} +0 -0
@@ -6,30 +6,17 @@ from fideslang.validation import FidesKey
6
6
  from loguru import logger
7
7
  from pydantic import Field, ValidationError
8
8
  from sqlalchemy.orm import Session
9
- from starlette.status import (
10
- HTTP_400_BAD_REQUEST,
11
- HTTP_404_NOT_FOUND,
12
- HTTP_422_UNPROCESSABLE_ENTITY,
13
- )
9
+ from starlette.status import HTTP_404_NOT_FOUND, HTTP_422_UNPROCESSABLE_ENTITY
14
10
 
15
11
  from fides.api.api import deps
16
12
  from fides.api.common_exceptions import (
17
- ClientUnsuccessfulException,
18
- ConnectionException,
13
+ ConnectionNotFoundException,
19
14
  KeyOrNameAlreadyExists,
15
+ SaaSConfigNotFoundException,
20
16
  )
21
17
  from fides.api.common_exceptions import ValidationError as FidesValidationError
22
- from fides.api.models.connectionconfig import (
23
- ConnectionConfig,
24
- ConnectionTestStatus,
25
- ConnectionType,
26
- )
18
+ from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
27
19
  from fides.api.models.datasetconfig import DatasetConfig
28
- from fides.api.models.manual_task import (
29
- ManualTask,
30
- ManualTaskParentEntityType,
31
- ManualTaskType,
32
- )
33
20
  from fides.api.models.manual_webhook import AccessManualWebhook
34
21
  from fides.api.models.privacy_request import PrivacyRequest
35
22
  from fides.api.models.sql_models import Dataset as CtlDataset # type: ignore
@@ -38,7 +25,6 @@ from fides.api.schemas.api import BulkUpdateFailed
38
25
  from fides.api.schemas.connection_configuration import (
39
26
  ConnectionConfigSecretsSchema,
40
27
  connection_secrets_schemas,
41
- get_connection_secrets_schema,
42
28
  )
43
29
  from fides.api.schemas.connection_configuration.connection_config import (
44
30
  BulkPutConnectionConfiguration,
@@ -48,23 +34,13 @@ from fides.api.schemas.connection_configuration.connection_config import (
48
34
  from fides.api.schemas.connection_configuration.connection_secrets import (
49
35
  TestStatusMessage,
50
36
  )
51
- from fides.api.schemas.connection_configuration.connection_secrets_dynamic_erasure_email import (
52
- validate_dynamic_erasure_email_dataset_references,
53
- )
54
- from fides.api.schemas.connection_configuration.connection_secrets_saas import (
55
- validate_saas_secrets_external_references,
56
- )
57
- from fides.api.schemas.connection_configuration.saas_config_template_values import (
58
- SaasConnectionTemplateValues,
59
- )
60
37
  from fides.api.schemas.privacy_request import PrivacyRequestStatus
61
- from fides.api.service.connectors import get_connector
62
- from fides.api.service.connectors.saas.connector_registry_service import (
63
- ConnectorRegistry,
64
- create_connection_config_from_template_no_save,
38
+ from fides.common.api.v1.urn_registry import SAAS_CONFIG
39
+ from fides.service.connection.connection_service import (
40
+ ConnectionService,
41
+ ConnectorTemplateNotFound,
65
42
  )
66
- from fides.api.util.logger import Pii
67
- from fides.common.api.v1.urn_registry import CONNECTION_TYPES, SAAS_CONFIG
43
+ from fides.service.event_audit_service import EventAuditService
68
44
  from fides.service.privacy_request.privacy_request_service import queue_privacy_request
69
45
 
70
46
  # pylint: disable=too-many-nested-blocks,too-many-branches,too-many-statements
@@ -95,7 +71,7 @@ def requeue_requires_input_requests(db: Session) -> None:
95
71
  )
96
72
 
97
73
 
98
- def _validate_secrets_error_message() -> str:
74
+ def validate_secrets_error_message() -> str:
99
75
  return f"A SaaS config to validate the secrets is unavailable for this connection config, please add one via {SAAS_CONFIG}"
100
76
 
101
77
 
@@ -106,56 +82,30 @@ def validate_secrets(
106
82
  ) -> ConnectionConfigSecretsSchema:
107
83
  """Validate incoming connection configuration secrets."""
108
84
 
109
- connection_type = connection_config.connection_type
110
- saas_config = connection_config.get_saas_config()
111
- if connection_type == ConnectionType.saas and saas_config is None:
112
- raise HTTPException(
113
- status_code=HTTP_422_UNPROCESSABLE_ENTITY,
114
- detail=_validate_secrets_error_message(),
115
- )
85
+ event_audit_service = EventAuditService(db)
86
+ connection_service = ConnectionService(db, event_audit_service)
116
87
 
117
88
  try:
118
- schema = get_connection_secrets_schema(connection_type.value, saas_config) # type: ignore
119
- logger.info(
120
- "Validating secrets on connection config with key '{}'",
121
- connection_config.key,
89
+ return connection_service.validate_secrets(request_body, connection_config)
90
+ except SaaSConfigNotFoundException:
91
+ raise HTTPException(
92
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
93
+ detail=validate_secrets_error_message(),
122
94
  )
123
- connection_secrets = schema.model_validate(request_body)
95
+ except FidesValidationError as e:
96
+ # Check if the exception has the original pydantic errors attached
97
+ raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
124
98
  except ValidationError as e:
125
- # Intentionally excluding the pydantic url, input, and ctx fields from the error response to hide
126
- # potentially sensitive information
127
99
  errors = e.errors(include_url=False, include_input=False)
128
100
  for err in errors:
129
101
  # Additionally, manually remove the context from the error message -
130
102
  # this may contain sensitive information
131
103
  err.pop("ctx", None)
132
-
133
104
  raise HTTPException(
134
105
  status_code=HTTP_422_UNPROCESSABLE_ENTITY,
135
106
  detail=jsonable_encoder(errors),
136
107
  )
137
108
 
138
- # SaaS secrets with external references must go through extra validation
139
- if connection_type == ConnectionType.saas:
140
- try:
141
- validate_saas_secrets_external_references(db, schema, connection_secrets) # type: ignore
142
-
143
- except FidesValidationError as e:
144
- raise HTTPException(
145
- status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message
146
- )
147
-
148
- # For dynamic erasure emails we must validate the recipient email address
149
- if connection_type == ConnectionType.dynamic_erasure_email:
150
- try:
151
- validate_dynamic_erasure_email_dataset_references(db, connection_secrets)
152
- except FidesValidationError as e:
153
- raise HTTPException(
154
- status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message
155
- )
156
-
157
- return connection_secrets
158
-
159
109
 
160
110
  def patch_connection_configs(
161
111
  db: Session,
@@ -166,134 +116,20 @@ def patch_connection_configs(
166
116
  failed: List[BulkUpdateFailed] = []
167
117
  logger.info("Starting bulk upsert for {} connection configuration(s)", len(configs))
168
118
 
169
- for config in configs:
170
- # Retrieve the existing connection config from the database
171
- existing_connection_config = None
172
- if config.key:
173
- existing_connection_config = ConnectionConfig.get_by(
174
- db, field="key", value=config.key
175
- )
176
-
177
- if config.connection_type == "saas":
178
- if config.secrets:
179
- # This is here rather than with the get_connection_config_or_error because
180
- # it will also throw an HTTPException if validation fails and we don't want
181
- # to catch it in this case.
182
- if existing_connection_config:
183
- config.secrets = validate_secrets(
184
- db, config.secrets, existing_connection_config
185
- )
186
- else:
187
- if not config.saas_connector_type:
188
- raise HTTPException(
189
- status_code=HTTP_422_UNPROCESSABLE_ENTITY,
190
- detail="saas_connector_type is missing",
191
- )
192
-
193
- connector_template = ConnectorRegistry.get_connector_template(
194
- config.saas_connector_type
195
- )
196
- if not connector_template:
197
- raise HTTPException(
198
- status_code=HTTP_404_NOT_FOUND,
199
- detail=f"SaaS connector type '{config.saas_connector_type}' is not yet available in Fides. For a list of available SaaS connectors, refer to {CONNECTION_TYPES}.",
200
- )
201
- try:
202
- template_values = SaasConnectionTemplateValues(
203
- name=config.name,
204
- key=config.key,
205
- description=config.description,
206
- secrets=config.secrets,
207
- instance_key=config.key,
208
- )
209
- if system:
210
- connection_config = (
211
- create_connection_config_from_template_no_save(
212
- db,
213
- connector_template,
214
- template_values,
215
- system_id=system.id,
216
- )
217
- )
218
- else:
219
- connection_config = (
220
- create_connection_config_from_template_no_save(
221
- db,
222
- connector_template,
223
- template_values,
224
- )
225
- )
226
- except KeyOrNameAlreadyExists as exc:
227
- raise HTTPException(
228
- status_code=HTTP_400_BAD_REQUEST,
229
- detail=exc.args[0],
230
- )
231
- except ValidationError as e:
232
- # The "input" potentially contains sensitive info and the Pydantic-specific "url" is not helpful
233
- errors = e.errors(include_url=False, include_input=False)
234
- for err in errors:
235
- # Additionally, manually remove the context from the error message -
236
- # this may contain sensitive information
237
- err.pop("ctx", None)
238
-
239
- raise HTTPException(
240
- status_code=HTTP_422_UNPROCESSABLE_ENTITY,
241
- detail=jsonable_encoder(errors),
242
- )
243
-
244
- connection_config.secrets = validate_secrets(
245
- db,
246
- template_values.secrets,
247
- connection_config,
248
- ).model_dump(mode="json")
249
- connection_config.save(db=db)
250
- created_or_updated.append(
251
- ConnectionConfigurationResponse.model_validate(
252
- connection_config
253
- )
254
- )
255
- continue
119
+ # Initialize the connection service
120
+ event_audit_service = EventAuditService(db)
121
+ connection_service = ConnectionService(db, event_audit_service)
256
122
 
123
+ for config in configs:
257
124
  orig_data = config.model_dump(serialize_as_any=True, mode="json").copy()
258
- config_dict = config.model_dump(serialize_as_any=True, exclude_unset=True)
259
- config_dict.pop("saas_connector_type", None)
260
-
261
- if existing_connection_config:
262
- config_dict = {
263
- key: value
264
- for key, value in {
265
- **existing_connection_config.__dict__,
266
- **config.model_dump(serialize_as_any=True, exclude_unset=True),
267
- }.items()
268
- if isinstance(value, bool) or value
269
- }
270
-
271
- if system:
272
- config_dict["system_id"] = system.id
273
125
 
274
126
  try:
275
- connection_config = ConnectionConfig.create_or_update(
276
- db, data=config_dict, check_name=False
127
+ # Use the service to handle individual connection config processing
128
+ connection_response = connection_service.create_or_update_connection_config(
129
+ config, system
277
130
  )
131
+ created_or_updated.append(connection_response)
278
132
 
279
- # Automatically create a ManualTask if this is a connection config of type manual_task
280
- # and it doesn't already have one
281
- if (
282
- connection_config.connection_type == ConnectionType.manual_task
283
- and not connection_config.manual_task
284
- ):
285
- ManualTask.create(
286
- db=db,
287
- data={
288
- "task_type": ManualTaskType.privacy_request,
289
- "parent_entity_id": connection_config.id,
290
- "parent_entity_type": ManualTaskParentEntityType.connection_config,
291
- },
292
- )
293
-
294
- created_or_updated.append(
295
- ConnectionConfigurationResponse.model_validate(connection_config)
296
- )
297
133
  except KeyOrNameAlreadyExists as exc:
298
134
  logger.warning(
299
135
  "Create/update failed for connection config with key '{}': {}",
@@ -309,6 +145,29 @@ def patch_connection_configs(
309
145
  data=orig_data,
310
146
  )
311
147
  )
148
+ except ConnectorTemplateNotFound as exc:
149
+ raise HTTPException(
150
+ status_code=HTTP_404_NOT_FOUND,
151
+ detail=str(exc),
152
+ )
153
+ except ValidationError as e:
154
+ # The "input" potentially contains sensitive info and the Pydantic-specific "url" is not helpful
155
+ errors = e.errors(include_url=False, include_input=False)
156
+ for err in errors:
157
+ # Additionally, manually remove the context from the error message -
158
+ # this may contain sensitive information
159
+ err.pop("ctx", None)
160
+
161
+ raise HTTPException(
162
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
163
+ detail=jsonable_encoder(errors),
164
+ )
165
+ except ValueError as exc:
166
+ # Handle missing saas_connector_type and other validation errors
167
+ raise HTTPException(
168
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
169
+ detail=str(exc),
170
+ )
312
171
  except Exception as e:
313
172
  logger.warning(
314
173
  "Create/update failed for connection config with key '{}'.", config.key
@@ -327,6 +186,12 @@ def patch_connection_configs(
327
186
  # Check if possibly disabling a manual webhook here causes us to need to queue affected privacy requests
328
187
  requeue_requires_input_requests(db)
329
188
 
189
+ logger.info(
190
+ "Completed bulk upsert for {} connection configuration(s): {} succeeded, {} failed",
191
+ len(configs),
192
+ len(created_or_updated),
193
+ len(failed),
194
+ )
330
195
  return BulkPutConnectionConfiguration(
331
196
  succeeded=created_or_updated,
332
197
  failed=failed,
@@ -352,6 +217,12 @@ def delete_connection_config(db: Session, connection_key: FidesKey) -> None:
352
217
  connection_config = get_connection_config_or_error(db, connection_key)
353
218
  connection_type = connection_config.connection_type
354
219
  logger.info("Deleting connection config with key '{}'.", connection_key)
220
+
221
+ # Initialize services for audit logging
222
+ event_audit_service = EventAuditService(db)
223
+ connection_service = ConnectionService(db, event_audit_service)
224
+
225
+ # Handle SaaS-specific cleanup
355
226
  if connection_config.saas_config:
356
227
  saas_dataset_fides_key = connection_config.saas_config.get("fides_key")
357
228
 
@@ -369,7 +240,8 @@ def delete_connection_config(db: Session, connection_key: FidesKey) -> None:
369
240
  )
370
241
  saas_dataset.delete(db) # type: ignore[union-attr]
371
242
 
372
- connection_config.delete(db)
243
+ # Use connection service to delete with audit logging
244
+ connection_service.delete_connection_config(connection_key)
373
245
 
374
246
  # Access Manual Webhooks are cascade deleted if their ConnectionConfig is deleted,
375
247
  # so we queue any privacy requests that are no longer blocked by webhooks
@@ -382,30 +254,42 @@ def connection_status(
382
254
  ) -> TestStatusMessage:
383
255
  """Connect, verify with a trivial query or API request, and report the status."""
384
256
 
385
- connector = get_connector(connection_config)
257
+ event_audit_service = EventAuditService(db)
258
+ connection_service = ConnectionService(db, event_audit_service)
259
+ return connection_service.connection_status(connection_config, msg)
386
260
 
387
- try:
388
- status: Optional[ConnectionTestStatus] = connector.test_connection()
389
261
 
390
- except (ConnectionException, ClientUnsuccessfulException) as exc:
391
- logger.warning(
392
- "Connection test failed on {}: {}",
393
- connection_config.key,
394
- Pii(str(exc)),
262
+ def update_connection_secrets(
263
+ connection_service: ConnectionService,
264
+ connection_key: FidesKey,
265
+ unvalidated_secrets: connection_secrets_schemas,
266
+ verify: Optional[bool],
267
+ merge_with_existing: Optional[bool] = False,
268
+ ) -> TestStatusMessage:
269
+ try:
270
+ return connection_service.update_secrets(
271
+ connection_key, unvalidated_secrets, verify, merge_with_existing
272
+ )
273
+ except ConnectionNotFoundException:
274
+ raise HTTPException(
275
+ status_code=HTTP_404_NOT_FOUND,
276
+ detail=f"No connection config found with key {connection_key}",
395
277
  )
396
- connection_config.update_test_status(
397
- test_status=ConnectionTestStatus.failed, db=db
278
+ except SaaSConfigNotFoundException:
279
+ raise HTTPException(
280
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
281
+ detail=validate_secrets_error_message(),
398
282
  )
399
- return TestStatusMessage(
400
- msg=msg,
401
- test_status=ConnectionTestStatus.failed,
402
- failure_reason=str(exc),
283
+ except ValidationError as e:
284
+ errors = e.errors(include_url=False, include_input=False)
285
+ for err in errors:
286
+ # Additionally, manually remove the context from the error message -
287
+ # this may contain sensitive information
288
+ err.pop("ctx", None)
289
+ raise HTTPException(
290
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
291
+ detail=jsonable_encoder(errors),
403
292
  )
404
-
405
- logger.info("Connection test {} on {}", status.value, connection_config.key) # type: ignore
406
- connection_config.update_test_status(test_status=status, db=db) # type: ignore
407
-
408
- return TestStatusMessage(
409
- msg=msg,
410
- test_status=status,
411
- )
293
+ except FidesValidationError as e:
294
+ # Check if the exception has the original pydantic errors attached
295
+ raise HTTPException(status_code=HTTP_422_UNPROCESSABLE_ENTITY, detail=e.message)
@@ -0,0 +1,230 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import Any, Dict, Optional, Tuple
4
+
5
+ from fides.api.common_exceptions import NoSuchConnectionTypeSecretSchemaError
6
+ from fides.api.models.connectionconfig import ConnectionConfig
7
+ from fides.api.models.event_audit import EventAuditType
8
+ from fides.api.schemas.connection_configuration.connection_oauth_config import (
9
+ OAuthConfigSchema,
10
+ )
11
+ from fides.api.util.connection_type import get_connection_type_secret_schema
12
+ from fides.api.util.masking_util import mask_sensitive_fields
13
+
14
+
15
+ def normalize_value(value: Any) -> Any:
16
+ """
17
+ Normalize values for consistent comparison and serialization.
18
+
19
+ - Converts datetime objects to ISO strings
20
+ - Converts enums to their string values
21
+ - Converts lists of enums to lists of string values
22
+ - Treats None and empty strings as equivalent (both become None)
23
+ """
24
+ # Treat None and empty strings as equivalent
25
+ if value == "" or value is None:
26
+ return None
27
+ if isinstance(value, datetime):
28
+ return value.isoformat()
29
+ if isinstance(value, Enum):
30
+ return value.value
31
+ if (
32
+ isinstance(value, list) and value and hasattr(value[0], "value")
33
+ ): # List of enums
34
+ return [item.value for item in value]
35
+ return value
36
+
37
+
38
+ def _get_saas_connector_type(connection_config: ConnectionConfig) -> Optional[str]:
39
+ """
40
+ Helper function to extract SaaS connector type from connection config.
41
+
42
+ Args:
43
+ connection_config: The connection configuration
44
+
45
+ Returns:
46
+ SaaS connector type if available, None otherwise
47
+ """
48
+ connection_type = connection_config.connection_type.value # type: ignore[attr-defined]
49
+ if connection_type == "saas" and connection_config.saas_config:
50
+ try:
51
+ saas_config = connection_config.get_saas_config()
52
+ if saas_config:
53
+ return saas_config.type
54
+ except Exception:
55
+ # If SaaS config is invalid, try to get type directly from raw config
56
+ if (
57
+ isinstance(connection_config.saas_config, dict)
58
+ and "type" in connection_config.saas_config
59
+ ):
60
+ return connection_config.saas_config["type"]
61
+ return None
62
+
63
+
64
+ def _create_connection_event_details(
65
+ connection_config: ConnectionConfig,
66
+ operation_type: str,
67
+ changed_fields: Optional[set] = None,
68
+ ) -> Dict[str, Any]:
69
+ """
70
+ Create standardized event details for connection audit events.
71
+
72
+ Args:
73
+ connection_config: The connection configuration
74
+ operation_type: Type of operation (create, update, delete)
75
+ changed_fields: Set of field names that changed (None means include all fields)
76
+
77
+ Returns:
78
+ Standardized event details dictionary
79
+ """
80
+ event_details: dict[str, Any] = {
81
+ "operation_type": operation_type,
82
+ }
83
+
84
+ # Define fields to exclude from audit details
85
+ excluded_fields = {
86
+ "id",
87
+ "created_at",
88
+ "updated_at",
89
+ "secrets",
90
+ }
91
+
92
+ # Dynamically add connection config fields (only changed fields if specified)
93
+ configuration_changes: dict[str, Any] = {}
94
+ for column in connection_config.__table__.columns:
95
+ field_name = column.name
96
+ if field_name not in excluded_fields:
97
+ # If changed_fields is specified, only include fields that changed
98
+ if changed_fields is not None and field_name not in changed_fields:
99
+ continue
100
+
101
+ value = getattr(connection_config, field_name)
102
+
103
+ configuration_changes[field_name] = normalize_value(value)
104
+
105
+ event_details["configuration_changes"] = configuration_changes
106
+ return event_details
107
+
108
+
109
+ def generate_connection_audit_event_details(
110
+ event_type: EventAuditType,
111
+ connection_config: ConnectionConfig,
112
+ description: Optional[str] = None,
113
+ changed_fields: Optional[set] = None,
114
+ ) -> Tuple[Dict[str, Any], str]:
115
+ """
116
+ Create an audit event for connection operations.
117
+
118
+ Args:
119
+ event_type: Type of audit event
120
+ connection_config: The connection configuration
121
+ description: Human-readable description
122
+ changed_fields: Set of field names that changed (None means include all fields)
123
+
124
+ Returns:
125
+ Created EventAudit instance
126
+ """
127
+ # Determine operation type from event type
128
+ operation_type = event_type.value.split(".")[
129
+ -1
130
+ ] # e.g., "created", "updated", "deleted"
131
+
132
+ # Create standardized event details
133
+ if operation_type == "deleted":
134
+ event_details = {
135
+ "operation_type": operation_type,
136
+ }
137
+ else:
138
+ event_details = _create_connection_event_details(
139
+ connection_config,
140
+ operation_type,
141
+ changed_fields,
142
+ )
143
+
144
+ # Generate description if not provided
145
+ connection_type = connection_config.connection_type.value # type: ignore[attr-defined]
146
+ connector_type = _get_saas_connector_type(connection_config)
147
+
148
+ description = f"Connection {operation_type}: {connector_type if connector_type else connection_type} connection '{connection_config.key}'"
149
+
150
+ return event_details, description
151
+
152
+
153
+ def generate_connection_secrets_event_details(
154
+ event_type: EventAuditType,
155
+ connection_config: ConnectionConfig,
156
+ secrets_modified: Dict[str, Any],
157
+ ) -> Tuple[Dict[str, Any], str]:
158
+ """
159
+ Create an audit event for connection secrets operations.
160
+
161
+ Args:
162
+ event_type: Type of audit event (should be a connection.secrets.* event)
163
+ connection_config: The connection configuration
164
+ secrets_modified: Dict of secret field names and values that were modified
165
+ changed_fields: Set of field names that changed (None means include all fields)
166
+ description: Human-readable description
167
+
168
+ Returns:
169
+ Created EventAudit instance
170
+ """
171
+ # Determine operation type from event type
172
+ operation_type = event_type.value.split(".")[
173
+ -1
174
+ ] # e.g., "created", "updated", "deleted"
175
+
176
+ # Mask the secrets using the existing masking utility
177
+ saas_config = connection_config.get_saas_config()
178
+ connection_type = connection_config.connection_type.value # type: ignore[attr-defined]
179
+ connection_type = (
180
+ saas_config.type
181
+ if connection_type == "saas" and saas_config
182
+ else connection_type
183
+ )
184
+
185
+ # Get the secret schema for this connection type
186
+ try:
187
+ secret_schema = None
188
+
189
+ # For HTTPS connections with OAuth config, check if we should use OAuth schema
190
+ if connection_type == "https" and connection_config.oauth_config:
191
+ # Get OAuth fields dynamically from the schema
192
+ oauth_schema = OAuthConfigSchema.model_json_schema()
193
+ oauth_fields = set(oauth_schema.get("properties", {}).keys())
194
+ secrets_keys = set(secrets_modified.keys())
195
+
196
+ # If we're updating OAuth fields, use OAuth schema
197
+ if secrets_keys.intersection(oauth_fields):
198
+ secret_schema = oauth_schema
199
+
200
+ # If we haven't set a schema yet, use the connection type's secret schema
201
+ if secret_schema is None:
202
+ secret_schema = get_connection_type_secret_schema(
203
+ connection_type=connection_type
204
+ )
205
+
206
+ # Use existing masking function
207
+ masked_secrets = mask_sensitive_fields(secrets_modified, secret_schema)
208
+ except NoSuchConnectionTypeSecretSchemaError:
209
+ # if there is no schema, mask every secret
210
+ masked_secrets = {key: "**********" for key in secrets_modified}
211
+
212
+ # Create event details with masked secret values
213
+ event_details: dict[str, Any] = {
214
+ "secrets": masked_secrets,
215
+ }
216
+
217
+ # Add SaaS connector type if applicable
218
+ connector_type = _get_saas_connector_type(connection_config)
219
+ if connector_type:
220
+ event_details["saas_connector_type"] = connector_type
221
+
222
+ # Generate description
223
+ secret_names = ", ".join(secrets_modified) if secrets_modified else "secrets"
224
+
225
+ if connector_type:
226
+ description = f"Connection secrets {operation_type}: {connector_type} connection '{connection_config.key}' - {secret_names}"
227
+ else:
228
+ description = f"Connection secrets {operation_type}: {connection_type} connection '{connection_config.key}' - {secret_names}"
229
+
230
+ return event_details, description
@@ -165,7 +165,9 @@ def request_details(
165
165
 
166
166
  if response is not None:
167
167
  if CONFIG.dev_mode and response.content:
168
- details[LoggerContextKeys.response.value] = response.content.decode("utf-8")
168
+ details[LoggerContextKeys.response.value] = response.content.decode(
169
+ "utf-8", errors="replace"
170
+ )
169
171
 
170
172
  details[LoggerContextKeys.status_code.value] = response.status_code
171
173