Alcrro Shop

React 18JAJavaScript (ES2022)RERedux ToolkitRTRTK QueryREReact Router v6NONode.js 18EXExpress 4MOMongoDB / Mongoose 6 (discriminator pattern)STStripe v22 (PaymentIntents, Customers, Webhooks, SetupIntents)CLCloudinary (avatar + produs upload)REResend (email tranzacțional + newsletter)JWJWT (httpOnly cookie, Secure + SameSite=None)bcbcryptjsHEhelmetEXexpress-rate-limitEXexpress-mongo-sanitizePLPlain CSS (custom properties, BEM, dark mode)@S@stripe/stripe-js + @stripe/react-stripe-jsREreact-image-crop (avatar circular crop)JEJest 29 + React Testing LibraryCOConcurrently + NodemonVEVercel (frontend) + Render (backend)

Features

18 shipped6 planned

Shipped18

  • Auth — register, login, JWT cookie, roluri
  • Catalog produse cu 8+ filtre URL-persistente
  • Multi-vendor — apply/approve, seller picker
  • Vendor dashboard — 6 secțiuni
  • Coș de cumpărături
  • Checkout multi-pas (coș → detalii → confirmare)
  • Plăți Stripe — PaymentIntents, carduri salvate, CVV-only
  • Stripe Webhooks — sync automat comandă
  • Comenzi — timeline, inline payment, anulare
  • AlcrroCard — puncte, niveluri, credite, referral
  • Sistem vouchere — vendor, global, reward automat
  • Calculator rate bancare (BT, ING, Raiffeisen, BCR)
  • Profil utilizator — adrese, carduri, avatar crop
  • Admin panel — aprobare vendori, management comenzi
  • Recenzii & rating cu recalcul automat
  • Dark mode cu CSS custom properties
  • Newsletter cu Resend
  • Upload imagini Cloudinary (produse + avatar)

Planned6

  • Email notificări comenzi (confirmare, expediere)
  • Integrare curier AWB real (Fan Courier / DPD)
  • Full-text search cu MongoDB Atlas Search
  • Vendor analytics — grafice vânzări, top produse
  • Recomandări produse AI
  • PWA + notificări push

Database schema

users12 fields
_idObjectId
nameString
emailString
passwordString
roleenum (client | vendor | admin)
phoneString

Colecție unificată pentru toți utilizatorii. Rolul determină accesul la rute și dashboard-uri. stripeCustomerId creat lazy la prima operație Stripe.

vendors14 fields
_idObjectId
userObjectId → users
shopDescriptionString
profile.cuiString
profile.denumireFirmaString
profile.tipEntitateenum (SRL | PFA | SA | RA | II | ONG)

Profilul business al unui vendor. Creat la aprobare de admin. Conține date firmă (CUI, tip entitate), locații cu program și politica de retur.

products20 fields
_idObjectId
kindenum (Electronics | Clothing | Furniture | HomeGarden | Books)
brandString
model / nameString
minPriceNumber
variantsArray (attributes{}, price, stock{quantity, availability}, images[])

Mongoose discriminator pattern — o singură colecție, câmpuri specifice per categorie. Variantele conțin preț, stoc și imagini. Rating recalculat automat la save/delete review.

addresses11 fields
_idObjectId
userObjectId → users
labelString
streetString
cityString
countyenum (41 județe RO)

Adresele de livrare ale unui user. Maximum 5 per cont. Pre-save hook dezactivează celelalte adrese default la setarea uneia noi.

reviews7 fields
_idObjectId
productObjectId → products
userObjectId → users
valueNumber
commentString
createdAtDate

Index unic (product, user) — un review per produs per user. Post-save hook recalculează rating.average și rating.count pe produs prin aggregation.

orders21 fields
_idObjectId
userObjectId → users
itemsArray (product, brand, model, price, quantity, vendor)
deliveryAddressObject (street, city, county, zip, phone)
totalPriceNumber
statusenum (Pending | Processing | Shipped | Delivered | Cancelled)

items și deliveryAddress sunt snapshot-uri — prețul și adresa rămân fixe chiar dacă produsul/adresa user-ului se modifică ulterior.

shopcards11 fields
_idObjectId
userObjectId → users
cardNumberString
creditsNumber
pointsNumber
tierenum (standard | silver | gold)

Un card per user, creat automat la înregistrare. Tier recalculat via pre-save: standard (<500 pts), silver (≥500), gold (≥2000). Multiplicatori: 1.0× / 1.1× / 1.25×.

cardtransactions10 fields
_idObjectId
cardObjectId → shopcards
userObjectId → users
typeenum (credit-purchase | points-earned | points-redeemed | credits-spent | referral-bonus | welcome-bonus)
amountNumber
descriptionString

Log imutabil al tuturor mișcărilor de puncte și credite. Folosit pentru istoricul din profil și reconcilierea Stripe.

vouchers16 fields
_idObjectId
codeString
typeenum (percent | fixed)
valueNumber
minOrderNumber
activeBoolean

Trei tipuri: global (admin), vendor (creat de vendor, max 10), reward (emis automat după livrare). Validare și discount calculate server-side la createOrder.

vendorvoucherrules10 fields
_idObjectId
vendorIdObjectId → users
enabledBoolean
typeenum (percent | fixed)
valueNumber
minOrderAmountNumber

Un singur document per vendor (upsert). Dacă enabled=true, sistemul emite automat un voucher reward cumpărătorului după livrarea comenzii.