100 Commits
Author SHA1 Message Date
Alireza HassaniandCursor eb0644e6c1 Grant roll-call permissions to editor and viewer staff.
Roll call is a staff work log, so smaller team roles can use it when the module is on.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 12:33:57 +03:30
Alireza HassaniandCursor 3558c441b9 Add opt-in roll_call business module gate.
Keeps Roll Call off by default and blocks the API until super-admin enables it.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 14:15:43 +03:30
Alireza HassaniandCursor a6c2d4764e Add roll-call API for admin work-day logs with tasks.
Lets owners/admins track start/stop sessions and task lists per business day.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-07 13:21:01 +03:30
Alireza HassaniandCursor d237d00f65 Make business profile address postal code optional.
Allow empty or missing postalCode on profile addresses so saves are not blocked by MinLength validation.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 18:42:22 +03:30
Alireza HassaniandCursor 6f2ce12c0f Add business category create, update, and delete APIs.
Super-admins can manage the marketplace category tree via POST/PATCH/DELETE on /api/v1/business-categories.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 11:44:26 +03:30
Alireza HassaniandCursor a9e29b79fd Accept marketplace banners at 18:6 (3:1) aspect ratio.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 20:46:44 +03:30
Alireza HassaniandCursor e0cd2327eb Treat website meta tags as label + full HTML snippets.
Public business-info now exposes metaTags as { html }, matching how admins paste complete <meta> tags in Tags & Badges.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 18:39:19 +03:30
Alireza HassaniandCursor 63ae9b22b9 Expose website tags and badges via business settings and business-info.
Stores custom meta tags and eNamad/Samandehi footer HTML in settings so storefronts can render them from the public API.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 18:07:13 +03:30
Alireza HassaniandCursor cffc828328 Scope customer order lists with selfOnly and expose product FA names.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 23:00:48 +03:30
Alireza HassaniandCursor 41d3f8f4eb Add پس کرایه (freight collect) on shipping cost groups.
When enabled, checkout shipping amount is 0 while customers still see the پس کرایه label.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 22:37:28 +03:30
Alireza HassaniandCursor 7f6fa3672d Add paymentStatus filter and field on order list API.
Support paid/unpaid/failed filtering from completed transactions for dashboard order tabs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 22:22:23 +03:30
Alireza HassaniandCursor 0d9e866a57 Expose gateway tracking fields on order transactions.
Include authority, track id, masked card, and paid-at from gateway meta for support and reconciliation.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 22:15:10 +03:30
Alireza HassaniandCursor 0a330b8749 Lock payment process steps to gateway-only updates.
Reject admin PATCH of awaiting-payment / payment-successful so order payment status cannot be set manually.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 22:07:32 +03:30
Alireza HassaniandCursor 88ef4e82a1 Add shipping cost groups and reject spam contact-form SMS.
Wire cart/checkout shipping fees with category groups and static rates, reject gibberish contact submissions, and SMS only valid Iranian mobiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 21:52:41 +03:30
Alireza HassaniandCursor 1a49576752 Add OTP-first signup and product catalog PDF uploads.
Signup verifies phone before password; existing Meshkee accounts keep their password. Products can attach an optional PDF catalog (max 2MB) via Pars Pack media.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-27 08:57:08 +03:30
Alireza HassaniandCursor 4a9e10e614 Add store loan methods with public website calculate API.
Supports dashboard CRUD and tenant list/get/calculate so storefronts can offer installments, requiring a method pick when several exist.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 23:17:51 +03:30
Alireza HassaniandCursor 2a01873c95 Add invoice bank account templates API and migration.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 23:31:58 +03:30
Alireza HassaniandCursor 503b70a690 Prefer text fields in technical-form AI and add invoice payment methods.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 20:02:05 +03:30
Alireza HassaniandCursor f8b865b0aa Skip technical form fill on AI product create.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 15:43:18 +03:30
Alireza HassaniandCursor a1e73d1c9e Accept custom color hexes when saving category color variations.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 15:28:14 +03:30
Alireza HassaniandCursor 00d0284454 Add multi_value technical fields and FA category AI forms.
Support duplicatable free-text lists, always append سایر ویژگی‌ها on AI category forms, and fill leftover product specs into that field.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 13:50:04 +03:30
Alireza HassaniandCursor ac04e51c8b Fetch product page URLs when generating technical AI content.
Ground product technical fill, product AI create, and category technical form suggestions on page text instead of inventing specs from the URL alone.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 12:40:40 +03:30
Alireza HassaniandCursor 94e9a8ed1c Add isUsed on store items with API list filters.
Persists used/second-hand status per listing and supports isUsed=true on business and public store-item queries.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 12:17:28 +03:30
Alireza HassaniandCursor c6b7629c77 Add product technical-info AI fill endpoint.
Lets the dashboard suggest technical form values from a user prompt without auto-saving.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 11:53:34 +03:30
Alireza HassaniandCursor 57800634ca Treat AI create input as a research brief and localize FA prompts.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-19 08:20:34 +03:30
Alireza HassaniandCursor d37b920c01 Add businesses renewal sort, low-SMS alert, and contact form SMS.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 17:17:59 +03:30
Alireza HassaniandCursor 94cb7eaa33 Accept bare DKIM public-key pastes without v=DKIM1 prefix.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 14:45:09 +03:30
Alireza HassaniandCursor 50b716f040 Make Ed25519 DKIM optional for Email DNS updates.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 14:26:05 +03:30
Alireza HassaniandCursor 5e7bdc0cf2 Use SPF v=spf1 mx -all for Email DNS upserts.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 11:29:53 +03:30
Alireza Hassani 19c0ea25e1 Fix Arvan mail A record value to array of IPs
Arvan CDN 4.0 rejects A creates when value is a single { ip } object
(422: value must be an array). Send [{ ip }] and compare listed A
values as arrays so ensureMailRecords no longer fails before DKIM.
2026-09-18 10:56:32 +03:30
Alireza Hassani 95d851f9dd Accept value-only DKIM TXT pastes for Email DNS
Allow v=DKIM1… pastes without a zone name by taking an optional
selector hint so Arvan/Cloudflare still get the right _domainkey record.
2026-09-18 10:38:06 +03:30
Alireza HassaniandCursor b7ca306097 Count page views once per load and skip known bots.
Stop auto-counting list APIs and homepage sliders, track static pages via pageKey, and add store-specials AI list matching.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-16 17:33:44 +03:30
Alireza HassaniandCursor 6517877bed Use id+slug paths for user products and count their visits.
Align storefront/sitemap URLs with catalog products, add by-id public APIs, and include user-product detail views in the product visit chart.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 15:35:46 +03:30
Alireza HassaniandCursor 3aef62c1b8 Add business gallery API and marketplace profile fields.
Expose list/add/remove gallery endpoints via media_attachments, plus profile title, banner, and category tag/nameFa support needed by the marketplace dashboard.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-11 14:41:32 +03:30
Alireza HassaniandCursor d68ef2d08a Add business profile AI fill endpoint for abstract and description.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-11 09:36:06 +03:30
Alireza HassaniandCursor aaf7a83742 Add Schema.org JSON-LD, SEO meta overrides, and resilient bulk SMS.
Expose Organization/LocalBusiness and Product/BlogPosting jsonLd, optional seoMeta fields on content/categories, and continue mass SMS after per-recipient failures.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 23:30:24 +03:30
Alireza HassaniandCursor db305c58a4 Allow creating customers with only first or last name.
Password stays optional; missing password gets a random hash server-side.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 12:32:18 +03:30
Alireza HassaniandCursor a2dacfdc97 Track SMS sent counts by type (mass, singular, auth, auto, admin).
Charge/refund bump the matching counter plus total; expose smsSentByType on business APIs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 11:31:17 +03:30
Alireza HassaniandCursor 717a203d48 Fix SMS billing build and make credit conversion idempotent.
Import the purchase-price constant for Nest build, and only convert IRT-scale balances so migrate re-runs do not divide credits again.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 11:12:27 +03:30
Alireza HassaniandCursor 584c01fcee Switch SMS billing to credit units with IRT top-ups.
Balance is SMS credits (1 per 64 chars); top-ups add floor(IRT/500) credits, track sms_sent_count, and convert existing IRT balances.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 11:10:22 +03:30
Alireza HassaniandCursor 07f3304c07 Fix advertising SMS shortcode to 5000990009.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 17:43:24 +03:30
Alireza HassaniandCursor 4a1d60dbef Add SMS templates, prepaid IRT billing, and advertising shortcode 9000590009.
Charge ceil(len/64)*400 IRT per recipient across OTP, customer, and partner SMS; seed new businesses with 500k IRT; default partner sends to the advertising line.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 16:24:15 +03:30
Alireza HassaniandCursor 4623061a4f Update PROJECT_CONTEXT sitemap path docs for slug-based content URLs.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 14:53:07 +03:30
Alireza HassaniandCursor 9a020d748d Align storefront content URLs with live slug-based routes.
Use /blog/{slug}, /portfolio/{slug}, and /instruction/{slug} in sitemap defaults and emit CMS slugs for blogs/portfolios instead of title-derived paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 14:51:12 +03:30
Alireza HassaniandCursor 4823cf97f6 Require Next.js standalone output in website AI prompt and deploy.
Document mandatory output: "standalone" for shared-VM RAM, and align websites-agent deploy to prefer .next/standalone/server.js.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 14:21:44 +03:30
Alireza HassaniandCursor b1dcecc468 Add customer Excel import/export and Gama bulk SMS sending.
Business SMS uses optional settings.sms.senderNumber (else advertising shortcode) with SendQuick for one recipient and SendBulk for quantity.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 14:12:48 +03:30
Alireza HassaniandCursor cf459807d8 Document storefront mini-cart and customer-dashboard checkout.
Website agents must add variants to a local guest cart and redirect to customer.{domain} for login and checkout instead of building those pages on the shop.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 08:55:11 +03:30
Alireza HassaniandCursor 5c701d0841 Use Node http for long storefront deploys instead of undici.
This API VM's Node 20 build has no node:undici, so require() crash-looped the process and took login down.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 15:51:07 +03:30
Alireza HassaniandCursor 53fe8b72bd Allow storefront deploys to wait up to 30 minutes.
Node fetch was aborting at undici's 5-minute headers timeout, so Super Admin marked long npm ci / next builds as failed while the websites VM was still compiling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 15:22:23 +03:30
Alireza HassaniandCursor d14f91a606 Add catalog EN/AR translations with AI translate-all by locale.
Store product/category translations in entity_translations, expose CMS APIs, and gate the MultiLanguage Data module for businesses.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 09:51:11 +03:30
Alireza HassaniandCursor 42cf29bc4e Add Torob Product API v3 for store-module sites with a store setting to enable it.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 15:26:23 +03:30
Alireza HassaniandCursor 6f1b13b6dc Add Email DNS upsert for Stalwart DKIM, MX, and SPF.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 22:00:04 +03:30
Alireza HassaniandCursor 6b8073f998 Expose visit summary totals for the Statistics dashboard.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 11:10:52 +03:30
Alireza HassaniandCursor f42e6fe2a4 Allow add/edit domain to upsert tenant DNS on Cloudflare or Arvan.
Update DNS writes @, www, business, customer, and api records on the chosen provider instead of Arvan only.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 18:46:48 +03:30
Alireza HassaniandCursor d1f60b5313 Add parked alias domains with Arvan or Cloudflare DNS and websites SSL.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 18:09:09 +03:30
Alireza HassaniandCursor 5813e9fc53 Allow adding or editing a storefront git repo from the Websites domain editor.
Provision uses the same websites-VM agent as Businesses; DNS still goes through Arvan ensureTenantRecords.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 16:32:20 +03:30
Alireza HassaniandCursor cda901d049 Probe tenant dashboard TLS via business/customer.meshkee.com.
The API VM resolver often NXDOMAINs business.* / customer.* CNAMEs even when the certs are valid, which made the SSL button always fail after a successful issue.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 16:32:10 +03:30
Alireza HassaniandCursor dcf8b6423a Drop the domain from public AI prompt URLs.
Copied links now use business name and prompt name only; old host-prefixed URLs still resolve.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-30 16:19:45 +03:30
Alireza HassaniandCursor 73588db1c6 Keep product migrate from crashing the API on large image copies.
PM2 was restarting at 512MB while Sharp cached buffers, which returned 502 to the migrate UI after categories had already succeeded.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-30 15:02:40 +03:30
Alireza HassaniandCursor a5f2f8d63b Fix SSL list badges, labeled AI prompt URLs, and product-category migrate.
Storefront SSL now follows apex expiry instead of requiring www, prompt links include domain and prompt name, and extra color variations merge instead of aborting migrate.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-30 14:47:10 +03:30
Alireza HassaniandCursor e37cb4a20d Stop storefront deploys from inheriting the agent PORT and leftover standalone cwd.
pm2 restart --update-env leaked PORT=9050 onto Next sites and left nginx 502 when a build dropped standalone output.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-30 09:41:37 +03:30
Alireza HassaniandCursor 0c1c3f7ff9 Add AI English name translation and aggregate website view analytics.
Website views chart uses kind=all across page kinds; home hits also count static-images loads.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-28 20:39:37 +03:30
Alireza HassaniandCursor 0d9c2fd8ea Add published user products to the storefront sitemap.
Expose /sitemap-user-products.xml when customer_products is enabled, invalidate on listing mutations, and proxy the new path from nginx provision scripts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-27 07:16:05 +03:30
Alireza HassaniandCursor fb04425df7 Clarify technical-info docs and ship pending owner/color fixes.
Document that product specs need /technical-info for labels, auto-verify admin-created business owners, and expand category color presets with Farsi aliases.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-27 06:46:28 +03:30
Alireza HassaniandCursor 3d3abeb65b Patch sitemap SEO proxies on both HTTP and HTTPS nginx blocks.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 19:10:15 +03:30
Alireza HassaniandCursor 730407ec3a Split blogs and other modules into child sitemaps.
Move blogs, portfolios, videos, instructions, and workshops out of sitemap-main into dedicated files like products, and allow saving migrated Farsi category color labels without wiping store-item links.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 19:02:38 +03:30
Alireza HassaniandCursor 5850c90d84 Re-provision storefront nginx when domain host is renamed.
Also create origin HTTPS with a self-signed cert on provision so Cloudflare Full does not fall through to another site's default SSL vhost.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 17:31:56 +03:30
Alireza HassaniandCursor cbe7aced6d Serve public AI prompts as plain text.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 15:47:27 +03:30
Alireza HassaniandCursor 91a20a89d6 Add public AI prompt templates for websites.
Manage reusable templates in Super Admin, attach editable per-site prompts with Meshkee API public links that require no auth.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 15:28:41 +03:30
Alireza HassaniandCursor 4db9c7709d Default annual renewal to business created date.
Backfill null renewals from created_at and use now when create omits the date.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 10:33:26 +03:30
Alireza HassaniandCursor 92601ae729 Add page-view analytics, product counters, SSL expiry, and business renewal.
Auto-count storefront page views with 6-month event retention and lifetime counters, track product visit/cart/sale stats, persist SSL cert expiry with daily probes, and support owner titles plus annual contract renewal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 10:13:06 +03:30
Alireza HassaniandCursor 6cd0b009ef Call per-tenant dashboard SSL agent when issuing domain SSL.
Issue SSL on one domain now passes tenantApex to the dashboards agent instead of renewing the shared multi-tenant cert.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 01:20:03 +03:30
Alireza HassaniandCursor 3f266a2dcb Add website view analytics for dashboard traffic charts.
Track storefront views via POST /tenants/{domain}/analytics/views, expose business activity API, and add product/website/portfolio/blog 30-day chart types for super-admin selection.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 01:12:44 +03:30
Alireza HassaniandCursor b8f60c5141 Skip dashboard SSL hosts without DNS and shorten sync errors.
Dashboard cert renewal no longer fails when unrelated tenants lack business/customer DNS records; Issue SSL errors summarize blocked hostnames instead of dumping certbot logs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 00:55:58 +03:30
Alireza HassaniandCursor ead16080b8 Add website favicon API and manual favicon profile updates.
Expose GET /tenants/{domain}/website/favicon for storefront tab icons, allow faviconMediaId on profile PATCH, and sync website API docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 00:51:11 +03:30
Alireza HassaniandCursor 6ce6f959ac Add dark-mode business logo, payment order steps, and Arvan DNS diagnostics.
Store logo_dark_media_id on businesses, expose logoDarkUrl on tenant/website APIs, prepend awaiting-payment steps to order workflows, and surface clearer Arvan API network errors.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-26 00:21:46 +03:30
Alireza HassaniandCursor e942348b1d Route payment bank callbacks through storefront domains.
ZarinPal rejects api.meshkee.com when the terminal is registered to the store apex; nginx now proxies /meshkee/payments/{gateway}/callback to a host-scoped API route.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 21:34:56 +03:30
Alireza HassaniandCursor 40284df880 Surface the real build error when website deploy.sh fails.
Super Admin was only showing "exited with code 1" because the ERR trap never copied the last compiler or module-not-found line from the deploy log.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 17:39:03 +03:30
Alireza HassaniandCursor 20cc0bbd78 Fix e-payment settings payload, cart race, and media/content helpers.
Stop returning passwordSet (forbidNonWhitelisted), upsert carts safely, and harden related media/product/workshop flows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-25 16:41:00 +03:30
Alireza HassaniandCursor ad6f9dcf1d Expose portfolio projectUrl and document it for websites.
Wire create/update/list/detail to project_url and sync website OpenAPI, Postman, and AI brief.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 16:47:46 +03:30
Alireza HassaniandCursor 37bce1e9fa Add moveToTop on portfolio update so items pin to absolute list top.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 15:23:17 +03:30
Alireza HassaniandCursor af0573c089 Show newest portfolios first on dashboard and website lists.
Order by sort_order descending and assign new items the next highest sort value so create and move-up stay consistent.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 15:01:52 +03:30
Alireza HassaniandCursor ea40ae40d8 Split product sitemap and use Farsi category URLs with ids.
sitemap.xml is now an index of main + products; category loc paths use /products/category/{id}/{nameFaSlug} with a public by-id lookup for storefronts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 00:23:30 +03:30
Alireza HassaniandCursor c4367d8eb0 Include product category URLs in sitemaps and document by-slug lookup.
Adds /products/category/{slug} to default sitemap generation and a public categories/by-slug endpoint for storefront category pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 00:15:26 +03:30
Alireza HassaniandCursor df17925d3a Keep Farsi characters readable in sitemap loc URLs.
Stop percent-encoding path slugs so <loc> shows UTF-8 Persian text while still sanitizing unsafe URL characters.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 00:04:07 +03:30
Alireza HassaniandCursor 7cef24336a Use /{id}/{fa-slug} detail URLs in sitemaps and add public by-id lookups.
Default sitemap templates now emit SEO-friendly Farsi path segments with stable CMS ids; storefronts resolve content via new by-id public endpoints.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 23:43:25 +03:30
Alireza HassaniandCursor 1b16e79d3f Add tag filter to blogs, portfolios, and videos list APIs.
Storefronts can filter published content by metadata.tags the same way as products; website API docs are updated to match.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 21:14:42 +03:30
Alireza HassaniandCursor e0e122ed57 Add name filter to business store-items list.
Lets the dashboard specials picker search store items without loading the full catalog.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 20:38:58 +03:30
Alireza HassaniandCursor 24ce75c2e6 Expand website AI prompt with on-page SEO requirements for every public page.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 19:58:53 +03:30
Alireza HassaniandCursor 2e8d7c1cfd Add backend-generated sitemap with website manifest sync and nginx SEO proxy support.
Stores synced route config from /meshkee/sitemap-config.json, serves sitemap.xml and robots.txt per tenant, and invalidates cache on CMS writes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 15:15:32 +03:30
Alireza HassaniandCursor c7d5204b49 Add workshops CMS API with schedule, registrations, and public storefront routes.
Includes SQL migrations, Prisma models, dashboard CRUD, registration status workflow, and website OpenAPI updates for workshop listing and signup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 12:22:24 +03:30
Alireza HassaniandCursor 9d56ec7396 Fix register transaction typing for cross-site password update.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-21 12:09:52 +03:30
Alireza HassaniandCursor e027cc96ea Replace Meshkee password when linking an existing account to a new site.
Cross-site register now updates the password to the signup value and documents passwordUpdated for storefronts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-21 12:07:17 +03:30
Alireza HassaniandCursor b0d4916138 Add website special-products source setting for storefronts.
Let businesses choose product vs store_item sourcing, defaulting from the store module, and expose it on tenant resolve and store-specials.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-21 11:57:49 +03:30
Alireza HassaniandCursor 8609d8d4fd Make Arvan DNS updates opt-in and persist English user names.
Domain add/edit only upserts Arvan records when updateDns is true, and super-admin user PATCH now accepts firstNameEn and lastNameEn.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 11:50:57 +03:30
Alireza HassaniandCursor f61bba317e Add SSO handoff tickets and expand seeded countries for address forms.
Support one-time Redis-backed dashboard sign-in handoff and seed European, Middle East, and Far East countries with major cities.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 19:46:57 +03:30
Alireza HassaniandCursor 7277817b6e Add store-item Excel export/import for bulk price and stock updates.
Dashboard can download grouped product variants and re-upload to update price and stock. Also expose Content-Disposition for downloads and keep related product/customer API docs in sync.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 01:02:43 +03:30
Alireza HassaniandCursor 4a5780e74d Include updatedAt in store-item listings
Backend now returns updated timestamps for variants so the UI can sort by availability.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 11:26:20 +03:30
Alireza HassaniandCursor 5e5bfc4aa3 Sync static image slots from the live website catalog.
Refresh now imports keys from the storefront and deletes unused slots plus their files.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-17 09:55:03 +03:30
Alireza HassaniandCursor 1c7678ce67 Add website static image slots with page grouping and bilingual captions.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-16 23:56:16 +03:30