Files

54 lines
2.3 KiB
Markdown

# Project Architecture
Below is a 3-layer architectural diagram illustrating how the Discord Clone Proof-of-Concept is built and how it operates, especially after consolidating the real-time layer into PostgreSQL.
```mermaid
graph TD
%% Styling
classDef client fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;
classDef backend fill:#e8f5e9,stroke:#388e3c,stroke-width:2px;
classDef data fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
subgraph Layer 1: Client/Frontend Layer
B[Web Browser]:::client
JS[JavaScript / WebSockets]:::client
UI[Bootstrap UI / HTML5]:::client
B -->|Renders| UI
B -->|Executes| JS
end
subgraph Layer 2: Application/Backend Layer
Daphne[Daphne ASGI Server]:::backend
Django[Django Framework]:::backend
Channels[Django Channels]:::backend
JS <-->|WSS/WS connection| Daphne
B <-->|HTTP GET/POST| Daphne
Daphne -->|HTTP Routing| Django
Daphne -->|WebSocket Routing| Channels
end
subgraph Layer 3: Data Layer
DB[(PostgreSQL Database)]:::data
%% Combined database logic
Django <-->|ORM Queries / Migrations| DB
Channels <-->|LISTEN/NOTIFY / Publish-Subscribe| DB
end
class B,JS,UI client;
class Daphne,Django,Channels backend;
class DB data;
```
### Layer Details
1. **Client / Frontend Layer**:
The user interacts with the standard HTML/CSS generated by Django templates, styled with Bootstrap. A lightweight JavaScript script establishes a continuous WebSocket connection to the server for receiving real-time events (like new messages or files).
2. **Application / Backend Layer**:
The entire application is served by **Daphne**, an ASGI server. Daphne intelligently routes standard HTTP traffic (like form submissions or page loads) to **Django's** synchronous views, and routes persistent WebSocket connections to **Django Channels** async consumers.
3. **Data Layer**:
Instead of using multiple stores (e.g., PostgreSQL for data and Redis for pub/sub), the project uses a unified **PostgreSQL** database. Standard Django queries handle users and messages, while the `channels_postgres` plugin utilizes Postgres's native `LISTEN/NOTIFY` capabilities to broadcast real-time events to connected clients.