# ARCHITECTURE

## Scope

Dokument opisuje aktualna architekture runtime projektu `shopPRO`:
- warstwy aplikacji i ich odpowiedzialnosci,
- przeplywy requestow (admin/front/api),
- Dependency Injection i miejsca wiringu,
- konwencje autoloadera i namespace,
- granice miedzy nowa architektura a pozostalosciami legacy.

## High-level layout

Kod aplikacji jest podzielony na 4 glowne warstwy:

1. `autoload/Domain/` - logika biznesowa i dostep do danych (28 modulow)
2. `autoload/admin/` - panel administracyjny (router + kontrolery + form system)
3. `autoload/front/` - frontend sklepu (router + layout engine + kontrolery/widoki)
4. `autoload/api/` - REST API (`api.php`, `ApiRouter`, kontrolery endpointow)

Komponenty wspoldzielone sa trzymane w `autoload/Shared/`.

## Directory map (runtime)

```text
autoload/
  Domain/                 # 28 modulow domenowych
  Shared/                 # Cache, Helpers, Tpl, Html, Email, Image
  admin/
    App.php               # routing + DI factories
    Controllers/          # 28 kontrolerow admin
    Support/              # formularze/tabele
    Validation/           # walidacja formularzy
    ViewModels/           # modele widokow
  front/
    App.php               # routing + DI factories + fallback legacy
    LayoutEngine.php      # silnik layoutu frontend
    Controllers/          # 8 kontrolerow frontend
    Views/                # 11 statycznych klas widokow
  api/
    ApiRouter.php         # auth + endpoint dispatch
    Controllers/          # 4 kontrolery API
```

## Entry points i przeplyw

### Admin (`admin/index.php`)

1. Bootstrap (sesja, DB, autoload)
2. `admin\App::update()` - uruchamia pending migracje
3. `admin\App::special_actions()` - logowanie/wylogowanie/2FA
4. `admin\App::render()`:
   - auth gate (lub formularz logowania),
   - `route()` -> kontroler + akcja,
   - render przez `Shared\Tpl\Tpl`.

### Front (`index.php`)

1. Bootstrap (sesja, DB, autoload, jezyk)
2. Mapowanie URL (redirecty + routes)
3. `front\App::checkUrlParams()`
4. `front\App::route()`:
   - artykul/produkt/kategoria,
   - nowe kontrolery DI,
   - fallback do `front\controls\*` (legacy, jesli istnieje)
5. `front\LayoutEngine::show()` sklada finalny HTML.

### API (`api.php`)

1. Bootstrap (bez sesji biznesowej)
2. Tworzenie `\api\ApiRouter`
3. `ApiRouter::handle()`:
   - auth przez `X-Api-Key`,
   - walidacja `endpoint` i `action`,
   - dispatch do kontrolera API,
   - JSON response przez `sendSuccess()` / `sendError()`.

Szczegolowa specyfikacja endpointow: `.paul/docs/API.md`.

## Dependency Injection (manual factories)

DI jest realizowane recznie w mapach factory:

- admin: `autoload/admin/App.php` -> `getControllerFactories()`
- front: `autoload/front/App.php` -> `getControllerFactories()`
- api: `autoload/api/ApiRouter.php` -> `getControllerFactories()`

Wzorzec:
- router tworzy repozytoria domenowe,
- repozytoria sa wstrzykiwane do kontrolerow przez konstruktor,
- kontroler wywoluje metody domenowe i zwraca HTML/JSON.

## Autoloader i namespace rules

Kazdy entry point korzysta z custom autoloadera:

1. `autoload/{namespace}/class.{ClassName}.php` (legacy)
2. `autoload/{namespace}/{ClassName}.php` (nowy format)

Mapowanie namespace -> katalog (case-sensitive na Linux):

- `\Domain\` -> `autoload/Domain/`
- `\Shared\` -> `autoload/Shared/`
- `\admin\` -> `autoload/admin/` (male `a`)
- `\front\` -> `autoload/front/`
- `\api\` -> `autoload/api/`

Nie uzywac `\Admin\` (duze `A`), bo katalog runtime to `admin/`.

## Domain layer (28 modulow)

Aktualne moduly:

`Article`, `Attribute`, `Banner`, `Basket`, `Cache`, `Category`, `Client`, `Coupon`, `CronJob`, `Dashboard`, `Dictionaries`, `Integrations`, `Languages`, `Layouts`, `Newsletter`, `Order`, `Pages`, `PaymentMethod`, `Producer`, `Product`, `ProductSet`, `Promotion`, `Scontainers`, `Settings`, `ShopStatus`, `Transport`, `Update`, `User`.

Zasada: logika biznesowa i dostep do danych sa w Domain, bez duplikowania osobnych warstw "admin service" i "front service" dla tych samych przypadkow (wyjatki tylko tam, gdzie historycznie juz istnieja, np. `OrderAdminService`).

## Admin architecture

- Router: `admin\App`
- Kontrolery: `autoload/admin/Controllers/*.php` (28 klas)
- Form system:
  - `admin\ViewModels\Forms\*`
  - `admin\Support\Forms\FormRequestHandler`
  - `admin\Support\Forms\FormFieldRenderer`
  - `admin\Validation\FormValidator`
  - template: `admin/templates/components/form-edit.php`

Admin ma pelne DI i nie korzysta z fallbacku na legacy kontrolery.

## Front architecture

- Router: `front\App`
- Layout engine: `front\LayoutEngine`
- Kontrolery DI: `autoload/front/Controllers/*.php` (8 klas)
- Widoki statyczne: `autoload/front/Views/*.php` (11 klas)

Wazne: frontend nadal ma fallback do `\front\controls\*`, wiec architektura jest hybrydowa (new DI + remaining legacy paths).

## API architecture

- Router: `api\ApiRouter`
- Endpointy: `orders`, `products`, `dictionaries`, `categories`
- Kontrolery: `autoload/api/Controllers/*ApiController.php` (4 klasy)
- API jest stateless, autoryzowane naglowkiem `X-Api-Key`

Source-of-truth API to runtime:
- `api.php`
- `autoload/api/ApiRouter.php`
- `autoload/api/Controllers/*`

## Shared components

Najwazniejsze klasy wspoldzielone:

- `Shared\Cache\CacheHandler`, `Shared\Cache\RedisConnection`
- `Shared\Helpers\Helpers`
- `Shared\Tpl\Tpl`
- `Shared\Html\Html`
- `Shared\Email\Email`
- `Shared\Image\ImageManipulator`

## Data and cache conventions

- ORM: Medoo (`$mdb`)
- Prefix tabel: `pp_`
- Cache: Redis, domyslnie TTL `86400`
- Dane cache czesto serializowane (`serialize`/`unserialize`)
- Czyszczenie cache produktu: pattern `shop\\product:{id}:*`

## Security boundaries

- Admin:
  - sesja uzytkownika admina,
  - CSRF token w akcjach POST,
  - 2FA email flow (pending session + verify).
- API:
  - `X-Api-Key` porownywany przez `hash_equals()`,
  - brak logiki sesyjnej.
- Front:
  - sesja klienta + walidacja przeplywow frontendowych.

## Source files

Najwazniejsze pliki do szybkiej orientacji:

- `autoload/admin/App.php`
- `autoload/front/App.php`
- `autoload/front/LayoutEngine.php`
- `autoload/api/ApiRouter.php`
- `.paul/docs/API.md`
- `docs/PROJECT_STRUCTURE.md`
