# Saleor Core Extensions

A Saleor app that sends email notifications for order events (created, fulfilled, cancelled) using React Email templates.

## Features

- **Order Created** - Sends confirmation emails to customer and admin
- **Order Fulfilled** - Sends shipping notification with tracking
- **Order Cancelled** - Sends cancellation notification
- **Multi-language** - Supports EN, SR, DE, FR
- **React Email** - Professional HTML emails with responsive design

## Installation

### Option 1: Install via Manifest URL

In your Saleor Dashboard, go to Apps → Install App → Enter manifest URL:

```
https://your-app-domain.com/api/manifest
```

### Option 2: Manual Installation

```bash
# Clone the repository
git clone https://github.com/your-org/saleor-core-extensions.git
cd saleor-core-extensions

# Install dependencies
pnpm install

# Build Docker image
docker build -t ghcr.io/your-org/saleor-core-extensions:latest .

# Deploy to your K8s cluster
kubectl apply -f deployment.yaml
```

## Configuration

### Environment Variables

| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `SALEOR_API_URL` | Yes | - | Internal K8s URL for Saleor API (e.g., `http://saleor-api.saleor:8000/graphql/`) |
| `ALLOWED_SALEOR_URLS` | No | `http://localhost:3000` | Comma-separated list of allowed Saleor API URLs |
| `RESEND_API_KEY` | Yes | - | API key from [Resend.com](https://resend.com) |
| `FROM_EMAIL` | No | `support@mail.manoonoils.com` | Sender email address |
| `FROM_NAME` | No | `ManoonOils` | Sender name |
| `ADMIN_EMAILS` | Yes | - | Comma-separated admin emails for notifications |
| `SITE_URL` | No | `https://dev.manoonoils.com` | Public store URL |
| `DASHBOARD_URL` | No | `https://dashboard.manoonoils.com` | Saleor dashboard URL |
| `APP_IFRAME_BASE_URL` | Yes | - | Public URL where app is hosted |
| `APP_API_BASE_URL` | Yes | - | Same as APP_IFRAME_BASE_URL |
| `AUTH_DATA_FILE_PATH` | No | `/tmp/.auth-data.json` | Path for auth data storage |
| `EMAIL_LOGO_URL` | No | - | URL to company logo for emails |
| `EMAIL_COMPANY_NAME` | No | `Store` | Company name in emails |
| `EMAIL_FOOTER` | No | auto | Footer text in emails |

### Kubernetes Deployment

```yaml
env:
  - name: SALEOR_API_URL
    value: "http://saleor-api.saleor:8000/graphql/"
  - name: APP_IFRAME_BASE_URL
    value: "https://your-app.domain.com"
  - name: APP_API_BASE_URL
    value: "https://your-app.domain.com"
  - name: RESEND_API_KEY
    valueFrom:
      secretKeyRef:
        name: core-extensions-secrets
        key: resend-api-key
  - name: ADMIN_EMAILS
    value: "admin@example.com"
```

## Architecture

```
┌─────────────────┐     Webhooks      ┌──────────────────┐
│  Saleor Cloud   │ ───────────────► │  Core Extensions │
│                 │                  │     App          │
└─────────────────┘                  └────────┬─────────┘
       ▲                                       │
       │                                       ▼
       │                               ┌──────────────┐
       │                               │    Resend    │
       └────── GraphQL API ───────────│   (Email)   │
                                       └──────────────┘
```

### Internal Networking

The app uses `SALEOR_API_URL` to communicate with Saleor API internally, avoiding Cloudflare HTTP restrictions. The stored auth token is reused while the env var controls the API endpoint.

## Development

```bash
# Install dependencies
pnpm install

# Start development server
pnpm dev

# Generate GraphQL types
pnpm generate

# Build for production
pnpm build
```

## Project Structure

```
src/
├── emails/
│   ├── BaseLayout.tsx       # Email layout with logo/footer
│   ├── OrderConfirmation.tsx # Order confirmation email
│   ├── OrderShipped.tsx     # Order shipped email
│   └── OrderCancelled.tsx   # Order cancelled email
├── lib/
│   ├── resend.ts            # Email sending logic
│   └── create-graphq-client.ts
├── pages/
│   ├── api/
│   │   ├── manifest.ts      # App manifest
│   │   └── register.ts     # App registration
│   └── webhooks/
│       ├── order-created.ts
│       ├── order-fulfilled.ts
│       └── order-cancelled.ts
└── saleor-app.ts           # APL configuration
```

## License

MIT
