3.5 KiB
3.5 KiB
Arjmand Pharmacy — AI context
Persian RTL pharmacy storefront for arjmandpharmacy.com (داروخانه دکتر ارجمند). Next.js App Router.
Meshkee API
- Docs: https://api.meshkee.com/docs/website
- OpenAPI: https://api.meshkee.com/docs/website/openapi.json
- Base:
https://api.meshkee.com/api/v1 - Tenant domain:
arjmandpharmacy.com(NEXT_PUBLIC_WEBSITE_DOMAIN/WEBSITE_DOMAIN/NEXT_PUBLIC_MESHKEE_DOMAIN) - Customer portal:
https://customer.arjmandpharmacy.com(NEXT_PUBLIC_CUSTOMER_PORTAL_URL) - Public reads:
/tenants/{domain}/...(no auth). Cart/orders/favorites:/businesses/{businessId}/...+ Bearer JWT. - Do not invent CMS, upload, or dashboard APIs.
Login / user icon (and add-to-cart if not logged in) go to the customer portal. Do not build a local login page.
Routes
| Path | Source |
|---|---|
/ |
Homepage + static image slots + store specials + latest blogs |
/products |
Store items (GET /tenants/{domain}/store-items) |
/products?categoryId= |
Same, filtered |
/products/[variantId] |
Store item variant + product description/gallery + comments |
/blog |
GET /tenants/{domain}/blogs |
/blog/[slug] |
Blog details |
/meshkee/static-image-slots |
Slot catalog for the dashboard Refresh button |
/api/search?q= |
Instant store-item search (name, min 3 chars) |
/api/cart/items |
Proxies authenticated add-to-cart |
Homepage carousels (store specials)
GET /tenants/{domain}/store-specials matched by key:
special-salemulti-vitaminbody-building-supplement
If a special has no items, keep the current sample products. Use variants[0].id as the product URL.
Catalog
- Mega menu: product categories level 1 and 2 (
GET /tenants/{domain}/categories?entityType=product). Links:/products?categoryId={id}. - Instant search: header input, activate when query length > 2,
store-items?name=. - Details gallery: product
images[].url+ thumbnail. Click = lightbox, hover = zoom. - Details tabs: description (
descriptionHtml) and comments (GET /comments?entityType=product&entityId={productId}). Unauthenticated users see a login box to the customer portal. - Add to cart:
POST /businesses/{businessId}/cart/itemswith{ storeItemVariantId, quantity }. No token → customer portal.
Static image slots
Homepage images: GET /tenants/{domain}/website/static-images?pageKey=home. Catalog: GET /meshkee/static-image-slots.
| key | kind | itemCount |
|---|---|---|
slider |
list | null |
two-banner-below-slider |
list | 2 |
categories |
list | null |
two-banner-row |
list | 2 |
three-banner-row |
list | 3 |
about-us-image |
single | 1 |
url → img, linkUrl → wrap in a link, empty/fail → placeholder. Use slot.aspectRatio. If a slot’s size/ratio changes in CSS, update STATIC_IMAGE_SLOTS in lib/static-images.ts in the same change.
Tags & badges
GET /tenants/{domain}/website/business-info
metaTags:[{ html }]— each full<meta …>tag is placed in the root<head>. Empty → omit.trustBadges:[{ kind: "enamad" | "samandehi", embedHtml }]rendered in the footer withdangerouslySetInnerHTML. Empty → omit. Do not hardcode eNamad or Samandehi placeholders.
Local fallbacks
- Slider:
src/assets/images/slides, else/placeholders/slider-*.svg - Logo:
src/assets/images/logo, else/placeholders/logo.svg - Other art / empty catalog:
/public/placeholders/*.svgand sample products/posts inlib/data.ts