# Audit cache & Redis — Listara

Data audit: 2026-05  
**Status implementare:** complet — vezi `docs/CACHE-STATUS.md` (verificare medii) și `docs/PRODUCTION-CACHE-REDIS.md`.

### Verificare 2026-05-19

| Verificare | Local | Producție Listara |
|------------|-------|-------------------|
| `CacheWarmCommand` / `CacheDiagnosticsCommand` | OK | OK |
| `LayoutViewCache` + `HomepageCache` | OK | OK |
| `cache:warm` toate localele (ro, en) | OK | OK (după deploy) |
| `CACHE_DRIVER` | `redis` | `file` (→ `redis` după `setup-redis.sh`) |
| `SESSION_DRIVER` | `redis` | `file` |
| Redis server + php-redis | Redis PONG (cli) | **Neinstalat** — opțional |
| `CACHE_DRIVER=auto` | Da (fallback file) | Recomandat înainte de Redis |
| Deploy `cache:warm` ca www-data | N/A | OK |
| Invalidare `settingsAndLayout` | layout + settings | layout + settings |

## 1. Rezumat executiv

| Componentă | Stare înainte | Acțiune |
|------------|---------------|---------|
| Laravel Cache | Parțial (`cache_remember_safe`, meniuri, setări IP) | **Extins** — layout global + homepage |
| Redis | Configurat în `config/`, nefolosit implicit | **Opțional** — activare via `.env` pe producție |
| Sessions | `file` (default) | **Neschimbat** — redis doar dacă trafic/session cluster |
| Queues | `sync` (default) | **Neschimbat** — job `ModerateListingJob` nu e dispatch-uit |
| View composer `*` | ~15 query-uri / request | **Cache 5 min** + invalidare la admin |

## 2. Ce folosește deja cache

- `cache_remember_safe()` — fallback fără cache dacă driver-ul e indisponibil
- Categorii principale (`main_category_status_by_id`, slug map) — 300s
- Setări: IP security, phone verification, email deliverability, password policy — 300s
- `PromotionSetting::current()` — 3600s
- `EmailGlobalTemplateService` — 3600s
- `MenuService` — meniuri 3600s (dar layout-ul le reîncărca din DB)
- `ApiAccountingReportService` — rapoarte 300s
- AbuseIPDB IP — 24h
- Contact reveal burst — rate limit per minut

## 3. Probleme identificate

### 3.1 View composer global (CRITIC)

`AppServiceProvider` → `View::composer('*')` executa la **fiecare view**:

- `Setting::first()`, limbi, monede, integrări, meniuri, număr utilizatori, număr anunțuri active
- Query `TicketMessage` (admin) pe tot site-ul
- Coș per user (corect, rămâne per-request)

**Remediu:** `App\Services\Cache\LayoutViewCache` — cache 5 minute, invalidare la update setări/meniuri/categorii.

### 3.2 Homepage — query-uri duplicate

Subcategorii pentru Classified / Job / Real Estate erau încărcate de 2–4 ori fără cache.

**Remediu:** `App\Services\Cache\HomepageCache` — SEO, conținut homepage, subcategorii, testimoniale, bannere ads (TTL 5–60 min).

### 3.3 Listing-uri pe homepage

Listările „latest” și promovările rotative **nu sunt cache-uite** — date dinamice, rotație per sesiune. Cache ar stale-ui conținutul; TTL scurt ar ajuta puțin față de complexitate.

### 3.4 Redis

- `config/cache.php` și `config/database.php` au store `redis`
- Default: `CACHE_DRIVER=file`, `QUEUE_CONNECTION=sync`, `SESSION_DRIVER=file`
- **Redis nu e obligatoriu** pentru funcționare

### 3.5 Queues

- `ModerateListingJob` implementează `ShouldQueue` dar **nu există `dispatch()`** în codebase
- Mail-uri (`UserForgetPassword`, etc.) au `ShouldQueue` în interface dar trimitere sincronă
- **Nu s-a forțat redis queue** — fără worker și fără joburi reale, nu aduce beneficiu

### 3.6 Cache tags

- Driver `file` **nu suportă** tags
- Tags utile doar cu `CACHE_DRIVER=redis` — neimplementat intenționat; invalidare prin chei dedicate

### 3.7 `cache:clear` la meniuri

`MenuItemController` apela `Artisan::cache:clear` (șterge tot cache-ul aplicației).

**Remediu:** invalidare țintită (`clear_layout_view_cache` + `MenuService::clearCache()`).

## 4. Implementări noi

| Fișier | Rol |
|--------|-----|
| `app/Services/Cache/LayoutViewCache.php` | Cache layout partajat |
| `app/Services/Cache/HomepageCache.php` | Cache porțiuni homepage |
| `app/Console/Commands/CacheDiagnosticsCommand.php` | Test driver / Redis |
| Helpers: `app_setting()`, `clear_*_cache()` | API invalidare |

## 5. Configurare producție (Redis)

```env
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_CACHE_DB=1
```

Worker queue (doar dacă vei dispatch-ui joburi):

```bash
php artisan queue:work redis --sleep=3 --tries=3
```

## 6. Testare

```bash
php artisan cache:diagnostics
```

Verifică: driver, ping Redis (dacă e configurat), write/read test.

După deploy:

1. Încarcă homepage de 2 ori — a doua ar trebui să fie mai rapidă (layout cache hit).
2. Modifică un element de meniu în admin — meniul pe site se actualizează după invalidare (nu mai e nevoie de `cache:clear` global).

## 7. Ce NU s-a schimbat (intenționat)

- Business logic rezervări, promovări, autentificare
- Rotația promovărilor în sesiune
- Forțarea Redis pe medii fără server Redis
- Cache pe liste de anunțuri / search (risc mare de date învechite)

## 8. Invalidare cache

| Eveniment | Funcții apelate |
|-----------|-----------------|
| Update setări generale | `clear_app_setting_cache()` |
| Update captcha / integrări | `clear_layout_view_cache()` |
| Categorii | `clear_main_category_cache()` |
| Meniuri | `bustMenuCaches()` în MenuItemController |
| Template email global | `EmailGlobalTemplateService::clearCache()` (existent) |
