ethyca-fides 2.71.2b0__py2.py3-none-any.whl → 2.72.0rc0__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 (271) hide show
  1. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/RECORD +239 -233
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/4bfbeff34611_add_polling_status.py +45 -12
  5. fides/api/api/v1/endpoints/connection_endpoints.py +38 -45
  6. fides/api/api/v1/endpoints/saas_config_endpoints.py +60 -48
  7. fides/api/api/v1/endpoints/system.py +11 -43
  8. fides/api/api/v1/endpoints/user_endpoints.py +8 -1
  9. fides/api/app_setup.py +1 -3
  10. fides/api/common_exceptions.py +4 -0
  11. fides/api/email_templates/get_email_template.py +3 -0
  12. fides/api/email_templates/template_names.py +1 -0
  13. fides/api/email_templates/templates/manual_task_digest.html +316 -0
  14. fides/api/models/detection_discovery/monitor_task.py +1 -0
  15. fides/api/models/digest/digest_execution.py +11 -1
  16. fides/api/models/event_audit.py +9 -0
  17. fides/api/models/messaging_template.py +7 -0
  18. fides/api/schemas/connection_configuration/connection_config.py +1 -30
  19. fides/api/schemas/messaging/messaging.py +15 -0
  20. fides/api/service/connectors/saas/connector_registry_service.py +1 -138
  21. fides/api/service/deps.py +8 -0
  22. fides/api/service/messaging/message_dispatch_service.py +38 -1
  23. fides/api/tasks/__init__.py +0 -1
  24. fides/api/util/connection_util.py +99 -215
  25. fides/api/util/event_audit_util.py +230 -0
  26. fides/api/util/masking_util.py +31 -0
  27. fides/api/util/saas_config_updater.py +66 -0
  28. fides/service/connection/__init__.py +0 -0
  29. fides/service/connection/connection_service.py +651 -0
  30. fides/service/event_audit_service.py +16 -22
  31. fides/ui-build/static/admin/404.html +1 -1
  32. fides/ui-build/static/admin/_next/static/SnBet3d7BrNVkglIl0ajl/_buildManifest.js +1 -0
  33. fides/ui-build/static/admin/_next/static/chunks/{1437-fb699e9d69c3e325.js → 1437-b49af8562f54a625.js} +1 -1
  34. fides/ui-build/static/admin/_next/static/chunks/155-dd7bf4b1acc077f6.js +1 -0
  35. fides/ui-build/static/admin/_next/static/chunks/{1817-10b392e1dd9c4673.js → 1817-9e4a1b1897e9bf98.js} +1 -1
  36. fides/ui-build/static/admin/_next/static/chunks/{2040-01d5edb1802d3482.js → 2040-68eb3a5d010c1e97.js} +1 -1
  37. fides/ui-build/static/admin/_next/static/chunks/{2397-40506a386a3a469a.js → 2397-fc4d998dd825ec4d.js} +1 -1
  38. fides/ui-build/static/admin/_next/static/chunks/3377-d0a01db227febac8.js +1 -0
  39. fides/ui-build/static/admin/_next/static/chunks/{3696-259be222ea12392a.js → 3696-19767df579460115.js} +1 -1
  40. fides/ui-build/static/admin/_next/static/chunks/3700-12cb80d0f957fcc4.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/401-3bcfbf738f028868.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/5185-7474c764ea99f1ca.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/{5258-2d28b2c64acf5de3.js → 5258-f16177770ded638e.js} +1 -1
  44. fides/ui-build/static/admin/_next/static/chunks/{5279-21929b12c927b022.js → 5279-c00fe2f02fb0884a.js} +1 -1
  45. fides/ui-build/static/admin/_next/static/chunks/{5643-7583c1f8dbd83273.js → 5643-d43eaf754759827a.js} +1 -1
  46. fides/ui-build/static/admin/_next/static/chunks/{5783-55c0387508e50f3e.js → 5783-38508f27d73ce33d.js} +1 -1
  47. fides/ui-build/static/admin/_next/static/chunks/6277-24790943a32f4310.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/{6315-2d4e86a32fc40458.js → 6315-8e75ebd641e72b64.js} +1 -1
  49. fides/ui-build/static/admin/_next/static/chunks/{6853-cb15625a713b3ef9.js → 6853-a9bf7b1e3efc4890.js} +1 -1
  50. fides/ui-build/static/admin/_next/static/chunks/6954-50bacf2850b67baa.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/7245-0fb0a47c8d09b133.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/{7476-f25fce73eeb1f9c6.js → 7476-1ff6e16cd626c709.js} +1 -1
  53. fides/ui-build/static/admin/_next/static/chunks/{7488-df17b592fbeaa1eb.js → 7488-d8dae51cdc7beded.js} +1 -1
  54. fides/ui-build/static/admin/_next/static/chunks/7630-e679419d1b9ccb40.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/{8011-56031d82d5428981.js → 8011-4712e3cd2f4ac324.js} +1 -1
  56. fides/ui-build/static/admin/_next/static/chunks/{8373-7f940f5ac9c38b1f.js → 8373-d1e097f06ec2ee69.js} +1 -1
  57. fides/ui-build/static/admin/_next/static/chunks/{9046-31b16a7e872c22be.js → 9046-4833f2609581dba5.js} +1 -1
  58. fides/ui-build/static/admin/_next/static/chunks/9070-72f484137b9e8c01.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/{9330-cea1bf40f5d27e53.js → 9330-4e0809deb8798d22.js} +1 -1
  60. fides/ui-build/static/admin/_next/static/chunks/{9682-2754256aeae141bb.js → 9682-38892cb66c7f95e3.js} +1 -1
  61. fides/ui-build/static/admin/_next/static/chunks/{9899-15530c468d5656a1.js → 9899-c643484881627fb2.js} +1 -1
  62. fides/ui-build/static/admin/_next/static/chunks/9965-2236fd3e20e82310.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-9e869a44215709ed.js → _app-2e4cd4b7602e1bb3.js} +43 -43
  64. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-dba951f9d47e999b.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-42d903108bea604f.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-f8ecba33126e0c25.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-224e9981280a4dc5.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-144f4a5d20e97568.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{projects-69b429a9d30ebaf1.js → projects-567785f8792366e1.js} +1 -1
  70. fides/ui-build/static/admin/_next/static/chunks/pages/{data-catalog-a53ef0161235ee47.js → data-catalog-bfd0c20e75b8b920.js} +1 -1
  71. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-b38ccd2e832e49f3.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-98f2ad49cf056476.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/{[monitorId]-ace848575e688200.js → [monitorId]-ce9c88efaa0e1574.js} +1 -1
  74. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{action-center-53ca31c50c43007f.js → action-center-ba88a4fb3040868b.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{activity-f87e4a0f664f4cde.js → activity-fe2bfdf0311bfef8.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{new-db54d01fd8f6df50.js → new-a942e03888533e9d.js} +1 -1
  77. fides/ui-build/static/admin/_next/static/chunks/pages/{dataset-55d312af5228e098.js → dataset-cdc0702d27cf8c33.js} +1 -1
  78. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-488beba62e832660.js → [id]-06012371d6895224.js} +1 -1
  79. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-4aad5495f9bf81ce.js → new-206e6e6d1fe2410f.js} +1 -1
  80. fides/ui-build/static/admin/_next/static/chunks/pages/{index-8a2ba955d92d52ee.js → index-c67367086367c633.js} +1 -1
  81. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-627a239ad9ee583c.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-f69b04d3b4cf43b1.js → integrations-95e69be79db496a8.js} +1 -1
  83. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-f57a7e0fa0980ccd.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-ffe085b4c4397507.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-6eaa901f9b870009.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-f5bce1ceb0502f04.js → FormikAntFormItem-4de259b097029614.js} +1 -1
  87. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-90b4ea9f9deca6e2.js → FormikControlled-8b141c7922fa9ac7.js} +1 -1
  88. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3bdf46d79cc0109f.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{[id]-fe4ed3ad75151e36.js → [id]-3f0d46ca6f1b519f.js} +1 -1
  90. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/{storage-de681c2d022c9e0d.js → storage-8954850d483b26f3.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/{privacy-requests-cd8ba2eef9085377.js → privacy-requests-454ebb8c7af36486.js} +1 -1
  92. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-9981789c06a174a7.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-c298a89b006c2646.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-91efbb5b334823a1.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{custom-fields-ea9baf24de35d3b1.js → custom-fields-401ed29bd0c5df46.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-ee33c5de7339d7d4.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-33448bf0a1d53870.js → locations-787738296ba93cf2.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-e93333bb5a79dc53.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{organization-3c315036f1fc9f90.js → organization-7376fc65cbfa9fb4.js} +1 -1
  100. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-085834d81742e278.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/systems-c6317160d10b8f29.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/{taxonomy-cecea5832cb1f3b0.js → taxonomy-ea7e284bc31a4dc2.js} +1 -1
  103. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-726fbc0a34ffba1f.js → [id]-ba3b6d517ef5de22.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-df9b75ab01c1a2ea.js → user-management-ed8df757a8129298.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/css/80cba63bd8a9a6c7.css +1 -0
  106. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  107. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  108. fides/ui-build/static/admin/add-systems.html +1 -1
  109. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  110. fides/ui-build/static/admin/consent/configure.html +1 -1
  111. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  112. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  113. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  114. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  115. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  116. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  117. fides/ui-build/static/admin/consent/properties.html +1 -1
  118. fides/ui-build/static/admin/consent/reporting.html +1 -1
  119. fides/ui-build/static/admin/consent.html +1 -1
  120. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  121. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  122. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  123. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  124. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  125. fides/ui-build/static/admin/data-catalog.html +1 -1
  126. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  127. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/data-explorer.html +1 -1
  128. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  129. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  130. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  131. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  132. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  133. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  134. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  135. fides/ui-build/static/admin/datamap.html +1 -1
  136. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  137. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  138. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  139. fides/ui-build/static/admin/dataset/new.html +1 -1
  140. fides/ui-build/static/admin/dataset.html +1 -1
  141. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  142. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  143. fides/ui-build/static/admin/datastore-connection.html +1 -1
  144. fides/ui-build/static/admin/index.html +1 -1
  145. fides/ui-build/static/admin/integrations/[id].html +1 -1
  146. fides/ui-build/static/admin/integrations.html +1 -1
  147. fides/ui-build/static/admin/login/[provider].html +1 -1
  148. fides/ui-build/static/admin/login.html +1 -1
  149. fides/ui-build/static/admin/messaging/[id].html +1 -1
  150. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  151. fides/ui-build/static/admin/messaging.html +1 -1
  152. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  153. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  154. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  155. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  156. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  157. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  158. fides/ui-build/static/admin/poc/forms.html +1 -1
  159. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  160. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  161. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  162. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  163. fides/ui-build/static/admin/privacy-requests.html +1 -1
  164. fides/ui-build/static/admin/properties/[id].html +1 -1
  165. fides/ui-build/static/admin/properties/add-property.html +1 -1
  166. fides/ui-build/static/admin/properties.html +1 -1
  167. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  168. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  169. fides/ui-build/static/admin/settings/about.html +1 -1
  170. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  171. fides/ui-build/static/admin/settings/consent.html +1 -1
  172. fides/ui-build/static/admin/settings/custom-fields/[id].html +1 -1
  173. fides/ui-build/static/admin/settings/custom-fields/new.html +1 -1
  174. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  175. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  176. fides/ui-build/static/admin/settings/domains.html +1 -1
  177. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  178. fides/ui-build/static/admin/settings/locations.html +1 -1
  179. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -1
  180. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -1
  181. fides/ui-build/static/admin/settings/messaging-providers.html +1 -1
  182. fides/ui-build/static/admin/settings/organization.html +1 -1
  183. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  184. fides/ui-build/static/admin/settings/regulations.html +1 -1
  185. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  186. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  187. fides/ui-build/static/admin/systems.html +1 -1
  188. fides/ui-build/static/admin/taxonomy.html +1 -1
  189. fides/ui-build/static/admin/user-management/new.html +1 -1
  190. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  191. fides/ui-build/static/admin/user-management.html +1 -1
  192. fides/ui-build/static/admin/_next/static/chunks/155-3d03f101c662c054.js +0 -1
  193. fides/ui-build/static/admin/_next/static/chunks/3377-4c129258b4c4ea28.js +0 -1
  194. fides/ui-build/static/admin/_next/static/chunks/3700-42976bfaad3b91c9.js +0 -1
  195. fides/ui-build/static/admin/_next/static/chunks/401-5270e3e23b08ab2b.js +0 -1
  196. fides/ui-build/static/admin/_next/static/chunks/5185-325e5435a0c7dcb7.js +0 -1
  197. fides/ui-build/static/admin/_next/static/chunks/6277-ca31d48a33202761.js +0 -1
  198. fides/ui-build/static/admin/_next/static/chunks/6954-08b59d28d7a2a43b.js +0 -1
  199. fides/ui-build/static/admin/_next/static/chunks/7245-895bb7c6a6c797bc.js +0 -1
  200. fides/ui-build/static/admin/_next/static/chunks/7630-71582de0e818e28f.js +0 -1
  201. fides/ui-build/static/admin/_next/static/chunks/9070-13f237db78da586d.js +0 -1
  202. fides/ui-build/static/admin/_next/static/chunks/9965-54037b6c8f36d14b.js +0 -1
  203. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-1c9cef80deccb15d.js +0 -1
  204. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-4adeec3bcec05f7b.js +0 -1
  205. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-4254abef7bb52edd.js +0 -1
  206. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-8e76cbfaf71fdcb9.js +0 -1
  207. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-93730a4316c0d980.js +0 -1
  208. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-f85f4f8fcf1bfbdb.js +0 -1
  209. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/data-explorer-3619e454763dba09.js +0 -1
  210. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-4580f70eb41b6a7d.js +0 -1
  211. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-c7ba755c2e0e2377.js +0 -1
  212. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f14bfd5890a0e939.js +0 -1
  213. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-e4274a4d5d23eea9.js +0 -1
  214. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-520ba5ae02f47bda.js +0 -1
  215. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-764b6ce8e030d4a1.js +0 -1
  216. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-da78452b3c41b29e.js +0 -1
  217. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-6442e761ecb5c65a.js +0 -1
  218. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-6f61d886aa6f5ce7.js +0 -1
  219. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-776258bad0941a7d.js +0 -1
  220. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-8067e12227210f48.js +0 -1
  221. fides/ui-build/static/admin/_next/static/chunks/pages/systems-277ea1f34c3714cf.js +0 -1
  222. fides/ui-build/static/admin/_next/static/css/372d6a236c84613f.css +0 -1
  223. fides/ui-build/static/admin/_next/static/zmEQMSpOBih8kmA1t-EWO/_buildManifest.js +0 -1
  224. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/WHEEL +0 -0
  225. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/entry_points.txt +0 -0
  226. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/licenses/LICENSE +0 -0
  227. {ethyca_fides-2.71.2b0.dist-info → ethyca_fides-2.72.0rc0.dist-info}/top_level.txt +0 -0
  228. /fides/ui-build/static/admin/_next/static/{zmEQMSpOBih8kmA1t-EWO → SnBet3d7BrNVkglIl0ajl}/_ssgManifest.js +0 -0
  229. /fides/ui-build/static/admin/_next/static/chunks/{1099-27b2d4e59a569b38.js → 1099-0b3dedca0b088f1a.js} +0 -0
  230. /fides/ui-build/static/admin/_next/static/chunks/{1115-8fb5000847f73ec7.js → 1115-a124adb312fb2699.js} +0 -0
  231. /fides/ui-build/static/admin/_next/static/chunks/{2921-edfdffa353a611e4.js → 2921-d3e9c85cdd7c27ef.js} +0 -0
  232. /fides/ui-build/static/admin/_next/static/chunks/{3772-aa7beafe5df5e656.js → 3772-f110cd525aead279.js} +0 -0
  233. /fides/ui-build/static/admin/_next/static/chunks/{3923-fa1d71afc7dc9e6e.js → 3923-ae843be719d73ef4.js} +0 -0
  234. /fides/ui-build/static/admin/_next/static/chunks/{4817-5f9b9c9bafe888f1.js → 4817-1ec683be64664576.js} +0 -0
  235. /fides/ui-build/static/admin/_next/static/chunks/{549-c3b4c51f45a84a52.js → 549-9892a4d85bcbf7a2.js} +0 -0
  236. /fides/ui-build/static/admin/_next/static/chunks/{7773-98d34d188ae0a694.js → 7773-fcd7875cd98f5f39.js} +0 -0
  237. /fides/ui-build/static/admin/_next/static/chunks/{796-7944f684f8945506.js → 796-f3fc016814418a8b.js} +0 -0
  238. /fides/ui-build/static/admin/_next/static/chunks/{9826-e71887e2c4283249.js → 9826-cbfbfc79b6841f08.js} +0 -0
  239. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-2014144a1a0fa64f.js → 404-aa3982e4f51705df.js} +0 -0
  240. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-4f3ba02774f27795.js → manual-a37865aa5cf14ea2.js} +0 -0
  241. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-f7bdc2da53137ffd.js → add-vendors-611f37b6e9031263.js} +0 -0
  242. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{configure-a27b220fe76bdc8e.js → configure-21123d6de9094ca2.js} +0 -0
  243. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-542fd4a4322122f1.js → [id]-5e5eae30956fea95.js} +0 -0
  244. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-d31d1c233e94dc1f.js → [id]-13e4cc79e134b563.js} +0 -0
  245. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ea057e6217993f9.js → new-ba8ee9f3b86763c3.js} +0 -0
  246. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-eb557180eded0abd.js → properties-1585e94b122004f3.js} +0 -0
  247. /fides/ui-build/static/admin/_next/static/chunks/pages/{consent-c64589e53338e59a.js → consent-35925fa8990ec083.js} +0 -0
  248. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-8cd4d1d6ba000333.js → [projectUrn]-ca7f388ecd1601df.js} +0 -0
  249. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-8c7103ebf01d6e6a.js → resources-c3a69a1d0d38cea7.js} +0 -0
  250. /fides/ui-build/static/admin/_next/static/chunks/pages/{datamap-ae7a4c1c4eabc0d4.js → datamap-7e3e7bf39b111f66.js} +0 -0
  251. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/{[...subfieldNames]-179e5d09ccff50c1.js → [...subfieldNames]-a3f64d75bdfe8936.js} +0 -0
  252. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/{[collectionName]-59466e5e238c59d0.js → [collectionName]-9fe2facc2f232fde.js} +0 -0
  253. /fides/ui-build/static/admin/_next/static/chunks/pages/dataset/{[datasetId]-36d90c8c39fb0d1c.js → [datasetId]-fd69a9c224af3746.js} +0 -0
  254. /fides/ui-build/static/admin/_next/static/chunks/pages/{datastore-connection-496ec7ecca8259dc.js → datastore-connection-5efe1b59a50befd8.js} +0 -0
  255. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-d6eed2dc5d27f625.js → [id]-ab70f1fad73df45f.js} +0 -0
  256. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-c7b43fa365f4be10.js → add-template-0f2238b930e6acd8.js} +0 -0
  257. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-d6043ae8dae6ef7d.js → FormikField-25d78a1dbaf785ed.js} +0 -0
  258. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-b46f432b51421fae.js → table-migration-fc3e49b5ee4a4d23.js} +0 -0
  259. /fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/{configure-04ebf2fb6fc4358a.js → configure-948e71f3cfbe304e.js} +0 -0
  260. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-f75a407d78857ab3.js → [id]-180bb94838bca304.js} +0 -0
  261. /fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-975ff605e1dbc09c.js → add-property-719bbd424816ef58.js} +0 -0
  262. /fides/ui-build/static/admin/_next/static/chunks/pages/{properties-e7fdf3a9a3e8c267.js → properties-ca707af08bca687a.js} +0 -0
  263. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{domain-records-44d06e280990854d.js → domain-records-e57ee1a08caacb1b.js} +0 -0
  264. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{email-templates-11148b182370fd83.js → email-templates-3fce669766a3d183.js} +0 -0
  265. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{[key]-4a18d8135c0dbf2a.js → [key]-ad748b76b1cc69ba.js} +0 -0
  266. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/{new-41957281b8ec26b1.js → new-d962d09f6156484c.js} +0 -0
  267. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{privacy-requests-00917525c9245a90.js → privacy-requests-bf97b87395719636.js} +0 -0
  268. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-5d924b2f1f926b88.js → regulations-2c938cdf5915ff39.js} +0 -0
  269. /fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-1a902922759cae76.js → [id]-62015f01f64578b2.js} +0 -0
  270. /fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-629c88e90699369b.js → new-789f5ee80227c57b.js} +0 -0
  271. /fides/ui-build/static/admin/_next/static/chunks/{webpack-118fb4723d13c14f.js → webpack-119be8f042eb6b8b.js} +0 -0
@@ -28,6 +28,7 @@ from fides.api.schemas.messaging.messaging import (
28
28
  ErrorNotificationBodyParams,
29
29
  ExternalUserWelcomeBodyParams,
30
30
  FidesopsMessage,
31
+ ManualTaskDigestBodyParams,
31
32
  MessagingActionType,
32
33
  MessagingMethod,
33
34
  MessagingServiceDetails,
@@ -177,6 +178,7 @@ def dispatch_message(
177
178
  UserInviteBodyParams,
178
179
  ErrorNotificationBodyParams,
179
180
  ExternalUserWelcomeBodyParams,
181
+ ManualTaskDigestBodyParams,
180
182
  ]
181
183
  ] = None,
182
184
  subject_override: Optional[str] = None,
@@ -352,7 +354,7 @@ def _render(template_str: str, variables: Optional[Dict] = None) -> str:
352
354
  return template_str
353
355
 
354
356
 
355
- def _build_email( # pylint: disable=too-many-return-statements, too-many-branches
357
+ def _build_email( # pylint: disable=too-many-return-statements, too-many-branches, too-many-statements
356
358
  config_proxy: ConfigProxy,
357
359
  action_type: MessagingActionType,
358
360
  body_params: Any,
@@ -494,6 +496,41 @@ def _build_email( # pylint: disable=too-many-return-statements, too-many-branch
494
496
  template_variables=variables,
495
497
  )
496
498
 
499
+ if action_type == MessagingActionType.MANUAL_TASK_DIGEST:
500
+ variables = {
501
+ "vendor_contact_name": body_params.vendor_contact_name,
502
+ "organization_name": body_params.organization_name,
503
+ "portal_url": body_params.portal_url,
504
+ "imminent_task_count": body_params.imminent_task_count,
505
+ "upcoming_task_count": body_params.upcoming_task_count,
506
+ "total_task_count": body_params.total_task_count,
507
+ "company_logo_url": body_params.company_logo_url,
508
+ }
509
+
510
+ # Start with default subject
511
+ subject = f"Weekly DSR Summary from {body_params.organization_name}"
512
+
513
+ # If messaging template exists, extract customizable content
514
+ if messaging_template:
515
+ # Use custom subject if provided
516
+ if "subject" in messaging_template.content:
517
+ subject = _render(messaging_template.content["subject"], variables)
518
+
519
+ # Use custom body content to replace the intro text in HTML template
520
+ custom_body = messaging_template.content.get("body", "")
521
+ if custom_body.strip():
522
+ # Replace the default intro text with the custom body content
523
+ rendered_custom_body = _render(custom_body, variables)
524
+ variables["intro_text"] = rendered_custom_body
525
+
526
+ # Always use the HTML template
527
+ base_template = get_email_template(action_type)
528
+ return EmailForActionType(
529
+ subject=subject,
530
+ body=base_template.render(variables),
531
+ template_variables=variables,
532
+ )
533
+
497
534
  logger.error("Message action type {} is not implemented", action_type)
498
535
  raise MessageDispatchException(
499
536
  f"Message action type {action_type} is not implemented"
@@ -86,7 +86,6 @@ class DatabaseTask(Task): # pylint: disable=W0223
86
86
  # to prevent session overlap when requests are executing concurrently
87
87
  # when in task_always_eager mode (i.e. without proper workers)
88
88
  new_session = self._sessionmaker()
89
- logger.debug(f"DatabaseTaskSession ID: {id(new_session)}. Self ID: {id(self)}")
90
89
  return new_session
91
90
 
92
91
 
@@ -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)