Temă
Specificații tehnice
Tehnologii și versiuni
| Zonă | Tehnologie | Versiune |
|---|---|---|
| API: limbaj | PHP (declare(strict_types=1) în fiecare fișier) | 8.3+ (imaginea Docker: 8.4) |
| API: cadru | Laravel | 13.39 |
| API: GraphQL | Lighthouse (schema-first), webonyx/graphql-php | 6.74 |
| API: date | query builder Laravel, fără ORM; migrări Laravel | — |
| API: calitate | PHPUnit, Pint (stil), Larastan (analiză statică, nivelul 8) | 12, 1, 3 |
| Bază de date | MySQL 8 sau MariaDB 10.6+ (utf8mb4, colaționare utf8mb4_unicode_ci: căutare fără diacritice) | testate: MySQL 8.0, MariaDB 10.11 |
| Cache, sesiuni, blocări | în baza de date (driverul database al Laravel) | — |
| Stocare fișiere | discul serverului (storage/app), servit de API | — |
| Imagini | Intervention Image (GD, WebP) | 3 |
| Aplicații web: runtime | Node.js (LTS), doar pentru dezvoltare și build | 26 |
| Pachete | pnpm (cu minimumReleaseAge de 14 zile: nicio versiune publicată mai recent); Composer pentru API | 12.13 |
| Limbaj aplicații web | TypeScript (strict, noUncheckedIndexedAccess) | 6.0 |
| Interfață | React, React Router, TanStack Query, Vite | 19.3, 8, 5, 8.3 |
| E-mail în dezvoltare | Mailpit | 1.32 |
| Teste | Vitest, Testing Library, jsdom, Playwright, axe-core | 5, 16, 30, 1.64, 4.14 |
Cerințe nefuncționale
Performanță
Bugetele de mai jos rămân ținta. Valorile „măsurat” sunt de la API-ul anterior (NestJS), pe profilul de date volume (10.000 de anunțuri, 2.000 de utilizatori, 1.500 de comenzi), mediana a 5 rulări. Generatorul acelui profil și scriptul de măsurare nu sunt încă portate pe Laravel (vezi ROADMAP), deci API-ul actual nu a fost încă măsurat pe acest volum. Interogările SQL sunt aceleași, cu aceiași indecși.
| Operație | Buget | Măsurat |
|---|---|---|
| Lista de anunțuri (prima pagină) | 250 ms | 73 ms |
| Căutare text | 300 ms | 47 ms |
| Categorie + preț + sortare | 300 ms | 44 ms |
| Pagina anunțului + similare | 250 ms | 46 ms |
| Numărătoarele din antet | 150 ms | 11 ms |
| Coada de moderare | 300 ms | 54 ms |
| Căutare comenzi (Backoffice) | 300 ms | 99 ms |
| Rapoarte pe 90 de zile | 800 ms | 69 ms |
| Contacte CRM | 600 ms | 63 ms |
| Audiența unei campanii | 800 ms | 176 ms |
Interfața: pachetul inițial al site-ului e de 172 KB comprimat; paginile rare (cont, checkout, mesaje, ajutor) se încarcă la cerere.
Accesibilitate
WCAG 2.1 nivel AA, verificat automat cu axe-core pe 54 de pagini din cele trei aplicații, în tema luminoasă și întunecată: zero probleme. Formularele au etichete legate, erorile sunt anunțate de cititoarele de ecran (aria-describedby, role="alert"), toate acțiunile merg de la tastatură, contrastul e de minim 4,5:1.
Limbi
Șase limbi (română, engleză, italiană, spaniolă, franceză, germană) în toate aplicațiile. Traducerea folosește textul românesc drept cheie; numerele se înlocuiesc prin șabloane ({n}). Datele introduse de utilizatori (titluri, mesaje) nu se traduc.
Compatibilitate
Ultimele două versiuni de Chrome, Edge, Firefox și Safari; telefoane de la 360 px lățime. Tema urmează sistemul și poate fi aleasă manual.
Disponibilitate și date
- Toate scrierile cu bani rulează în tranzacții; vânzarea dublă e blocată la nivel de rând (
SELECT … FOR UPDATE). - Datele se păstrează în volume Docker; copiile de siguranță sunt descrise în operare.
- Integritatea datelor se verifică cu
pnpm db:check(17 reguli).
Limite și valori implicite
| Ce | Valoare | Unde se schimbă |
|---|---|---|
| Fotografii pe anunț | 10 | Setări platformă → Reguli |
| Durata unui anunț | 30 de zile | Setări platformă → Reguli |
| Confirmare automată după livrare | 48 de ore | Setări platformă → Reguli |
| Fișier încărcat | max. 12 MB, latura max. 1.600 px după procesare | cod (app/Modules/Catalog/Photos.php) |
| Încercări de conectare | 5 eșuate → blocare 15 minute | cod (app/Modules/Auth/Session/LoginThrottle.php) |
| Coduri SMS | 3 pe oră, 5 încercări, valabile 10 minute | cod (app/Modules/Verification/Verification.php) |
| Sesiune client / echipă | 30 de zile / 12 ore | CUSTOMER_SESSION_DAYS, STAFF_SESSION_HOURS |
| Dispozitiv de încredere (echipă) | 30 de zile | TRUSTED_DEVICE_DAYS |
| Plafoane de marketing | 3 e-mailuri/săpt., 1 push/zi, 2 SMS/lună | Setări CRM |
| Ore de liniște | 21:00–09:00 | Setări CRM |
| Comisioane | curier 19,99 lei, easybox 12,99 lei, ramburs 4,99 lei, protecție 2,99 lei + 3% | Setări platformă → Comisioane |
| Comisionul platformei (protecția și promovările) | activ | Setări platformă → Comisioanele platformei (oprit: vânzări și promovări gratuite) |
Configurare (variabile de mediu)
API-ul le citește din apps/api/.env (în Docker Compose, din .env-ul de la rădăcină), o singură dată, în config/taraba.php și în configurația standard Laravel; codul nu citește direct mediul. Pentru producție, pnpm build:prod generează un .env.example complet.
| Variabilă | Implicit | Rol |
|---|---|---|
TZ | Europe/Bucharest | fusul orar al containerelor |
API_CORS_ORIGINS | serverele Vite | doar pentru dezvoltare (în producție totul e pe același domeniu) |
APP_ENV, APP_DEBUG | local, true | production și false în producție (erorile nu arată detalii interne) |
APP_KEY | generată la instalare | semnează și criptează: sesiuni, linkuri de dezabonare, coduri SMS; nu se schimbă după pornire |
SEED_DEMO_DATA, SEED_PROFILE | true, demo | date inițiale pe o bază goală; false în producție |
DIAGNOSTICS_ENABLED | true | unelte de dezvoltare (mesaje de test, livrare simulată, timp simulat); false în producție |
COOKIE_SECURE, COOKIE_DOMAIN | false, gol | true și .domeniu.ro în producție (HTTPS, sesiune comună Backoffice–CRM) |
CUSTOMER_SESSION_DAYS, STAFF_SESSION_HOURS, TRUSTED_DEVICE_DAYS | 30, 12, 30 | durata sesiunilor |
DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD | mysql, … | MySQL sau MariaDB (obligatorii) |
MAIL_MAILER, MAIL_SCHEME, MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD, MAIL_FROM_ADDRESS, MAIL_FROM_NAME | smtp spre Mailpit | trimiterea e-mailurilor |
MAIL_ALLOWED_RECIPIENTS | — | singurele adrese care primesc e-mail real (protecție în dezvoltare); goală = oricine |
SMS_DRIVER, PUSH_DRIVER | capture | capture (în Mailpit) sau disabled; un furnizor real se adaugă ca driver nou |
CAPTURE_SMTP_HOST, CAPTURE_SMTP_PORT | = SMTP | unde se captează SMS-urile, push-urile și campaniile |
PUBLIC_SITE_URL, PUBLIC_BACKOFFICE_URL, PUBLIC_CRM_URL, PUBLIC_MAIL_UI_URL, PUBLIC_DOCS_URL, PUBLIC_STATUS_URL | localhost | linkuri între aplicații și în e-mailuri, sitemap |
ALERT_EMAILS, ALERT_CHECK_SECONDS, ALERT_AFTER_FAILURES | gol, 300, 2 | alertele pe e-mail (gol = oprite) |
BACKUP_TIME, BACKUP_KEEP | 03:00, 7 | ora copiei zilnice și câte copii se păstrează (serviciul backup) |
STATUS_APP_URLS | serverele de dezvoltare | aplicațiile verificate de pagina de stare (id=url, adrese interne; Docker Compose setează http://site/healthz…) |