High-performance multi-site platform for managing independent directories of beauty clinics, cosmetologists, and cosmetic products. Enables administrators to spawn separate custom domains, configure dynamic EAV-hybrid catalog values, and filter data instantly via a hybrid SSR/SPA Vue architecture.
Decoupled monorepo using simplified Domain-Driven Design (DDD) to isolate domain contexts and business layers, facilitating database flexibility and codebase maintenance.
Clear partition into Domain (entities & rules), Application (services & logic), and Infrastructure (HTTP wrappers)
SiteResolver intercepts request host, normalizes domain, loads settings, and caches the site context for 4 hours
Polymorphic URL resolution maps endpoints dynamically to avoid hardcoded prefixes, resolving targets in O(1)
To prevent database bloating across clinics, doctors, and products, a hybrid EAV database architecture was designed to combine search indexability with structural versatility.
Options are stored in standard tables for rapid indexing and SQL join performance
Non-searchable textual and media metadata is saved inside JSONB structures to reduce table size
Sensitive fields (like API keys) marked with is_secret are encrypted at the database level
A hybrid SSR/SPA rendering approach was chosen to ensure optimal search engine crawlability and an interactive, client-side SPA navigation experience.
data-vue="catalog-view", loading initial store states from DOM data attributesStore handles search parameters, caches results matrices, and controls dynamic query structures
Prevents network race conditions by automatically cancelling active AJAX calls when filters change rapidly
Updating regions immediately recalibrates city availability lists and recalculates directory match counts
Glow animations automatically adapt to the specific site's primary color settings loaded dynamically from backend
Uses Spatie Translatable with a custom HasSiteFallbackTranslations trait. If a translation is missing in the requested locale, it cascades from local language -> site default locale -> global locale -> first filled field.
The routing layer uses localizedRoute() to consistently append trailing slashes. This prevents page duplication and canonical URL conflicts in search engines.
Clean path routing for the default site language (e.g. /contacts), while automatically suffixing custom codes for additional locales (e.g. /uk/contacts).
Dynamic generation of XML sitemaps, robots.txt, and RSS feeds per domain. Immediate indexation updates notified via IndexNowController endpoints.
errors, backups to notifications