# montassar-isbored/clinconnet-portal architecture

> Architecture diagram of the GitHub repository montassar-isbored/clinconnet-portal, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/montassar-isbored/clinconnet-portal
- Repository: https://github.com/montassar-isbored/clinconnet-portal
- Video tour (about a minute): https://gitdiagram.com/montassar-isbored/clinconnet-portal/video

## Overview

ClinConNet-Portal connects participants and clinical-study projects through a web portal, with SSI-based sign-in and dynamic consent management. The principal flow is: browse a project, authenticate with a wallet-backed identity, then publish, review, update, or revoke consent proofs; the backend records proof state on Hyperledger Fabric and maintains portal data in MongoDB. The graph includes documented project and consent capabilities, but several route and API implementations were not sampled, so their internal wiring is shown only where supported.

Main entry points: [`client/src/App.js`](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/App.js) (React app and routes), [`server/server.js`](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/server.js) (HTTP server), [`client/src/services/api.js`](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/services/api.js) (API client), [`server/routes/auth.js`](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/auth.js) (Auth routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_portal["Portal UI"]
  node_app["React app and routes<br/>[App.js]"]
  node_home["Project discovery<br/>[HomePage.js]"]
  node_project_detail["Project details"]
  node_profile["Consent workspace<br/>[ProfilePage.js]"]
  node_login["Sign-in page<br/>[LoginPage.js]"]
  node_auth_context["Client auth state<br/>[AuthContext.js]"]
  node_api_client["API client<br/>[api.js]"]
end

subgraph group_backend["Portal Backend"]
  node_server["HTTP server<br/>[server.js]"]
  node_project_routes["Project routes<br/>[projects.js]"]
  node_consent_routes["Consent routes<br/>[consent.js]"]
  node_project_model["Project records<br/>[Project.js]"]
  node_mongo[("MongoDB<br/>[db.js]")]
end

subgraph group_identity["Identity"]
  node_auth_routes["Auth routes<br/>[auth.js]"]
  node_user_model["User records<br/>[User.js]"]
  node_wallet["SSI wallet"]
end

subgraph group_ledger["Consent Ledger"]
  node_fabric_service["Fabric gateway<br/>[fabricService.js]"]
  node_contract["Consent contract<br/>[consentContract.js]"]
  node_fabric_network[("Fabric network")]
end

node_participant(("Participant"))

node_participant -->|"uses"| node_app
node_app -->|"routes"| node_home
node_app -->|"routes"| node_project_detail
node_app -->|"protects route"| node_profile
node_app -->|"routes"| node_login
node_home -->|"requests projects"| node_api_client
node_project_detail -->|"requests details"| node_api_client
node_profile -->|"manages consents"| node_api_client
node_auth_context -->|"checks session"| node_api_client
node_login -->|"starts sign-in"| node_auth_routes
node_auth_routes -.->|"verifies identity"| node_wallet
node_auth_routes -->|"finds or creates"| node_user_model
node_api_client -->|"sends API requests"| node_server
node_server -->|"dispatches"| node_project_routes
node_server -->|"dispatches"| node_consent_routes
node_server -->|"dispatches"| node_auth_routes
node_server -->|"connects and seeds"| node_mongo
node_project_routes -->|"project data"| node_project_model
node_project_model -->|"stores records"| node_mongo
node_user_model -->|"stores users"| node_mongo
node_consent_routes -->|"consent operations"| node_fabric_service
node_fabric_service -->|"submits transactions"| node_fabric_network
node_fabric_network -->|"executes"| node_contract
node_contract -->|"reads and writes state"| node_fabric_network

click node_app "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/App.js"
click node_home "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/HomePage.js"
click node_project_detail "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/ProjectDetailPage.js"
click node_profile "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/ProfilePage.js"
click node_login "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/LoginPage.js"
click node_auth_context "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/context/AuthContext.js"
click node_api_client "https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/services/api.js"
click node_server "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/server.js"
click node_project_routes "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/projects.js"
click node_consent_routes "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/consent.js"
click node_auth_routes "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/auth.js"
click node_project_model "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/models/Project.js"
click node_user_model "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/models/User.js"
click node_mongo "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/config/db.js"
click node_fabric_service "https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/fabricService.js"
click node_contract "https://github.com/montassar-isbored/clinconnet-portal/blob/master/consentcc/lib/consentContract.js"

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_home,node_project_detail,node_profile,node_login,node_auth_context,node_api_client toneBlue
class node_server,node_project_routes,node_consent_routes,node_project_model,node_mongo toneAmber
class node_auth_routes,node_user_model,node_wallet toneMint
class node_fabric_service,node_contract,node_fabric_network toneRose
class node_participant toneIndigo
```

## Components

### Portal UI

- [React app and routes](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/App.js): `client/src/App.js`
- [Project discovery](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/HomePage.js): `client/src/pages/HomePage.js`
- [Project details](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/ProjectDetailPage.js): `client/src/pages/ProjectDetailPage.js`
- [Consent workspace](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/ProfilePage.js): `client/src/pages/ProfilePage.js`
- [Sign-in page](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/pages/LoginPage.js): `client/src/pages/LoginPage.js`
- [Client auth state](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/context/AuthContext.js): `client/src/context/AuthContext.js`
- [API client](https://github.com/montassar-isbored/clinconnet-portal/blob/master/client/src/services/api.js): `client/src/services/api.js`

### Portal Backend

- [HTTP server](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/server.js): `server/server.js`
- [Project routes](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/projects.js): `server/routes/projects.js`
- [Consent routes](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/consent.js): `server/routes/consent.js`
- [Project records](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/models/Project.js): `server/models/Project.js`
- [MongoDB](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/config/db.js): `server/config/db.js`

### Identity

- [Auth routes](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/routes/auth.js): `server/routes/auth.js`
- [User records](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/models/User.js): `server/models/User.js`
- **SSI wallet**

### Consent Ledger

- [Fabric gateway](https://github.com/montassar-isbored/clinconnet-portal/blob/master/server/fabricService.js): `server/fabricService.js`
- [Consent contract](https://github.com/montassar-isbored/clinconnet-portal/blob/master/consentcc/lib/consentContract.js): `consentcc/lib/consentContract.js`
- **Fabric network**

### Other components

- **Participant**

## Connections

- Participant → React app and routes: uses
- React app and routes → Project discovery: routes
- React app and routes → Project details: routes
- React app and routes → Consent workspace: protects route
- React app and routes → Sign-in page: routes
- Project discovery → API client: requests projects
- Project details → API client: requests details
- Consent workspace → API client: manages consents
- Client auth state → API client: checks session
- Sign-in page → Auth routes: starts sign-in
- Auth routes → SSI wallet: verifies identity
- Auth routes → User records: finds or creates
- API client → HTTP server: sends API requests
- HTTP server → Project routes: dispatches
- HTTP server → Consent routes: dispatches
- HTTP server → Auth routes: dispatches
- HTTP server → MongoDB: connects and seeds
- Project routes → Project records: project data
- Project records → MongoDB: stores records
- User records → MongoDB: stores users
- Consent routes → Fabric gateway: consent operations
- Fabric gateway → Fabric network: submits transactions
- Fabric network → Consent contract: executes
- Consent contract → Fabric network: reads and writes state
