{"message":"Supermarket Backend API is running","endpoints":{"health":"GET /health","store":{"info":"GET /api/store/info (resolves store by X-Store-Domain, X-Store-Id, ?store=, or Host domain)","categories":"GET /api/store/categories (active global categories)","products":"GET /api/store/products (paginated store products: ?page=1&limit=20&category_id=&category=&in_stock=true&search=&sort_by=)","productById":"GET /api/store/products/:id"},"products":{"list":"GET /api/products (store-scoped via X-Store-Domain / host: ?page=1&limit=20&category_id=&category=&in_stock=true&search=&sort_by=)","getById":"GET /api/products/:id"},"categories":{"list":"GET /api/categories (?search=&page=1&limit=50)","getById":"GET /api/categories/:id"},"auth":{"register":"POST /api/auth/register","login":"POST /api/auth/login","profile":"GET /api/auth/profile","updateFcmToken":"PATCH /api/auth/fcm-token","logout":"POST /api/auth/logout"},"admin":{"upload":{"uploadImage":"POST /api/admin/upload (multipart: image file, optional ?folder=)","deleteImage":"DELETE /api/admin/upload (body or query: url or key)"},"categories":{"create":"POST /api/admin/categories (JSON or multipart with image file)","list":"GET /api/admin/categories (paginated: ?page=1&limit=10&search=&status=&sort_by=&sort_order=)","getById":"GET /api/admin/categories/:id","update":"PUT/PATCH /api/admin/categories/:id (JSON or multipart with image file)","reorder":"PUT /api/admin/categories/reorder (JSON: { category_ids: [...] } or { orders: [{ id, order_index }] })","uploadImage":"POST /api/admin/categories/:id/image (multipart: image file)","delete":"DELETE /api/admin/categories/:id","listSubcategories":"GET /api/admin/categories/:categoryId/subcategories","createSubcategory":"POST /api/admin/categories/:categoryId/subcategories (JSON or multipart with image file)"},"subcategories":{"create":"POST /api/admin/subcategories (JSON or multipart with image file)","list":"GET /api/admin/subcategories (paginated: ?page=1&limit=10&category_id=&search=&status=&sort_by=&sort_order=)","getById":"GET /api/admin/subcategories/:id","update":"PUT/PATCH /api/admin/subcategories/:id (JSON or multipart with image file)","uploadImage":"POST /api/admin/subcategories/:id/image (multipart: image file)","delete":"DELETE /api/admin/subcategories/:id"},"products":{"create":"POST /api/admin/products (JSON or multipart: fields + images files)","list":"GET /api/admin/products (paginated: ?page=1&limit=20&name=&category_id=&subcategory_id=&brand_id=&search=)","getById":"GET /api/admin/products/:id"},"brands":{"create":"POST /api/admin/brands (JSON: { name, status? })","list":"GET /api/admin/brands (paginated: ?page=1&limit=20&name=&search=&status=)","getById":"GET /api/admin/brands/:id","update":"PUT/PATCH /api/admin/brands/:id (JSON: { name?, status? })","delete":"DELETE /api/admin/brands/:id"},"supermarkets":{"list":"GET /api/admin/supermarkets (paginated: ?page=1&limit=20&name=&search=&status=&district=)","getById":"GET /api/admin/supermarkets/:id"},"supermarketProducts":{"add":"POST /api/admin/supermarket-products (JSON: { supermarket_id, product_id, price, discount_type?, discount_value?, stock_quantity?, is_available? })","list":"GET /api/admin/supermarket-products (paginated: ?page=1&limit=20&supermarket_id=&product_id=&category_id=&is_available=&name=&search=)","getById":"GET /api/admin/supermarket-products/:id","update":"PUT/PATCH /api/admin/supermarket-products/:id (JSON: { price?, discount_type?, discount_value?, stock_quantity?, is_available? })","delete":"DELETE /api/admin/supermarket-products/:id"}}}}