# WebSocket and payment integration

## WebSocket/Real-time Features

### Socket.IO Implementation

**Server Setup** (in `index.js`):
```javascript
const server = http.createServer(app);
const io = socketIo(server, {
  cors: { origin: "*" }
});
handleChat(io);
```

### Chat System

**Features:**
- Real-time messaging between buyers and sellers
- Chat room management
- Online status
- Typing indicators
- Unread message count

**Events:**
- `connection` - Client connected
- `join_room` - Join specific chat room
- `send_message` - Send message
- `typing` - User typing indicator
- `read_messages` - Mark messages as read
- `disconnect` - Client disconnected

**Implementation** (`services/chat.services.js`):
```javascript
io.on('connection', (socket) => {
  socket.on('join_room', (roomId) => {
    socket.join(roomId);
  });
  
  socket.on('send_message', async (data) => {
    // Save message to MongoDB
    // Emit to room participants
    io.to(roomId).emit('new_message', message);
  });
});
```

---

## Payment Integration

### Xendit Integration

#### 1. Create Virtual Account

```javascript
const { xenditClient } = require('./config/api');

// Create VA
const response = await xenditClient.VirtualAccount.create({
  external_id: orderNumber,
  bank_code: 'BCA',
  name: customerName,
  expected_amount: totalAmount,
  expiration_date: expirationDate
});
```

#### 2. Webhook Handling

```javascript
// POST /webhook/xendit
app.post('/webhook/xendit', async (req, res) => {
  // Verify webhook signature
  const signature = req.headers['x-callback-token'];
  if (signature !== process.env.XENDIT_CALLBACK_TOKEN) {
    return res.status(401).json({ error: 'Unauthorized' });
  }
  
  // Process payment
  const { external_id, status } = req.body;
  if (status === 'PAID') {
    await updateOrderStatus(external_id, 'PAID');
  }
  
  res.json({ success: true });
});
```

### BRI Virtual Account (BRIVA)

Additional integration for BRI-specific virtual accounts in `services/briva/`.