Share
## https://sploitus.com/exploit?id=4A76B775-6F83-581C-9D2B-09F79E46B31E
# FotoWeb PAP Photo Matcher

Proof-of-concept automatycznego dopasowywania zdjęć z archiwum PAP (Polska Agencja Prasowa) do artykułów z Ring CMS.

## Jak to działa

1. Użytkownik wkleja URL artykułu z Ring CMS
2. Backend pobiera treść artykułu przez Ring Publishing GraphQL API
3. OpenAI GPT-4.1 ekstrahuje słowa kluczowe (osoby, lokalizacje, tematy, zapytania PL/EN)
4. Backend przeszukuje FotoWeb On-Premises API wieloma zapytaniami (parallel batches z fallback)
5. Wyniki rankowane przez GPT (z algorytmicznym fallbackiem)
6. Rezultaty streamowane do frontendu przez Server-Sent Events (SSE)

## Stack technologiczny

**Backend:** Node.js, Express, TypeScript, Zod, OpenAI SDK, `@ringpublishing/graphql-api-client`
**Frontend:** React 19, Vite, TypeScript
**Shared types:** `shared/types.ts` jako single source of truth

## Wymagania

- Node.js >= 18
- Dostęp do Ring Content API (klucze API)
- Klucz OpenAI API
- Dostęp do instancji FotoWeb On-Premises (OAuth2 credentials)

## Setup

### 1. Sklonuj repo i zainstaluj zależności

```bash
npm install
cd frontend && npm install
```

### 2. Skonfiguruj zmienne środowiskowe

```bash
cp .env.example .env
```

Uzupełnij `.env` swoimi credentials:

| Zmienna | Opis | Wymagana |
|---------|------|----------|
| `RING_ACCESS_KEY` | Klucz dostępu Ring Content API | Tak |
| `RING_SECRET_KEY` | Klucz sekretny Ring Content API | Tak |
| `OPENAI_API_KEY` | Klucz API OpenAI | Tak |
| `OPENAI_MODEL` | Model OpenAI (domyślnie `gpt-4.1`) | Nie |
| `FOTOWEB_BASE_URL` | URL instancji FotoWeb | Tak |
| `FOTOWEB_CLIENT_ID` | OAuth2 Client ID FotoWeb | Tak |
| `FOTOWEB_CLIENT_SECRET` | OAuth2 Client Secret FotoWeb | Tak |
| `FOTOWEB_LOGIN` | Login do FotoWeb | Tak |
| `FOTOWEB_PASSWORD` | Hasło do FotoWeb | Tak |
| `PORT` | Port backendu (domyślnie `3001`) | Nie |
| `RANKING_STRATEGY` | Strategia rankingu: `gpt` lub `algorithmic` (domyślnie `gpt`) | Nie |

### 3. Uruchom w trybie developerskim

Backend i frontend w osobnych terminalach:

```bash
# Terminal 1 — backend
npm run dev

# Terminal 2 — frontend
cd frontend && npm run dev
```

Frontend (Vite) domyślnie startuje na `http://localhost:5173` i proxy'uje `/api` do backendu na porcie 3001.

## Struktura projektu

```
├── src/                  # Backend (Express + TypeScript)
│   ├── config/           # Env validation (Zod), Ring spaces
│   ├── routes/           # /api/analyze (SSE), /api/search-manual
│   ├── services/         # FotoWeb, Ring CMS, keyword extraction, ranking
│   └── utils/            # Text extraction z content blocks
├── frontend/             # Frontend (React + Vite)
│   └── src/
│       ├── components/   # UI components
│       └── hooks/        # React hooks (useAnalyze, useManualSearch)
├── shared/               # Shared types (backend + frontend)
├── postman/              # Postman collection do testów API
├── docs/                 # Dokumentacja techniczna
└── tests/                # Live testy pipeline
```

## Postman

Kolekcja Postman do testowania FotoWeb API jest w `postman/`. Skopiuj plik environment:

```bash
cp postman/FotoWeb_Beta_Environment.postman_environment.example.json postman/FotoWeb_Beta_Environment.postman_environment.json
```

Uzupełnij `client_id` i `client_secret` w skopiowanym pliku.

## Build

```bash
# Backend
npm run build
npm start

# Frontend
cd frontend && npm run build
```