# Screenshot Service

Unified Node.js service for generating merchandise design screenshots using Puppeteer.

## Overview

This service consolidates multiple screenshot generation endpoints that were previously running on separate ports. It now provides a single, well-organized application with proper routing.

## Architecture

```
nodejs/
├── server.js              # Main application entry point
├── config/
│   └── config.js         # Configuration (SSL, CORS, URLs)
├── middleware/
│   └── cors.js           # CORS middleware
├── routes/
│   ├── jersey.js         # Jersey screenshot routes
│   ├── tshirt.js         # T-Shirt screenshot routes
│   ├── merchbay.js       # Merchbay screenshot routes
│   └── mask.js           # Mask screenshot routes
├── utils/
│   └── screenshot.js     # Screenshot utility functions
└── package.json          # Dependencies and scripts
```

## Installation

```bash
npm install
```

## Configuration

### Environment Variables

Create a `.env` file from the example:
```bash
cp .env.example .env
```

Key configuration options:
- `USE_SSL=false` - Use HTTP (recommended for Traefik deployment)
- `USE_SSL=true` - Use HTTPS with direct SSL certificates
- `PORT=5955` - Server port
- `BASE_URL` - Base URL for generated screenshot links

### Traefik Deployment (Recommended)

When deploying behind Traefik with automatic SSL:
1. Set `USE_SSL=false` in your `.env` file
2. The app will run on HTTP
3. Traefik handles SSL termination with automatic Let's Encrypt certificates
4. No SSL certificate files needed

### Direct SSL Deployment

If deploying without a reverse proxy:
1. Set `USE_SSL=true` in your `.env` file
2. Configure SSL certificate paths:
   - `SSL_KEY_PATH=/path/to/key.pem`
   - `SSL_CERT_PATH=/path/to/cert.pem`

## Usage

### Development
```bash
npm run dev
```

### Production
```bash
npm start
```

## API Endpoints

### Health Check
- `GET /health` - Service health status

### Jersey Screenshots
- `GET /jersey/:designId` - Generate 4-view screenshots (front, back, right, left)

### T-Shirt Screenshots
- `GET /tshirt/:designId` - Generate 4-view screenshots
- `GET /tshirt/allover/:designId` - Generate 2-view all-over print screenshots

### Merchbay Screenshots
- `GET /merchbay/tshirt/:designId` - Generate 4-view screenshots
- `GET /merchbay/allover/:designId` - Generate 2-view all-over print screenshots
- `GET /merchbay/legacy/:designId` - Legacy viewer URL format (4 views)

### Mask Screenshots
- `GET /mask/:designId` - All-over print mask (single view)
- `GET /mask/classic/:designId` - Classic mask (single view, larger)

### Legacy Routes (Backwards Compatible)
- `GET /tb/:designId` → Maps to `/jersey/:designId`
- `GET /ap/:designId` → Maps to `/tshirt/allover/:designId`

## Response Format

All endpoints return JSON/JSONP with the following structure:

```json
{
  "thumb_front": "https://crewsportswear.app:5955/designId-front-thumbnail.png",
  "thumb_back": "https://crewsportswear.app:5955/designId-back-thumbnail.png",
  "thumb_right": "https://crewsportswear.app:5955/designId-right-thumbnail.png",
  "thumb_left": "https://crewsportswear.app:5955/designId-left-thumbnail.png",
  "time": "2025-12-23T12:00:00.000Z"
}
```

## Features

- ✅ **Unified Application**: Single server instead of multiple separate services
- ✅ **Organized Routes**: Clean route structure with dedicated modules
- ✅ **CORS Support**: Configured allowed origins
- ✅ **Caching**: Checks for existing screenshots before regenerating
- ✅ **Error Handling**: Proper error handling and logging
- ✅ **Backwards Compatibility**: Legacy routes still work
- ✅ **HTTPS**: SSL/TLS support
- ✅ **Health Check**: Monitoring endpoint
- ✅ **Graceful Shutdown**: Proper cleanup on termination

## Configuration

Edit `config/config.js` to modify:
- SSL certificate paths
- Allowed CORS origins
- Screenshot output directory
- Base URL for generated images
- Viewport dimensions
- Wait times
- Viewer URLs

## Migration from Old Services

### Before (Multiple Services)
```
jersey-screenshot.js   → Port 5951
merchbay-tshirt.js    → Port 5952
tshirt_ss.js          → Port 5952
mask.js               → Port 5953
```

### After (Single Unified Service)
```
server.js → Port 5955 (configurable)
All routes available on the same port
```

### Updating Laravel Applications

Update your `.env` or configuration to point to the new unified service:

```env
IMAGES_URL=https://your-domain:5955
```

Then update API calls:
- Old: `https://domain:5951/tb/:designId`
- New: `https://domain:5955/jersey/:designId` (or use legacy route `/tb/:designId`)

## Logging

The service logs:
- Route access
- Screenshot generation status
- Errors and exceptions
- Server startup information

## Environment Variables

### Server
- `PORT` - Server port (default: 5955)
- `HOST` - Server host (default: 0.0.0.0)
- `USE_SSL` - Enable direct SSL (true/false, default: false)

### SSL (only when USE_SSL=true)
- `SSL_KEY_PATH` - Path to SSL private key
- `SSL_CERT_PATH` - Path to SSL certificate

###Deployment Options

### Option 1: Traefik with Auto SSL (Recommended)
1. Set `USE_SSL=false`
2. Configure Traefik labels in docker-compose
3. Traefik handles SSL with Let's Encrypt
4. App runs on HTTP internally

### Option 2: Direct SSL
1. Set `USE_SSL=true`
2. Provide SSL certificates:
   - Key: `/etc/httpd/ssl/crewsportswear_app.key`
   - Cert: `/etc/httpd/ssl/certs/current_cert.crt`
3. App runs on HTTPS directlydefault: 1100)
- `WAIT_TIME` - Wait time before screenshot in ms (default: 10000)

## Dependencies

- **express**: Web framework
- **puppeteer**: Headless browser for screenshots
- **nodemon**: Development auto-reload (dev dependency)

## SSL Certificates

Ensure SSL certificates are available at:
- Key: `/etc/httpd/ssl/crewsportswear_app.key`
- Cert: `/etc/httpd/ssl/certs/current_cert.crt`

## Notes

- Screenshots are cached in `/var/www/html/images/`
- If a screenshot already exists, it returns immediately without regeneration
- All routes support JSONP for cross-domain compatibility
- Puppeteer runs in headless mode with `--no-sandbox` for Docker compatibility
