ethyca-fides 2.69.3b0__py2.py3-none-any.whl → 2.69.3b2__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 (332) hide show
  1. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/METADATA +1 -1
  2. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/RECORD +267 -239
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/30369bb8ae01_add_webmonitorgroupjob_model.py +67 -0
  5. fides/api/alembic/migrations/versions/5fa78b1f324d_add_event_audit_table.py +82 -0
  6. fides/api/alembic/migrations/versions/67d0e389b003_update_consentstatus_enum.py +47 -0
  7. fides/api/alembic/migrations/versions/b9bfa12c167b_add_not_applicable_to_asset_consentstatus.py +46 -0
  8. fides/api/alembic/migrations/versions/f36ce1bde293_add_system_groups.py +132 -0
  9. fides/api/alembic/migrations/versions/fd7571bef683_adds_new_fields_to_messagingconfig_for_.py +31 -0
  10. fides/api/api/v1/endpoints/messaging_endpoints.py +164 -34
  11. fides/api/api/v1/endpoints/system.py +140 -55
  12. fides/api/db/base.py +3 -0
  13. fides/api/db/seed.py +34 -0
  14. fides/api/main.py +2 -0
  15. fides/api/models/asset.py +3 -0
  16. fides/api/models/detection_discovery/web_monitor.py +61 -0
  17. fides/api/models/event_audit.py +68 -0
  18. fides/api/models/messaging.py +30 -10
  19. fides/api/models/sql_models.py +8 -0
  20. fides/api/models/system_group.py +85 -0
  21. fides/api/models/taxonomy.py +16 -4
  22. fides/api/schemas/application_config.py +4 -1
  23. fides/api/schemas/messaging/messaging.py +33 -66
  24. fides/api/schemas/messaging/messaging_secrets_docs_only.py +1 -1
  25. fides/api/schemas/messaging/shared_schemas.py +102 -0
  26. fides/api/schemas/saas/saas_config.py +2 -17
  27. fides/api/schemas/saas/strategy_configuration.py +12 -0
  28. fides/api/schemas/system.py +8 -0
  29. fides/api/service/async_dsr/async_dsr_service.py +130 -10
  30. fides/api/service/async_dsr/async_dsr_strategy.py +5 -0
  31. fides/api/service/async_dsr/async_dsr_strategy_callback.py +16 -0
  32. fides/api/service/async_dsr/async_dsr_strategy_factory.py +63 -0
  33. fides/api/service/async_dsr/async_dsr_strategy_polling.py +94 -0
  34. fides/api/service/connectors/saas_connector.py +25 -7
  35. fides/api/service/deps.py +17 -2
  36. fides/api/service/messaging/message_dispatch_service.py +16 -15
  37. fides/api/service/messaging/messaging_crud_service.py +5 -9
  38. fides/api/service/privacy_request/request_runner_service.py +18 -0
  39. fides/api/service/privacy_request/request_service.py +29 -20
  40. fides/api/service/strategy.py +6 -3
  41. fides/api/task/graph_task.py +1 -2
  42. fides/api/tasks/__init__.py +1 -0
  43. fides/api/util/filter_utils.py +0 -3
  44. fides/api/worker/__init__.py +2 -0
  45. fides/common/api/v1/urn_registry.py +2 -1
  46. fides/service/event_audit_service.py +115 -0
  47. fides/service/messaging/aws_ses_service.py +2 -4
  48. fides/service/system/__init__.py +0 -0
  49. fides/service/system/system_service.py +138 -0
  50. fides/service/taxonomy/taxonomy_service.py +49 -3
  51. fides/ui-build/static/admin/404.html +1 -1
  52. fides/ui-build/static/admin/_next/static/86A8z6OnbTuDYww0DJkX0/_buildManifest.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/1115-d5a834cdaa717edc.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/155-b5e4370b158e5ee3.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/1817-dc2bba3ca736d39e.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/1841-2052c3239f2a0a1a.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/1896-49010da5c2705fc5.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/2040-3f9c66c56a05b336.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/2751-58285ccf50a0ba4b.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/3377-c5e0cc3de1a5ffd1.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/3696-fff4f944d7d5ff20.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/{3855-ef5194cdb228beb6.js → 3855-8377b3fcbb3d93b0.js} +1 -1
  63. fides/ui-build/static/admin/_next/static/chunks/3872-4786ccbe7c6f65b0.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/409-e1deab19fc7e6d99.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/4230-c55d5531697a715c.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/4608-2fbc3389681f6924.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/4786-8d78ec773d171562.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/5185-a219b390ef17ff4b.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/5309-e994c5195f99b1eb.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/5783-c62c79e7be21be73.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/6084-29cbe703bffdccfe.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/6416-79eee298a5b3f80f.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/6780-eeb7775eb21d7a12.js +1 -0
  74. fides/ui-build/static/admin/_next/static/chunks/{6853-b17673391117c976.js → 6853-91a8641cd2784b54.js} +1 -1
  75. fides/ui-build/static/admin/_next/static/chunks/6882-55dbb142f7c40f53.js +1 -0
  76. fides/ui-build/static/admin/_next/static/chunks/6954-6dfafd38b02d5852.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/7476-3da7a490debad8e2.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/7630-22f9c4b25d6aed29.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/7725-b2fa93d747d3d85d.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/7929-4314e317b1717257.js +1 -0
  81. fides/ui-build/static/admin/_next/static/chunks/796-8e4da90ae82dfebb.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/8002-78d78545309b2c1c.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/8373-bd50fa53cbcab2aa.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/9037-453224ba3ee65b13.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/9046-0f92802b0e3382a9.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/9226-49dbcdb135bf9793.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/9826-f316eb1d61cb90b6.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/{9951-a88367a129b724ba.js → 9951-c389c51ca6353035.js} +1 -1
  89. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-fcdad91f6f66292b.js → _app-c780470042750062.js} +10 -10
  90. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{manual-ace203dfacacbdc4.js → manual-fb9434d926ebf0b3.js} +1 -1
  91. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-92034daafd2187a0.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-87919c1192e68b1a.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{privacy-experience-9dda4de5ec580279.js → privacy-experience-ae8a64fffe3f8c66.js} +1 -1
  94. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-d7d9ff9ed28fa790.js +1 -0
  95. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{properties-226efa1dcd41437f.js → properties-c985ea8c1a0e0550.js} +1 -1
  96. fides/ui-build/static/admin/_next/static/chunks/pages/consent/{reporting-28b192e2c074b0f3.js → reporting-ddf6ba92355f81de.js} +1 -1
  97. fides/ui-build/static/admin/_next/static/chunks/pages/consent-35c0ae9d5b5a940c.js +1 -0
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-2c29ff7a01198f30.js → [resourceUrn]-6a196c704f1c6dd7.js} +1 -1
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-06ba907e7d91a724.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-8eb581024bc0172f.js → [resourceUrn]-9cee4e222ebb2b60.js} +1 -1
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-f99af5669b9ab44c.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-db7f1a269d3e7fc2.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-de957913f9b47daa.js +1 -0
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-5868591ff1e5f881.js +1 -0
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-715064e1c9788e1a.js +1 -0
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-8f736b078e9842da.js → [resourceUrn]-9ae81f5c245b8a01.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-eb814e3c22807871.js → detection-6537c93c69b597c7.js} +1 -1
  108. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-6875b7783fcfda2f.js → [resourceUrn]-5db26067d921a94a.js} +1 -1
  109. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-172dbd7740e212ca.js → discovery-9f6a62614d7eb113.js} +1 -1
  110. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-aed0e6dafc143b97.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-72b9878ea9b91529.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-f36a46381a6c25d4.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-b653fd60e7db989b.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-5bb96c8684a38bbf.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-639046f6c76bc8bd.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{[id]-927b7e476c4b47d0.js → [id]-6bf117315d909ad1.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/{new-cbe100d50df34285.js → new-1e2fa11f22dbc449.js} +1 -1
  118. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-c55e3e0e19030f3f.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/index-d66ea87b457af21e.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-0159fbb2e0440709.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/{integrations-95402b5001c07ef2.js → integrations-267d2742fffaebe5.js} +1 -1
  122. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-670b05b03ba11e0a.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-482a7256925a6e06.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-331147598052f25c.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-28083bfb2dec7b9f.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{[id]-e784c05d056b2371.js → [id]-e02dc4b4b385c86f.js} +1 -1
  127. fides/ui-build/static/admin/_next/static/chunks/pages/properties/{add-property-0a7a2db148a7561a.js → add-property-74c2a0ff4c992633.js} +1 -1
  128. fides/ui-build/static/admin/_next/static/chunks/pages/{properties-da734840e4f9d04b.js → properties-7459d56e548925b2.js} +1 -1
  129. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/{datamap-6903f42a0412bfa6.js → datamap-aed018025b09c045.js} +1 -1
  130. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-68eaac2d79133679.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-6c4904c157477285.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/{[purpose_id]-9495e2eb506606c7.js → [purpose_id]-7f2c50044806c094.js} +1 -1
  133. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-e8cab942d09aa358.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-128f952a49a0e8dc.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-cca3d1a26e1269bb.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-07e1b9937a169e32.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-3bc799dac8423f50.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/settings/{locations-2e635dcd11b78224.js → locations-9f36b6c213ae524c.js} +1 -1
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/[key]-f8887b2b29aed1b9.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers/new-5473558807e94462.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/messaging-providers-1065fbefd449719c.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-3e23d92d789fff99.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-907bfbb71d84646f.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-aa1ada4d4ac09759.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/{[id]-6e15332935f6b538.js → [id]-02b0dde03a1ad159.js} +1 -1
  146. fides/ui-build/static/admin/_next/static/chunks/pages/systems-4a6ef2509e8cedfc.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-16b122b83e57bb8c.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/{new-92f52c43f522a350.js → new-6304dad2c5fab694.js} +1 -1
  149. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/{[id]-64452dfae2c5e614.js → [id]-0a8ec3aa2ed59a33.js} +1 -1
  150. fides/ui-build/static/admin/_next/static/chunks/pages/{user-management-9cec020f89544426.js → user-management-4036b023366b7eec.js} +1 -1
  151. fides/ui-build/static/admin/_next/static/css/018c12b58ee7f861.css +1 -0
  152. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  153. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  154. fides/ui-build/static/admin/add-systems.html +1 -1
  155. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  156. fides/ui-build/static/admin/consent/configure.html +1 -1
  157. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  158. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  159. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  160. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  161. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  162. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  163. fides/ui-build/static/admin/consent/properties.html +1 -1
  164. fides/ui-build/static/admin/consent/reporting.html +1 -1
  165. fides/ui-build/static/admin/consent.html +1 -1
  166. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  167. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  168. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  169. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  170. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  171. fides/ui-build/static/admin/data-catalog.html +1 -1
  172. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  173. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  174. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  175. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  176. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  177. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  178. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  179. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  180. fides/ui-build/static/admin/datamap.html +1 -1
  181. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  182. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  183. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  184. fides/ui-build/static/admin/dataset/new.html +1 -1
  185. fides/ui-build/static/admin/dataset.html +1 -1
  186. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  187. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  188. fides/ui-build/static/admin/datastore-connection.html +1 -1
  189. fides/ui-build/static/admin/index.html +1 -1
  190. fides/ui-build/static/admin/integrations/[id].html +1 -1
  191. fides/ui-build/static/admin/integrations.html +1 -1
  192. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  193. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  194. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  195. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  196. fides/ui-build/static/admin/lib/fides.js +2 -2
  197. fides/ui-build/static/admin/login/[provider].html +1 -1
  198. fides/ui-build/static/admin/login.html +1 -1
  199. fides/ui-build/static/admin/messaging/[id].html +1 -1
  200. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  201. fides/ui-build/static/admin/messaging.html +1 -1
  202. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  203. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  204. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  205. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  206. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  207. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  208. fides/ui-build/static/admin/poc/forms.html +1 -1
  209. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  210. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  211. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  212. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  213. fides/ui-build/static/admin/privacy-requests.html +1 -1
  214. fides/ui-build/static/admin/properties/[id].html +1 -1
  215. fides/ui-build/static/admin/properties/add-property.html +1 -1
  216. fides/ui-build/static/admin/properties.html +1 -1
  217. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  218. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  219. fides/ui-build/static/admin/settings/about.html +1 -1
  220. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  221. fides/ui-build/static/admin/settings/consent.html +1 -1
  222. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  223. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  224. fides/ui-build/static/admin/settings/domains.html +1 -1
  225. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  226. fides/ui-build/static/admin/settings/locations.html +1 -1
  227. fides/ui-build/static/admin/settings/messaging-providers/[key].html +1 -0
  228. fides/ui-build/static/admin/settings/messaging-providers/new.html +1 -0
  229. fides/ui-build/static/admin/settings/messaging-providers.html +1 -0
  230. fides/ui-build/static/admin/settings/organization.html +1 -1
  231. fides/ui-build/static/admin/settings/privacy-requests.html +1 -1
  232. fides/ui-build/static/admin/settings/regulations.html +1 -1
  233. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  234. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  235. fides/ui-build/static/admin/systems.html +1 -1
  236. fides/ui-build/static/admin/taxonomy.html +1 -1
  237. fides/ui-build/static/admin/user-management/new.html +1 -1
  238. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  239. fides/ui-build/static/admin/user-management.html +1 -1
  240. fides/ui-build/static/admin/_next/static/FFd0ddRZhjxA7iBCrjLzA/_buildManifest.js +0 -1
  241. fides/ui-build/static/admin/_next/static/chunks/1099-79646e64f26d62fa.js +0 -1
  242. fides/ui-build/static/admin/_next/static/chunks/1345-5e1c5b66e25c566e.js +0 -1
  243. fides/ui-build/static/admin/_next/static/chunks/1817-0ca16d288fad916d.js +0 -1
  244. fides/ui-build/static/admin/_next/static/chunks/3620-602eb74dc896d556.js +0 -1
  245. fides/ui-build/static/admin/_next/static/chunks/3729-c17ac8031a4c4fd1.js +0 -1
  246. fides/ui-build/static/admin/_next/static/chunks/3847-f08c58d074858f48.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/3872-f78dec02f0d959ae.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/4164-355644b916ae0094.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/4608-be8cba73f5d7c326.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/4786-61154adf88e448e1.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/4808-dd4157aa72648068.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/4831-fd99c0b3784de128.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/4844-46324c3d848b8b6a.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/5258-e880b606a2293803.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/5487-02d00bad7c6830e0.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/549-38ea1d91ee2addaa.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/6084-c153669d5567e242.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/6954-5296188c19d7d0ac.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/7476-45c5088baa8b66af.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/7630-7ed6c6117775dffe.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/787-a8c7eab617e2fceb.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/79-65674011d455af4d.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/796-9e1ca1a4030707c5.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/8002-24af20d679efc04e.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/9046-712156d461165f56.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/9826-dbae8dee941a7fac.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-bd0d82078e67cac3.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-7207ab23bdb36ce8.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-94c13aad1499eea9.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/pages/consent-3e8bdefe714254ec.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-5f2d7b24804f861f.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-30108b00ac769fc3.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-3b0bcb9e98fab95c.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-9403d5b239e318d2.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9a81d42a474e1e48.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-b6ae7adb8ef0b525.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-c7390e046b2e2b7f.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-dfd71c1e9c458b89.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-7cdc42ec5493b83d.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-e12b11ba15bc3fc1.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-e32fccc4ca520d2b.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-7c59a6abf6ba6207.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-cce20440b177050b.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/pages/index-6cd8708106331b8d.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-5d40db1ce8810e1d.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-0f25a76dd18c5e20.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-ad6ad3e5bd72765d.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-6032d82f0fc2893d.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-d83e5bd52a638234.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-baf31c3e4b081046.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-a82f3df840d5c1b5.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-d06fb16487705b9d.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-93a978443bf299db.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-9ecb803099082bf4.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-16fdd91a81074dd1.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-4cdd6001e7cb9aee.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-1914de830ce5cfc4.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-f547f1f33c12faf3.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/settings/privacy-requests-2ecc073f41628f62.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-20b1193ed76c56b0.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/systems-fbc8761ef4d55516.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-4d7827fc9c46b6b8.js +0 -1
  303. fides/ui-build/static/admin/_next/static/css/650df9c348000a26.css +0 -1
  304. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +0 -1
  305. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/WHEEL +0 -0
  306. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/entry_points.txt +0 -0
  307. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/licenses/LICENSE +0 -0
  308. {ethyca_fides-2.69.3b0.dist-info → ethyca_fides-2.69.3b2.dist-info}/top_level.txt +0 -0
  309. /fides/ui-build/static/admin/_next/static/{FFd0ddRZhjxA7iBCrjLzA → 86A8z6OnbTuDYww0DJkX0}/_ssgManifest.js +0 -0
  310. /fides/ui-build/static/admin/_next/static/chunks/{2921-52328140bc420d0f.js → 2921-cdc7a13973f4a0ba.js} +0 -0
  311. /fides/ui-build/static/admin/_next/static/chunks/{3923-bb2417b8dcade7a4.js → 3923-db57401384d1de8f.js} +0 -0
  312. /fides/ui-build/static/admin/_next/static/chunks/{401-4af0a912e249d30f.js → 401-4e56e924f35317f2.js} +0 -0
  313. /fides/ui-build/static/admin/_next/static/chunks/pages/{404-471a6b18e712f050.js → 404-e4a1f93a7ce944f0.js} +0 -0
  314. /fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/{multiple-920fb469e0dda1d2.js → multiple-a4f821c4902f2df8.js} +0 -0
  315. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/{add-vendors-406170eaae4329c6.js → add-vendors-96245b63aafc5168.js} +0 -0
  316. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/{[id]-f80cf2d3966816fd.js → [id]-4fea66e59bd59de8.js} +0 -0
  317. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{[id]-b378576cba255609.js → [id]-c8038e05f35da8d1.js} +0 -0
  318. /fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/{new-2ca1de7b88094ab0.js → new-f3a40101a8f3fd00.js} +0 -0
  319. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/{[projectUrn]-04cfe2cfba7b7cd8.js → [projectUrn]-965af6c1fd01334e.js} +0 -0
  320. /fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/{resources-de704de849960f01.js → resources-5afecf141308bfc5.js} +0 -0
  321. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{[id]-3c6dc2f6e6bae960.js → [id]-4352e55f110556b4.js} +0 -0
  322. /fides/ui-build/static/admin/_next/static/chunks/pages/messaging/{add-template-4a6d4023a7791be8.js → add-template-c533120e94e049e3.js} +0 -0
  323. /fides/ui-build/static/admin/_next/static/chunks/pages/{messaging-76b204c9b98d656f.js → messaging-b14f5f38b2d711a8.js} +0 -0
  324. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{ant-components-bc0e2adf6e0d3ac7.js → ant-components-31d51e3b9227c8d5.js} +0 -0
  325. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{AntForm-86ffcc1ad3fa912e.js → AntForm-8794a0d2e7554a05.js} +0 -0
  326. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikAntFormItem-ec04f595465bdf69.js → FormikAntFormItem-90b31073e478c99c.js} +0 -0
  327. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikControlled-41d309754ff0c1de.js → FormikControlled-0a6859a0225b7e00.js} +0 -0
  328. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/{FormikField-cab1f78cec7808f9.js → FormikField-eb0552917907fe21.js} +0 -0
  329. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{forms-eb6058221403b156.js → forms-b2a2a084d8cfe22d.js} +0 -0
  330. /fides/ui-build/static/admin/_next/static/chunks/pages/poc/{table-migration-48500551fd6a7602.js → table-migration-0c944cfa9c6acbff.js} +0 -0
  331. /fides/ui-build/static/admin/_next/static/chunks/pages/settings/{regulations-7c02e469d8c5bd74.js → regulations-f0f0ea35d0185ae3.js} +0 -0
  332. /fides/ui-build/static/admin/_next/static/chunks/{webpack-678e89d68dbcd94f.js → webpack-55e1c55932df2413.js} +0 -0
@@ -1,4 +1,4 @@
1
- from typing import Dict, List, Optional
1
+ from typing import Any, Dict, List, Optional
2
2
 
3
3
  from fastapi import Depends, Security
4
4
  from fastapi.encoders import jsonable_encoder
@@ -26,6 +26,7 @@ from fides.api.common_exceptions import (
26
26
  MessagingConfigNotFoundException,
27
27
  MessagingTemplateValidationException,
28
28
  )
29
+ from fides.api.models.application_config import ApplicationConfig
29
30
  from fides.api.models.messaging import (
30
31
  MessagingConfig,
31
32
  default_messaging_config_key,
@@ -46,16 +47,16 @@ from fides.api.schemas.messaging.messaging import (
46
47
  MessagingConfigResponse,
47
48
  MessagingConfigStatus,
48
49
  MessagingConfigStatusMessage,
50
+ MessagingConnectionTestStatus,
49
51
  MessagingMethod,
50
52
  MessagingServiceType,
51
53
  MessagingTemplateDefault,
52
54
  MessagingTemplateWithPropertiesDetail,
55
+ MessagingTestBodyParams,
53
56
  TestMessagingStatusMessage,
54
57
  UserEmailInviteStatus,
55
58
  )
56
- from fides.api.schemas.messaging.messaging_secrets_docs_only import (
57
- possible_messaging_secrets,
58
- )
59
+ from fides.api.schemas.messaging.shared_schemas import PossibleMessagingSecrets
59
60
  from fides.api.schemas.redis_cache import Identity
60
61
  from fides.api.service.messaging.message_dispatch_service import dispatch_message
61
62
  from fides.api.service.messaging.messaging_crud_service import (
@@ -91,10 +92,14 @@ from fides.common.api.v1.urn_registry import (
91
92
  MESSAGING_TEMPLATE_BY_ID,
92
93
  MESSAGING_TEMPLATE_DEFAULT_BY_TEMPLATE_TYPE,
93
94
  MESSAGING_TEST,
95
+ MESSAGING_TEST_DEPRECATED,
94
96
  V1_URL_PREFIX,
95
97
  )
98
+ from fides.config import get_config
96
99
  from fides.config.config_proxy import ConfigProxy
97
100
 
101
+ CONFIG = get_config()
102
+
98
103
  router = APIRouter(tags=["Messaging"], prefix=V1_URL_PREFIX)
99
104
 
100
105
 
@@ -107,33 +112,73 @@ router = APIRouter(tags=["Messaging"], prefix=V1_URL_PREFIX)
107
112
  def post_config(
108
113
  *,
109
114
  db: Session = Depends(deps.get_db),
110
- messaging_config: MessagingConfigRequest,
115
+ messaging_config_request: MessagingConfigRequest,
111
116
  ) -> MessagingConfigResponse:
112
117
  """
113
118
  Given a messaging config, create corresponding MessagingConfig object, provided no config already exists
114
119
  """
115
120
 
116
121
  try:
117
- return create_or_update_messaging_config(db=db, config=messaging_config)
118
- except ValueError as e:
122
+ # set default values for the name and type if they're not provided
123
+ if not messaging_config_request.name:
124
+ messaging_config_request.name = default_messaging_config_name(
125
+ messaging_config_request.service_type.value
126
+ )
127
+ if not messaging_config_request.key:
128
+ messaging_config_request.key = default_messaging_config_key(
129
+ messaging_config_request.service_type.value
130
+ )
131
+ messaging_config = create_or_update_messaging_config(
132
+ db=db, config=messaging_config_request
133
+ )
134
+ if messaging_config_request.secrets:
135
+ update_config_secrets(
136
+ db,
137
+ messaging_config,
138
+ unvalidated_messaging_secrets=messaging_config_request.secrets,
139
+ )
140
+
141
+ # if there is only one messaging config, make it the default
142
+ messaging_config_count = db.query(MessagingConfig).count()
143
+ if messaging_config_count == 1:
144
+ ApplicationConfig.update_api_set(
145
+ db,
146
+ {
147
+ "notifications": {
148
+ "notification_service_type": messaging_config.service_type
149
+ }
150
+ },
151
+ )
152
+
153
+ return MessagingConfigResponse(
154
+ name=messaging_config.name,
155
+ key=messaging_config.key,
156
+ service_type=messaging_config.service_type.value, # type: ignore
157
+ details=messaging_config.details,
158
+ last_test_timestamp=messaging_config.last_test_timestamp,
159
+ last_test_succeeded=messaging_config.last_test_succeeded,
160
+ )
161
+ except ValueError as exc:
162
+ failed_key = messaging_config_request.key
119
163
  logger.warning(
120
164
  "Create failed for messaging config {}: {}",
121
- messaging_config.key,
122
- Pii(str(e)),
165
+ failed_key,
166
+ str(exc),
123
167
  )
124
168
  raise HTTPException(
125
169
  status_code=HTTP_400_BAD_REQUEST,
126
- detail=f"Config with key {messaging_config.key} failed to be added: {e}",
170
+ detail=f"Config with key {failed_key} failed to be added: {exc}",
127
171
  )
128
172
  except Exception as exc:
173
+ failed_key = messaging_config_request.key
129
174
  logger.warning(
130
175
  "Create failed for messaging config {}: {}",
131
- messaging_config.key,
132
- Pii(str(exc)),
176
+ failed_key,
177
+ str(exc),
133
178
  )
134
179
  raise HTTPException(
135
180
  status_code=HTTP_500_INTERNAL_SERVER_ERROR,
136
- detail=f"Config with key {messaging_config.key} failed to be added: {exc}",
181
+ detail=f"Config with key {failed_key} failed to be added: {exc}",
137
182
  )
138
183
 
139
184
 
@@ -146,13 +191,23 @@ def patch_config_by_key(
146
191
  config_key: FidesKey,
147
192
  *,
148
193
  db: Session = Depends(deps.get_db),
149
- messaging_config: MessagingConfigRequest,
194
+ messaging_config_request: MessagingConfigRequest,
150
195
  ) -> Optional[MessagingConfigResponse]:
151
196
  """
152
197
  Updates config for messaging by key, provided config with key can be found.
153
198
  """
154
199
  try:
155
- return update_messaging_config(db=db, key=config_key, config=messaging_config)
200
+ messaging_config = update_messaging_config(
201
+ db=db, key=config_key, config=messaging_config_request
202
+ )
203
+ return MessagingConfigResponse(
204
+ name=messaging_config.name,
205
+ key=messaging_config.key,
206
+ service_type=messaging_config.service_type.value, # type: ignore
207
+ details=messaging_config.details,
208
+ last_test_timestamp=messaging_config.last_test_timestamp,
209
+ last_test_succeeded=messaging_config.last_test_succeeded,
210
+ )
156
211
  except MessagingConfigNotFoundException:
157
212
  logger.warning("No messaging config found with key {}", config_key)
158
213
  raise HTTPException(
@@ -162,12 +217,12 @@ def patch_config_by_key(
162
217
  except Exception as exc:
163
218
  logger.warning(
164
219
  "Patch failed for messaging config {}: {}",
165
- messaging_config.key,
166
- Pii(str(exc)),
220
+ config_key,
221
+ str(exc),
167
222
  )
168
223
  raise HTTPException(
169
224
  status_code=HTTP_500_INTERNAL_SERVER_ERROR,
170
- detail=f"Config with key {messaging_config.key} failed to be added",
225
+ detail=f"Config with key {config_key} failed to be added",
171
226
  )
172
227
 
173
228
 
@@ -294,17 +349,19 @@ def get_messaging_status(
294
349
  def put_default_config(
295
350
  *,
296
351
  db: Session = Depends(deps.get_db),
297
- messaging_config: MessagingConfigRequestBase,
352
+ messaging_config_request: MessagingConfigRequestBase,
298
353
  ) -> Optional[MessagingConfigResponse]:
299
354
  """
300
355
  Updates default messaging config for given service type.
301
356
  """
302
357
  logger.info(
303
358
  "Starting upsert for default messaging config of type '{}'",
304
- messaging_config.service_type,
359
+ messaging_config_request.service_type,
360
+ )
361
+ incoming_data = messaging_config_request.model_dump(mode="json")
362
+ existing_default = MessagingConfig.get_by_type(
363
+ db, messaging_config_request.service_type
305
364
  )
306
- incoming_data = messaging_config.model_dump(mode="json")
307
- existing_default = MessagingConfig.get_by_type(db, messaging_config.service_type)
308
365
  if existing_default:
309
366
  # take the key of the existing default and add that to the incoming data, to ensure we overwrite the same record
310
367
  incoming_data["key"] = existing_default.key
@@ -312,14 +369,22 @@ def put_default_config(
312
369
  else:
313
370
  # set a key and name for our config if we're creating a new default
314
371
  incoming_data["name"] = default_messaging_config_name(
315
- messaging_config.service_type.value
372
+ messaging_config_request.service_type.value
316
373
  )
317
374
  incoming_data["key"] = default_messaging_config_key(
318
- messaging_config.service_type.value
375
+ messaging_config_request.service_type.value
319
376
  )
320
- return create_or_update_messaging_config(
377
+ messaging_config = create_or_update_messaging_config(
321
378
  db, MessagingConfigRequest(**incoming_data)
322
379
  )
380
+ return MessagingConfigResponse(
381
+ name=messaging_config.name,
382
+ key=messaging_config.key,
383
+ service_type=messaging_config.service_type.value, # type: ignore
384
+ details=messaging_config.details,
385
+ last_test_timestamp=messaging_config.last_test_timestamp,
386
+ last_test_succeeded=messaging_config.last_test_succeeded,
387
+ )
323
388
 
324
389
 
325
390
  @router.put(
@@ -332,7 +397,7 @@ def put_default_config_secrets(
332
397
  service_type: MessagingServiceType,
333
398
  *,
334
399
  db: Session = Depends(deps.get_db),
335
- unvalidated_messaging_secrets: possible_messaging_secrets,
400
+ unvalidated_messaging_secrets: PossibleMessagingSecrets,
336
401
  ) -> TestMessagingStatusMessage:
337
402
  messaging_config = MessagingConfig.get_by_type(db, service_type=service_type)
338
403
  if not messaging_config:
@@ -353,7 +418,7 @@ def put_config_secrets(
353
418
  config_key: FidesKey,
354
419
  *,
355
420
  db: Session = Depends(deps.get_db),
356
- unvalidated_messaging_secrets: possible_messaging_secrets,
421
+ unvalidated_messaging_secrets: PossibleMessagingSecrets,
357
422
  ) -> TestMessagingStatusMessage:
358
423
  """
359
424
  Add or update secrets for messaging config.
@@ -371,7 +436,7 @@ def put_config_secrets(
371
436
  def update_config_secrets(
372
437
  db: Session,
373
438
  messaging_config: MessagingConfig,
374
- unvalidated_messaging_secrets: possible_messaging_secrets,
439
+ unvalidated_messaging_secrets: PossibleMessagingSecrets,
375
440
  ) -> TestMessagingStatusMessage:
376
441
  try:
377
442
  secrets_schema = get_schema_for_secrets(
@@ -512,11 +577,70 @@ def delete_config_by_key(
512
577
  },
513
578
  )
514
579
  def send_test_message(
580
+ service_type: MessagingServiceType,
581
+ *,
582
+ db: Session = Depends(deps.get_db),
583
+ params: MessagingTestBodyParams,
584
+ ) -> Dict[str, str]:
585
+ """
586
+ Sends a test message to the provided email or phone number.
587
+ """
588
+ config = MessagingConfig.get_by_type(db, service_type)
589
+ if not config:
590
+ raise HTTPException(
591
+ status_code=404,
592
+ detail=f"No messaging config found with service type: {service_type}",
593
+ )
594
+ try:
595
+ dispatch_message(
596
+ db,
597
+ action_type=MessagingActionType.TEST_MESSAGE,
598
+ to_identity=Identity(
599
+ email=params.to_identity.email,
600
+ phone_number=params.to_identity.phone_number,
601
+ ),
602
+ service_type=service_type.value,
603
+ )
604
+ except MessageDispatchException as exc:
605
+ config.update_test_status(
606
+ test_status=MessagingConnectionTestStatus.failed, db=db
607
+ )
608
+ raise HTTPException(
609
+ status_code=400,
610
+ detail=f"There was an error sending the test message: {exc}",
611
+ )
612
+ config.update_test_status(
613
+ test_status=MessagingConnectionTestStatus.succeeded, db=db
614
+ )
615
+ return {"details": "Test message successfully sent"}
616
+
617
+
618
+ @router.post(
619
+ MESSAGING_TEST_DEPRECATED,
620
+ deprecated=True,
621
+ status_code=HTTP_200_OK,
622
+ dependencies=[Security(verify_oauth_client, scopes=[MESSAGING_CREATE_OR_UPDATE])],
623
+ response_model=Dict[str, Any],
624
+ responses={
625
+ HTTP_200_OK: {
626
+ "content": {
627
+ "application/json": {
628
+ "example": {
629
+ "details": "Test message successfully sent",
630
+ }
631
+ }
632
+ }
633
+ }
634
+ },
635
+ )
636
+ def send_test_message_deprecated(
515
637
  message_info: Identity,
516
638
  db: Session = Depends(deps.get_db),
517
639
  config_proxy: ConfigProxy = Depends(deps.get_config_proxy),
518
- ) -> Dict[str, str]:
519
- """Sends a test message."""
640
+ ) -> Dict[str, Any]:
641
+ """
642
+ This endpoint is deprecated. Please use the `POST /messaging/test/{service_type}`
643
+ """
520
644
  try:
521
645
  dispatch_message(
522
646
  db,
@@ -524,11 +648,17 @@ def send_test_message(
524
648
  to_identity=message_info,
525
649
  service_type=config_proxy.notifications.notification_service_type,
526
650
  )
527
- except MessageDispatchException as e:
651
+ except MessageDispatchException as exc:
528
652
  raise HTTPException(
529
- status_code=400, detail=f"There was an error sending the test message: {e}"
530
- )
531
- return {"details": "Test message successfully sent"}
653
+ status_code=400,
654
+ detail=f"There was an error sending the test message: {exc}",
655
+ )
656
+ return {
657
+ "details": "Test message successfully sent",
658
+ "warnings": [
659
+ "This endpoint is deprecated. Please use the `POST /messaging/test/{service_type}`"
660
+ ],
661
+ }
532
662
 
533
663
 
534
664
  @router.get(
@@ -1,29 +1,27 @@
1
- import datetime
2
1
  from typing import Annotated, Dict, List, Optional, Union
3
2
 
4
3
  from fastapi import Depends, HTTPException, Query, Response, Security
5
4
  from fastapi_pagination import Page, Params
6
5
  from fastapi_pagination.bases import AbstractPage
7
- from fastapi_pagination.ext.async_sqlalchemy import paginate as async_paginate
8
6
  from fastapi_pagination.ext.sqlalchemy import paginate
9
7
  from fideslang.models import System as SystemSchema
10
8
  from fideslang.validation import FidesKey
11
9
  from loguru import logger
12
10
  from pydantic import Field
13
- from sqlalchemy import or_
14
11
  from sqlalchemy.ext.asyncio import AsyncSession
15
12
  from sqlalchemy.future import select
16
13
  from sqlalchemy.orm import Session
17
14
  from starlette import status
18
- from starlette.status import HTTP_200_OK, HTTP_204_NO_CONTENT, HTTP_404_NOT_FOUND
15
+ from starlette.status import (
16
+ HTTP_200_OK,
17
+ HTTP_204_NO_CONTENT,
18
+ HTTP_400_BAD_REQUEST,
19
+ HTTP_404_NOT_FOUND,
20
+ )
19
21
 
20
22
  from fides.api.api import deps
21
23
  from fides.api.api.v1.endpoints.saas_config_endpoints import instantiate_connection
22
- from fides.api.db.crud import (
23
- get_resource,
24
- get_resource_with_custom_fields,
25
- list_resource,
26
- )
24
+ from fides.api.db.crud import get_resource, get_resource_with_custom_fields
27
25
  from fides.api.db.ctl_session import get_async_db
28
26
  from fides.api.db.system import (
29
27
  create_system,
@@ -34,10 +32,8 @@ from fides.api.db.system import (
34
32
  )
35
33
  from fides.api.models.connectionconfig import ConnectionConfig, ConnectionType
36
34
  from fides.api.models.fides_user import FidesUser
37
- from fides.api.models.sql_models import ( # type:ignore[attr-defined]
38
- PrivacyDeclaration,
39
- System,
40
- )
35
+ from fides.api.models.sql_models import System # type:ignore[attr-defined]
36
+ from fides.api.oauth.roles import APPROVER
41
37
  from fides.api.oauth.system_manager_oauth_util import (
42
38
  verify_oauth_client_for_system_from_fides_key,
43
39
  verify_oauth_client_for_system_from_request_body_cli,
@@ -56,8 +52,12 @@ from fides.api.schemas.connection_configuration.connection_secrets import (
56
52
  from fides.api.schemas.connection_configuration.saas_config_template_values import (
57
53
  SaasConnectionTemplateValues,
58
54
  )
59
- from fides.api.schemas.filter_params import FilterParams
60
- from fides.api.schemas.system import BasicSystemResponse, SystemResponse
55
+ from fides.api.schemas.system import (
56
+ AssignStewardRequest,
57
+ BasicSystemResponse,
58
+ SystemResponse,
59
+ )
60
+ from fides.api.service.deps import get_system_service
61
61
  from fides.api.util.api_router import APIRouter
62
62
  from fides.api.util.connection_util import (
63
63
  connection_status,
@@ -66,7 +66,6 @@ from fides.api.util.connection_util import (
66
66
  patch_connection_configs,
67
67
  validate_secrets,
68
68
  )
69
- from fides.api.util.filter_utils import apply_filters_to_query
70
69
  from fides.common.api.scope_registry import (
71
70
  CONNECTION_CREATE_OR_UPDATE,
72
71
  CONNECTION_DELETE,
@@ -82,6 +81,7 @@ from fides.common.api.v1.urn_registry import (
82
81
  SYSTEM_CONNECTIONS,
83
82
  V1_URL_PREFIX,
84
83
  )
84
+ from fides.service.system.system_service import SystemService
85
85
 
86
86
  SYSTEM_ROUTER = APIRouter(tags=["System"], prefix=f"{V1_URL_PREFIX}/system")
87
87
  SYSTEM_CONNECTIONS_ROUTER = APIRouter(
@@ -349,6 +349,123 @@ async def delete(
349
349
  }
350
350
 
351
351
 
352
+ @SYSTEM_ROUTER.post(
353
+ "/bulk-delete",
354
+ dependencies=[
355
+ Security(
356
+ verify_oauth_client_prod,
357
+ scopes=[SYSTEM_DELETE],
358
+ )
359
+ ],
360
+ status_code=status.HTTP_200_OK,
361
+ )
362
+ async def system_bulk_delete(
363
+ fides_keys: List[str],
364
+ db: AsyncSession = Depends(get_async_db),
365
+ ) -> Dict:
366
+ """Delete multiple systems by their fides_keys."""
367
+
368
+ deleted: List[Dict] = []
369
+
370
+ async with db.begin():
371
+ # Retrieve all systems within the same transactional context
372
+ stmt = select(System).filter(System.fides_key.in_(fides_keys))
373
+ result = await db.execute(stmt)
374
+ systems_to_delete = result.scalars().all()
375
+
376
+ for system in systems_to_delete:
377
+ await db.delete(system)
378
+ deleted.append(SystemSchema.model_validate(system).model_dump(mode="json"))
379
+
380
+ return {
381
+ "message": f"Deleted {len(deleted)} system(s)",
382
+ "deleted": deleted,
383
+ }
384
+
385
+
386
+ @SYSTEM_ROUTER.post(
387
+ "/assign-steward",
388
+ dependencies=[
389
+ Security(
390
+ verify_oauth_client_prod,
391
+ scopes=[SYSTEM_UPDATE],
392
+ )
393
+ ],
394
+ )
395
+ async def bulk_assign_steward(
396
+ data: AssignStewardRequest,
397
+ db: Session = Depends(deps.get_db),
398
+ ) -> Dict:
399
+ """Assign the given `data_steward` (username) as a system manager for the list of `system_keys`.
400
+
401
+ This mirrors the behavior of the user permissions endpoint that assigns systems to a given user but
402
+ from the perspective of the System API. It validates that:
403
+
404
+ 1. The provided user exists.
405
+ 2. The user already has permissions (cannot be None).
406
+ 3. The user is not an approver (approvers are explicitly disallowed from being system managers).
407
+ 4. All provided `system_keys` resolve to existing System records.
408
+ 5. There are no duplicate keys in the payload.
409
+ """
410
+
411
+ data_steward = data.data_steward
412
+ system_keys = data.system_keys
413
+
414
+ user: Optional[FidesUser] = FidesUser.get_by(
415
+ db, field="username", value=data_steward
416
+ )
417
+ if not user:
418
+ raise HTTPException(
419
+ status_code=HTTP_404_NOT_FOUND,
420
+ detail=f"No user found with username {data_steward}.",
421
+ )
422
+
423
+ # Validate user has permissions assigned
424
+ if not (user.permissions and user.permissions.roles): # type: ignore[attr-defined]
425
+ raise HTTPException(
426
+ status_code=HTTP_400_BAD_REQUEST,
427
+ detail=f"User {data_steward} needs permissions before they can be assigned as system manager.",
428
+ )
429
+
430
+ # Approvers are not allowed to be system managers
431
+ if APPROVER in user.permissions.roles: # type: ignore[attr-defined]
432
+ raise HTTPException(
433
+ status_code=HTTP_400_BAD_REQUEST,
434
+ detail=f"User {data_steward} is an {APPROVER} and cannot be assigned as a system manager.",
435
+ )
436
+
437
+ # Check for duplicate system keys
438
+ if len(set(system_keys)) != len(system_keys):
439
+ raise HTTPException(
440
+ status_code=HTTP_400_BAD_REQUEST,
441
+ detail=f"Cannot add user {data_steward} as system manager. Duplicate systems in request body.",
442
+ )
443
+
444
+ # Retrieve systems and validate existence
445
+ systems_query = db.query(System).filter(System.fides_key.in_(system_keys))
446
+ if systems_query.count() != len(system_keys):
447
+ raise HTTPException(
448
+ status_code=HTTP_404_NOT_FOUND,
449
+ detail=f"Cannot add user {data_steward} as system manager. System(s) not found.",
450
+ )
451
+
452
+ systems = systems_query.all()
453
+
454
+ logger.info(
455
+ "Assigning user {} as data steward for {} systems", data_steward, len(systems)
456
+ )
457
+
458
+ updated_count = 0
459
+ for system in systems:
460
+ if user not in system.data_stewards:
461
+ user.set_as_system_manager(db, system)
462
+ updated_count += 1
463
+
464
+ return {
465
+ "message": f"User {data_steward} assigned as data steward to {updated_count} system(s)",
466
+ }
467
+
468
+
352
469
  @SYSTEM_ROUTER.post(
353
470
  "/",
354
471
  response_model=SystemResponse,
@@ -384,62 +501,30 @@ async def create(
384
501
  name="List systems (optionally paginated)",
385
502
  )
386
503
  async def ls( # pylint: disable=invalid-name
387
- db: AsyncSession = Depends(get_async_db),
504
+ system_service: SystemService = Depends(get_system_service),
388
505
  size: Optional[int] = Query(None, ge=1, le=100),
389
506
  page: Optional[int] = Query(None, ge=1),
390
507
  search: Optional[str] = None,
391
508
  data_uses: Optional[List[FidesKey]] = Query(None),
392
509
  data_categories: Optional[List[FidesKey]] = Query(None),
393
510
  data_subjects: Optional[List[FidesKey]] = Query(None),
394
- show_deleted: Optional[bool] = Query(False),
395
- ) -> List:
511
+ show_deleted: bool = Query(False),
512
+ ) -> Union[List[System], Page[System]]:
396
513
  """Get a list of all of the Systems.
397
514
  If any parameters or filters are provided the response will be paginated and/or filtered.
398
515
  Otherwise all Systems will be returned (this may be a slow operation if there are many systems,
399
516
  so using the pagination parameters is recommended).
400
517
  """
401
- if not (size or page or search or data_uses or data_categories or data_subjects):
402
- # if no advanced parameters are passed, we return a very basic list of all System resources
403
- # to maintain backward compatibility of the original API, which backs some important client usages, e.g. the fides CLI
404
518
 
405
- return await list_resource(System, db)
406
-
407
- query = select(System)
408
-
409
- pagination_params = Params(page=page or 1, size=size or 50)
410
- # Need to join with PrivacyDeclaration in order to be able to filter
411
- # by data use, data category, and data subject
412
- if any([data_uses, data_categories, data_subjects]):
413
- query = query.outerjoin(
414
- PrivacyDeclaration, System.id == PrivacyDeclaration.system_id
415
- )
416
-
417
- # Filter out any vendor deleted systems, unless explicitly asked for
418
- if not show_deleted:
419
- query = query.filter(
420
- or_(
421
- System.vendor_deleted_date.is_(None),
422
- System.vendor_deleted_date >= datetime.datetime.now(),
423
- )
424
- )
425
-
426
- filter_params = FilterParams(
519
+ return await system_service.get_systems(
427
520
  search=search,
428
521
  data_uses=data_uses,
429
522
  data_categories=data_categories,
430
523
  data_subjects=data_subjects,
524
+ size=size,
525
+ page=page,
526
+ show_deleted=show_deleted,
431
527
  )
432
- filtered_query = apply_filters_to_query(
433
- query=query,
434
- filter_params=filter_params,
435
- search_model=System,
436
- taxonomy_model=PrivacyDeclaration,
437
- )
438
-
439
- # Add a distinct so we only get one row per system
440
- duplicates_removed = filtered_query.distinct(System.id)
441
-
442
- return await async_paginate(db, duplicates_removed, pagination_params)
443
528
 
444
529
 
445
530
  @SYSTEM_ROUTER.patch(
fides/api/db/base.py CHANGED
@@ -21,6 +21,8 @@ from fides.api.models.detection_discovery.monitor_task import (
21
21
  MonitorTask,
22
22
  MonitorTaskExecutionLog,
23
23
  )
24
+ from fides.api.models.detection_discovery.web_monitor import WebMonitorGroupJob
25
+ from fides.api.models.event_audit import EventAudit
24
26
  from fides.api.models.experience_notices import ExperienceNotices
25
27
  from fides.api.models.fides_cloud import FidesCloud
26
28
  from fides.api.models.fides_user import FidesUser
@@ -77,6 +79,7 @@ from fides.api.models.property import (
77
79
  from fides.api.models.registration import UserRegistration
78
80
  from fides.api.models.storage import StorageConfig
79
81
  from fides.api.models.system_compass_sync import SystemCompassSync
82
+ from fides.api.models.system_group import SystemGroup, SystemGroupMember
80
83
  from fides.api.models.system_history import SystemHistory
81
84
  from fides.api.models.system_manager import SystemManager
82
85
  from fides.api.models.taxonomy import (
fides/api/db/seed.py CHANGED
@@ -2,6 +2,7 @@
2
2
  Provides functions that seed the application with data.
3
3
  """
4
4
 
5
+ import os
5
6
  from typing import Dict, List, Optional
6
7
 
7
8
  from fideslang.default_taxonomy import DEFAULT_TAXONOMY
@@ -17,6 +18,7 @@ from fides.api.common_exceptions import KeyOrNameAlreadyExists
17
18
  from fides.api.db.base_class import FidesBase
18
19
  from fides.api.db.ctl_session import sync_session
19
20
  from fides.api.db.system import upsert_system
21
+ from fides.api.models.application_config import ApplicationConfig
20
22
  from fides.api.models.client import ClientDetail
21
23
  from fides.api.models.connectionconfig import ConnectionConfig
22
24
  from fides.api.models.datasetconfig import DatasetConfig
@@ -37,7 +39,16 @@ from fides.api.schemas.connection_configuration.saas_config_template_values impo
37
39
  SaasConnectionTemplateValues,
38
40
  )
39
41
  from fides.api.schemas.dataset import DatasetConfigCtlDataset
42
+ from fides.api.schemas.messaging.messaging import (
43
+ MessagingConfigRequest,
44
+ MessagingServiceDetailsMailgun,
45
+ MessagingServiceType,
46
+ )
47
+ from fides.api.schemas.messaging.shared_schemas import MessagingSecretsMailgunDocs
40
48
  from fides.api.schemas.policy import ActionType, DrpAction
49
+ from fides.api.service.messaging.messaging_crud_service import (
50
+ create_or_update_messaging_config,
51
+ )
41
52
  from fides.api.util.connection_util import patch_connection_configs
42
53
  from fides.api.util.data_category import get_user_data_categories
43
54
  from fides.api.util.errors import AlreadyExistsError, QueryError
@@ -486,6 +497,29 @@ async def load_samples(async_session: AsyncSession) -> None:
486
497
  except QueryError: # pragma: no cover
487
498
  pass # The upsert_resources function will log any error
488
499
 
500
+ if os.getenv("MAILGUN_DOMAIN") and os.getenv("MAILGUN_API_KEY"):
501
+ log.info("Loading Mailgun messaging config")
502
+ with sync_session() as db:
503
+ messaging_config = create_or_update_messaging_config(
504
+ db=db,
505
+ config=MessagingConfigRequest(
506
+ key="my_mailgun_config",
507
+ name="Mailgun",
508
+ service_type=MessagingServiceType.mailgun,
509
+ details=MessagingServiceDetailsMailgun(
510
+ domain=os.getenv("MAILGUN_DOMAIN")
511
+ ),
512
+ ),
513
+ )
514
+ messaging_config.set_secrets(
515
+ db=db,
516
+ messaging_secrets=MessagingSecretsMailgunDocs(
517
+ mailgun_api_key=os.getenv("MAILGUN_API_KEY")
518
+ ),
519
+ )
520
+ CONFIG.notifications.notification_service_type = "mailgun"
521
+ ApplicationConfig.update_config_set(db, CONFIG)
522
+
489
523
 
490
524
  def load_default_organization(db: Session) -> None:
491
525
  """