# Perspective Submission Service

This module implements the perspective submission service for VoxPop, allowing users to submit perspectives on issues with rate limiting and security measures for unverified users.

## Design

The system is built around the following components:

1. **PerspectiveService**: Handles the business logic for perspective submissions
2. **PerspectiveHandler**: Exposes the HTTP API endpoint
3. **Rate Limiting**: Uses Redis for tracking submission counts

## API Endpoints

### Submit Perspective

**Endpoint**: `POST /submit-perspective`

**Request Body**:
```json
{
  "issueId": "issue-12345",
  "text": "This is my perspective on the issue.",
  "fileURL": "http://example.com/document.pdf",
  "userAddress": "0x1234567890abcdef",
  "isVerified": false,
  "captchaToken": "valid-token"
}
```

**Response**:
```json
{
  "success": true,
  "hash": "QmHash123issu"
}
```

## Features

### Text Validation
- Maximum text length: 1000 characters
- Sanitizes input to prevent injection attacks

### File Validation
- Maximum file size: 5MB
- Currently mocked in the implementation

### Unverified Users
- Limited to 5 submissions per day
- Must provide a valid CAPTCHA token
- Error response if rate limit exceeded:
  ```json
  {
    "success": false,
    "error": "Rate limit exceeded. Maximum 5 submissions per day for unverified users."
  }
  ```

### IPFS Storage
- Uploads content to IPFS via Pinata (currently mocked)
- Returns an IPFS hash for the content

## Configuration

The service requires Redis for rate limiting:

- `REDIS_ADDR`: Redis server address (default: "localhost:6379")
- `REDIS_PASSWORD`: Redis password (default: "")
- `REDIS_DB`: Redis database number (default: 0)

## Example Usage

### Verified User

```json
// Request
{
  "issueId": "issue-12345",
  "text": "This is my perspective on the issue.",
  "fileURL": "http://example.com/document.pdf",
  "userAddress": "0x1234567890abcdef",
  "isVerified": true
}

// Response
{
  "success": true,
  "hash": "QmHash123issu"
}
```

### Unverified User (with CAPTCHA)

```json
// Request
{
  "issueId": "issue-12345",
  "text": "This is my perspective on the issue.",
  "userAddress": "0x1234567890abcdef",
  "isVerified": false,
  "captchaToken": "valid-token"
}

// Response
{
  "success": true,
  "hash": "QmHash123issu"
}
```

### Rate Limit Exceeded

```json
// Response (HTTP 429)
{
  "success": false,
  "error": "Rate limit exceeded. Maximum 5 submissions per day for unverified users."
}
```

## Testing

Run the tests with:

```bash
go test ./perspective
```