# EasyStream API Documentation

## Overview

EasyStream provides a RESTful API for managing videos, users, comments, and subscriptions. All API endpoints return JSON responses and support both JWT token authentication and session-based authentication.

**Base URL:** `/api/`

**Content-Type:** `application/json`

## Table of Contents

1. [Authentication](#authentication)
2. [Videos API](#videos-api)
3. [User API](#user-api)
4. [Comments API](#comments-api)
5. [Subscriptions API](#subscriptions-api)
6. [Error Handling](#error-handling)
7. [Rate Limiting](#rate-limiting)

---

## Authentication

### Overview

EasyStream supports two authentication methods:

1. **JWT Token Authentication** (Recommended for API clients)
2. **Session-based Authentication** (For web pages)

### Endpoints

#### Login with JWT Token

```http
POST /api/auth.php?action=login_token
```

**Request Body:**
```json
{
  "identifier": "username or email",
  "password": "password",
  "expires_in": 86400
}
```

**Response:**
```json
{
  "success": true,
  "token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "expires_in": 86400,
  "user": {
    "usr_id": 1,
    "usr_user": "john",
    "usr_email": "john@example.com"
  }
}
```

#### Login with Session

```http
POST /api/auth.php?action=login
```

**Request Body:**
```json
{
  "identifier": "username or email",
  "password": "password",
  "remember": true,
  "csrf_token": "token"
}
```

#### Get CSRF Token

```http
GET /api/auth.php?action=csrf_token
```

#### Verify Token

```http
GET /api/auth.php?action=verify_token
Authorization: Bearer <token>
```

#### Get Current User

```http
GET /api/auth.php?action=me
Authorization: Bearer <token>
```

#### Logout

```http
POST /api/auth.php?action=logout
```

---

## Videos API

Base endpoint: `/api/videos.php`

### List Videos

Get a paginated list of videos with filtering options.

```http
GET /api/videos.php?page=1&limit=20&sort=recent&category=music
```

**Query Parameters:**
- `page` (integer, optional): Page number (default: 1)
- `limit` (integer, optional): Items per page, max 100 (default: 20)
- `sort` (string, optional): Sort order - `recent`, `popular`, `featured`, `oldest`, `title` (default: recent)
- `category` (string, optional): Filter by category
- `channel_id` (integer, optional): Filter by channel/user ID

**Response:**
```json
{
  "success": true,
  "data": {
    "videos": [
      {
        "file_key": "123456",
        "file_title": "My Video",
        "file_description": "Description",
        "file_duration": "00:05:30",
        "file_views": 1500,
        "upload_date": "2025-01-15 10:30:00",
        "thumbnail": "/path/to/thumb.jpg",
        "usr_id": 1,
        "usr_user": "john",
        "usr_dname": "John Doe",
        "like_count": 50,
        "comment_count": 10
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 100,
      "pages": 5
    }
  }
}
```

### Get Single Video

```http
GET /api/videos.php?id=123456
```

**Response:**
```json
{
  "success": true,
  "data": {
    "file_key": "123456",
    "file_title": "My Video",
    "file_description": "Description",
    "file_name": "video.mp4",
    "file_duration": "00:05:30",
    "file_views": 1500,
    "privacy": "public",
    "upload_date": "2025-01-15 10:30:00",
    "usr_id": 1,
    "usr_user": "john",
    "usr_dname": "John Doe",
    "usr_avatar": "/path/to/avatar.jpg",
    "like_count": 50,
    "dislike_count": 2,
    "comment_count": 10,
    "subscriber_count": 1000,
    "user_like_status": "like",
    "user_subscribed": true
  }
}
```

### Search Videos

```http
GET /api/videos.php?action=search&q=search+query&page=1&limit=20
```

### Create Video

```http
POST /api/videos.php?action=create
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "title": "Video Title",
  "description": "Video description",
  "privacy": "public",
  "category": "entertainment",
  "tags": "tag1,tag2,tag3"
}
```

**Response:**
```json
{
  "success": true,
  "data": {
    "file_key": "789012",
    "message": "Video created successfully"
  }
}
```

### Update Video

```http
PUT /api/videos.php?id=123456
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "file_title": "Updated Title",
  "file_description": "Updated description",
  "privacy": "private"
}
```

### Delete Video

```http
DELETE /api/videos.php?id=123456
Authorization: Bearer <token>
```

### Like/Dislike Video

```http
POST /api/videos.php?action=like
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "file_key": "123456",
  "like_type": "like"
}
```

**Response:**
```json
{
  "success": true,
  "data": {
    "action": "added",
    "like_count": 51,
    "dislike_count": 2
  }
}
```

### Record Video View

```http
POST /api/videos.php?action=view
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "file_key": "123456"
}
```

### Watch Later

Add/remove video from watch later list.

```http
POST /api/videos.php?action=watch_later
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "file_key": "123456"
}
```

---

## User API

Base endpoint: `/api/user.php`

### Get User Profile

Get current user's profile (requires authentication):

```http
GET /api/user.php?action=profile
Authorization: Bearer <token>
```

Get another user's public profile:

```http
GET /api/user.php?id=123
```

**Response:**
```json
{
  "success": true,
  "data": {
    "usr_id": 1,
    "usr_user": "john",
    "usr_dname": "John Doe",
    "usr_email": "john@example.com",
    "usr_avatar": "/path/to/avatar.jpg",
    "usr_about": "About me",
    "usr_website": "https://example.com",
    "usr_verified": true,
    "usr_partner": false,
    "stats": {
      "videos": 50,
      "subscribers": 1000,
      "subscriptions": 75,
      "views": 50000
    }
  }
}
```

### Update Profile

```http
PUT /api/user.php
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "usr_dname": "John Doe",
  "usr_about": "Updated bio",
  "usr_website": "https://newsite.com",
  "usr_location": "New York, USA"
}
```

### Upload Avatar

```http
POST /api/user.php?action=avatar
Authorization: Bearer <token>
Content-Type: multipart/form-data
```

**Form Data:**
- `avatar`: Image file (JPG, PNG, GIF, max 5MB)

### Get User Statistics

```http
GET /api/user.php?action=stats
Authorization: Bearer <token>
```

**Response:**
```json
{
  "success": true,
  "data": {
    "total_videos": 50,
    "videos_last_30_days": 5,
    "total_views": 50000,
    "total_subscribers": 1000,
    "total_subscriptions": 75,
    "total_comments": 250,
    "total_likes_given": 500
  }
}
```

### Get User's Videos

```http
GET /api/user.php?action=videos&id=123&page=1&limit=20
```

### Get User's Subscriptions

```http
GET /api/user.php?action=subscriptions
Authorization: Bearer <token>
```

### Get User's Subscribers

```http
GET /api/user.php?action=subscribers&id=123
```

---

## Comments API

Base endpoint: `/api/comments.php`

### List Comments

Get comments for a video:

```http
GET /api/comments.php?file_key=123456&page=1&limit=50&sort=recent
```

**Query Parameters:**
- `file_key` (required): Video file key
- `page` (optional): Page number
- `limit` (optional): Items per page, max 100
- `sort` (optional): `recent`, `top`, `oldest`

**Response:**
```json
{
  "success": true,
  "data": {
    "comments": [
      {
        "comment_id": 1,
        "usr_id": 5,
        "usr_user": "jane",
        "usr_dname": "Jane Smith",
        "usr_avatar": "/path/to/avatar.jpg",
        "comment_text": "Great video!",
        "comment_date": "2025-01-15 12:00:00",
        "comment_likes": 10,
        "reply_count": 3,
        "user_liked": false
      }
    ],
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 120,
      "pages": 3
    }
  }
}
```

### Get Single Comment

Get comment with replies:

```http
GET /api/comments.php?id=123
```

### Create Comment

```http
POST /api/comments.php?action=create
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "file_key": "123456",
  "comment_text": "This is my comment",
  "parent_id": null
}
```

Set `parent_id` to reply to another comment.

### Update Comment

```http
PUT /api/comments.php?id=123
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "comment_text": "Updated comment text"
}
```

### Delete Comment

```http
DELETE /api/comments.php?id=123
Authorization: Bearer <token>
```

### Like Comment

```http
POST /api/comments.php?action=like
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "comment_id": 123
}
```

### Report Comment

```http
POST /api/comments.php?action=report
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "comment_id": 123,
  "reason": "Spam or abuse"
}
```

---

## Subscriptions API

Base endpoint: `/api/subscriptions.php`

### Get User's Subscriptions

```http
GET /api/subscriptions.php?action=list
Authorization: Bearer <token>
```

**Response:**
```json
{
  "success": true,
  "data": {
    "subscriptions": [
      {
        "usr_id": 5,
        "usr_user": "creator",
        "usr_dname": "Creator Name",
        "usr_avatar": "/path/to/avatar.jpg",
        "usr_verified": true,
        "sub_date": "2025-01-01 10:00:00",
        "video_count": 50,
        "subscriber_count": 10000
      }
    ],
    "total": 15
  }
}
```

### Get Channel's Subscribers

```http
GET /api/subscriptions.php?action=subscribers&channel_id=5&page=1
```

### Get Subscription Feed

Get latest videos from subscribed channels:

```http
GET /api/subscriptions.php?action=feed&page=1&limit=20
Authorization: Bearer <token>
```

### Check Subscription Status

```http
GET /api/subscriptions.php?action=check&channel_id=5
Authorization: Bearer <token>
```

**Response:**
```json
{
  "success": true,
  "data": {
    "is_subscribed": true,
    "subscribed_since": "2025-01-01 10:00:00"
  }
}
```

### Subscribe to Channel

```http
POST /api/subscriptions.php
Authorization: Bearer <token>
```

**Request Body:**
```json
{
  "channel_id": 5
}
```

### Unsubscribe from Channel

```http
DELETE /api/subscriptions.php?channel_id=5
Authorization: Bearer <token>
```

---

## Error Handling

All API endpoints return consistent error responses:

```json
{
  "success": false,
  "error": "Error message here",
  "data": null
}
```

### HTTP Status Codes

- `200 OK`: Request successful
- `400 Bad Request`: Invalid request parameters
- `401 Unauthorized`: Authentication required or failed
- `403 Forbidden`: Insufficient permissions
- `404 Not Found`: Resource not found
- `405 Method Not Allowed`: HTTP method not supported
- `429 Too Many Requests`: Rate limit exceeded
- `500 Internal Server Error`: Server error

---

## Rate Limiting

Rate limits are applied to prevent abuse:

- **Login attempts**: 5 per 15 minutes per IP
- **Password reset**: 3 per hour per email
- **API calls**: 100 per minute per user (when authenticated)
- **Anonymous API calls**: 20 per minute per IP

Rate limit headers:

```
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1642512000
```

---

## Frontend Integration

### Using api-helper.js

EasyStream provides a modern JavaScript API client for easy integration:

```javascript
// Initialize (automatically done on page load)
const api = window.api; // or new EasyStreamAPI()

// Login
const loginResult = await api.login('username', 'password');
if (loginResult.success) {
  console.log('Logged in!', loginResult.user);
}

// Get videos
const videos = await api.getVideos({ page: 1, sort: 'popular' });

// Get single video
const video = await api.getVideo('123456');

// Like video
await api.likeVideo('123456', 'like');

// Create comment
await api.createComment('123456', 'Great video!');

// Subscribe to channel
await api.subscribe(5);

// Get user profile
const profile = await api.getUserProfile(123);

// Update profile
await api.updateProfile({
  usr_dname: 'New Display Name',
  usr_about: 'Updated bio'
});

// Error handling
try {
  const result = await api.someAPICall();
} catch (error) {
  console.error('API error:', error.message);
  api.handleError(error);
}
```

### Authentication Headers

When using JWT tokens, include the Authorization header:

```javascript
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
```

The api-helper.js automatically handles this for you.

---

## CORS Configuration

Cross-Origin Resource Sharing (CORS) is configured securely:

- **Development**: Allows localhost and 127.0.0.1
- **Production**: Only allows origins defined in `CORS_ALLOWED_ORIGINS` environment variable

To configure allowed origins in production, set:

```bash
CORS_ALLOWED_ORIGINS=https://example.com,https://www.example.com
```

---

## Best Practices

1. **Always use HTTPS** in production
2. **Store JWT tokens securely** (httpOnly cookies or secure localStorage)
3. **Include CSRF tokens** for session-based requests
4. **Handle errors gracefully** and show user-friendly messages
5. **Implement exponential backoff** for failed requests
6. **Cache responses** when appropriate
7. **Validate input** on both client and server side
8. **Use pagination** for large datasets
9. **Monitor rate limits** to avoid being throttled
10. **Log errors** for debugging

---

## Support

For issues or questions about the API:

- Check [docs/TROUBLESHOOTING.md](TROUBLESHOOTING.md)
- Review [docs/BACKEND_FRONTEND_INTEGRATION_FIXES.md](BACKEND_FRONTEND_INTEGRATION_FIXES.md)
- Open an issue in the project repository

---

**Last Updated:** January 2025
**API Version:** 1.0.0
