# marcooesterlin/microsoft-purview-unified-catalog architecture

> Architecture diagram of the GitHub repository marcooesterlin/microsoft-purview-unified-catalog, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/marcooesterlin/microsoft-purview-unified-catalog
- Repository: https://github.com/marcooesterlin/microsoft-purview-unified-catalog

## Overview

This repository is a collection of independent Microsoft Purview tools, with Microsoft_Purview_Utility as its main end-to-end product. In that web app, governance users browse catalog assets, select them, and invoke curation or governance operations; the Flask API delegates selected operations to backend modules that interact with Purview. Other documented branches cover metadata export, schema and product retrieval, privacy labeling, cleanup, and inactive-contact audits. Connections from the web UI to the API are shown as unverified because the sampled excerpts do not expose that request wiring; README-described capabilities are retained without asserting unsampled call paths.

Main entry points: [`Microsoft_Purview_Utility/backend/api_server.py`](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/api_server.py) (Flask API), [`Microsoft_Purview_Utility/src/App.tsx`](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/App.tsx) (Web App Router), [`Microsoft_Purview_Utility/src/pages/BrowseAssets.tsx`](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/BrowseAssets.tsx) (Asset Browsing), [`Microsoft_Purview_Utility/src/contexts/SelectedAssetsContext.tsx`](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/contexts/SelectedAssetsContext.tsx) (Asset Selection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_catalog["Unified Catalog App"]
  node_app["Web App Router<br/>[App.tsx]"]
  node_browse["Asset Browsing<br/>[BrowseAssets.tsx]"]
  node_assettypes["Type Browsing"]
  node_dashboard["Catalog Dashboard<br/>[Dashboard.tsx]"]
  node_products["Data Products<br/>[DataProducts.tsx]"]
  node_selection["Asset Selection"]
end

subgraph group_curation["Curation Operations"]
  node_curate["Curation Portal<br/>[Curate.tsx]"]
  node_selectedpanel["Selected Asset Panel"]
  node_api["Flask API<br/>[api_server.py]"]
  node_assetdata["Asset Catalog Data<br/>[get_data.py]"]
  node_tagging["Tag Management<br/>[add_tag.py]"]
  node_classification["Classification Curation"]
  node_autoclassify["Auto Classification<br/>[auto_classify.py]"]
  node_lineage["Lineage Discovery<br/>[create_lineage.py]"]
  node_glossary["Glossary Sync<br/>[sync_glossary.py]"]
  node_entra["Owner and Expert Lookup"]
end

subgraph group_standalone["Catalog Utilities"]
  node_pii["PII Label Automation<br/>[Add_PII_Label.py]"]
  node_deleteassets["Collection Asset Cleanup<br/>[delete_assets.py]"]
  node_inactive["Inactive Contact Audit"]
end

subgraph group_extract["Metadata Extraction"]
  node_schema["Asset Schema Retrieval"]
  node_producttool["Product Retrieval"]
  node_sql_export["Azure SQL Export"]
  node_fabric_export["Fabric Export"]
end

subgraph group_external["External Services"]
  node_purview[("Microsoft Purview")]
  node_graph["Microsoft Graph"]
  node_sql[("Azure SQL Database")]
  node_fabric[("Fabric Lakehouse")]
end

node_user(("Governance User"))

node_user -->|"uses"| node_app
node_app -->|"routes to"| node_dashboard
node_app -->|"routes to"| node_browse
node_app -->|"routes to"| node_assettypes
node_app -->|"routes to"| node_products
node_app -->|"routes to"| node_curate
node_app -->|"renders"| node_selectedpanel
node_app -->|"provides state"| node_selection
node_browse -.->|"selects assets"| node_selection
node_assettypes -.->|"selects assets"| node_selection
node_curate -.->|"requests operations"| node_api
node_browse -.->|"requests catalog data"| node_api
node_api -->|"reads catalog"| node_assetdata
node_api -->|"calls"| node_tagging
node_api -->|"dispatches"| node_classification
node_api -->|"calls"| node_autoclassify
node_api -->|"dispatches"| node_lineage
node_api -->|"dispatches"| node_glossary
node_api -->|"dispatches"| node_entra
node_assetdata -->|"queries"| node_purview
node_tagging -->|"updates tags"| node_purview
node_classification -->|"updates classifications"| node_purview
node_autoclassify -->|"classifies assets"| node_purview
node_lineage -->|"manages lineage"| node_purview
node_glossary -->|"syncs terms"| node_purview
node_entra -->|"looks up users"| node_graph
node_pii -->|"labels assets"| node_purview
node_deleteassets -->|"deletes assets"| node_purview
node_inactive -->|"checks contacts"| node_purview
node_inactive -->|"checks identities"| node_graph
node_schema -->|"retrieves schema"| node_purview
node_producttool -->|"retrieves products"| node_purview
node_sql_export -->|"extracts metadata"| node_purview
node_sql_export -->|"exports metadata"| node_sql
node_fabric_export -->|"extracts metadata"| node_purview
node_fabric_export -->|"exports metadata"| node_fabric

click node_app "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/App.tsx"
click node_browse "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/BrowseAssets.tsx"
click node_assettypes "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/BrowseByAssetType.tsx"
click node_dashboard "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/Dashboard.tsx"
click node_products "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/DataProducts.tsx"
click node_selection "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/contexts/SelectedAssetsContext.tsx"
click node_curate "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/Curate.tsx"
click node_selectedpanel "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/components/catalog/SelectedAssetsPanel.tsx"
click node_api "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/api_server.py"
click node_assetdata "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/get_data.py"
click node_tagging "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/add_tag.py"
click node_classification "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/add_classificiation.py"
click node_autoclassify "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/auto_classify.py"
click node_lineage "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/create_lineage.py"
click node_glossary "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/sync_glossary.py"
click node_entra "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/get_entra_id_users.py"
click node_pii "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Add_PII_Label/Add_PII_Label.py"
click node_deleteassets "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Delete_Assets_Collection/delete_assets.py"
click node_inactive "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Get_Inactive_Experts_Owners/get_inactive_owner_experts.py"
click node_schema "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Get_Asset_Schema/Get_Data_Asset_Schema.py"
click node_producttool "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Get_Data_Product/get_data_product.py"
click node_sql_export "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Datamap_extractor_Public/datamap_extract_azure_sql.py"
click node_fabric_export "https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Datamap_extractor_Public/datamap_extract_fabric_notebook.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_browse,node_assettypes,node_dashboard,node_products,node_selection,node_user toneBlue
class node_curate,node_selectedpanel,node_api,node_assetdata,node_tagging,node_classification,node_autoclassify,node_lineage,node_glossary,node_entra toneAmber
class node_pii,node_deleteassets,node_inactive toneMint
class node_schema,node_producttool,node_sql_export,node_fabric_export toneRose
class node_purview,node_graph,node_sql,node_fabric toneIndigo
```

## Components

### Unified Catalog App

- [Web App Router](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/App.tsx): `Microsoft_Purview_Utility/src/App.tsx`
- [Asset Browsing](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/BrowseAssets.tsx): `Microsoft_Purview_Utility/src/pages/BrowseAssets.tsx`
- [Type Browsing](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/BrowseByAssetType.tsx): `Microsoft_Purview_Utility/src/pages/BrowseByAssetType.tsx`
- [Catalog Dashboard](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/Dashboard.tsx): `Microsoft_Purview_Utility/src/pages/Dashboard.tsx`
- [Data Products](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/DataProducts.tsx): `Microsoft_Purview_Utility/src/pages/DataProducts.tsx`
- [Asset Selection](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/contexts/SelectedAssetsContext.tsx): `Microsoft_Purview_Utility/src/contexts/SelectedAssetsContext.tsx`

### Curation Operations

- [Curation Portal](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/pages/Curate.tsx): `Microsoft_Purview_Utility/src/pages/Curate.tsx`
- [Selected Asset Panel](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/src/components/catalog/SelectedAssetsPanel.tsx): `Microsoft_Purview_Utility/src/components/catalog/SelectedAssetsPanel.tsx`
- [Flask API](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/api_server.py): `Microsoft_Purview_Utility/backend/api_server.py`
- [Asset Catalog Data](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/get_data.py): `Microsoft_Purview_Utility/backend/get_data.py`
- [Tag Management](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/add_tag.py): `Microsoft_Purview_Utility/backend/add_tag.py`
- [Classification Curation](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/add_classificiation.py): `Microsoft_Purview_Utility/backend/add_classificiation.py`
- [Auto Classification](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/auto_classify.py): `Microsoft_Purview_Utility/backend/auto_classify.py`
- [Lineage Discovery](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/create_lineage.py): `Microsoft_Purview_Utility/backend/create_lineage.py`
- [Glossary Sync](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/sync_glossary.py): `Microsoft_Purview_Utility/backend/sync_glossary.py`
- [Owner and Expert Lookup](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Utility/backend/get_entra_id_users.py): `Microsoft_Purview_Utility/backend/get_entra_id_users.py`

### Catalog Utilities

- [PII Label Automation](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Add_PII_Label/Add_PII_Label.py): `Microsoft_Purview_Add_PII_Label/Add_PII_Label.py`
- [Collection Asset Cleanup](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Delete_Assets_Collection/delete_assets.py): `Microsoft_Purview_Delete_Assets_Collection/delete_assets.py`
- [Inactive Contact Audit](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Get_Inactive_Experts_Owners/get_inactive_owner_experts.py): `Microsoft_Purview_Get_Inactive_Experts_Owners/get_inactive_owner_experts.py`

### Metadata Extraction

- [Asset Schema Retrieval](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Get_Asset_Schema/Get_Data_Asset_Schema.py): `Microsoft_Purview_Get_Asset_Schema/Get_Data_Asset_Schema.py`
- [Product Retrieval](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Get_Data_Product/get_data_product.py): `Microsoft_Purview_Get_Data_Product/get_data_product.py`
- [Azure SQL Export](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Datamap_extractor_Public/datamap_extract_azure_sql.py): `Microsoft_Purview_Datamap_extractor_Public/datamap_extract_azure_sql.py`
- [Fabric Export](https://github.com/marcooesterlin/microsoft-purview-unified-catalog/blob/main/Microsoft_Purview_Datamap_extractor_Public/datamap_extract_fabric_notebook.py): `Microsoft_Purview_Datamap_extractor_Public/datamap_extract_fabric_notebook.py`

### External Services

- **Microsoft Purview**
- **Microsoft Graph**
- **Azure SQL Database**
- **Fabric Lakehouse**

### Other components

- **Governance User**

## Connections

- Governance User → Web App Router: uses (evidence: `README.md`)
- Web App Router → Catalog Dashboard: routes to (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Web App Router → Asset Browsing: routes to (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Web App Router → Type Browsing: routes to (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Web App Router → Data Products: routes to (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Web App Router → Curation Portal: routes to (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Web App Router → Selected Asset Panel: renders (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Web App Router → Asset Selection: provides state (evidence: `Microsoft_Purview_Utility/src/App.tsx`)
- Asset Browsing → Asset Selection: selects assets
- Type Browsing → Asset Selection: selects assets
- Curation Portal → Flask API: requests operations
- Asset Browsing → Flask API: requests catalog data
- Flask API → Asset Catalog Data: reads catalog (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Flask API → Tag Management: calls (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Flask API → Classification Curation: dispatches (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Flask API → Auto Classification: calls (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Flask API → Lineage Discovery: dispatches (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Flask API → Glossary Sync: dispatches (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Flask API → Owner and Expert Lookup: dispatches (evidence: `Microsoft_Purview_Utility/backend/api_server.py`)
- Asset Catalog Data → Microsoft Purview: queries (evidence: `README.md`)
- Tag Management → Microsoft Purview: updates tags (evidence: `README.md`)
- Classification Curation → Microsoft Purview: updates classifications (evidence: `README.md`)
- Auto Classification → Microsoft Purview: classifies assets (evidence: `README.md`)
- Lineage Discovery → Microsoft Purview: manages lineage (evidence: `README.md`)
- Glossary Sync → Microsoft Purview: syncs terms (evidence: `README.md`)
- Owner and Expert Lookup → Microsoft Graph: looks up users (evidence: `README.md`)
- PII Label Automation → Microsoft Purview: labels assets (evidence: `README.md`)
- Collection Asset Cleanup → Microsoft Purview: deletes assets (evidence: `README.md`)
- Inactive Contact Audit → Microsoft Purview: checks contacts (evidence: `README.md`)
- Inactive Contact Audit → Microsoft Graph: checks identities (evidence: `README.md`)
- Asset Schema Retrieval → Microsoft Purview: retrieves schema (evidence: `README.md`)
- Product Retrieval → Microsoft Purview: retrieves products (evidence: `README.md`)
- Azure SQL Export → Microsoft Purview: extracts metadata (evidence: `README.md`)
- Azure SQL Export → Azure SQL Database: exports metadata (evidence: `README.md`)
- Fabric Export → Microsoft Purview: extracts metadata (evidence: `README.md`)
- Fabric Export → Fabric Lakehouse: exports metadata (evidence: `README.md`)
