# 02 - Requirements Specification

## 2.1 Overview

This document defines the functional and non-functional requirements for OpenWA.

## 2.2 Functional Requirements

### 2.2.1 Session Management

```mermaid
flowchart LR
    subgraph Session["Session Lifecycle"]
        C[Create] --> A[Authenticate]
        A --> |QR Scan| R[Ready]
        R --> |Logout| D[Destroy]
        R --> |Disconnect| RC[Reconnect]
        RC --> R
    end
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-SM-001 | The system must create new sessions | High | 1 |
| FR-SM-002 | The system must generate a QR code for authentication | High | 1 |
| FR-SM-003 | The system must persist session state for reconnection | High | 1 |
| FR-SM-004 | The system must delete a session | High | 1 |
| FR-SM-005 | The system must display session status | High | 1 |
| FR-SM-006 | The system must support multiple sessions | High | 2 |
| FR-SM-007 | The system must auto-reconnect when the connection is lost | Medium | 2 |
| FR-SM-008 | The system must support session naming | Low | 2 |

### 2.2.2 Messaging

```mermaid
flowchart TB
    subgraph Outbound["Outbound Messages"]
        T[Text] 
        I[Image]
        V[Video]
        A[Audio]
        D[Document]
        L[Location]
        CT[Contact]
        S[Sticker]
    end
    
    subgraph Inbound["Inbound Messages"]
        W[Webhook] --> P[Process]
        P --> ACK[Acknowledgment]
    end
    
    Outbound --> API[REST API]
    API --> WA[WhatsApp]
    WA --> Inbound
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-MSG-001 | The system must send text messages | High | 1 |
| FR-MSG-002 | The system must send images with captions | High | 1 |
| FR-MSG-003 | The system must send video messages | High | 1 |
| FR-MSG-004 | The system must send audio/voice notes | High | 1 |
| FR-MSG-005 | The system must send documents/files | High | 1 |
| FR-MSG-006 | The system must send locations | Medium | 2 |
| FR-MSG-007 | The system must send contact cards | Medium | 2 |
| FR-MSG-008 | The system must send stickers | Medium | 2 |
| FR-MSG-009 | The system must reply to a message | Medium | 2 |
| FR-MSG-010 | The system must forward messages | Low | 3 |
| FR-MSG-011 | The system must delete messages | Low | 3 |
| FR-MSG-012 | The system must react to messages | Low | 3 |
| FR-MSG-013 | The system must send bulk messages (batch) | Medium | 2 |
| FR-MSG-014 | The system must support template variables in bulk messages | Medium | 2 |
| FR-MSG-015 | The system must track status per message in a batch | Medium | 2 |
| FR-MSG-016 | The system must cancel a running batch | Medium | 2 |
| FR-MSG-017 | The system must apply delays between messages to reduce ban risk | High | 2 |
| FR-MSG-018 | The system must validate media size before sending | High | 1 |
| FR-MSG-019 | The system must support downloading media from a URL | High | 1 |

### 2.2.3 Webhook & Events

```mermaid
sequenceDiagram
    participant WA as WhatsApp
    participant OW as OpenWA
    participant WH as Webhook URL
    
    WA->>OW: New Message Event
    OW->>OW: Process & Store
    OW->>WH: POST /webhook
    WH-->>OW: 200 OK
    
    alt Webhook Failed
        OW->>OW: Queue for Retry
        OW->>WH: Retry (max 3x)
    end
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-WH-001 | The system must deliver events to webhook URLs | High | 1 |
| FR-WH-002 | The system must support multiple webhook URLs | Medium | 2 |
| FR-WH-003 | The system must retry failed webhooks (max 3x) | Medium | 2 |
| FR-WH-004 | The system must filter event types per webhook | Medium | 2 |
| FR-WH-005 | The system must log webhook delivery status | Medium | 2 |
| FR-WH-006 | The system must support webhook signature verification | Medium | 2 |
| FR-WH-007 | The system must provide an idempotency key per event | High | 2 |
| FR-WH-008 | The system must provide a delivery ID to track retries | Medium | 2 |
| FR-WH-009 | The system must support exponential backoff for retries | Medium | 2 |
| FR-WH-010 | The system must enable/disable webhooks without deletion | Low | 2 |

### 2.2.4 Real-time Updates (WebSocket)

```mermaid
flowchart LR
    subgraph WebSocket["WebSocket Features"]
        direction TB
        CONN[Connection Management]
        AUTH[Authentication]
        SUB[Event Subscription]
        PING[Keep-alive Ping/Pong]
    end

    subgraph Events["Real-time Events"]
        MSG[Message Events]
        SESS[Session Events]
        QR[QR Code Updates]
    end

    WebSocket --> Events
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-WS-001 | The system must provide a WebSocket endpoint for real-time updates | Medium | 2 |
| FR-WS-002 | The system must support API key authentication for WebSocket | Medium | 2 |
| FR-WS-003 | The system must allow subscribing to a specific session | Medium | 2 |
| FR-WS-004 | The system must allow subscribing to specific event types | Medium | 2 |
| FR-WS-005 | The system must implement ping/pong keep-alive | Medium | 2 |
| FR-WS-006 | The system must auto-reconnect with exponential backoff | Low | 3 |
| FR-WS-007 | The system must stream QR code updates in real time | High | 2 |

### 2.2.5 Contact Management

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-CT-001 | The system must retrieve all contacts | High | 1 |
| FR-CT-002 | The system must retrieve a contact by ID | High | 1 |
| FR-CT-003 | The system must check if a number exists on WhatsApp | High | 1 |
| FR-CT-004 | The system must retrieve a contact profile picture | Medium | 2 |
| FR-CT-005 | The system must block/unblock a contact | Low | 3 |

### 2.2.6 Group Management

```mermaid
flowchart TB
    subgraph GroupOps["Group Operations"]
        direction TB
        CR[Create Group]
        UP[Update Info]
        AD[Add Participants]
        RM[Remove Participants]
        PR[Promote to Admin]
        DM[Demote Admin]
        LV[Leave Group]
    end
    
    subgraph GroupInfo["Group Info"]
        GI[Get Info]
        GP[Get Participants]
        GL[Get Invite Link]
    end
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-GR-001 | The system must retrieve all groups | Medium | 2 |
| FR-GR-002 | The system must retrieve group info | Medium | 2 |
| FR-GR-003 | The system must retrieve group participants | Medium | 2 |
| FR-GR-004 | The system must create a group | Medium | 3 |
| FR-GR-005 | The system must update group info | Low | 3 |
| FR-GR-006 | The system must add participants | Low | 3 |
| FR-GR-007 | The system must remove participants | Low | 3 |
| FR-GR-008 | The system must promote/demote admins | Low | 3 |
| FR-GR-009 | The system must get/revoke invite links | Low | 3 |
| FR-GR-010 | The system must leave a group | Low | 3 |

### 2.2.7 Dashboard (Web UI)

```mermaid
flowchart LR
    subgraph Dashboard["Dashboard Features"]
        direction TB
        SS[Session Status]
        QR[QR Display]
        WM[Webhook Manager]
        LG[Logs Viewer]
        ST[Statistics]
    end
    
    Dashboard --> API[REST API]
    API --> BE[Backend]
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-UI-001 | The dashboard must display the status of all sessions | High | 2 |
| FR-UI-002 | The dashboard must display QR codes | High | 2 |
| FR-UI-003 | The dashboard must manage webhooks | Medium | 2 |
| FR-UI-004 | The dashboard must view logs | Medium | 2 |
| FR-UI-005 | The dashboard must test sending messages | Medium | 2 |
| FR-UI-006 | The dashboard must display statistics | Low | 3 |
| FR-UI-007 | The dashboard must support dark mode | Low | 3 |

### 2.2.8 Authentication & Authorization

```mermaid
flowchart TB
    subgraph Auth["Authentication Flow"]
        REQ[Request] --> KEY[API Key Check]
        KEY -->|Valid| IP[IP Whitelist Check]
        KEY -->|Invalid| R401[401 Unauthorized]
        IP -->|Allowed| PERM[Permission Check]
        IP -->|Blocked| R403[403 Forbidden - IP]
        PERM -->|Granted| PROC[Process Request]
        PERM -->|Denied| R403B[403 Forbidden - Permission]
    end
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-AU-001 | The system must support API key authentication | High | 2 |
| FR-AU-002 | The system must generate/revoke API keys | High | 2 |
| FR-AU-003 | The system must set permissions per API key | Medium | 3 |
| FR-AU-004 | The system must log API access | Medium | 2 |
| FR-AU-005 | The system must support IP whitelisting per API key | Medium | 2 |
| FR-AU-006 | The system must support CIDR notation for IP ranges | Low | 2 |
| FR-AU-007 | The system must set expiration dates for API keys | Medium | 2 |
| FR-AU-008 | The system must hash API keys before storage (SHA-256) | High | 2 |
| FR-AU-009 | The system must track last used timestamps per API key | Low | 2 |
| FR-AU-010 | The system must support a master API key from environment | High | 2 |
| FR-AU-011 | The system must support the `X-Request-ID` header for request tracing | Medium | 2 |

### 2.2.9 Bulk Operations

```mermaid
flowchart LR
    subgraph Batch["Batch Processing"]
        direction TB
        CREATE[Create Batch]
        QUEUE[Queue Messages]
        PROCESS[Process with Delay]
        TRACK[Track Progress]
        CANCEL[Cancel Option]
    end

    CREATE --> QUEUE --> PROCESS --> TRACK
    TRACK --> CANCEL
```

| ID | Requirement | Priority | Phase |
|----|-------------|----------|-------|
| FR-BK-001 | The system must accept batches up to 100 messages | Medium | 2 |
| FR-BK-002 | The system must apply delays between messages (configurable, min 1s) | High | 2 |
| FR-BK-003 | The system must randomize delays for natural behavior | Medium | 2 |
| FR-BK-004 | The system must track batch progress (sent/failed/pending) | Medium | 2 |
| FR-BK-005 | The system must cancel a running batch | Medium | 2 |
| FR-BK-006 | The system must support template variables in batches | Low | 3 |
| FR-BK-007 | The system must return a batch ID for status tracking | High | 2 |
| FR-BK-008 | The system must clean up completed batches after 24 hours | Low | 3 |

## 2.3 Non-Functional Requirements

### 2.3.1 Performance

```mermaid
flowchart LR
    subgraph Performance["Performance Targets"]
        RT[Response Time < 500ms]
        TP[Throughput 100 req/s]
        MS[Memory < 500MB/session]
        ST[Startup < 30s]
    end
```

| ID | Requirement | Target | Priority |
|----|-------------|--------|----------|
| NFR-PF-001 | API response time | < 500ms (p95) | High |
| NFR-PF-002 | Message send latency | < 2s | High |
| NFR-PF-003 | QR code generation | < 3s | High |
| NFR-PF-004 | Memory per session | < 500MB | High |
| NFR-PF-005 | Concurrent sessions | 10+ per instance | Medium |
| NFR-PF-006 | Webhook delivery | < 5s | Medium |
| NFR-PF-007 | Startup time | < 30s | Medium |

### 2.3.2 Reliability & Availability

| ID | Requirement | Target | Priority |
|----|-------------|--------|----------|
| NFR-RL-001 | Uptime | 99.5% | High |
| NFR-RL-002 | Auto-recovery after crash | < 60s | High |
| NFR-RL-003 | Session persistence | Survive restart | High |
| NFR-RL-004 | Graceful shutdown | Complete pending ops | Medium |
| NFR-RL-005 | Data durability | No message loss | High |

### 2.3.3 Scalability

```mermaid
flowchart TB
    subgraph Vertical["Vertical Scaling"]
        V1[More RAM]
        V2[More CPU]
        V3[More Sessions]
    end
    
    subgraph Horizontal["Horizontal Scaling"]
        H1[Multiple Instances]
        H2[Load Balancer]
        H3[Shared Storage]
    end
    
    Vertical --> Single[Single Instance]
    Horizontal --> Cluster[Cluster Mode]
```

| ID | Requirement | Target | Priority |
|----|-------------|--------|----------|
| NFR-SC-001 | Vertical scaling | 20+ sessions/instance | Medium |
| NFR-SC-002 | Horizontal scaling support | Multiple instances | Low |
| NFR-SC-003 | Stateless API design | Session-independent | High |

### 2.3.4 Security

| ID | Requirement | Description | Priority |
|----|-------------|-------------|----------|
| NFR-SE-001 | API Authentication | API key required | High |
| NFR-SE-002 | Data encryption | TLS for all connections | High |
| NFR-SE-003 | Secret management | Encrypted storage | High |
| NFR-SE-004 | Input validation | Sanitize all inputs | High |
| NFR-SE-005 | Rate limiting | Prevent abuse | Medium |
| NFR-SE-006 | Audit logging | Track all operations | Medium |
| NFR-SE-007 | CORS configuration | Configurable origins | Medium |

### 2.3.5 Maintainability

| ID | Requirement | Description | Priority |
|----|-------------|-------------|----------|
| NFR-MT-001 | Code coverage | > 80% unit tests | Medium |
| NFR-MT-002 | Documentation | API docs up-to-date | High |
| NFR-MT-003 | Logging | Structured logging | High |
| NFR-MT-004 | Modular architecture | Loosely coupled | High |
| NFR-MT-005 | Configuration | Environment-based | High |

### 2.3.6 Usability

| ID | Requirement | Description | Priority |
|----|-------------|-------------|----------|
| NFR-US-001 | Setup time | < 5 minutes with Docker | High |
| NFR-US-002 | API documentation | Swagger/OpenAPI | High |
| NFR-US-003 | Error messages | Clear & actionable | High |
| NFR-US-004 | Examples | Working code examples | Medium |
| NFR-US-005 | Dashboard UX | Intuitive interface | Medium |

### 2.3.7 Compatibility

| ID | Requirement | Description | Priority |
|----|-------------|-------------|----------|
| NFR-CP-001 | Node.js version | 18.x, 20.x LTS | High |
| NFR-CP-002 | Database support | SQLite, PostgreSQL | High |
| NFR-CP-003 | OS support | Linux, macOS, Windows | High |
| NFR-CP-004 | Docker support | Official image | High |
| NFR-CP-005 | ARM64 support | Apple Silicon, ARM servers | Medium |

## 2.4 Use Cases

### UC-001: Send Text Message

```mermaid
sequenceDiagram
    actor User
    participant API as OpenWA API
    participant Engine as WA Engine
    participant WA as WhatsApp
    
    User->>API: POST /api/sessions/:sessionId/messages/send-text
    API->>API: Validate request
    API->>Engine: sendMessage(chatId, text)
    Engine->>WA: Send via WhatsApp Web
    WA-->>Engine: Message sent
    Engine-->>API: Success response
    API-->>User: 200 OK {messageId}
```

**Actors**: External application, Developer  
**Precondition**: Session is active and connected  
**Main Flow**:
1. User sends a POST request with `chatId` and `text`
2. The system validates the request
3. The system sends the message via the WhatsApp engine
4. The system returns the `messageId`

**Alternative Flow**:
- Session not active → Return 400 error
- Invalid phone number → Return 400 error
- WhatsApp error → Return 500 error

### UC-002: Receive Message via Webhook

```mermaid
sequenceDiagram
    participant WA as WhatsApp
    participant Engine as WA Engine
    participant API as OpenWA
    participant WH as User Webhook
    
    WA->>Engine: New message received
    Engine->>API: Message event
    API->>API: Store message
    API->>WH: POST webhook payload
    WH-->>API: 200 OK
    API->>API: Mark delivered
```

**Actors**: WhatsApp, External webhook endpoint  
**Precondition**: Webhook URL configured  
**Main Flow**:
1. WhatsApp sends a message to the session
2. The engine receives and forwards to the API
3. The API stores the message and sends it to the webhook
4. The webhook endpoint acknowledges

**Alternative Flow**:
- Webhook failed → Retry 3x
- All retries failed → Log and mark failed

### UC-003: Create New Session

```mermaid
stateDiagram-v2
    [*] --> Creating: POST /sessions
    Creating --> WaitingQR: Generate QR
    WaitingQR --> Scanning: User scans QR
    WaitingQR --> Timeout: 60s timeout
    Scanning --> Authenticating: QR scanned
    Authenticating --> Ready: Auth success
    Authenticating --> Failed: Auth failed
    Ready --> [*]
    Timeout --> [*]
    Failed --> [*]
```

## 2.5 Requirements Traceability Matrix

| Requirement ID | Use Case | Test Case | Status |
|----------------|----------|-----------|--------|
| FR-SM-001 | UC-003 | TC-SM-001 | ✅ Implemented |
| FR-SM-002 | UC-003 | TC-SM-002 | ✅ Implemented |
| FR-MSG-001 | UC-001 | TC-MSG-001 | ✅ Implemented |
| FR-WH-001 | UC-002 | TC-WH-001 | ✅ Implemented |

## 2.6 Acceptance Criteria

### Phase 1 MVP Acceptance Criteria

```
✓ A single session can be created and authenticated
✓ QR code can be scanned and session connected
✓ Text messages can be sent
✓ Image messages can be sent
✓ Incoming messages are forwarded to webhooks
✓ API documentation is available via Swagger
✓ Docker image can be built and run
✓ Basic health check endpoint works
```

### Phase 2 Acceptance Criteria

```
✓ Multiple sessions can run concurrently
✓ Dashboard can display all sessions
✓ Webhooks can be managed via UI
✓ PostgreSQL can be used as storage
✓ API key authentication works
✓ Rate limiting is enabled
```
---

<div align="center">

[← 01 - Project Overview](./01-project-overview.md) · [Documentation Index](./README.md) · [Next: 03 - System Architecture →](./03-system-architecture.md)

</div>
