| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/elite-events-storybook/ |
Upload File : |
"use strict";(self.webpackChunkelite_events_nextjs=self.webpackChunkelite_events_nextjs||[]).push([[9296],{"./src/lib/api-docs/executor.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{$C:()=>downloadOpenAPISpecYaml,Aq:()=>saveEnvironments,BO:()=>generateJavascript,DL:()=>getEnvironments,F8:()=>setCurrentEnvironment,Fc:()=>saveRequest,Ht:()=>getMethodColor,IB:()=>formatJson,Lr:()=>getCurrentEnvironment,Oq:()=>exportCollections,Pc:()=>addToHistory,Vc:()=>executeRequest,WY:()=>getSavedRequests,ZG:()=>importCollections,_u:()=>generatePython,bP:()=>getStatusBgColor,mA:()=>generateTypescript,qY:()=>getStatusColor,s1:()=>downloadOpenAPISpec,uu:()=>generateCurl,v$:()=>buildRequestUrl,ww:()=>deleteSavedRequest});var _registry__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./src/lib/api-docs/registry.ts");const HISTORY_STORAGE_KEY="api-docs-history",SAVED_REQUESTS_KEY="api-docs-saved-requests",COLLECTIONS_KEY="api-docs-collections",ENVIRONMENTS_KEY="api-docs-environments",CURRENT_ENV_KEY="api-docs-current-env",MAX_HISTORY_ITEMS=50,DEFAULT_ENVIRONMENTS=[{id:"local",name:"Local",baseUrl:"http://localhost:3000",isDefault:!0},{id:"staging",name:"Staging",baseUrl:""},{id:"production",name:"Production",baseUrl:""}];function buildRequestUrl(endpoint,pathParams,queryParams){let url=endpoint.path;for(const[key,value]of Object.entries(pathParams))url=url.replace(`{${key}}`,encodeURIComponent(value));const queryEntries=Object.entries(queryParams).filter(([,value])=>""!==value);if(queryEntries.length>0){const searchParams=new URLSearchParams;for(const[key,value]of queryEntries)searchParams.append(key,value);url+=`?${searchParams.toString()}`}return url}async function executeRequest(request){const startTime=performance.now(),url=buildRequestUrl(request.endpoint,request.pathParams,request.queryParams),headers={"Content-Type":"application/json",...request.headers},fetchOptions={method:request.endpoint.method,headers,credentials:request.useAuth?"include":"omit"};["POST","PUT","PATCH"].includes(request.endpoint.method)&&request.body&&(fetchOptions.body=JSON.stringify(request.body));try{const response=await fetch(url,fetchOptions),endTime=performance.now(),responseHeaders={};let body;response.headers.forEach((value,key)=>{responseHeaders[key]=value});const contentType=response.headers.get("content-type");if(contentType?.includes("application/json"))try{body=await response.json()}catch{body=await response.text()}else body=await response.text();return{status:response.status,statusText:response.statusText,headers:responseHeaders,body,duration:Math.round(endTime-startTime),timestamp:new Date}}catch(error){const endTime=performance.now();return{status:0,statusText:"Network Error",headers:{},body:{error:error instanceof Error?error.message:"Unknown error"},duration:Math.round(endTime-startTime),timestamp:new Date}}}function getRequestHistory(){try{const stored=localStorage.getItem(HISTORY_STORAGE_KEY);if(!stored)return[];return JSON.parse(stored).map(item=>({...item,timestamp:new Date(item.timestamp),response:{...item.response,timestamp:new Date(item.response.timestamp)}}))}catch{return[]}}function addToHistory(request,response){const history=getRequestHistory(),updated=[{id:`${Date.now()}-${Math.random().toString(36).substr(2,9)}`,request,response,timestamp:new Date},...history].slice(0,MAX_HISTORY_ITEMS);try{localStorage.setItem(HISTORY_STORAGE_KEY,JSON.stringify(updated))}catch{localStorage.setItem(HISTORY_STORAGE_KEY,JSON.stringify(updated.slice(0,10)))}}function getStatusColor(status){return 0===status?"text-gray-500":status>=200&&status<300?"text-green-600":status>=300&&status<400?"text-blue-600":status>=400&&status<500?"text-yellow-600":"text-red-600"}function getStatusBgColor(status){return 0===status?"bg-gray-100":status>=200&&status<300?"bg-green-100":status>=300&&status<400?"bg-blue-100":status>=400&&status<500?"bg-yellow-100":"bg-red-100"}function getMethodColor(method){switch(method){case"GET":return"bg-green-100 text-green-700";case"POST":return"bg-blue-100 text-blue-700";case"PUT":return"bg-yellow-100 text-yellow-700";case"PATCH":return"bg-orange-100 text-orange-700";case"DELETE":return"bg-red-100 text-red-700";default:return"bg-gray-100 text-gray-700"}}function formatJson(obj){try{return JSON.stringify(obj,null,2)}catch{return String(obj)}}function generateCurl(request){const url=buildRequestUrl(request.endpoint,request.pathParams,request.queryParams);let curl=`curl -X ${request.endpoint.method} '${window.location.origin}${url}'`;curl+=" \\\n -H 'Content-Type: application/json'";for(const[key,value]of Object.entries(request.headers))curl+=` \\\n -H '${key}: ${value}'`;return["POST","PUT","PATCH"].includes(request.endpoint.method)&&request.body&&(curl+=` \\\n -d '${JSON.stringify(request.body)}'`),curl}function generateTypescript(request){let code=`const response = await fetch('${buildRequestUrl(request.endpoint,request.pathParams,request.queryParams)}', {\n`;code+=` method: '${request.endpoint.method}',\n`,code+=" headers: {\n",code+=" 'Content-Type': 'application/json',\n";for(const[key,value]of Object.entries(request.headers))code+=` '${key}': '${value}',\n`;return code+=" },\n",["POST","PUT","PATCH"].includes(request.endpoint.method)&&request.body&&(code+=` body: JSON.stringify(${JSON.stringify(request.body,null,2).split("\n").join("\n ")}),\n`),code+="});\n\n",code+="const data = await response.json();\n",code+="console.log(data);",code}function generateJavascript(request){let code=`fetch('${buildRequestUrl(request.endpoint,request.pathParams,request.queryParams)}', {\n`;code+=` method: '${request.endpoint.method}',\n`,code+=" headers: {\n",code+=" 'Content-Type': 'application/json',\n";for(const[key,value]of Object.entries(request.headers))code+=` '${key}': '${value}',\n`;return code+=" },\n",["POST","PUT","PATCH"].includes(request.endpoint.method)&&request.body&&(code+=` body: JSON.stringify(${JSON.stringify(request.body,null,2).split("\n").join("\n ")}),\n`),code+="})\n",code+=" .then(response => response.json())\n",code+=" .then(data => console.log(data))\n",code+=" .catch(error => console.error('Error:', error));",code}function generatePython(request){const url=buildRequestUrl(request.endpoint,request.pathParams,request.queryParams);let code="import requests\n\n";code+=`url = "${window.location.origin}${url}"\n`,code+="headers = {\n",code+=' "Content-Type": "application/json",\n';for(const[key,value]of Object.entries(request.headers))code+=` "${key}": "${value}",\n`;return code+="}\n\n",["POST","PUT","PATCH"].includes(request.endpoint.method)&&request.body?(code+=`data = ${JSON.stringify(request.body,null,4)}\n\n`,code+=`response = requests.${request.endpoint.method.toLowerCase()}(url, headers=headers, json=data)\n`):code+=`response = requests.${request.endpoint.method.toLowerCase()}(url, headers=headers)\n`,code+="print(response.json())",code}function getSavedRequests(){try{const stored=localStorage.getItem(SAVED_REQUESTS_KEY);if(!stored)return[];return JSON.parse(stored).map(item=>({...item,createdAt:new Date(item.createdAt)}))}catch{return[]}}function saveRequest(name,request){const saved={id:`saved-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,name,request,createdAt:new Date},updated=[saved,...getSavedRequests()];try{localStorage.setItem(SAVED_REQUESTS_KEY,JSON.stringify(updated))}catch{}return saved}function deleteSavedRequest(id){const updated=getSavedRequests().filter(r=>r.id!==id);localStorage.setItem(SAVED_REQUESTS_KEY,JSON.stringify(updated))}function getCollections(){try{const stored=localStorage.getItem(COLLECTIONS_KEY);if(!stored)return[];return JSON.parse(stored).map(item=>({...item,createdAt:new Date(item.createdAt),updatedAt:new Date(item.updatedAt),requests:item.requests.map(r=>({...r,createdAt:new Date(r.createdAt)}))}))}catch{return[]}}function exportCollections(){const collections=getCollections(),savedRequests=getSavedRequests();return JSON.stringify({version:"1.0",exportedAt:(new Date).toISOString(),collections,savedRequests},null,2)}function importCollections(jsonString){try{const data=JSON.parse(jsonString);if(data.collections){const existing=getCollections(),imported=data.collections.map(c=>({...c,id:`col-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,createdAt:new Date,updatedAt:new Date}));localStorage.setItem(COLLECTIONS_KEY,JSON.stringify([...imported,...existing]))}if(data.savedRequests){const existing=getSavedRequests(),imported=data.savedRequests.map(r=>({...r,id:`saved-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,createdAt:new Date}));localStorage.setItem(SAVED_REQUESTS_KEY,JSON.stringify([...imported,...existing]))}return{collections:data.collections?.length||0,requests:data.savedRequests?.length||0}}catch{throw new Error("Invalid import file format")}}function getEnvironments(){try{const stored=localStorage.getItem(ENVIRONMENTS_KEY);return stored?JSON.parse(stored):DEFAULT_ENVIRONMENTS}catch{return DEFAULT_ENVIRONMENTS}}function saveEnvironments(environments){localStorage.setItem(ENVIRONMENTS_KEY,JSON.stringify(environments))}function getCurrentEnvironment(){try{const stored=localStorage.getItem(CURRENT_ENV_KEY);return stored?JSON.parse(stored):DEFAULT_ENVIRONMENTS[0]}catch{return DEFAULT_ENVIRONMENTS[0]}}function setCurrentEnvironment(env){localStorage.setItem(CURRENT_ENV_KEY,JSON.stringify(env))}function generateOpenAPISpec(){const spec={openapi:"3.0.3",info:{title:_registry__WEBPACK_IMPORTED_MODULE_0__.Yn.title,version:_registry__WEBPACK_IMPORTED_MODULE_0__.Yn.version,description:_registry__WEBPACK_IMPORTED_MODULE_0__.Yn.description},servers:[{url:window.location.origin,description:"Current server"}],paths:{},components:{securitySchemes:{cookieAuth:{type:"apiKey",in:"cookie",name:"session"}}}};for(const category of _registry__WEBPACK_IMPORTED_MODULE_0__.Yn.categories)for(const endpoint of category.endpoints){const path=endpoint.path.replace(/{(\w+)}/g,"{$1}");spec.paths[path]||(spec.paths[path]={});const operation={summary:endpoint.summary,description:endpoint.description,operationId:endpoint.id,tags:endpoint.tags||[category.name],parameters:endpoint.parameters?.map(p=>({name:p.name,in:p.location,required:p.required,description:p.description,schema:{type:p.type,enum:p.enum,example:p.example}})),requestBody:endpoint.requestBody?{required:!0,description:endpoint.requestBody.description,content:{[endpoint.requestBody.contentType]:{schema:{type:"object",properties:endpoint.requestBody.fields.reduce((acc,field)=>({...acc,[field.name]:{type:field.type,description:field.description,enum:field.enum}}),{}),required:endpoint.requestBody.fields.filter(f=>f.required).map(f=>f.name)},example:endpoint.requestBody.example}}}:void 0,responses:endpoint.responses.reduce((acc,res)=>({...acc,[res.status.toString()]:{description:res.description,content:res.example?{"application/json":{example:res.example}}:void 0}}),{}),security:endpoint.requiresAuth?[{cookieAuth:[]}]:void 0};spec.paths[path][endpoint.method.toLowerCase()]=operation}return spec}function downloadOpenAPISpec(){const spec=generateOpenAPISpec(),blob=new Blob([JSON.stringify(spec,null,2)],{type:"application/json"}),url=URL.createObjectURL(blob),a=document.createElement("a");a.href=url,a.download=`${_registry__WEBPACK_IMPORTED_MODULE_0__.Yn.title.toLowerCase().replace(/\s+/g,"-")}-openapi.json`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(url)}function downloadOpenAPISpecYaml(){const yaml=jsonToYaml(generateOpenAPISpec()),blob=new Blob([yaml],{type:"text/yaml"}),url=URL.createObjectURL(blob),a=document.createElement("a");a.href=url,a.download=`${_registry__WEBPACK_IMPORTED_MODULE_0__.Yn.title.toLowerCase().replace(/\s+/g,"-")}-openapi.yaml`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(url)}function jsonToYaml(obj,indent=0){const spaces=" ".repeat(indent);if(null==obj)return"null";if("string"==typeof obj)return obj.includes("\n")||obj.includes(":")||obj.includes("#")?`"${obj.replace(/"/g,'\\"')}"`:obj;if("number"==typeof obj||"boolean"==typeof obj)return String(obj);if(Array.isArray(obj))return 0===obj.length?"[]":obj.map(item=>{const itemYaml=jsonToYaml(item,indent+1);return"object"==typeof item&&null!==item?`${spaces}- ${itemYaml.trim().replace(/^\s+/,"").replace(/\n/g,`\n${spaces} `)}`:`${spaces}- ${itemYaml}`}).join("\n");if("object"==typeof obj){const entries=Object.entries(obj).filter(([,v])=>void 0!==v);return 0===entries.length?"{}":entries.map(([key,value])=>{const valueYaml=jsonToYaml(value,indent+1);return"object"!=typeof value||null===value||Array.isArray(value)?Array.isArray(value)?`${spaces}${key}:\n${valueYaml}`:`${spaces}${key}: ${valueYaml}`:`${spaces}${key}:\n${valueYaml}`}).join("\n")}return String(obj)}},"./src/lib/api-docs/registry.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{Yn:()=>apiRegistry,OR:()=>getEndpointById,RO:()=>searchEndpoints});const categories=[{id:"auth",name:"Authentication",description:"User authentication, registration, and password management",icon:"lock",endpoints:[{id:"auth-signup",method:"POST",path:"/api/auth/signup",summary:"Register a new user",description:"Creates a new user account with email and password",category:"auth",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"email",type:"string",required:!0,description:"User email address"},{name:"password",type:"string",required:!0,description:"Password (min 8 characters)"},{name:"name",type:"string",required:!1,description:"User display name"}],example:{email:"user@example.com",password:"securepassword123",name:"John Doe"}},responses:[{status:201,description:"User created successfully",example:{success:!0,message:"Account created"}},{status:400,description:"Invalid input data"},{status:409,description:"Email already exists"}]},{id:"auth-forgot-password",method:"POST",path:"/api/auth/forgot-password",summary:"Request password reset",description:"Sends a password reset email to the user",category:"auth",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"email",type:"string",required:!0,description:"User email address"}],example:{email:"user@example.com"}},responses:[{status:200,description:"Reset email sent (always returns success for security)"}]},{id:"auth-reset-password",method:"POST",path:"/api/auth/reset-password",summary:"Reset password with token",description:"Resets user password using the token from email",category:"auth",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"token",type:"string",required:!0,description:"Reset token from email"},{name:"password",type:"string",required:!0,description:"New password"}],example:{token:"abc123...",password:"newpassword123"}},responses:[{status:200,description:"Password reset successfully"},{status:400,description:"Invalid or expired token"}]},{id:"auth-verify-email",method:"POST",path:"/api/auth/verify-email",summary:"Verify email address",description:"Verifies user email with the token sent via email",category:"auth",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"token",type:"string",required:!0,description:"Verification token from email"}],example:{token:"verification-token-123"}},responses:[{status:200,description:"Email verified successfully"},{status:400,description:"Invalid or expired token"}]},{id:"auth-resend-verification",method:"POST",path:"/api/auth/resend-verification",summary:"Resend verification email",description:"Sends a new verification email to the user",category:"auth",requiresAuth:!0,responses:[{status:200,description:"Verification email sent"},{status:400,description:"Email already verified"}]}]},{id:"products",name:"Products",description:"Product catalog, search, and filtering",icon:"box",endpoints:[{id:"products-list",method:"GET",path:"/api/products",summary:"List all products",description:"Returns paginated list of products with optional filters",category:"products",requiresAuth:!1,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number",example:1},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page",example:20},{name:"category",type:"string",required:!1,location:"query",description:"Filter by category slug"},{name:"search",type:"string",required:!1,location:"query",description:"Search term"},{name:"minPrice",type:"number",required:!1,location:"query",description:"Minimum price filter"},{name:"maxPrice",type:"number",required:!1,location:"query",description:"Maximum price filter"},{name:"sort",type:"string",required:!1,location:"query",description:"Sort field",enum:["price","name","createdAt"]},{name:"order",type:"string",required:!1,location:"query",description:"Sort order",enum:["asc","desc"]}],responses:[{status:200,description:"List of products",example:{success:!0,data:{products:[{id:1,name:"Product",price:99.99,slug:"product-1",categoryId:1}],pagination:{page:1,limit:20,total:100,totalPages:5}}}}]},{id:"products-get",method:"GET",path:"/api/products/{id}",summary:"Get product by ID",description:"Returns a single product with full details",category:"products",requiresAuth:!1,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Product ID"}],responses:[{status:200,description:"Product details",example:{success:!0,data:{id:1,name:"Product Name",description:"Product description",price:99.99,slug:"product-name",images:["/images/product1.jpg"],category:{id:1,name:"Category"},reviews:[]}}},{status:404,description:"Product not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Product not found"}}}]},{id:"products-search",method:"GET",path:"/api/products/search",summary:"Search products",description:"Search products by query with full-text search",category:"products",requiresAuth:!1,parameters:[{name:"q",type:"string",required:!0,location:"query",description:"Search query"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"Search results",example:{success:!0,data:{results:[{id:1,name:"Product",price:99.99,slug:"product-1"}],pagination:{page:1,limit:20,total:10,totalPages:1}}}}]},{id:"products-search-suggestions",method:"GET",path:"/api/products/search/suggestions",summary:"Get search suggestions",description:"Returns autocomplete suggestions for product search",category:"products",requiresAuth:!1,parameters:[{name:"q",type:"string",required:!0,location:"query",description:"Search query",example:"chair"},{name:"limit",type:"number",required:!1,location:"query",description:"Max suggestions",example:5}],responses:[{status:200,description:"List of suggestions",example:{success:!0,data:{suggestions:[{id:1,title:"Office Chair",slug:"office-chair"},{id:2,title:"Gaming Chair",slug:"gaming-chair"}]}}}]},{id:"products-filters",method:"GET",path:"/api/products/filters",summary:"Get available filters",description:"Returns available filter options based on current products",category:"products",requiresAuth:!1,responses:[{status:200,description:"Filter options",example:{success:!0,data:{categories:[{id:1,name:"Category",slug:"category"}],priceRange:{min:0,max:1e3},brands:["Brand A","Brand B"]}}}]}]},{id:"categories",name:"Categories",description:"Product categories and organization",icon:"folder",endpoints:[{id:"categories-list",method:"GET",path:"/api/categories",summary:"List all categories",description:"Returns hierarchical list of product categories",category:"categories",requiresAuth:!1,responses:[{status:200,description:"List of categories",example:{success:!0,data:{categories:[{id:1,name:"Electronics",slug:"electronics",description:"Electronic devices and accessories",parentId:null,children:[{id:2,name:"Phones",slug:"phones",parentId:1}]}]}}}]},{id:"categories-get",method:"GET",path:"/api/categories/{id}",summary:"Get category by ID",description:"Returns a single category with its subcategories",category:"categories",requiresAuth:!1,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Category ID"}],responses:[{status:200,description:"Category details",example:{success:!0,data:{id:1,name:"Electronics",slug:"electronics",description:"Electronic devices and accessories",products:[]}}},{status:404,description:"Category not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Category not found"}}}]}]},{id:"cart",name:"Shopping Cart",description:"Cart management and checkout preparation",icon:"shopping-cart",endpoints:[{id:"cart-get",method:"GET",path:"/api/cart",summary:"Get current cart",description:"Returns the current user cart with all items",category:"cart",requiresAuth:!0,responses:[{status:200,description:"Cart contents",example:{success:!0,data:{items:[{id:1,productId:101,quantity:2,price:29.99}],total:59.98}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"cart-add",method:"POST",path:"/api/cart",summary:"Add item to cart",description:"Adds a product to the shopping cart",category:"cart",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!0,description:"Product ID to add"},{name:"quantity",type:"number",required:!0,description:"Quantity to add"},{name:"rentalStart",type:"string",required:!1,description:"Rental start date (ISO)"},{name:"rentalEnd",type:"string",required:!1,description:"Rental end date (ISO)"}],example:{productId:1,quantity:2}},responses:[{status:201,description:"Item added to cart",example:{success:!0,data:{id:1,productId:1,quantity:2,price:29.99}}},{status:400,description:"Invalid product or quantity",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Invalid product or quantity"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"cart-update-item",method:"PATCH",path:"/api/cart/{id}",summary:"Update cart item",description:"Updates quantity or dates for a cart item",category:"cart",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Cart item ID"}],requestBody:{contentType:"application/json",fields:[{name:"quantity",type:"number",required:!1,description:"New quantity"}],example:{quantity:3}},responses:[{status:200,description:"Cart item updated",example:{success:!0,data:{id:1,productId:1,quantity:3,price:29.99}}},{status:404,description:"Cart item not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Cart item not found"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"cart-remove-item",method:"DELETE",path:"/api/cart/{id}",summary:"Remove cart item",description:"Removes an item from the cart",category:"cart",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Cart item ID"}],responses:[{status:200,description:"Item removed",example:{success:!0,data:{message:"Item removed from cart"}}},{status:404,description:"Cart item not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Cart item not found"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"cart-merge",method:"POST",path:"/api/cart/merge",summary:"Merge guest cart",description:"Merges guest cart with user cart after login",category:"cart",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"guestCartId",type:"string",required:!0,description:"Guest cart session ID"}],example:{guestCartId:"guest-session-abc123"}},responses:[{status:200,description:"Carts merged successfully",example:{success:!0,data:{message:"Cart merged successfully",itemsMerged:3}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]}]},{id:"orders",name:"Orders",description:"Order creation and management",icon:"package",endpoints:[{id:"orders-list",method:"GET",path:"/api/orders",summary:"List user orders",description:"Returns paginated list of orders for the current user",category:"orders",requiresAuth:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"}],responses:[{status:200,description:"List of orders",example:{success:!0,data:{orders:[{id:1,orderNumber:"ORD-2024-001",status:"DELIVERED",total:159.99,createdAt:"2024-01-15T10:30:00Z",items:[{productId:101,quantity:2,price:79.99}]}],pagination:{page:1,limit:10,total:25,totalPages:3}}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"orders-create",method:"POST",path:"/api/orders",summary:"Create new order",description:"Creates a new order from the current cart",category:"orders",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"shippingAddressId",type:"number",required:!0,description:"Shipping address ID"},{name:"billingAddressId",type:"number",required:!1,description:"Billing address ID"},{name:"paymentIntentId",type:"string",required:!0,description:"Stripe payment intent ID"},{name:"notes",type:"string",required:!1,description:"Order notes"}]},responses:[{status:201,description:"Order created",example:{success:!0,data:{id:1,orderNumber:"ORD-2024-001",status:"PENDING",total:159.99,shippingAddressId:1,billingAddressId:1,createdAt:"2024-01-15T10:30:00Z"}}},{status:400,description:"Invalid order data",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Invalid order data"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"orders-get",method:"GET",path:"/api/orders/{id}",summary:"Get order details",description:"Returns full details of a specific order",category:"orders",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Order ID"}],responses:[{status:200,description:"Order details",example:{success:!0,data:{id:1,orderNumber:"ORD-2024-001",status:"DELIVERED",total:159.99,shippingAddress:{street:"123 Main St",city:"New York",state:"NY",zipCode:"10001"},items:[{id:1,productId:101,name:"Product 1",quantity:2,price:79.99}],createdAt:"2024-01-15T10:30:00Z",updatedAt:"2024-01-16T14:00:00Z"}}},{status:404,description:"Order not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Order not found"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"checkout",method:"POST",path:"/api/checkout",summary:"Process checkout",description:"Processes checkout from cart, creates order, reserves inventory, and initiates Stripe payment",category:"orders",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"shippingAddress",type:"object",required:!0,description:"Shipping address object"},{name:"shippingAddress.street",type:"string",required:!0,description:"Street address"},{name:"shippingAddress.city",type:"string",required:!0,description:"City"},{name:"shippingAddress.state",type:"string",required:!0,description:"State/Province"},{name:"shippingAddress.zipCode",type:"string",required:!0,description:"ZIP/Postal code"},{name:"shippingAddress.country",type:"string",required:!0,description:"Country"},{name:"billingAddress",type:"object",required:!0,description:"Billing address object (same structure as shipping)"},{name:"paymentMethod",type:"string",required:!1,description:"Payment method",enum:["credit_card","paypal","apple_pay"]}],example:{shippingAddress:{street:"123 Main St",city:"New York",state:"NY",zipCode:"10001",country:"US"},billingAddress:{street:"123 Main St",city:"New York",state:"NY",zipCode:"10001",country:"US"}}},responses:[{status:201,description:"Order created with payment intent",example:{success:!0,data:{order:{id:1,orderNumber:"ORD-2024-001",status:"PENDING",total:159.99},payment:{clientSecret:"pi_xxx_secret_xxx",paymentIntentId:"pi_xxx"}}}},{status:400,description:"Cart empty or insufficient inventory",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Cart is empty"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}},{status:429,description:"Rate limit exceeded"}]}]},{id:"user",name:"User Account",description:"User profile, addresses, and preferences",icon:"user",endpoints:[{id:"user-profile",method:"GET",path:"/api/user/profile",summary:"Get user profile",description:"Returns current user profile information",category:"user",requiresAuth:!0,responses:[{status:200,description:"User profile data",example:{success:!0,data:{id:1,name:"John Doe",email:"john@example.com",phone:"+1234567890",role:"CUSTOMER",createdAt:"2024-01-01T00:00:00Z"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-profile-update",method:"PATCH",path:"/api/user/profile",summary:"Update user profile",description:"Updates current user profile information",category:"user",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Display name"},{name:"phone",type:"string",required:!1,description:"Phone number"}],example:{name:"Jane Doe",phone:"+1987654321"}},responses:[{status:200,description:"Profile updated",example:{success:!0,data:{id:1,name:"Jane Doe",email:"john@example.com",phone:"+1987654321",role:"CUSTOMER"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-password",method:"POST",path:"/api/user/password",summary:"Change password",description:"Changes the current user password. Invalidates all other sessions after successful change.",category:"user",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"oldPassword",type:"string",required:!0,description:"Current password"},{name:"newPassword",type:"string",required:!0,description:"New password (min 8 chars, uppercase, lowercase, number)"},{name:"confirmPassword",type:"string",required:!0,description:"Confirm new password"}]},responses:[{status:200,description:"Password changed",example:{success:!0,data:{message:"Password changed successfully. Please sign in again.",requireReauth:!0}}},{status:400,description:"Invalid current password or validation error",example:{success:!1,error:{code:"BAD_REQUEST",message:"Current password is incorrect"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}},{status:429,description:"Rate limited",example:{success:!1,error:{code:"RATE_LIMITED",message:"Too many password change attempts. Please try again later."}}}]},{id:"user-addresses-list",method:"GET",path:"/api/user/addresses",summary:"List user addresses",description:"Returns all saved addresses for the current user",category:"user",requiresAuth:!0,responses:[{status:200,description:"List of addresses",example:{success:!0,data:[{id:1,type:"SHIPPING",name:"John Doe",street:"123 Main St",city:"New York",state:"NY",zipCode:"10001",country:"US",isDefault:!0}]}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-addresses-create",method:"POST",path:"/api/user/addresses",summary:"Add new address",description:"Adds a new address to user account",category:"user",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"type",type:"string",required:!0,description:"Address type (SHIPPING or BILLING)"},{name:"name",type:"string",required:!0,description:"Recipient name"},{name:"street",type:"string",required:!0,description:"Street address"},{name:"city",type:"string",required:!0,description:"City"},{name:"state",type:"string",required:!0,description:"State/Province"},{name:"zipCode",type:"string",required:!0,description:"Postal/ZIP code"},{name:"country",type:"string",required:!0,description:"Country"},{name:"isDefault",type:"boolean",required:!1,description:"Set as default address"}],example:{type:"SHIPPING",name:"John Doe",street:"123 Main St",city:"New York",state:"NY",zipCode:"10001",country:"US"}},responses:[{status:201,description:"Address created",example:{success:!0,data:{id:1,type:"SHIPPING",name:"John Doe",street:"123 Main St",city:"New York",state:"NY",zipCode:"10001",country:"US",isDefault:!1}}},{status:400,description:"Validation error",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Invalid address data"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-addresses-get",method:"GET",path:"/api/user/addresses/{id}",summary:"Get address by ID",description:"Returns a single address by ID",category:"user",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Address ID"}],responses:[{status:200,description:"Address details",example:{success:!0,data:{id:1,type:"SHIPPING",name:"John Doe",street:"123 Main St",city:"New York",state:"NY",zipCode:"10001",country:"US",isDefault:!0}}},{status:404,description:"Address not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Address not found"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-addresses-update",method:"PATCH",path:"/api/user/addresses/{id}",summary:"Update address",description:"Updates an existing address",category:"user",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Address ID"}],requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Recipient name"},{name:"street",type:"string",required:!1,description:"Street address"},{name:"city",type:"string",required:!1,description:"City"},{name:"state",type:"string",required:!1,description:"State/Province"},{name:"zipCode",type:"string",required:!1,description:"Postal/ZIP code"},{name:"country",type:"string",required:!1,description:"Country"},{name:"isDefault",type:"boolean",required:!1,description:"Set as default address"}],example:{street:"456 Oak Ave",city:"Los Angeles"}},responses:[{status:200,description:"Address updated",example:{success:!0,data:{id:1,type:"SHIPPING",name:"John Doe",street:"456 Oak Ave",city:"Los Angeles",state:"NY",zipCode:"10001",country:"US",isDefault:!0}}},{status:404,description:"Address not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Address not found"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-addresses-delete",method:"DELETE",path:"/api/user/addresses/{id}",summary:"Delete address",description:"Removes an address from user account",category:"user",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Address ID"}],responses:[{status:200,description:"Address deleted",example:{success:!0,data:{message:"Address deleted successfully"}}},{status:404,description:"Address not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Address not found"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"user-notification-preferences-get",method:"GET",path:"/api/user/notification-preferences",summary:"Get notification preferences",description:"Returns current user notification preferences",category:"user",requiresAuth:!0,responses:[{status:200,description:"Notification preferences",example:{success:!0,data:{email:!0,push:!0,sms:!1,orders:!0,reviews:!0,stock:!0,promotions:!1}}},{status:401,description:"Not authenticated"}]},{id:"user-notification-preferences-update",method:"PUT",path:"/api/user/notification-preferences",summary:"Update notification preferences",description:"Updates user notification preferences",category:"user",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"email",type:"boolean",required:!1,description:"Email notifications"},{name:"push",type:"boolean",required:!1,description:"Push notifications"},{name:"sms",type:"boolean",required:!1,description:"SMS notifications"},{name:"orders",type:"boolean",required:!1,description:"Order update notifications"},{name:"reviews",type:"boolean",required:!1,description:"Review notifications"},{name:"stock",type:"boolean",required:!1,description:"Stock alert notifications"},{name:"promotions",type:"boolean",required:!1,description:"Promotional notifications"}],example:{email:!0,promotions:!0}},responses:[{status:200,description:"Preferences updated"},{status:400,description:"Invalid preferences"},{status:401,description:"Not authenticated"}]},{id:"user-notification-preferences-toggle",method:"PATCH",path:"/api/user/notification-preferences",summary:"Toggle single preference",description:"Toggles a single notification preference",category:"user",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"key",type:"string",required:!0,description:"Preference key to toggle",enum:["email","push","sms","orders","reviews","stock","promotions"]},{name:"value",type:"boolean",required:!0,description:"New value"}],example:{key:"promotions",value:!0}},responses:[{status:200,description:"Preference toggled"},{status:400,description:"Invalid key or value"},{status:401,description:"Not authenticated"}]}]},{id:"reviews",name:"Reviews",description:"Product reviews and ratings",icon:"star",endpoints:[{id:"reviews-list",method:"GET",path:"/api/reviews",summary:"List product reviews",description:"Returns reviews for a product",category:"reviews",requiresAuth:!1,parameters:[{name:"productId",type:"number",required:!0,location:"query",description:"Product ID"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"List of reviews",example:{success:!0,data:{reviews:[{id:1,productId:101,rating:5,title:"Great product!",content:"Love it!",userName:"John",createdAt:"2024-01-15T10:00:00Z"}],averageRating:4.5,totalReviews:25,pagination:{page:1,limit:10,total:25,totalPages:3}}}}]},{id:"reviews-create",method:"POST",path:"/api/reviews",summary:"Create review",description:"Creates a new product review",category:"reviews",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!0,description:"Product ID"},{name:"rating",type:"number",required:!0,description:"Rating (1-5)"},{name:"title",type:"string",required:!1,description:"Review title"},{name:"content",type:"string",required:!0,description:"Review content"}]},responses:[{status:201,description:"Review created",example:{success:!0,data:{id:1,productId:101,rating:5,title:"Great!",content:"Love it!",createdAt:"2024-01-15T10:00:00Z"}}},{status:400,description:"Already reviewed this product",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"You have already reviewed this product"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"reviews-update",method:"PUT",path:"/api/reviews/{reviewId}",summary:"Update review",description:"Updates an existing review",category:"reviews",requiresAuth:!0,parameters:[{name:"reviewId",type:"number",required:!0,location:"path",description:"Review ID"}],requestBody:{contentType:"application/json",fields:[{name:"rating",type:"number",required:!1,description:"Rating (1-5)"},{name:"title",type:"string",required:!1,description:"Review title"},{name:"content",type:"string",required:!1,description:"Review content"}]},responses:[{status:200,description:"Review updated",example:{success:!0,data:{id:1,rating:4,title:"Updated title",content:"Updated review"}}},{status:404,description:"Review not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Review not found"}}}]},{id:"reviews-delete",method:"DELETE",path:"/api/reviews/{reviewId}",summary:"Delete review",description:"Deletes a review",category:"reviews",requiresAuth:!0,parameters:[{name:"reviewId",type:"number",required:!0,location:"path",description:"Review ID"}],responses:[{status:200,description:"Review deleted",example:{success:!0,data:{message:"Review deleted successfully"}}},{status:404,description:"Review not found",example:{success:!1,error:{code:"NOT_FOUND",message:"Review not found"}}}]},{id:"product-reviews-list",method:"GET",path:"/api/products/{id}/reviews",summary:"Get product reviews with stats",description:"Returns reviews for a specific product with rating statistics and distribution",category:"reviews",requiresAuth:!1,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Product ID"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page (max 50)"},{name:"sortBy",type:"string",required:!1,location:"query",description:"Sort order",enum:["recent","helpful","rating_high","rating_low"]},{name:"rating",type:"number",required:!1,location:"query",description:"Filter by rating (1-5)"}],responses:[{status:200,description:"Reviews with stats",example:{success:!0,data:{reviews:[],stats:{averageRating:4.5,totalReviews:100,distribution:{1:5,2:10,3:15,4:30,5:40}},pagination:{page:1,limit:10,total:100}}}},{status:400,description:"Invalid product ID or parameters"}]},{id:"product-reviews-create",method:"POST",path:"/api/products/{id}/reviews",summary:"Submit product review",description:"Submits a review for a specific product",category:"reviews",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Product ID"}],requestBody:{contentType:"application/json",fields:[{name:"rating",type:"number",required:!0,description:"Rating (1-5)"},{name:"comment",type:"string",required:!1,description:"Review comment (10-2000 chars)"}],example:{rating:5,comment:"Great product! Highly recommended."}},responses:[{status:201,description:"Review submitted"},{status:400,description:"Validation failed"},{status:401,description:"Authentication required"},{status:404,description:"Product not found"},{status:409,description:"Already reviewed this product"}]}]},{id:"wishlist",name:"Wishlist",description:"User wishlist management",icon:"heart",endpoints:[{id:"wishlist-get",method:"GET",path:"/api/wishlist",summary:"Get wishlist",description:"Returns all items in the user wishlist",category:"wishlist",requiresAuth:!0,responses:[{status:200,description:"Wishlist items",example:{success:!0,data:[{id:1,title:"Product Name",price:29.99,discountedPrice:24.99,reviews:12,averageRating:4.5,imgs:{thumbnails:["/img1.jpg"],previews:["/img1-full.jpg"]},addedAt:"2024-01-15T10:00:00Z"}]}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"wishlist-add",method:"POST",path:"/api/wishlist",summary:"Add to wishlist",description:"Adds a product to user wishlist",category:"wishlist",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!0,description:"Product ID to add"}],example:{productId:101}},responses:[{status:201,description:"Added to wishlist",example:{success:!0,data:{id:1,productId:101,addedAt:"2024-01-15T10:00:00Z"}}},{status:400,description:"Product already in wishlist",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Product already in wishlist"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"wishlist-remove",method:"DELETE",path:"/api/wishlist/{id}",summary:"Remove from wishlist",description:"Removes a product from user wishlist",category:"wishlist",requiresAuth:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Product ID"}],responses:[{status:200,description:"Removed from wishlist",example:{success:!0,data:{message:"Product removed from wishlist"}}},{status:404,description:"Product not in wishlist",example:{success:!1,error:{code:"NOT_FOUND",message:"Product not found in wishlist"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]}]},{id:"payments",name:"Payments",description:"Payment processing with Stripe",icon:"credit-card",endpoints:[{id:"payments-create-intent",method:"POST",path:"/api/payments/create-intent",summary:"Create payment intent",description:"Creates a Stripe payment intent for checkout",category:"payments",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"amount",type:"number",required:!0,description:"Amount in cents"},{name:"currency",type:"string",required:!1,description:"Currency code (default: usd)"}]},responses:[{status:200,description:"Payment intent created",example:{success:!0,data:{clientSecret:"pi_xxx_secret_xxx",paymentIntentId:"pi_xxx",amount:15999,currency:"usd"}}},{status:400,description:"Invalid amount",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Amount must be a positive number"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"payments-process",method:"POST",path:"/api/payments",summary:"Process payment",description:"Processes a payment after checkout",category:"payments",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"paymentIntentId",type:"string",required:!0,description:"Stripe payment intent ID"},{name:"orderId",type:"number",required:!0,description:"Order ID"}]},responses:[{status:200,description:"Payment processed",example:{success:!0,data:{status:"succeeded",orderId:1,transactionId:"txn_xxx"}}},{status:400,description:"Payment failed",example:{success:!1,error:{code:"PAYMENT_FAILED",message:"Payment was declined"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]}]},{id:"promotions",name:"Promotions",description:"Discounts, promo codes, and sales",icon:"tag",endpoints:[{id:"promotions-active",method:"GET",path:"/api/promotions/active",summary:"Get active promotions",description:"Returns currently active promotions visible to customers",category:"promotions",requiresAuth:!1,responses:[{status:200,description:"List of active promotions",example:{success:!0,data:{promotions:[{id:1,name:"Summer Sale",code:"SUMMER20",type:"percentage",value:20,description:"Get 20% off your order",minPurchase:50}]}}}]},{id:"promotions-validate-code",method:"POST",path:"/api/promotions/validate-code",summary:"Validate promo code",description:"Validates a promotional code and returns discount info",category:"promotions",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"code",type:"string",required:!0,description:"Promo code to validate"},{name:"cartTotal",type:"number",required:!1,description:"Cart total for validation"}],example:{code:"SUMMER20",cartTotal:100}},responses:[{status:200,description:"Valid code",example:{success:!0,data:{valid:!0,discount:20,type:"percentage",message:"Code applied successfully"}}},{status:400,description:"Invalid or expired code",example:{success:!1,error:{code:"INVALID_CODE",message:"Promo code is invalid or has expired"}}}]},{id:"promotions-applicable",method:"GET",path:"/api/promotions/applicable",summary:"Get applicable promotions",description:"Returns promotions applicable to current cart based on items and total",category:"promotions",requiresAuth:!1,parameters:[{name:"cartTotal",type:"number",required:!1,location:"query",description:"Cart total amount"},{name:"productIds",type:"string",required:!1,location:"query",description:"Comma-separated product IDs"}],responses:[{status:200,description:"List of applicable promotions",example:{success:!0,data:{promotions:[{id:1,name:"Summer Sale",code:"SUMMER20",type:"percentage",value:20,eligible:!0},{id:2,name:"Free Shipping",code:"FREESHIP",type:"free_shipping",value:0,eligible:!0,reason:"Order over $50"}]}}}]}]},{id:"loyalty",name:"Loyalty",description:"Loyalty points and rewards program",icon:"award",endpoints:[{id:"loyalty-balance",method:"GET",path:"/api/loyalty/balance",summary:"Get loyalty balance",description:"Returns current loyalty points balance and tier",category:"loyalty",requiresAuth:!0,responses:[{status:200,description:"Loyalty balance",example:{success:!0,data:{points:500,tier:"Gold",nextTier:"Platinum",pointsToNextTier:500}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"loyalty-history",method:"GET",path:"/api/loyalty/history",summary:"Get points history",description:"Returns history of loyalty points transactions",category:"loyalty",requiresAuth:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"Points history",example:{success:!0,data:{transactions:[{id:1,type:"EARNED",points:50,description:"Purchase reward",createdAt:"2024-01-15T10:00:00Z"},{id:2,type:"REDEEMED",points:-25,description:"Discount applied",createdAt:"2024-01-10T10:00:00Z"}],pagination:{page:1,limit:10,total:25,totalPages:3}}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"loyalty-redeem",method:"POST",path:"/api/loyalty/redeem",summary:"Redeem points",description:"Redeems loyalty points for discount",category:"loyalty",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"points",type:"number",required:!0,description:"Points to redeem"}]},responses:[{status:200,description:"Points redeemed",example:{success:!0,data:{discount:5,pointsRedeemed:100,remainingPoints:400}}},{status:400,description:"Insufficient points",example:{success:!1,error:{code:"INSUFFICIENT_POINTS",message:"Not enough points to redeem"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]}]},{id:"referrals",name:"Referrals",description:"Referral program and tracking",icon:"users",endpoints:[{id:"referrals-code",method:"GET",path:"/api/referrals/code",summary:"Get referral code",description:"Returns user referral code",category:"referrals",requiresAuth:!0,responses:[{status:200,description:"Referral code",example:{success:!0,data:{code:"ABC123",shareUrl:"https://example.com/ref/ABC123"}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"referrals-stats",method:"GET",path:"/api/referrals/stats",summary:"Get referral stats",description:"Returns referral statistics for current user",category:"referrals",requiresAuth:!0,responses:[{status:200,description:"Referral stats",example:{success:!0,data:{totalReferrals:5,pendingReferrals:2,completedReferrals:3,earnings:25,pendingEarnings:10}}},{status:401,description:"Not authenticated",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}}]},{id:"referrals-validate",method:"POST",path:"/api/referrals/validate",summary:"Validate referral code",description:"Validates a referral code",category:"referrals",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"code",type:"string",required:!0,description:"Referral code to validate"}]},responses:[{status:200,description:"Valid code",example:{success:!0,data:{valid:!0,discount:10,discountType:"percentage"}}},{status:400,description:"Invalid code",example:{success:!1,error:{code:"INVALID_CODE",message:"Referral code not found or expired"}}}]}]},{id:"support",name:"Support",description:"Customer support tickets, chatbot, and help articles",icon:"headphones",endpoints:[{id:"support-articles-list",method:"GET",path:"/api/support/articles",summary:"List help articles",description:"Returns paginated list of published support articles",category:"support",requiresAuth:!1,parameters:[{name:"category",type:"string",required:!1,location:"query",description:"Filter by category"},{name:"search",type:"string",required:!1,location:"query",description:"Search articles"},{name:"page",type:"number",required:!1,location:"query",description:"Page number",example:1},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page",example:20}],responses:[{status:200,description:"List of articles",example:{success:!0,data:[{id:1,title:"Getting Started",slug:"getting-started",category:"general"}],pagination:{page:1,limit:20,total:50}}}]},{id:"support-articles-categories",method:"GET",path:"/api/support/articles/categories",summary:"List article categories",description:"Returns all available article categories",category:"support",requiresAuth:!1,responses:[{status:200,description:"List of categories",example:{success:!0,data:["general","orders","payments","shipping"]}}]},{id:"support-articles-get",method:"GET",path:"/api/support/articles/{slug}",summary:"Get article by slug",description:"Returns a single support article by its URL slug",category:"support",requiresAuth:!1,parameters:[{name:"slug",type:"string",required:!0,location:"path",description:"Article URL slug"}],responses:[{status:200,description:"Article details"},{status:404,description:"Article not found"}]},{id:"support-articles-helpful",method:"POST",path:"/api/support/articles/{slug}/helpful",summary:"Vote article helpfulness",description:"Records whether an article was helpful or not",category:"support",requiresAuth:!1,parameters:[{name:"slug",type:"string",required:!0,location:"path",description:"Article URL slug"}],requestBody:{contentType:"application/json",fields:[{name:"helpful",type:"boolean",required:!0,description:"Whether the article was helpful"}],example:{helpful:!0}},responses:[{status:200,description:"Vote recorded",example:{success:!0,message:"Thank you for your feedback!"}},{status:404,description:"Article not found"}]},{id:"support-chatbot",method:"POST",path:"/api/support/chatbot",summary:"Chat with support bot",description:"Send a message to the support chatbot and get a response with suggested articles",category:"support",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"message",type:"string",required:!1,description:"User message to chatbot"},{name:"welcome",type:"boolean",required:!1,description:"Request welcome message"}],example:{message:"How do I track my order?"}},responses:[{status:200,description:"Chatbot response",example:{success:!0,data:{message:"You can track your order...",suggestedArticles:[],shouldEscalate:!1}}}]},{id:"support-tickets-list",method:"GET",path:"/api/support/tickets",summary:"List user tickets",description:"Returns paginated list of support tickets for the authenticated user",category:"support",requiresAuth:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"sortBy",type:"string",required:!1,location:"query",description:"Sort field",enum:["createdAt","updatedAt","status"]},{name:"sortOrder",type:"string",required:!1,location:"query",description:"Sort order",enum:["asc","desc"]}],responses:[{status:200,description:"List of tickets"},{status:401,description:"Authentication required"}]},{id:"support-tickets-create",method:"POST",path:"/api/support/tickets",summary:"Create support ticket",description:"Creates a new support ticket. Can be created by guests or authenticated users.",category:"support",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"customerEmail",type:"string",required:!0,description:"Customer email address"},{name:"customerName",type:"string",required:!0,description:"Customer name"},{name:"subject",type:"string",required:!0,description:"Ticket subject"},{name:"description",type:"string",required:!0,description:"Ticket description"},{name:"category",type:"string",required:!0,description:"Ticket category"},{name:"priority",type:"string",required:!1,description:"Priority level",enum:["LOW","MEDIUM","HIGH","URGENT"]},{name:"orderId",type:"number",required:!1,description:"Related order ID"},{name:"productId",type:"number",required:!1,description:"Related product ID"}],example:{customerEmail:"customer@example.com",customerName:"John Doe",subject:"Order not received",description:"I placed an order 5 days ago but have not received it.",category:"orders",priority:"MEDIUM"}},responses:[{status:201,description:"Ticket created",example:{success:!0,data:{ticketNumber:"TKT-001"}}},{status:400,description:"Validation error"}]},{id:"support-tickets-get",method:"GET",path:"/api/support/tickets/{id}",summary:"Get ticket details",description:"Returns full details of a support ticket including messages",category:"support",requiresAuth:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],responses:[{status:200,description:"Ticket details with messages"},{status:401,description:"Authentication required"},{status:403,description:"Access denied"},{status:404,description:"Ticket not found"}]},{id:"support-tickets-messages-list",method:"GET",path:"/api/support/tickets/{id}/messages",summary:"Get ticket messages",description:"Returns all messages for a support ticket",category:"support",requiresAuth:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],responses:[{status:200,description:"List of messages"},{status:401,description:"Authentication required"},{status:403,description:"Access denied"},{status:404,description:"Ticket not found"}]},{id:"support-tickets-messages-create",method:"POST",path:"/api/support/tickets/{id}/messages",summary:"Add message to ticket",description:"Adds a new message to an existing support ticket",category:"support",requiresAuth:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"content",type:"string",required:!0,description:"Message content"}],example:{content:"Thank you for your response. Here is additional information..."}},responses:[{status:201,description:"Message added"},{status:400,description:"Cannot add message to closed ticket"},{status:401,description:"Authentication required"},{status:403,description:"Access denied"},{status:404,description:"Ticket not found"}]},{id:"support-tickets-close",method:"POST",path:"/api/support/tickets/{id}/close",summary:"Close ticket",description:"Closes a support ticket. Can only be done by the ticket owner.",category:"support",requiresAuth:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],responses:[{status:200,description:"Ticket closed"},{status:400,description:"Ticket cannot be closed"},{status:401,description:"Authentication required"},{status:403,description:"Access denied"},{status:404,description:"Ticket not found"}]},{id:"support-tickets-survey",method:"POST",path:"/api/support/tickets/{id}/survey",summary:"Submit satisfaction survey",description:"Submits a satisfaction survey for a resolved or closed ticket",category:"support",requiresAuth:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"rating",type:"number",required:!0,description:"Rating (1-5)"},{name:"feedback",type:"string",required:!1,description:"Optional feedback"},{name:"wasHelpful",type:"boolean",required:!1,description:"Was the support helpful"},{name:"wouldRecommend",type:"boolean",required:!1,description:"Would recommend to others"}],example:{rating:5,feedback:"Great support!",wasHelpful:!0,wouldRecommend:!0}},responses:[{status:201,description:"Survey submitted"},{status:400,description:"Survey already submitted or ticket not resolved"},{status:401,description:"Authentication required"},{status:403,description:"Access denied"},{status:404,description:"Ticket not found"}]},{id:"chat-start",method:"POST",path:"/api/chat/start",summary:"Start live chat",description:"Start a new live chat conversation or continue an existing one",category:"support",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"message",type:"string",required:!0,description:"Initial message"},{name:"visitorId",type:"string",required:!1,description:"Visitor ID for anonymous users"},{name:"relatedOrderId",type:"number",required:!1,description:"Related order ID"},{name:"metadata",type:"object",required:!1,description:"Additional metadata (page, userAgent)"}],example:{message:"I need help with my order",metadata:{currentPage:"/orders/123"}}},responses:[{status:200,description:"Conversation started",example:{success:!0,data:{conversationId:"conv_123",messages:[],isNewConversation:!0}}},{status:400,description:"Validation error"}]},{id:"chat-message",method:"POST",path:"/api/chat/message",summary:"Send chat message",description:"Send a message in an existing live chat conversation",category:"support",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"conversationId",type:"string",required:!0,description:"Conversation ID"},{name:"content",type:"string",required:!0,description:"Message content"},{name:"contentType",type:"string",required:!1,description:"Content type",enum:["TEXT","IMAGE","FILE","QUICK_REPLIES"]},{name:"attachments",type:"array",required:!1,description:"File attachments"}],example:{conversationId:"conv_123",content:"Here is my order number: ORD-456"}},responses:[{status:200,description:"Message sent",example:{success:!0,data:{messages:[]}}},{status:400,description:"Conversation closed or validation error"},{status:403,description:"Access denied"},{status:404,description:"Conversation not found"}]},{id:"chat-conversation-get",method:"GET",path:"/api/chat/{conversationId}",summary:"Get chat conversation",description:"Get a live chat conversation with all messages",category:"support",requiresAuth:!1,parameters:[{name:"conversationId",type:"string",required:!0,location:"path",description:"Conversation ID"}],responses:[{status:200,description:"Conversation with messages"},{status:403,description:"Access denied"},{status:404,description:"Conversation not found"}]},{id:"chat-conversation-feedback",method:"PATCH",path:"/api/chat/{conversationId}",summary:"Submit chat feedback",description:"Submit feedback and rating for a chat conversation",category:"support",requiresAuth:!1,parameters:[{name:"conversationId",type:"string",required:!0,location:"path",description:"Conversation ID"}],requestBody:{contentType:"application/json",fields:[{name:"rating",type:"number",required:!1,description:"Rating (1-5)"},{name:"feedback",type:"string",required:!1,description:"Feedback text"}],example:{rating:5,feedback:"Very helpful!"}},responses:[{status:200,description:"Feedback submitted"},{status:403,description:"Access denied"},{status:404,description:"Conversation not found"}]}]},{id:"comparison",name:"Product Comparison",description:"Product comparison functionality",icon:"columns",endpoints:[{id:"comparison-get",method:"GET",path:"/api/comparison",summary:"Get comparison list",description:"Returns products in comparison list",category:"comparison",requiresAuth:!1,parameters:[{name:"ids",type:"string",required:!0,location:"query",description:"Comma-separated product IDs"}],responses:[{status:200,description:"Comparison data"}]}]},{id:"hero",name:"Hero Carousel",description:"Homepage hero section management",icon:"image",endpoints:[{id:"hero-get",method:"GET",path:"/api/hero",summary:"Get hero section data",description:"Returns active hero carousel items and feature cards for the homepage",category:"hero",requiresAuth:!1,responses:[{status:200,description:"Hero section data",example:{success:!0,data:{carousel:[{id:1,headline:"Summer Sale",product:{}}],featureCards:[{id:1,title:"Featured Product",position:"top",product:{}}]}}}]}]},{id:"testimonials",name:"Testimonials",description:"Customer testimonials and reviews",icon:"message-circle",endpoints:[{id:"testimonials-list",method:"GET",path:"/api/testimonials",summary:"Get testimonials",description:"Returns published customer testimonials",category:"testimonials",requiresAuth:!1,parameters:[{name:"limit",type:"number",required:!1,location:"query",description:"Number of testimonials to return"}],responses:[{status:200,description:"List of testimonials",example:{success:!0,data:[{id:1,content:"Great service and quality products!",authorName:"John Doe",authorTitle:"Verified Customer",rating:5}]}}]}]},{id:"system",name:"System",description:"Health checks, webhooks, and cron jobs",icon:"server",endpoints:[{id:"health-check",method:"GET",path:"/api/health",summary:"Health check",description:"Returns system health status including database connectivity and memory usage",category:"system",requiresAuth:!1,responses:[{status:200,description:"System healthy",example:{status:"healthy",timestamp:"2024-01-01T00:00:00Z",services:{database:"healthy",memory:"healthy"},metrics:{dbLatency:15,heapUsedMB:256}}},{status:503,description:"System unhealthy",example:{status:"unhealthy",services:{database:"unhealthy",memory:"healthy"}}}]},{id:"webhooks-stripe",method:"POST",path:"/api/webhooks/stripe",summary:"Stripe webhook handler",description:"Processes payment events from Stripe (payment_intent.succeeded, payment_intent.payment_failed, payment_intent.canceled, charge.refunded, charge.dispute.created)",category:"system",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"type",type:"string",required:!0,description:"Stripe event type"},{name:"data",type:"object",required:!0,description:"Event data object"},{name:"id",type:"string",required:!0,description:"Stripe event ID"}]},parameters:[{name:"stripe-signature",type:"string",required:!0,location:"header",description:"Stripe webhook signature for verification"}],responses:[{status:200,description:"Webhook processed successfully",example:{received:!0}},{status:400,description:"Missing or invalid signature"},{status:500,description:"Webhook not configured or processing failed"}]},{id:"cron-cleanup-logs",method:"POST",path:"/api/cron/cleanup-logs",summary:"Cleanup old logs",description:"Cron job to delete old error logs (30 days) and performance metrics (7 days). Requires CRON_SECRET for authorization.",category:"system",requiresAuth:!1,parameters:[{name:"authorization",type:"string",required:!0,location:"header",description:"Bearer token with CRON_SECRET"}],responses:[{status:200,description:"Cleanup completed",example:{success:!0,deleted:{errorLogs:150,performanceMetrics:500}}},{status:401,description:"Invalid or missing CRON_SECRET"}]},{id:"analytics-track",method:"POST",path:"/api/analytics/track",summary:"Track analytics event",description:"Tracks user events for analytics (runs on Edge runtime)",category:"system",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"category",type:"string",required:!0,description:'Event category (e.g., "product", "cart", "checkout")'},{name:"action",type:"string",required:!0,description:'Event action (e.g., "view", "add", "purchase")'},{name:"label",type:"string",required:!1,description:"Optional event label"},{name:"value",type:"number",required:!1,description:"Optional numeric value"},{name:"timestamp",type:"string",required:!1,description:"Event timestamp (ISO format)"},{name:"userAgent",type:"string",required:!1,description:"Browser user agent"},{name:"url",type:"string",required:!1,description:"Page URL where event occurred"}],example:{category:"product",action:"view",label:"SKU-12345",value:1,timestamp:"2025-01-15T12:00:00Z",url:"/products/12345"}},responses:[{status:200,description:"Event tracked",example:{success:!0,data:{tracked:!0}}},{status:400,description:"Missing required fields",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Missing required fields (category, action)"}}},{status:500,description:"Failed to track event",example:{success:!1,error:{code:"INTERNAL_ERROR",message:"Failed to track event"}}}]},{id:"analytics-ab-test",method:"POST",path:"/api/analytics/ab-test",summary:"Track A/B test event",description:"Records an A/B test participation or conversion event",category:"analytics",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"testId",type:"string",required:!0,description:"A/B test identifier"},{name:"variant",type:"string",required:!0,description:"Variant shown to user"},{name:"event",type:"string",required:!0,description:"Event type",enum:["view","conversion"]},{name:"sessionId",type:"string",required:!1,description:"Session identifier"}]},responses:[{status:200,description:"Event recorded"},{status:400,description:"Invalid event data"}]},{id:"analytics-pageview",method:"POST",path:"/api/analytics/pageview",summary:"Track pageview",description:"Records a pageview event for analytics",category:"analytics",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"path",type:"string",required:!0,description:"Page path"},{name:"referrer",type:"string",required:!1,description:"Referrer URL"},{name:"sessionId",type:"string",required:!1,description:"Session identifier"}]},responses:[{status:200,description:"Pageview recorded"}]},{id:"analytics-session",method:"POST",path:"/api/analytics/session",summary:"Track session",description:"Creates or updates a user session for analytics",category:"analytics",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"sessionId",type:"string",required:!0,description:"Session identifier"},{name:"event",type:"string",required:!0,description:"Session event",enum:["start","end","heartbeat"]}]},responses:[{status:200,description:"Session updated"}]},{id:"contact-submit",method:"POST",path:"/api/contact",summary:"Submit contact form",description:"Submits a contact form message",category:"public",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Contact name"},{name:"email",type:"string",required:!0,description:"Contact email"},{name:"subject",type:"string",required:!0,description:"Message subject"},{name:"message",type:"string",required:!0,description:"Message content"}]},responses:[{status:200,description:"Message sent successfully"},{status:400,description:"Validation failed"},{status:429,description:"Rate limit exceeded"}]},{id:"cron-analytics-aggregate",method:"POST",path:"/api/cron/analytics-aggregate",summary:"Aggregate analytics data",description:"Aggregates raw analytics data into summary tables (called by cron)",category:"cron",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Aggregation completed"},{status:401,description:"Invalid cron secret"}]},{id:"cron-cart-abandonment",method:"POST",path:"/api/cron/cart-abandonment",summary:"Process abandoned carts",description:"Sends abandoned cart reminder emails (called by cron)",category:"cron",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Processed abandoned carts"},{status:401,description:"Invalid cron secret"}]},{id:"cron-slo-snapshot",method:"POST",path:"/api/cron/slo-snapshot",summary:"Create SLO snapshot",description:"Creates a snapshot of current SLO metrics (called by cron)",category:"cron",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"SLO snapshot created"},{status:401,description:"Invalid cron secret"}]},{id:"docs-openapi",method:"GET",path:"/api/docs",summary:"Get API documentation",description:"Returns OpenAPI/Swagger documentation for the API",category:"public",requiresAuth:!1,responses:[{status:200,description:"OpenAPI specification"}]},{id:"email-unsubscribe",method:"GET",path:"/api/email/unsubscribe",summary:"Unsubscribe from emails",description:"Processes email unsubscribe requests via token",category:"public",requiresAuth:!1,parameters:[{name:"token",type:"string",required:!0,location:"query",description:"Unsubscribe token"}],responses:[{status:200,description:"Successfully unsubscribed"},{status:400,description:"Invalid or expired token"}]},{id:"email-webhook",method:"POST",path:"/api/email/webhook",summary:"Email provider webhook",description:"Receives webhooks from email provider (bounces, complaints, etc.)",category:"system",requiresAuth:!1,responses:[{status:200,description:"Webhook processed"},{status:400,description:"Invalid webhook signature"}]},{id:"health-db",method:"GET",path:"/api/health/db",summary:"Database health check",description:"Checks database connectivity and returns status",category:"system",requiresAuth:!1,responses:[{status:200,description:"Database healthy",example:{status:"healthy",latency:5}},{status:503,description:"Database unavailable"}]},{id:"images-upload",method:"POST",path:"/api/images/upload",summary:"Upload image",description:"Uploads an image to cloud storage",category:"system",requiresAuth:!0,requestBody:{contentType:"multipart/form-data",fields:[{name:"file",type:"string",required:!0,description:"Image file (multipart/form-data binary)"},{name:"folder",type:"string",required:!1,description:"Storage folder"}]},responses:[{status:200,description:"Image uploaded"},{status:400,description:"Invalid file type or size"},{status:401,description:"Authentication required"}]}]},{id:"notifications",name:"Notifications",description:"User notification management",icon:"bell",endpoints:[{id:"notifications-list",method:"GET",path:"/api/notifications",summary:"List notifications",description:"Returns user notifications with pagination",category:"notifications",requiresAuth:!0,parameters:[{name:"unreadOnly",type:"boolean",required:!1,location:"query",description:"Filter unread only"},{name:"type",type:"string",required:!1,location:"query",description:"Filter by type",enum:["order","promotion","system","support"]},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"List of notifications",example:{success:!0,data:{notifications:[],unreadCount:5,total:25}}},{status:401,description:"Authentication required"}]},{id:"notifications-mark-read",method:"PATCH",path:"/api/notifications/{id}/read",summary:"Mark notification as read",description:"Marks a specific notification as read",category:"notifications",requiresAuth:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Notification ID"}],responses:[{status:200,description:"Notification marked as read"},{status:404,description:"Notification not found"}]},{id:"notifications-mark-all-read",method:"PATCH",path:"/api/notifications/read-all",summary:"Mark all as read",description:"Marks all notifications as read",category:"notifications",requiresAuth:!0,responses:[{status:200,description:"All notifications marked as read",example:{success:!0,data:{updated:15}}}]}]},{id:"push",name:"Push Notifications",description:"Web push notification subscription management",icon:"send",endpoints:[{id:"push-subscribe",method:"POST",path:"/api/push/subscribe",summary:"Subscribe to push notifications",description:"Registers a device for web push notifications",category:"push",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"subscription",type:"object",required:!0,description:"PushSubscription object from browser"},{name:"preferences",type:"object",required:!1,description:"Notification preferences"}]},responses:[{status:201,description:"Subscription created"},{status:400,description:"Invalid subscription data"}]},{id:"push-unsubscribe",method:"POST",path:"/api/push/unsubscribe",summary:"Unsubscribe from push notifications",description:"Removes a device from push notification subscriptions",category:"push",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"endpoint",type:"string",required:!0,description:"Push subscription endpoint"}]},responses:[{status:200,description:"Subscription removed"},{status:404,description:"Subscription not found"}]}]},{id:"observability",name:"Observability",description:"Client-side error tracking, RUM, and tracing collection",icon:"eye",endpoints:[{id:"observability-errors",method:"POST",path:"/api/monitoring/errors",summary:"Report client error",description:"Reports a client-side error for tracking",category:"observability",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"message",type:"string",required:!0,description:"Error message"},{name:"stack",type:"string",required:!1,description:"Stack trace"},{name:"url",type:"string",required:!0,description:"Page URL where error occurred"},{name:"userAgent",type:"string",required:!1,description:"Browser user agent"},{name:"metadata",type:"object",required:!1,description:"Additional context"}]},responses:[{status:200,description:"Error recorded"}]},{id:"observability-rum",method:"POST",path:"/api/rum/collect",summary:"Collect RUM data",description:"Collects Real User Monitoring performance data",category:"observability",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"metrics",type:"object",required:!0,description:"Performance metrics (LCP, CLS, FID, etc.)"},{name:"url",type:"string",required:!0,description:"Page URL"},{name:"connectionType",type:"string",required:!1,description:"Network connection type"},{name:"deviceType",type:"string",required:!1,description:"Device type"}]},responses:[{status:200,description:"Metrics recorded"}]},{id:"observability-traces",method:"POST",path:"/api/traces/collect",summary:"Collect traces",description:"Collects distributed trace data",category:"observability",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"traceId",type:"string",required:!0,description:"Trace ID"},{name:"spans",type:"array",required:!0,description:"Array of trace spans"}]},responses:[{status:200,description:"Trace recorded"}]},{id:"observability-client-logs",method:"POST",path:"/api/monitoring/client-logs",summary:"Ship client logs",description:"Receives batched client-side logs for server-side aggregation and storage. Logs are automatically buffered and sent by the client logger.",category:"observability",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"entries",type:"array",required:!0,description:"Array of log entries to record"},{name:"entries[].level",type:"string",required:!0,description:"Log level: debug, info, warn, or error"},{name:"entries[].message",type:"string",required:!0,description:"Log message"},{name:"entries[].timestamp",type:"string",required:!0,description:"ISO 8601 timestamp"},{name:"entries[].url",type:"string",required:!0,description:"Page URL where log was generated"},{name:"entries[].userAgent",type:"string",required:!0,description:"Browser user agent"},{name:"entries[].sessionId",type:"string",required:!1,description:"Client session identifier"},{name:"entries[].data",type:"object",required:!1,description:"Additional structured data"},{name:"entries[].error",type:"object",required:!1,description:"Error details (name, message, stack)"}]},responses:[{status:200,description:"Logs processed successfully",fields:[{name:"success",type:"boolean",description:"Whether processing succeeded",required:!0},{name:"processed",type:"number",description:"Number of entries processed",required:!0},{name:"errors",type:"number",description:"Number of processing errors",required:!0}]},{status:400,description:"Invalid request body"},{status:500,description:"Server error"}]}]},{id:"admin-operations",name:"Admin: Operations",description:"Dashboard and system management",icon:"settings",endpoints:[{id:"admin-dashboard",method:"GET",path:"/api/admin/dashboard",summary:"Get dashboard stats",description:"Returns admin dashboard statistics",category:"admin-operations",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Dashboard statistics"},{status:403,description:"Admin access required"}]},{id:"admin-export-data",method:"POST",path:"/api/admin/export",summary:"Export data",description:"Exports data in various formats (CSV, JSON, Excel)",category:"admin-operations",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"type",type:"string",required:!0,description:"Data type to export",enum:["orders","products","customers","reviews"]},{name:"format",type:"string",required:!0,description:"Export format",enum:["csv","json","xlsx"]},{name:"filters",type:"object",required:!1,description:"Optional filters"}],example:{type:"orders",format:"csv",filters:{status:"completed"}}},responses:[{status:200,description:"Export file or download URL"},{status:400,description:"Invalid export configuration"},{status:403,description:"Admin access required"}]},{id:"admin-categories-list",method:"GET",path:"/api/admin/categories",summary:"List all categories",description:"Returns all product categories for admin management",category:"admin-operations",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of categories",example:{success:!0,data:{categories:[]}}},{status:403,description:"Admin access required"}]},{id:"admin-categories-create",method:"POST",path:"/api/admin/categories",summary:"Create category",description:"Creates a new product category",category:"admin-operations",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Category name"},{name:"slug",type:"string",required:!0,description:"URL slug"},{name:"description",type:"string",required:!1,description:"Category description"},{name:"parentId",type:"number",required:!1,description:"Parent category ID"}]},responses:[{status:201,description:"Category created"},{status:400,description:"Validation error"}]},{id:"admin-categories-get",method:"GET",path:"/api/admin/categories/{id}",summary:"Get category details",description:"Returns a single category by ID",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Category ID"}],responses:[{status:200,description:"Category details"},{status:404,description:"Category not found"}]},{id:"admin-categories-update",method:"PUT",path:"/api/admin/categories/{id}",summary:"Update category",description:"Updates an existing category",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Category ID"}],responses:[{status:200,description:"Category updated"},{status:404,description:"Category not found"}]},{id:"admin-categories-delete",method:"DELETE",path:"/api/admin/categories/{id}",summary:"Delete category",description:"Deletes a category",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Category ID"}],responses:[{status:200,description:"Category deleted"},{status:404,description:"Category not found"}]},{id:"admin-products-list",method:"GET",path:"/api/admin/products",summary:"List all products",description:"Returns all products for admin management with pagination",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"search",type:"string",required:!1,location:"query",description:"Search query"}],responses:[{status:200,description:"List of products"}]},{id:"admin-products-create",method:"POST",path:"/api/admin/products",summary:"Create product",description:"Creates a new product",category:"admin-operations",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Product name"},{name:"price",type:"number",required:!0,description:"Product price"},{name:"categoryId",type:"number",required:!0,description:"Category ID"}]},responses:[{status:201,description:"Product created"},{status:400,description:"Validation error"}]},{id:"admin-products-get",method:"GET",path:"/api/admin/products/{productId}",summary:"Get product details",description:"Returns a single product by ID with all details",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"productId",type:"number",required:!0,location:"path",description:"Product ID"}],responses:[{status:200,description:"Product details"},{status:404,description:"Product not found"}]},{id:"admin-products-update",method:"PUT",path:"/api/admin/products/{productId}",summary:"Update product",description:"Updates an existing product",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"productId",type:"number",required:!0,location:"path",description:"Product ID"}],responses:[{status:200,description:"Product updated"},{status:404,description:"Product not found"}]},{id:"admin-products-delete",method:"DELETE",path:"/api/admin/products/{productId}",summary:"Delete product",description:"Deletes a product",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"productId",type:"number",required:!0,location:"path",description:"Product ID"}],responses:[{status:200,description:"Product deleted"},{status:404,description:"Product not found"}]},{id:"admin-products-images",method:"POST",path:"/api/admin/products/images",summary:"Upload product images",description:"Uploads images for products",category:"admin-operations",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"multipart/form-data",fields:[{name:"productId",type:"number",required:!0,description:"Product ID"},{name:"images",type:"array",required:!0,description:"Image files (multipart/form-data)"}]},responses:[{status:200,description:"Images uploaded"},{status:400,description:"Invalid image format"}]},{id:"admin-orders-list",method:"GET",path:"/api/admin/orders",summary:"List all orders",description:"Returns all orders for admin management with filtering",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"List of orders"}]},{id:"admin-orders-get",method:"GET",path:"/api/admin/orders/{orderId}",summary:"Get order details",description:"Returns a single order by ID with all details",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"orderId",type:"number",required:!0,location:"path",description:"Order ID"}],responses:[{status:200,description:"Order details"},{status:404,description:"Order not found"}]},{id:"admin-orders-update",method:"PUT",path:"/api/admin/orders/{orderId}",summary:"Update order",description:"Updates order status or details",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"orderId",type:"number",required:!0,location:"path",description:"Order ID"}],requestBody:{contentType:"application/json",fields:[{name:"status",type:"string",required:!1,description:"New order status"},{name:"trackingNumber",type:"string",required:!1,description:"Shipping tracking number"}]},responses:[{status:200,description:"Order updated"},{status:404,description:"Order not found"}]},{id:"admin-users-list",method:"GET",path:"/api/admin/users",summary:"List all users",description:"Returns all users for admin management",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"role",type:"string",required:!1,location:"query",description:"Filter by role"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"search",type:"string",required:!1,location:"query",description:"Search by name/email"}],responses:[{status:200,description:"List of users"}]},{id:"admin-reviews-list",method:"GET",path:"/api/admin/reviews",summary:"List all reviews",description:"Returns all product reviews for moderation",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","approved","rejected"]},{name:"page",type:"number",required:!1,location:"query",description:"Page number"}],responses:[{status:200,description:"List of reviews"}]},{id:"admin-reviews-update",method:"PUT",path:"/api/admin/reviews/{id}",summary:"Moderate review",description:"Approves or rejects a review",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Review ID"}],requestBody:{contentType:"application/json",fields:[{name:"status",type:"string",required:!0,description:"New status",enum:["approved","rejected"]},{name:"reason",type:"string",required:!1,description:"Rejection reason"}]},responses:[{status:200,description:"Review updated"},{status:404,description:"Review not found"}]},{id:"admin-reviews-delete",method:"DELETE",path:"/api/admin/reviews/{id}",summary:"Delete review",description:"Deletes a review",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Review ID"}],responses:[{status:200,description:"Review deleted"},{status:404,description:"Review not found"}]},{id:"admin-reports",method:"GET",path:"/api/admin/reports",summary:"Get admin reports",description:"Returns various admin reports and summaries",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"type",type:"string",required:!1,location:"query",description:"Report type",enum:["sales","inventory","customers"]},{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Report data"}]},{id:"admin-images-audit",method:"GET",path:"/api/admin/images/audit",summary:"Audit images",description:"Returns audit report of all images in the system",category:"admin-operations",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Image audit report"}]},{id:"admin-email-queue",method:"GET",path:"/api/admin/email/queue",summary:"Get email queue",description:"Returns pending and recent emails in the queue",category:"admin-operations",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","sent","failed"]}],responses:[{status:200,description:"Email queue data"}]},{id:"admin-metrics-database",method:"GET",path:"/api/admin/metrics/database",summary:"Get database metrics",description:"Returns database performance metrics and stats",category:"admin-operations",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Database metrics"}]}]},{id:"admin-content",name:"Admin: Content",description:"Hero and testimonials management",icon:"edit-3",endpoints:[{id:"admin-hero-carousel-list",method:"GET",path:"/api/admin/hero/carousel",summary:"List carousel items",description:"Returns all hero carousel items with product details",category:"admin-content",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of carousel items",example:{success:!0,data:{items:[{id:1,productId:1,headline:"Summer Sale",subheadline:"Up to 50% off",badgeText:"50%",ctaText:"Shop Now",order:0,isActive:!0,product:{title:"Product 1",image:"/img.jpg"}}]}}},{status:403,description:"Admin access required"}]},{id:"admin-hero-carousel-create",method:"POST",path:"/api/admin/hero/carousel",summary:"Create carousel item",description:"Creates a new hero carousel item",category:"admin-content",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!0,description:"Product ID to feature"},{name:"headline",type:"string",required:!1,description:"Custom headline (max 200 chars)"},{name:"subheadline",type:"string",required:!1,description:"Custom subheadline"},{name:"badgeText",type:"string",required:!1,description:'Badge text (e.g., "20%")'},{name:"badgeSubtext",type:"string",required:!1,description:'Badge subtext (e.g., "Sale Off")'},{name:"ctaText",type:"string",required:!1,description:"Call-to-action button text",example:"Shop Now"},{name:"order",type:"number",required:!1,description:"Display order (auto-assigned if omitted)"},{name:"isActive",type:"boolean",required:!1,description:"Whether item is active"},{name:"startDate",type:"string",required:!1,description:"Scheduled start date (ISO 8601)"},{name:"endDate",type:"string",required:!1,description:"Scheduled end date (ISO 8601)"}],example:{productId:1,headline:"Summer Sale",badgeText:"30%",ctaText:"Shop Now"}},responses:[{status:201,description:"Carousel item created"},{status:400,description:"Validation failed"},{status:404,description:"Product not found"}]},{id:"admin-hero-carousel-get",method:"GET",path:"/api/admin/hero/carousel/{id}",summary:"Get carousel item",description:"Returns a single carousel item by ID",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Carousel item ID"}],responses:[{status:200,description:"Carousel item details"},{status:404,description:"Item not found"}]},{id:"admin-hero-carousel-update",method:"PUT",path:"/api/admin/hero/carousel/{id}",summary:"Update carousel item",description:"Updates an existing carousel item",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Carousel item ID"}],requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!1,description:"Product ID"},{name:"headline",type:"string",required:!1,description:"Custom headline"},{name:"subheadline",type:"string",required:!1,description:"Custom subheadline"},{name:"badgeText",type:"string",required:!1,description:"Badge text"},{name:"ctaText",type:"string",required:!1,description:"CTA button text"},{name:"order",type:"number",required:!1,description:"Display order"},{name:"isActive",type:"boolean",required:!1,description:"Active status"}]},responses:[{status:200,description:"Carousel item updated"},{status:400,description:"Validation failed"},{status:404,description:"Item or product not found"}]},{id:"admin-hero-carousel-delete",method:"DELETE",path:"/api/admin/hero/carousel/{id}",summary:"Delete carousel item",description:"Deletes a carousel item",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Carousel item ID"}],responses:[{status:200,description:"Item deleted"},{status:404,description:"Item not found"}]},{id:"admin-hero-carousel-reorder",method:"POST",path:"/api/admin/hero/carousel/reorder",summary:"Reorder carousel items",description:"Bulk reorder carousel items",category:"admin-content",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"items",type:"array",required:!0,description:"Array of {id, order} objects"}],example:{items:[{id:1,order:0},{id:2,order:1},{id:3,order:2}]}},responses:[{status:200,description:"Items reordered"},{status:400,description:"Validation failed"}]},{id:"admin-hero-feature-cards-list",method:"GET",path:"/api/admin/hero/feature-cards",summary:"List feature cards",description:"Returns all hero feature cards (side cards)",category:"admin-content",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of feature cards"},{status:403,description:"Admin access required"}]},{id:"admin-hero-feature-cards-create",method:"POST",path:"/api/admin/hero/feature-cards",summary:"Create feature card",description:"Creates a new hero feature card. Only one active card per position (top/bottom).",category:"admin-content",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!0,description:"Product ID to feature"},{name:"title",type:"string",required:!1,description:"Custom title (max 200 chars)"},{name:"subtitle",type:"string",required:!1,description:"Custom subtitle (max 100 chars)"},{name:"position",type:"string",required:!0,description:"Card position",enum:["top","bottom"]},{name:"isActive",type:"boolean",required:!1,description:"Whether card is active"}],example:{productId:5,title:"Featured Deal",position:"top",isActive:!0}},responses:[{status:201,description:"Feature card created"},{status:400,description:"Position already taken or validation failed"},{status:404,description:"Product not found"}]},{id:"admin-hero-feature-cards-get",method:"GET",path:"/api/admin/hero/feature-cards/{id}",summary:"Get feature card",description:"Returns a single feature card by ID",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Feature card ID"}],responses:[{status:200,description:"Feature card details"},{status:404,description:"Card not found"}]},{id:"admin-hero-feature-cards-update",method:"PUT",path:"/api/admin/hero/feature-cards/{id}",summary:"Update feature card",description:"Updates an existing feature card",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Feature card ID"}],requestBody:{contentType:"application/json",fields:[{name:"productId",type:"number",required:!1,description:"Product ID"},{name:"title",type:"string",required:!1,description:"Custom title"},{name:"subtitle",type:"string",required:!1,description:"Custom subtitle"},{name:"position",type:"string",required:!1,description:"Card position",enum:["top","bottom"]},{name:"isActive",type:"boolean",required:!1,description:"Active status"}]},responses:[{status:200,description:"Feature card updated"},{status:400,description:"Position taken or validation failed"},{status:404,description:"Card or product not found"}]},{id:"admin-hero-feature-cards-delete",method:"DELETE",path:"/api/admin/hero/feature-cards/{id}",summary:"Delete feature card",description:"Deletes a feature card",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Feature card ID"}],responses:[{status:200,description:"Card deleted"},{status:404,description:"Card not found"}]},{id:"admin-testimonials-list",method:"GET",path:"/api/admin/testimonials",summary:"List testimonials",description:"Returns all testimonials for admin management",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","approved","rejected"]}],responses:[{status:200,description:"List of testimonials"},{status:403,description:"Admin access required"}]},{id:"admin-testimonials-create",method:"POST",path:"/api/admin/testimonials",summary:"Create testimonial",description:"Creates a new testimonial",category:"admin-content",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"content",type:"string",required:!0,description:"Testimonial content"},{name:"authorName",type:"string",required:!0,description:"Author name"},{name:"authorTitle",type:"string",required:!1,description:"Author title/role"},{name:"authorImage",type:"string",required:!1,description:"Author image URL"},{name:"rating",type:"number",required:!1,description:"Rating (1-5)"},{name:"isActive",type:"boolean",required:!1,description:"Whether testimonial is active"}]},responses:[{status:201,description:"Testimonial created"},{status:400,description:"Validation failed"}]},{id:"admin-testimonials-update",method:"PUT",path:"/api/admin/testimonials/{id}",summary:"Update testimonial",description:"Updates an existing testimonial",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Testimonial ID"}],responses:[{status:200,description:"Testimonial updated"},{status:404,description:"Testimonial not found"}]},{id:"admin-testimonials-delete",method:"DELETE",path:"/api/admin/testimonials/{id}",summary:"Delete testimonial",description:"Deletes a testimonial",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Testimonial ID"}],responses:[{status:200,description:"Testimonial deleted"},{status:404,description:"Testimonial not found"}]},{id:"admin-promo-banners-list",method:"GET",path:"/api/admin/hero/promo-banners",summary:"List promo banners",description:"Returns all promotional banners for admin management",category:"admin-content",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of promo banners",example:{success:!0,data:{banners:[{id:1,title:"Summer Sale",headline:"Up to 50% Off",size:"large",isActive:!0,order:0}]}}},{status:403,description:"Admin access required"}]},{id:"admin-promo-banners-create",method:"POST",path:"/api/admin/hero/promo-banners",summary:"Create promo banner",description:"Creates a new promotional banner",category:"admin-content",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"title",type:"string",required:!0,description:"Banner title (max 100 chars)"},{name:"headline",type:"string",required:!0,description:"Banner headline (max 100 chars)"},{name:"description",type:"string",required:!1,description:"Banner description (max 255 chars)"},{name:"ctaText",type:"string",required:!0,description:"CTA button text (max 50 chars)"},{name:"productId",type:"number",required:!1,description:"Linked product ID"},{name:"ctaLink",type:"string",required:!1,description:"Custom CTA link URL"},{name:"imageUrl",type:"string",required:!0,description:"Banner image URL"},{name:"backgroundColor",type:"string",required:!0,description:"Background color (hex)"},{name:"textColor",type:"string",required:!1,description:"Text color (hex)"},{name:"darkBgColor",type:"string",required:!1,description:"Dark mode background color"},{name:"darkTextColor",type:"string",required:!1,description:"Dark mode text color"},{name:"size",type:"string",required:!0,description:"Banner size",enum:["large","small"]},{name:"imagePosition",type:"string",required:!1,description:"Image position",enum:["left","right"]},{name:"isActive",type:"boolean",required:!1,description:"Whether banner is active"},{name:"startDate",type:"string",required:!1,description:"Scheduled start date"},{name:"endDate",type:"string",required:!1,description:"Scheduled end date"}]},responses:[{status:201,description:"Banner created"},{status:400,description:"Validation failed"}]},{id:"admin-promo-banners-get",method:"GET",path:"/api/admin/hero/promo-banners/{id}",summary:"Get promo banner",description:"Returns a single promo banner by ID",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Banner ID"}],responses:[{status:200,description:"Banner details"},{status:404,description:"Banner not found"}]},{id:"admin-promo-banners-update",method:"PUT",path:"/api/admin/hero/promo-banners/{id}",summary:"Update promo banner",description:"Updates an existing promo banner",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Banner ID"}],responses:[{status:200,description:"Banner updated"},{status:404,description:"Banner not found"}]},{id:"admin-promo-banners-delete",method:"DELETE",path:"/api/admin/hero/promo-banners/{id}",summary:"Delete promo banner",description:"Deletes a promo banner",category:"admin-content",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Banner ID"}],responses:[{status:200,description:"Banner deleted"},{status:404,description:"Banner not found"}]},{id:"admin-promo-banners-reorder",method:"POST",path:"/api/admin/hero/promo-banners/reorder",summary:"Reorder promo banners",description:"Bulk reorder promo banners",category:"admin-content",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"items",type:"array",required:!0,description:"Array of {id, order} objects"}]},responses:[{status:200,description:"Banners reordered"},{status:400,description:"Validation failed"}]}]},{id:"admin-customers",name:"Admin: Customers",description:"Loyalty, referrals, and customer management",icon:"users",endpoints:[{id:"admin-loyalty-analytics",method:"GET",path:"/api/admin/loyalty/analytics",summary:"Get loyalty analytics",description:"Returns detailed loyalty program analytics including points metrics, trends, and top earners",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date (ISO 8601)"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date (ISO 8601)"}],responses:[{status:200,description:"Loyalty analytics data",example:{success:!0,data:{totalMembers:1500,activeMembers:1200,pointsIssued:5e5,pointsRedeemed:15e4,tierDistribution:{Bronze:800,Silver:400,Gold:200,Platinum:100}}}},{status:403,description:"Admin access required"}]},{id:"admin-loyalty-members-list",method:"GET",path:"/api/admin/loyalty/members",summary:"List loyalty members",description:"Returns paginated list of loyalty program members",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"search",type:"string",required:!1,location:"query",description:"Search by email or name"},{name:"tierId",type:"number",required:!1,location:"query",description:"Filter by tier ID"}],responses:[{status:200,description:"List of loyalty members"},{status:403,description:"Admin access required"}]},{id:"admin-loyalty-members-get",method:"GET",path:"/api/admin/loyalty/members/{id}",summary:"Get loyalty member",description:"Returns single member details with recent transactions",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Member ID"}],responses:[{status:200,description:"Member details"},{status:404,description:"Member not found"}]},{id:"admin-loyalty-members-update",method:"PATCH",path:"/api/admin/loyalty/members/{id}",summary:"Update loyalty member",description:"Updates member tier or notes",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Member ID"}],requestBody:{contentType:"application/json",fields:[{name:"currentTierId",type:"number",required:!1,description:"Override tier ID"},{name:"notes",type:"string",required:!1,description:"Admin notes"}]},responses:[{status:200,description:"Member updated"},{status:400,description:"Invalid tier ID"},{status:404,description:"Member not found"}]},{id:"admin-loyalty-points-list",method:"GET",path:"/api/admin/loyalty/points",summary:"List point adjustments",description:"Returns list of admin-made point adjustments",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"List of adjustments"}]},{id:"admin-loyalty-points-adjust",method:"POST",path:"/api/admin/loyalty/points",summary:"Adjust member points",description:"Award or deduct points for a member",category:"admin-customers",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"userId",type:"number",required:!0,description:"User ID"},{name:"points",type:"number",required:!0,description:"Points amount"},{name:"reason",type:"string",required:!0,description:"Reason for adjustment"},{name:"type",type:"string",required:!0,description:"Adjustment type",enum:["award","deduct"]}],example:{userId:1,points:100,reason:"Customer appreciation",type:"award"}},responses:[{status:201,description:"Points adjusted"},{status:400,description:"Validation failed"}]},{id:"admin-loyalty-tiers-list",method:"GET",path:"/api/admin/loyalty/tiers",summary:"List loyalty tiers",description:"Returns all loyalty program tiers",category:"admin-customers",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of tiers"}]},{id:"admin-loyalty-tiers-create",method:"POST",path:"/api/admin/loyalty/tiers",summary:"Create loyalty tier",description:"Creates a new loyalty tier",category:"admin-customers",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Tier name"},{name:"minPoints",type:"number",required:!0,description:"Minimum points required"},{name:"multiplier",type:"number",required:!1,description:"Points multiplier"},{name:"benefits",type:"array",required:!1,description:"Array of benefit strings"}]},responses:[{status:201,description:"Tier created"},{status:400,description:"Validation failed"}]},{id:"admin-loyalty-tiers-get",method:"GET",path:"/api/admin/loyalty/tiers/{id}",summary:"Get loyalty tier",description:"Returns tier details with member count",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Tier ID"}],responses:[{status:200,description:"Tier details"},{status:404,description:"Tier not found"}]},{id:"admin-loyalty-tiers-update",method:"PATCH",path:"/api/admin/loyalty/tiers/{id}",summary:"Update loyalty tier",description:"Updates an existing tier",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Tier ID"}],responses:[{status:200,description:"Tier updated"},{status:404,description:"Tier not found"}]},{id:"admin-loyalty-tiers-delete",method:"DELETE",path:"/api/admin/loyalty/tiers/{id}",summary:"Delete loyalty tier",description:"Deletes a tier (only if no members assigned)",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Tier ID"}],responses:[{status:200,description:"Tier deleted"},{status:400,description:"Tier has active members"},{status:404,description:"Tier not found"}]},{id:"admin-loyalty-transactions",method:"GET",path:"/api/admin/loyalty/transactions",summary:"List loyalty transactions",description:"Returns paginated list of all loyalty transactions",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"userId",type:"number",required:!1,location:"query",description:"Filter by user ID"},{name:"type",type:"string",required:!1,location:"query",description:"Filter by type (earn, redeem, expire, adjust)"}],responses:[{status:200,description:"List of transactions"}]},{id:"admin-loyalty-reports",method:"GET",path:"/api/admin/loyalty/reports",summary:"Get loyalty reports",description:"Returns aggregated loyalty stats, tier distribution, and monthly trends",category:"admin-customers",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Loyalty reports data"}]},{id:"admin-referrals-analytics",method:"GET",path:"/api/admin/referrals/analytics",summary:"Get referral analytics",description:"Returns referral program analytics including conversion funnel, top referrers, and trends",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date (ISO 8601)"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date (ISO 8601)"}],responses:[{status:200,description:"Referral analytics data"}]},{id:"admin-referrals-campaigns-list",method:"GET",path:"/api/admin/referrals/campaigns",summary:"List referral campaigns",description:"Returns all referral campaigns/programs with referral counts",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"List of campaigns"}]},{id:"admin-referrals-campaigns-create",method:"POST",path:"/api/admin/referrals/campaigns",summary:"Create referral campaign",description:"Creates a new referral campaign with reward configuration",category:"admin-customers",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Campaign name"},{name:"referrerReward",type:"object",required:!0,description:"Reward for referrer"},{name:"refereeReward",type:"object",required:!0,description:"Reward for referee"},{name:"minPurchase",type:"number",required:!1,description:"Minimum purchase amount"},{name:"isActive",type:"boolean",required:!1,description:"Active status"}]},responses:[{status:201,description:"Campaign created"},{status:400,description:"Validation failed"}]},{id:"admin-referrals-campaigns-get",method:"GET",path:"/api/admin/referrals/campaigns/{id}",summary:"Get campaign details",description:"Returns campaign details with referral stats",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Campaign ID"}],responses:[{status:200,description:"Campaign details with stats"},{status:404,description:"Campaign not found"}]},{id:"admin-referrals-campaigns-update",method:"PATCH",path:"/api/admin/referrals/campaigns/{id}",summary:"Update campaign",description:"Updates referral campaign configuration",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Campaign ID"}],responses:[{status:200,description:"Campaign updated"},{status:404,description:"Campaign not found"}]},{id:"admin-referrals-campaigns-delete",method:"DELETE",path:"/api/admin/referrals/campaigns/{id}",summary:"Delete campaign",description:"Deletes a referral campaign",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Campaign ID"}],responses:[{status:200,description:"Campaign deleted"},{status:404,description:"Campaign not found"}]},{id:"admin-referrals-list",method:"GET",path:"/api/admin/referrals",summary:"List all referrals",description:"Returns paginated list of all referrals",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","completed","expired"]},{name:"campaignId",type:"number",required:!1,location:"query",description:"Filter by campaign ID"}],responses:[{status:200,description:"List of referrals"}]},{id:"admin-referrals-reports",method:"GET",path:"/api/admin/referrals/reports",summary:"Get referral reports",description:"Returns aggregated referral program statistics",category:"admin-customers",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Referral reports data"}]},{id:"admin-referrals-codes-list",method:"GET",path:"/api/admin/referrals/codes",summary:"List referral codes",description:"Returns paginated list of all referral codes",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["active","inactive","expired"]}],responses:[{status:200,description:"List of referral codes"}]},{id:"admin-referrals-codes-get",method:"GET",path:"/api/admin/referrals/codes/{code}",summary:"Get referral code details",description:"Returns details and usage stats for a specific referral code",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"code",type:"string",required:!0,location:"path",description:"Referral code"}],responses:[{status:200,description:"Code details with usage stats"},{status:404,description:"Code not found"}]},{id:"admin-referrals-codes-update",method:"PATCH",path:"/api/admin/referrals/codes/{code}",summary:"Update referral code",description:"Updates a referral code status or configuration",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"code",type:"string",required:!0,location:"path",description:"Referral code"}],requestBody:{contentType:"application/json",fields:[{name:"isActive",type:"boolean",required:!1,description:"Active status"}]},responses:[{status:200,description:"Code updated"},{status:404,description:"Code not found"}]},{id:"admin-referrals-config-get",method:"GET",path:"/api/admin/referrals/config",summary:"Get referral config",description:"Returns current referral program configuration",category:"admin-customers",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Referral configuration"}]},{id:"admin-referrals-config-update",method:"PUT",path:"/api/admin/referrals/config",summary:"Update referral config",description:"Updates referral program configuration",category:"admin-customers",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"enabled",type:"boolean",required:!1,description:"Enable/disable program"},{name:"codeLength",type:"number",required:!1,description:"Generated code length"},{name:"expiryDays",type:"number",required:!1,description:"Days until code expires"}]},responses:[{status:200,description:"Config updated"}]},{id:"admin-referrals-rewards-list",method:"GET",path:"/api/admin/referrals/rewards",summary:"List pending rewards",description:"Returns pending referral rewards awaiting approval",category:"admin-customers",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","approved","rejected"]}],responses:[{status:200,description:"List of rewards"}]},{id:"admin-referrals-rewards-action",method:"POST",path:"/api/admin/referrals/rewards",summary:"Process reward",description:"Approves or rejects a pending reward",category:"admin-customers",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"rewardId",type:"number",required:!0,description:"Reward ID"},{name:"action",type:"string",required:!0,description:"Action to take",enum:["approve","reject"]},{name:"reason",type:"string",required:!1,description:"Rejection reason"}]},responses:[{status:200,description:"Reward processed"},{status:404,description:"Reward not found"}]},{id:"admin-referrals-settings-get",method:"GET",path:"/api/admin/referrals/settings",summary:"Get referral settings",description:"Returns detailed referral program settings",category:"admin-customers",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Referral settings"}]},{id:"admin-referrals-settings-update",method:"PUT",path:"/api/admin/referrals/settings",summary:"Update referral settings",description:"Updates referral program settings",category:"admin-customers",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"defaultReferrerReward",type:"object",required:!1,description:"Default referrer reward"},{name:"defaultRefereeReward",type:"object",required:!1,description:"Default referee reward"},{name:"requirePurchase",type:"boolean",required:!1,description:"Require purchase to complete referral"},{name:"minPurchaseAmount",type:"number",required:!1,description:"Minimum purchase amount"}]},responses:[{status:200,description:"Settings updated"}]}]},{id:"admin-support",name:"Admin: Support",description:"Support tickets and agent management",icon:"headphones",endpoints:[{id:"admin-support-dashboard",method:"GET",path:"/api/admin/support/dashboard",summary:"Get support dashboard",description:"Returns support metrics, open tickets, and agent performance",category:"admin-support",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Support dashboard data",example:{success:!0,data:{openTickets:45,avgResponseTime:"2h 30m",customerSatisfaction:4.5,ticketsByStatus:{open:45,inProgress:30,resolved:120}}}},{status:403,description:"Admin access required"}]},{id:"admin-support-tickets-list",method:"GET",path:"/api/admin/support/tickets",summary:"List all tickets",description:"Returns paginated list of all support tickets",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"},{name:"priority",type:"string",required:!1,location:"query",description:"Filter by priority"},{name:"assignedTo",type:"number",required:!1,location:"query",description:"Filter by agent ID"},{name:"category",type:"string",required:!1,location:"query",description:"Filter by category"}],responses:[{status:200,description:"List of tickets"},{status:403,description:"Admin access required"}]},{id:"admin-support-tickets-get",method:"GET",path:"/api/admin/support/tickets/{id}",summary:"Get ticket details",description:"Returns full ticket details with messages and audit log",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],responses:[{status:200,description:"Ticket details with messages"},{status:404,description:"Ticket not found"}]},{id:"admin-support-tickets-update",method:"PATCH",path:"/api/admin/support/tickets/{id}",summary:"Update ticket",description:"Updates ticket status, priority, or assignment",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"status",type:"string",required:!1,description:"Ticket status",enum:["OPEN","IN_PROGRESS","WAITING","RESOLVED","CLOSED"]},{name:"priority",type:"string",required:!1,description:"Priority level",enum:["LOW","MEDIUM","HIGH","URGENT"]},{name:"assignedAgentId",type:"number",required:!1,description:"Agent ID to assign"},{name:"category",type:"string",required:!1,description:"Ticket category"},{name:"internalNotes",type:"string",required:!1,description:"Internal notes"}]},responses:[{status:200,description:"Ticket updated"},{status:404,description:"Ticket not found"}]},{id:"admin-support-tickets-reply",method:"POST",path:"/api/admin/support/tickets/{id}/reply",summary:"Reply to ticket",description:"Adds an agent reply to a ticket",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"content",type:"string",required:!0,description:"Reply content"},{name:"isInternal",type:"boolean",required:!1,description:"Internal note (not visible to customer)"}]},responses:[{status:201,description:"Reply added"},{status:404,description:"Ticket not found"}]},{id:"admin-support-tickets-assign",method:"POST",path:"/api/admin/support/tickets/{id}/assign",summary:"Assign ticket",description:"Assigns a ticket to an agent",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"agentId",type:"number",required:!0,description:"Agent ID to assign"}]},responses:[{status:200,description:"Ticket assigned"},{status:404,description:"Ticket or agent not found"}]},{id:"admin-support-tickets-resolve",method:"POST",path:"/api/admin/support/tickets/{id}/resolve",summary:"Resolve ticket",description:"Marks a ticket as resolved",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"resolution",type:"string",required:!1,description:"Resolution summary"}]},responses:[{status:200,description:"Ticket resolved"},{status:404,description:"Ticket not found"}]},{id:"admin-support-agents-list",method:"GET",path:"/api/admin/support/agents",summary:"List support agents",description:"Returns list of support agents with performance metrics",category:"admin-support",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of agents"}]},{id:"admin-support-agents-create",method:"POST",path:"/api/admin/support/agents",summary:"Add support agent",description:"Adds a user as a support agent",category:"admin-support",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"userId",type:"number",required:!0,description:"User ID to add as agent"},{name:"role",type:"string",required:!1,description:"Agent role",enum:["AGENT","SUPERVISOR","MANAGER"]},{name:"maxTickets",type:"number",required:!1,description:"Max concurrent tickets"}]},responses:[{status:201,description:"Agent added"},{status:400,description:"User already an agent"},{status:404,description:"User not found"}]},{id:"admin-support-agents-get",method:"GET",path:"/api/admin/support/agents/{id}",summary:"Get agent details",description:"Returns agent details with performance stats",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Agent ID"}],responses:[{status:200,description:"Agent details"},{status:404,description:"Agent not found"}]},{id:"admin-support-agents-update",method:"PATCH",path:"/api/admin/support/agents/{id}",summary:"Update agent",description:"Updates agent settings",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Agent ID"}],responses:[{status:200,description:"Agent updated"},{status:404,description:"Agent not found"}]},{id:"admin-support-agents-delete",method:"DELETE",path:"/api/admin/support/agents/{id}",summary:"Remove agent",description:"Removes a user from support agents",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Agent ID"}],responses:[{status:200,description:"Agent removed"},{status:400,description:"Agent has open tickets"},{status:404,description:"Agent not found"}]},{id:"admin-support-articles-list",method:"GET",path:"/api/admin/support/articles",summary:"List articles (admin)",description:"Returns all support articles including drafts",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["draft","published","archived"]}],responses:[{status:200,description:"List of articles"}]},{id:"admin-support-articles-create",method:"POST",path:"/api/admin/support/articles",summary:"Create article",description:"Creates a new support article",category:"admin-support",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"title",type:"string",required:!0,description:"Article title"},{name:"content",type:"string",required:!0,description:"Article content (HTML/Markdown)"},{name:"category",type:"string",required:!0,description:"Article category"},{name:"status",type:"string",required:!1,description:"Article status",enum:["draft","published"]},{name:"tags",type:"array",required:!1,description:"Array of tags"}]},responses:[{status:201,description:"Article created"},{status:400,description:"Validation failed"}]},{id:"admin-support-articles-get",method:"GET",path:"/api/admin/support/articles/{id}",summary:"Get article (admin)",description:"Returns article with edit history and analytics",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Article ID"}],responses:[{status:200,description:"Article details"},{status:404,description:"Article not found"}]},{id:"admin-support-articles-update",method:"PUT",path:"/api/admin/support/articles/{id}",summary:"Update article",description:"Updates an existing support article",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Article ID"}],responses:[{status:200,description:"Article updated"},{status:404,description:"Article not found"}]},{id:"admin-support-articles-delete",method:"DELETE",path:"/api/admin/support/articles/{id}",summary:"Delete article",description:"Deletes a support article",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Article ID"}],responses:[{status:200,description:"Article deleted"},{status:404,description:"Article not found"}]},{id:"admin-support-faq-list",method:"GET",path:"/api/admin/support/faq",summary:"List FAQ entries",description:"Returns all FAQ entries",category:"admin-support",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of FAQ entries"}]},{id:"admin-support-faq-create",method:"POST",path:"/api/admin/support/faq",summary:"Create FAQ entry",description:"Creates a new FAQ entry",category:"admin-support",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"question",type:"string",required:!0,description:"FAQ question"},{name:"answer",type:"string",required:!0,description:"FAQ answer"},{name:"category",type:"string",required:!1,description:"FAQ category"},{name:"order",type:"number",required:!1,description:"Display order"}]},responses:[{status:201,description:"FAQ created"},{status:400,description:"Validation failed"}]},{id:"admin-support-faq-update",method:"PUT",path:"/api/admin/support/faq/{id}",summary:"Update FAQ entry",description:"Updates an existing FAQ entry",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"FAQ ID"}],responses:[{status:200,description:"FAQ updated"},{status:404,description:"FAQ not found"}]},{id:"admin-support-faq-delete",method:"DELETE",path:"/api/admin/support/faq/{id}",summary:"Delete FAQ entry",description:"Deletes a FAQ entry",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"FAQ ID"}],responses:[{status:200,description:"FAQ deleted"},{status:404,description:"FAQ not found"}]},{id:"admin-support-canned-responses-list",method:"GET",path:"/api/admin/support/canned-responses",summary:"List canned responses",description:"Returns all canned responses for quick replies",category:"admin-support",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of canned responses"}]},{id:"admin-support-canned-responses-create",method:"POST",path:"/api/admin/support/canned-responses",summary:"Create canned response",description:"Creates a new canned response template",category:"admin-support",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"title",type:"string",required:!0,description:"Response title"},{name:"content",type:"string",required:!0,description:"Response content"},{name:"category",type:"string",required:!1,description:"Response category"},{name:"shortcut",type:"string",required:!1,description:"Keyboard shortcut"}]},responses:[{status:201,description:"Canned response created"},{status:400,description:"Validation failed"}]},{id:"admin-support-canned-responses-get",method:"GET",path:"/api/admin/support/canned-responses/{id}",summary:"Get canned response",description:"Returns a single canned response by ID",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Canned response ID"}],responses:[{status:200,description:"Canned response details"},{status:404,description:"Canned response not found"}]},{id:"admin-support-canned-responses-update",method:"PUT",path:"/api/admin/support/canned-responses/{id}",summary:"Update canned response",description:"Updates an existing canned response",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Canned response ID"}],responses:[{status:200,description:"Canned response updated"},{status:404,description:"Canned response not found"}]},{id:"admin-support-canned-responses-delete",method:"DELETE",path:"/api/admin/support/canned-responses/{id}",summary:"Delete canned response",description:"Deletes a canned response",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Canned response ID"}],responses:[{status:200,description:"Canned response deleted"},{status:404,description:"Canned response not found"}]},{id:"admin-support-stats",method:"GET",path:"/api/admin/support/stats",summary:"Get support stats",description:"Returns real-time support statistics and metrics",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Support statistics",example:{success:!0,data:{openTickets:45,inProgressTickets:30,resolvedToday:25,avgResponseTime:"1h 45m",avgResolutionTime:"4h 20m",customerSatisfaction:4.5}}}]},{id:"admin-support-tickets-messages",method:"GET",path:"/api/admin/support/tickets/{id}/messages",summary:"Get ticket messages",description:"Returns all messages for a specific ticket",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],responses:[{status:200,description:"List of ticket messages"},{status:404,description:"Ticket not found"}]},{id:"admin-support-tickets-messages-add",method:"POST",path:"/api/admin/support/tickets/{id}/messages",summary:"Add ticket message",description:"Adds a message to a ticket thread",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"content",type:"string",required:!0,description:"Message content"},{name:"isInternal",type:"boolean",required:!1,description:"Internal note (not visible to customer)"},{name:"attachments",type:"array",required:!1,description:"File attachments"}]},responses:[{status:201,description:"Message added"},{status:404,description:"Ticket not found"}]},{id:"admin-support-tickets-bulk",method:"POST",path:"/api/admin/support/tickets/bulk",summary:"Bulk ticket operations",description:"Performs bulk operations on multiple tickets",category:"admin-support",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"ticketIds",type:"array",required:!0,description:"Array of ticket IDs"},{name:"action",type:"string",required:!0,description:"Bulk action",enum:["assign","close","change_priority","change_status"]},{name:"data",type:"object",required:!1,description:"Action-specific data (e.g., agentId, status, priority)"}]},responses:[{status:200,description:"Bulk operation completed",example:{success:!0,data:{updated:5,failed:0}}},{status:400,description:"Invalid action or ticket IDs"}]},{id:"admin-support-reports",method:"GET",path:"/api/admin/support/reports",summary:"Get support reports",description:"Returns aggregated support metrics and trends",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Support reports data"}]},{id:"admin-support-chat-conversations-list",method:"GET",path:"/api/admin/support/chat/conversations",summary:"List chat conversations",description:"Returns all live chat conversations for agents",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["WAITING","ACTIVE","ON_HOLD","RESOLVED","CLOSED"]},{name:"agentId",type:"number",required:!1,location:"query",description:"Filter by agent"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"List of conversations with queue stats",example:{success:!0,data:{conversations:[],stats:{waiting:5,active:10,onHold:2,myActive:3}}}}]},{id:"admin-support-chat-conversation-get",method:"GET",path:"/api/admin/support/chat/{conversationId}",summary:"Get chat conversation with context",description:"Returns conversation with full customer context for agents",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"conversationId",type:"string",required:!0,location:"path",description:"Conversation ID"}],responses:[{status:200,description:"Conversation with messages and customer context"},{status:404,description:"Conversation not found"}]},{id:"admin-support-chat-conversation-update",method:"PATCH",path:"/api/admin/support/chat/{conversationId}",summary:"Update chat conversation",description:"Assign, resolve, close, transfer, or update priority of a conversation",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"conversationId",type:"string",required:!0,location:"path",description:"Conversation ID"}],requestBody:{contentType:"application/json",fields:[{name:"action",type:"string",required:!0,description:"Action to perform",enum:["assign","resolve","close","hold","transfer","priority"]},{name:"resolution",type:"string",required:!1,description:"Resolution note (for resolve action)"},{name:"reason",type:"string",required:!1,description:"Reason (for hold/transfer actions)"},{name:"toAgentId",type:"number",required:!1,description:"Target agent ID (for transfer action)"},{name:"priority",type:"number",required:!1,description:"Priority 0-3 (for priority action)"},{name:"tags",type:"array",required:!1,description:"Tags to add"}],example:{action:"assign"}},responses:[{status:200,description:"Conversation updated"},{status:400,description:"Invalid action"},{status:404,description:"Conversation not found"}]},{id:"admin-support-chat-conversation-message",method:"POST",path:"/api/admin/support/chat/{conversationId}",summary:"Send agent message",description:"Send a message as an agent in a chat conversation",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"conversationId",type:"string",required:!0,location:"path",description:"Conversation ID"}],requestBody:{contentType:"application/json",fields:[{name:"content",type:"string",required:!0,description:"Message content"},{name:"contentType",type:"string",required:!1,description:"Content type",enum:["TEXT","IMAGE","FILE","PRODUCT_CARD","ORDER_CARD","QUICK_REPLIES"]},{name:"attachments",type:"array",required:!1,description:"Attachments"}],example:{content:"How can I help you today?"}},responses:[{status:200,description:"Message sent"},{status:404,description:"Conversation not found"}]},{id:"admin-support-chat-stats",method:"GET",path:"/api/admin/support/chat/conversations/stats",summary:"Get chat queue stats",description:"Returns real-time chat queue statistics for agents",category:"admin-support",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Queue statistics",example:{success:!0,data:{waiting:5,active:10,onHold:2,myActive:3}}}]},{id:"admin-support-analytics",method:"GET",path:"/api/admin/support/analytics",summary:"Get support analytics",description:"Returns comprehensive support analytics including chat metrics, agent performance, and trends",category:"admin-support",requiresAuth:!0,adminOnly:!0,parameters:[{name:"period",type:"string",required:!1,location:"query",description:"Time period",enum:["7d","30d","90d","custom"]},{name:"start",type:"string",required:!1,location:"query",description:"Start date (ISO format, for custom period)"},{name:"end",type:"string",required:!1,location:"query",description:"End date (ISO format, for custom period)"}],responses:[{status:200,description:"Support analytics summary",example:{success:!0,data:{period:{startDate:"2025-01-01",endDate:"2025-01-07"},chat:{totalConversations:150,resolvedConversations:120,averageResponseTime:180,averageHandleTime:900,averageRating:4.5},topAgents:[],dailyTrend:[],busiestHours:[],topTags:[]}}}]}]},{id:"admin-promotions",name:"Admin: Promotions",description:"Promotion and discount management",icon:"percent",endpoints:[{id:"admin-promotions-list",method:"GET",path:"/api/admin/promotions",summary:"List all promotions",description:"Returns paginated list of all promotions",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["active","scheduled","expired","disabled"]},{name:"type",type:"string",required:!1,location:"query",description:"Filter by type",enum:["percentage","fixed","free_shipping","bogo"]}],responses:[{status:200,description:"List of promotions",example:{success:!0,data:{promotions:[{id:1,name:"Summer Sale",code:"SUMMER20",type:"percentage",value:20,usageCount:150,isActive:!0}],pagination:{page:1,limit:20,total:50,totalPages:3}}}},{status:403,description:"Admin access required"}]},{id:"admin-promotions-create",method:"POST",path:"/api/admin/promotions",summary:"Create promotion",description:"Creates a new promotion or discount code",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Promotion name"},{name:"code",type:"string",required:!0,description:"Promo code (unique)"},{name:"type",type:"string",required:!0,description:"Discount type",enum:["percentage","fixed","free_shipping","bogo"]},{name:"value",type:"number",required:!0,description:"Discount value"},{name:"minPurchase",type:"number",required:!1,description:"Minimum purchase amount"},{name:"maxDiscount",type:"number",required:!1,description:"Maximum discount amount"},{name:"usageLimit",type:"number",required:!1,description:"Total usage limit"},{name:"perUserLimit",type:"number",required:!1,description:"Per-user usage limit"},{name:"startDate",type:"string",required:!1,description:"Start date (ISO 8601)"},{name:"endDate",type:"string",required:!1,description:"End date (ISO 8601)"},{name:"applicableProducts",type:"array",required:!1,description:"Array of product IDs"},{name:"applicableCategories",type:"array",required:!1,description:"Array of category IDs"},{name:"isActive",type:"boolean",required:!1,description:"Whether promotion is active"}],example:{name:"Summer Sale",code:"SUMMER20",type:"percentage",value:20,minPurchase:50,startDate:"2024-06-01T00:00:00Z",endDate:"2024-08-31T23:59:59Z"}},responses:[{status:201,description:"Promotion created"},{status:400,description:"Validation failed or code already exists"}]},{id:"admin-promotions-get",method:"GET",path:"/api/admin/promotions/{id}",summary:"Get promotion details",description:"Returns promotion details with usage statistics",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"}],responses:[{status:200,description:"Promotion details with stats",example:{success:!0,data:{id:1,name:"Summer Sale",code:"SUMMER20",type:"percentage",value:20,usageCount:150,totalDiscount:3e3,isActive:!0,usageHistory:[]}}},{status:404,description:"Promotion not found"}]},{id:"admin-promotions-update",method:"PUT",path:"/api/admin/promotions/{id}",summary:"Update promotion",description:"Updates an existing promotion",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"}],requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Promotion name"},{name:"value",type:"number",required:!1,description:"Discount value"},{name:"minPurchase",type:"number",required:!1,description:"Minimum purchase"},{name:"maxDiscount",type:"number",required:!1,description:"Maximum discount"},{name:"usageLimit",type:"number",required:!1,description:"Usage limit"},{name:"endDate",type:"string",required:!1,description:"End date"},{name:"isActive",type:"boolean",required:!1,description:"Active status"}]},responses:[{status:200,description:"Promotion updated"},{status:404,description:"Promotion not found"}]},{id:"admin-promotions-delete",method:"DELETE",path:"/api/admin/promotions/{id}",summary:"Delete promotion",description:"Deletes a promotion (soft delete if already used)",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"}],responses:[{status:200,description:"Promotion deleted"},{status:404,description:"Promotion not found"}]},{id:"admin-promotions-analytics",method:"GET",path:"/api/admin/promotions/analytics",summary:"Get promotions analytics",description:"Returns aggregated promotion performance metrics",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Promotion analytics data",example:{success:!0,data:{totalPromotions:25,activePromotions:10,totalUsage:5e3,totalDiscount:75e3,topPromotions:[]}}}]},{id:"admin-promotion-analytics",method:"GET",path:"/api/admin/promotions/{id}/analytics",summary:"Get single promotion analytics",description:"Returns detailed analytics for a specific promotion",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"},{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Promotion analytics",example:{success:!0,data:{usageCount:150,totalDiscount:3e3,averageOrderValue:75,usageTrend:[]}}},{status:404,description:"Promotion not found"}]},{id:"admin-promotion-codes",method:"GET",path:"/api/admin/promotions/{id}/codes",summary:"Get promotion codes",description:"Returns generated codes for a promotion (for bulk code promotions)",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["used","unused","expired"]}],responses:[{status:200,description:"List of codes",example:{success:!0,data:{codes:[{code:"PROMO-ABC123",used:!1,usedAt:null}],pagination:{page:1,limit:50,total:100}}}}]},{id:"admin-promotion-codes-generate",method:"POST",path:"/api/admin/promotions/{id}/codes",summary:"Generate promotion codes",description:"Generates bulk unique codes for a promotion",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"}],requestBody:{contentType:"application/json",fields:[{name:"count",type:"number",required:!0,description:"Number of codes to generate"},{name:"prefix",type:"string",required:!1,description:"Code prefix"}]},responses:[{status:201,description:"Codes generated"},{status:400,description:"Invalid count"}]},{id:"admin-promotion-toggle",method:"POST",path:"/api/admin/promotions/{id}/toggle",summary:"Toggle promotion status",description:"Enables or disables a promotion",category:"admin-promotions",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Promotion ID"}],responses:[{status:200,description:"Promotion status toggled",example:{success:!0,data:{isActive:!0}}},{status:404,description:"Promotion not found"}]}]},{id:"admin-affiliates",name:"Admin: Affiliates",description:"Affiliate program management",icon:"share-2",endpoints:[{id:"admin-affiliates-list",method:"GET",path:"/api/admin/affiliates",summary:"List all affiliates",description:"Returns paginated list of all affiliate accounts",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","active","suspended","rejected"]},{name:"search",type:"string",required:!1,location:"query",description:"Search by name or email"}],responses:[{status:200,description:"List of affiliates",example:{success:!0,data:{affiliates:[{id:1,code:"JOHN123",user:{name:"John Doe",email:"john@example.com"},status:"active",totalSales:5e3,totalCommission:500}],pagination:{page:1,limit:20,total:100,totalPages:5}}}},{status:403,description:"Admin access required"}]},{id:"admin-affiliates-get",method:"GET",path:"/api/admin/affiliates/{id}",summary:"Get affiliate details",description:"Returns full affiliate account details with sales and payout history",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Affiliate ID"}],responses:[{status:200,description:"Affiliate details",example:{success:!0,data:{id:1,code:"JOHN123",user:{id:101,name:"John Doe",email:"john@example.com"},status:"active",commissionRate:10,totalSales:5e3,totalCommission:500,pendingCommission:50,recentSales:[],payoutHistory:[]}}},{status:404,description:"Affiliate not found"}]},{id:"admin-affiliates-update",method:"PATCH",path:"/api/admin/affiliates/{id}",summary:"Update affiliate",description:"Updates affiliate status, commission rate, or notes",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Affiliate ID"}],requestBody:{contentType:"application/json",fields:[{name:"status",type:"string",required:!1,description:"Affiliate status",enum:["active","suspended","rejected"]},{name:"commissionRate",type:"number",required:!1,description:"Commission percentage"},{name:"notes",type:"string",required:!1,description:"Admin notes"}]},responses:[{status:200,description:"Affiliate updated"},{status:404,description:"Affiliate not found"}]},{id:"admin-affiliates-approve",method:"POST",path:"/api/admin/affiliates/{id}/approve",summary:"Approve affiliate",description:"Approves a pending affiliate application",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Affiliate ID"}],requestBody:{contentType:"application/json",fields:[{name:"commissionRate",type:"number",required:!1,description:"Initial commission rate"}]},responses:[{status:200,description:"Affiliate approved"},{status:400,description:"Affiliate not pending"},{status:404,description:"Affiliate not found"}]},{id:"admin-affiliates-reject",method:"POST",path:"/api/admin/affiliates/{id}/reject",summary:"Reject affiliate",description:"Rejects a pending affiliate application",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Affiliate ID"}],requestBody:{contentType:"application/json",fields:[{name:"reason",type:"string",required:!1,description:"Rejection reason"}]},responses:[{status:200,description:"Affiliate rejected"},{status:400,description:"Affiliate not pending"},{status:404,description:"Affiliate not found"}]},{id:"admin-affiliates-payouts-list",method:"GET",path:"/api/admin/affiliates/payouts",summary:"List payout requests",description:"Returns paginated list of affiliate payout requests",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","approved","paid","rejected"]}],responses:[{status:200,description:"List of payout requests"}]},{id:"admin-affiliates-payouts-process",method:"POST",path:"/api/admin/affiliates/payouts/{id}/process",summary:"Process payout",description:"Approves and processes an affiliate payout request",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Payout request ID"}],requestBody:{contentType:"application/json",fields:[{name:"action",type:"string",required:!0,description:"Action to take",enum:["approve","reject","mark_paid"]},{name:"notes",type:"string",required:!1,description:"Admin notes"},{name:"transactionId",type:"string",required:!1,description:"Payment transaction ID"}]},responses:[{status:200,description:"Payout processed"},{status:400,description:"Invalid action or payout state"},{status:404,description:"Payout not found"}]},{id:"admin-affiliates-sales",method:"GET",path:"/api/admin/affiliates/sales",summary:"List affiliate sales",description:"Returns paginated list of all sales attributed to affiliates",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"affiliateId",type:"number",required:!1,location:"query",description:"Filter by affiliate ID"},{name:"startDate",type:"string",required:!1,location:"query",description:"Start date filter"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date filter"}],responses:[{status:200,description:"List of affiliate sales",example:{success:!0,data:{sales:[{id:1,orderId:123,affiliateId:5,amount:100,commission:10,createdAt:"2024-01-01T00:00:00Z"}],pagination:{page:1,limit:20,total:100}}}}]},{id:"admin-affiliates-analytics",method:"GET",path:"/api/admin/affiliates/analytics",summary:"Get affiliate analytics",description:"Returns aggregated affiliate program metrics",category:"admin-affiliates",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Affiliate analytics data",example:{success:!0,data:{totalAffiliates:100,activeAffiliates:75,totalSales:5e4,totalCommissions:5e3,pendingPayouts:1500,topAffiliates:[]}}}]}]},{id:"admin-pricing",name:"Admin: Pricing",description:"Dynamic pricing rules",icon:"dollar-sign",endpoints:[{id:"admin-pricing-rules-list",method:"GET",path:"/api/admin/pricing/rules",summary:"List pricing rules",description:"Returns all dynamic pricing rules",category:"admin-pricing",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"isActive",type:"boolean",required:!1,location:"query",description:"Filter by active status"},{name:"type",type:"string",required:!1,location:"query",description:"Filter by rule type"}],responses:[{status:200,description:"List of pricing rules",example:{success:!0,data:{rules:[{id:1,name:"Weekend Surge",type:"time_based",adjustment:10,isActive:!0}],pagination:{page:1,limit:20,total:10,totalPages:1}}}},{status:403,description:"Admin access required"}]},{id:"admin-pricing-rules-create",method:"POST",path:"/api/admin/pricing/rules",summary:"Create pricing rule",description:"Creates a new dynamic pricing rule",category:"admin-pricing",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Rule name"},{name:"type",type:"string",required:!0,description:"Rule type",enum:["time_based","demand_based","inventory_based","segment_based"]},{name:"adjustment",type:"number",required:!0,description:"Price adjustment percentage"},{name:"conditions",type:"object",required:!0,description:"Rule conditions"},{name:"applicableProducts",type:"array",required:!1,description:"Product IDs (empty = all)"},{name:"applicableCategories",type:"array",required:!1,description:"Category IDs"},{name:"priority",type:"number",required:!1,description:"Rule priority (higher = more important)"},{name:"isActive",type:"boolean",required:!1,description:"Whether rule is active"}],example:{name:"Weekend Surge",type:"time_based",adjustment:10,conditions:{daysOfWeek:["saturday","sunday"]},priority:5}},responses:[{status:201,description:"Pricing rule created"},{status:400,description:"Validation failed"}]},{id:"admin-pricing-rules-get",method:"GET",path:"/api/admin/pricing/rules/{id}",summary:"Get pricing rule",description:"Returns a single pricing rule with usage stats",category:"admin-pricing",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Rule ID"}],responses:[{status:200,description:"Pricing rule details"},{status:404,description:"Rule not found"}]},{id:"admin-pricing-rules-update",method:"PUT",path:"/api/admin/pricing/rules/{id}",summary:"Update pricing rule",description:"Updates an existing pricing rule",category:"admin-pricing",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Rule ID"}],responses:[{status:200,description:"Pricing rule updated"},{status:404,description:"Rule not found"}]},{id:"admin-pricing-rules-delete",method:"DELETE",path:"/api/admin/pricing/rules/{id}",summary:"Delete pricing rule",description:"Deletes a pricing rule",category:"admin-pricing",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Rule ID"}],responses:[{status:200,description:"Pricing rule deleted"},{status:404,description:"Rule not found"}]},{id:"admin-pricing-simulate",method:"POST",path:"/api/admin/pricing/simulate",summary:"Simulate pricing",description:"Simulates pricing rules for given products and conditions",category:"admin-pricing",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"productIds",type:"array",required:!0,description:"Product IDs to simulate"},{name:"conditions",type:"object",required:!1,description:"Simulation conditions"}]},responses:[{status:200,description:"Simulation results",example:{success:!0,data:{products:[{id:1,originalPrice:100,adjustedPrice:110,appliedRules:["Weekend Surge"]}]}}}]}]},{id:"admin-segments",name:"Admin: Segments",description:"Customer segmentation",icon:"pie-chart",endpoints:[{id:"admin-segments-list",method:"GET",path:"/api/admin/segments",summary:"List customer segments",description:"Returns all customer segments with member counts",category:"admin-segments",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"type",type:"string",required:!1,location:"query",description:"Filter by segment type",enum:["static","dynamic"]}],responses:[{status:200,description:"List of segments",example:{success:!0,data:{segments:[{id:1,name:"VIP Customers",type:"dynamic",memberCount:150,conditions:{}}],pagination:{page:1,limit:20,total:10,totalPages:1}}}},{status:403,description:"Admin access required"}]},{id:"admin-segments-create",method:"POST",path:"/api/admin/segments",summary:"Create segment",description:"Creates a new customer segment",category:"admin-segments",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Segment name"},{name:"description",type:"string",required:!1,description:"Segment description"},{name:"type",type:"string",required:!0,description:"Segment type",enum:["static","dynamic"]},{name:"conditions",type:"object",required:!1,description:"Dynamic segment conditions"},{name:"userIds",type:"array",required:!1,description:"Static segment user IDs"}],example:{name:"VIP Customers",type:"dynamic",conditions:{totalSpent:{operator:"gte",value:1e3}}}},responses:[{status:201,description:"Segment created"},{status:400,description:"Validation failed"}]},{id:"admin-segments-get",method:"GET",path:"/api/admin/segments/{id}",summary:"Get segment details",description:"Returns segment details with member list",category:"admin-segments",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Segment ID"}],responses:[{status:200,description:"Segment details"},{status:404,description:"Segment not found"}]},{id:"admin-segments-update",method:"PUT",path:"/api/admin/segments/{id}",summary:"Update segment",description:"Updates an existing segment",category:"admin-segments",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Segment ID"}],responses:[{status:200,description:"Segment updated"},{status:404,description:"Segment not found"}]},{id:"admin-segments-delete",method:"DELETE",path:"/api/admin/segments/{id}",summary:"Delete segment",description:"Deletes a customer segment",category:"admin-segments",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Segment ID"}],responses:[{status:200,description:"Segment deleted"},{status:404,description:"Segment not found"}]},{id:"admin-segments-members",method:"GET",path:"/api/admin/segments/{id}/members",summary:"Get segment members",description:"Returns paginated list of customers in the segment",category:"admin-segments",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Segment ID"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"Segment members"},{status:404,description:"Segment not found"}]},{id:"admin-segments-refresh",method:"POST",path:"/api/admin/segments/{id}/refresh",summary:"Refresh dynamic segment",description:"Recalculates membership for a dynamic segment",category:"admin-segments",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Segment ID"}],responses:[{status:200,description:"Segment refreshed",example:{success:!0,data:{memberCount:175,added:30,removed:5}}},{status:400,description:"Not a dynamic segment"},{status:404,description:"Segment not found"}]},{id:"admin-segments-preview",method:"POST",path:"/api/admin/segments/preview",summary:"Preview segment",description:"Previews which customers would match segment conditions without saving",category:"admin-segments",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"conditions",type:"object",required:!0,description:"Segment conditions to preview"},{name:"limit",type:"number",required:!1,description:"Max results to return"}],example:{conditions:{totalSpent:{operator:"gte",value:1e3}},limit:10}},responses:[{status:200,description:"Preview results",example:{success:!0,data:{estimatedCount:150,sampleMembers:[{id:1,email:"user@example.com",name:"John Doe"}]}}},{status:400,description:"Invalid conditions"}]}]},{id:"admin-workflows",name:"Admin: Workflows",description:"Marketing automation workflows",icon:"git-branch",endpoints:[{id:"admin-workflows-list",method:"GET",path:"/api/admin/workflows",summary:"List workflows",description:"Returns all automated workflows",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["active","paused","draft"]},{name:"trigger",type:"string",required:!1,location:"query",description:"Filter by trigger type"}],responses:[{status:200,description:"List of workflows",example:{success:!0,data:{workflows:[{id:1,name:"Welcome Email",trigger:"user_registered",status:"active",executionCount:500}],pagination:{page:1,limit:20,total:15,totalPages:1}}}},{status:403,description:"Admin access required"}]},{id:"admin-workflows-create",method:"POST",path:"/api/admin/workflows",summary:"Create workflow",description:"Creates a new automated workflow",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Workflow name"},{name:"description",type:"string",required:!1,description:"Workflow description"},{name:"trigger",type:"object",required:!0,description:"Trigger configuration"},{name:"conditions",type:"array",required:!1,description:"Workflow conditions"},{name:"actions",type:"array",required:!0,description:"Actions to execute"},{name:"status",type:"string",required:!1,description:"Initial status",enum:["active","paused","draft"]}],example:{name:"Welcome Email",trigger:{type:"user_registered"},actions:[{type:"send_email",template:"welcome"}]}},responses:[{status:201,description:"Workflow created"},{status:400,description:"Validation failed"}]},{id:"admin-workflows-get",method:"GET",path:"/api/admin/workflows/{id}",summary:"Get workflow details",description:"Returns workflow configuration and execution history",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"}],responses:[{status:200,description:"Workflow details"},{status:404,description:"Workflow not found"}]},{id:"admin-workflows-update",method:"PUT",path:"/api/admin/workflows/{id}",summary:"Update workflow",description:"Updates an existing workflow",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"}],responses:[{status:200,description:"Workflow updated"},{status:404,description:"Workflow not found"}]},{id:"admin-workflows-delete",method:"DELETE",path:"/api/admin/workflows/{id}",summary:"Delete workflow",description:"Deletes a workflow",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"}],responses:[{status:200,description:"Workflow deleted"},{status:404,description:"Workflow not found"}]},{id:"admin-workflows-toggle",method:"POST",path:"/api/admin/workflows/{id}/toggle",summary:"Toggle workflow status",description:"Activates or pauses a workflow",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"}],requestBody:{contentType:"application/json",fields:[{name:"status",type:"string",required:!0,description:"New status",enum:["active","paused"]}]},responses:[{status:200,description:"Workflow status updated"},{status:404,description:"Workflow not found"}]},{id:"admin-workflows-test",method:"POST",path:"/api/admin/workflows/{id}/test",summary:"Test workflow",description:"Tests a workflow with sample data without side effects",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"}],requestBody:{contentType:"application/json",fields:[{name:"testData",type:"object",required:!0,description:"Sample data for testing"}]},responses:[{status:200,description:"Test results",example:{success:!0,data:{conditionsMet:!0,actionsToExecute:["send_email"]}}},{status:404,description:"Workflow not found"}]},{id:"admin-workflows-executions",method:"GET",path:"/api/admin/workflows/{id}/executions",summary:"Get workflow executions",description:"Returns execution history for a workflow",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["success","failed","skipped"]}],responses:[{status:200,description:"Execution history"},{status:404,description:"Workflow not found"}]},{id:"admin-workflows-trigger",method:"POST",path:"/api/admin/workflows/{id}/trigger",summary:"Manually trigger workflow",description:"Manually triggers a workflow execution with provided data",category:"admin-workflows",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"number",required:!0,location:"path",description:"Workflow ID"}],requestBody:{contentType:"application/json",fields:[{name:"data",type:"object",required:!0,description:"Trigger data"},{name:"targetUsers",type:"array",required:!1,description:"Specific user IDs to target"}],example:{data:{campaignId:123},targetUsers:[1,2,3]}},responses:[{status:200,description:"Workflow triggered",example:{success:!0,data:{executionId:456,queued:100}}},{status:400,description:"Workflow not active or invalid data"},{status:404,description:"Workflow not found"}]}]},{id:"admin-analytics",name:"Admin: Analytics",description:"Business analytics and reports",icon:"bar-chart",endpoints:[{id:"admin-analytics-overview",method:"GET",path:"/api/admin/analytics/overview",summary:"Get analytics overview",description:"Returns high-level business metrics and KPIs",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date (ISO 8601)"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date (ISO 8601)"},{name:"compareWith",type:"string",required:!1,location:"query",description:"Comparison period",enum:["previous_period","previous_year"]}],responses:[{status:200,description:"Analytics overview data",example:{success:!0,data:{revenue:{current:15e4,previous:12e4,change:25},orders:{current:1500,previous:1200,change:25},customers:{current:500,new:150},averageOrderValue:100,conversionRate:3.5}}},{status:403,description:"Admin access required"}]},{id:"admin-analytics-revenue",method:"GET",path:"/api/admin/analytics/revenue",summary:"Get revenue analytics",description:"Returns detailed revenue breakdown and trends",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"},{name:"granularity",type:"string",required:!1,location:"query",description:"Data granularity",enum:["daily","weekly","monthly"]},{name:"groupBy",type:"string",required:!1,location:"query",description:"Group by dimension",enum:["category","product","channel"]}],responses:[{status:200,description:"Revenue analytics",example:{success:!0,data:{total:15e4,trend:[{date:"2024-01-01",revenue:5e3,orders:50}],byCategory:[{category:"Electronics",revenue:5e4,percentage:33}]}}}]},{id:"admin-analytics-customers",method:"GET",path:"/api/admin/analytics/customers",summary:"Get customer analytics",description:"Returns customer behavior and cohort analysis",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Customer analytics",example:{success:!0,data:{totalCustomers:5e3,newCustomers:500,returningCustomers:1500,churnRate:5,lifetimeValue:250,cohortRetention:[]}}}]},{id:"admin-analytics-products",method:"GET",path:"/api/admin/analytics/products",summary:"Get product analytics",description:"Returns product performance and inventory insights",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"},{name:"limit",type:"number",required:!1,location:"query",description:"Number of top products"}],responses:[{status:200,description:"Product analytics",example:{success:!0,data:{topSelling:[{id:1,name:"Product A",units:500,revenue:1e4}],lowStock:[{id:5,name:"Product E",stock:3}],noSales:[{id:10,name:"Product J",daysSinceLastSale:30}]}}}]},{id:"admin-analytics-traffic",method:"GET",path:"/api/admin/analytics/traffic",summary:"Get traffic analytics",description:"Returns website traffic and visitor analytics",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Traffic analytics",example:{success:!0,data:{pageViews:1e5,uniqueVisitors:25e3,sessions:4e4,bounceRate:45,avgSessionDuration:180,topPages:[{path:"/products",views:15e3}],trafficSources:[{source:"google",sessions:15e3,percentage:37.5}]}}}]},{id:"admin-analytics-export",method:"POST",path:"/api/admin/analytics/export",summary:"Export analytics data",description:"Exports analytics data in various formats",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"report",type:"string",required:!0,description:"Report type",enum:["revenue","customers","products","traffic"]},{name:"format",type:"string",required:!0,description:"Export format",enum:["csv","xlsx","pdf"]},{name:"startDate",type:"string",required:!0,description:"Start date"},{name:"endDate",type:"string",required:!0,description:"End date"}]},responses:[{status:200,description:"Export file or download URL"},{status:400,description:"Invalid export parameters"}]},{id:"admin-analytics-cohorts",method:"GET",path:"/api/admin/analytics/cohorts",summary:"Get cohort analysis",description:"Returns customer cohort retention and behavior analysis",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date (ISO 8601)"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date (ISO 8601)"},{name:"granularity",type:"string",required:!1,location:"query",description:"Cohort granularity",enum:["daily","weekly","monthly"]}],responses:[{status:200,description:"Cohort analysis data",example:{success:!0,data:{cohorts:[{period:"2024-01",users:500,retention:[100,45,30,25]}]}}},{status:403,description:"Admin access required"}]},{id:"admin-analytics-funnels",method:"GET",path:"/api/admin/analytics/funnels",summary:"Get conversion funnel analytics",description:"Returns conversion funnel data for user journey analysis",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"},{name:"funnelType",type:"string",required:!1,location:"query",description:"Funnel type",enum:["checkout","registration","product"]}],responses:[{status:200,description:"Funnel analytics data",example:{success:!0,data:{steps:[{name:"View Product",count:1e4,rate:100},{name:"Add to Cart",count:3e3,rate:30},{name:"Checkout",count:1500,rate:15},{name:"Purchase",count:1e3,rate:10}]}}}]},{id:"admin-analytics-products-top",method:"GET",path:"/api/admin/analytics/products/top",summary:"Get top performing products",description:"Returns ranked list of top performing products by revenue or units",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"},{name:"metric",type:"string",required:!1,location:"query",description:"Ranking metric",enum:["revenue","units","views"]},{name:"limit",type:"number",required:!1,location:"query",description:"Number of products to return"}],responses:[{status:200,description:"Top products data",example:{success:!0,data:{products:[{id:1,name:"Product A",revenue:5e4,units:500,views:1e4}]}}}]},{id:"admin-analytics-revenue-forecast",method:"GET",path:"/api/admin/analytics/revenue/forecast",summary:"Get revenue forecast",description:"Returns projected revenue based on historical trends",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"periods",type:"number",required:!1,location:"query",description:"Number of periods to forecast"},{name:"granularity",type:"string",required:!1,location:"query",description:"Forecast granularity",enum:["daily","weekly","monthly"]}],responses:[{status:200,description:"Revenue forecast data",example:{success:!0,data:{forecast:[{period:"2024-02",projected:16e4,confidence:{low:14e4,high:18e4}}]}}}]},{id:"admin-analytics-revenue-trend",method:"GET",path:"/api/admin/analytics/revenue/trend",summary:"Get revenue trend analysis",description:"Returns revenue trend data with growth rates and patterns",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"},{name:"granularity",type:"string",required:!1,location:"query",description:"Data granularity",enum:["daily","weekly","monthly"]}],responses:[{status:200,description:"Revenue trend data",example:{success:!0,data:{trend:[{period:"2024-01",revenue:15e4,growth:25}],movingAverage:145e3,seasonality:{detected:!0,pattern:"weekly"}}}}]},{id:"admin-analytics-segments",method:"GET",path:"/api/admin/analytics/segments",summary:"Get segment analytics",description:"Returns analytics broken down by customer segments",category:"admin-analytics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"Segment analytics data",example:{success:!0,data:{segments:[{id:1,name:"VIP Customers",revenue:75e3,orders:300,avgOrderValue:250},{id:2,name:"New Customers",revenue:25e3,orders:500,avgOrderValue:50}]}}}]}]},{id:"admin-monitoring",name:"Admin: Monitoring",description:"System monitoring, alerts, errors, and performance tracking",icon:"activity",endpoints:[{id:"admin-monitoring-alerts-list",method:"GET",path:"/api/admin/monitoring/alerts",summary:"List monitoring alerts",description:"Returns all monitoring alerts with optional filtering",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["active","acknowledged","resolved"]},{name:"severity",type:"string",required:!1,location:"query",description:"Filter by severity",enum:["critical","warning","info"]},{name:"limit",type:"number",required:!1,location:"query",description:"Number of alerts to return"}],responses:[{status:200,description:"List of alerts",example:{success:!0,data:{alerts:[],total:0}}},{status:403,description:"Admin access required"}]},{id:"admin-monitoring-alerts-create",method:"POST",path:"/api/admin/monitoring/alerts",summary:"Create monitoring alert rule",description:"Creates a new alert rule for monitoring",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Alert name"},{name:"metric",type:"string",required:!0,description:"Metric to monitor"},{name:"condition",type:"string",required:!0,description:"Alert condition"},{name:"threshold",type:"number",required:!0,description:"Threshold value"},{name:"severity",type:"string",required:!0,description:"Alert severity"}]},responses:[{status:201,description:"Alert created"},{status:400,description:"Invalid alert configuration"}]},{id:"admin-monitoring-alerts-get",method:"GET",path:"/api/admin/monitoring/alerts/{id}",summary:"Get alert details",description:"Returns details of a specific alert",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Alert ID"}],responses:[{status:200,description:"Alert details"},{status:404,description:"Alert not found"}]},{id:"admin-monitoring-alerts-update",method:"PATCH",path:"/api/admin/monitoring/alerts/{id}",summary:"Update alert",description:"Updates an existing alert configuration",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Alert ID"}],requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Alert name"},{name:"enabled",type:"boolean",required:!1,description:"Enable/disable alert"},{name:"threshold",type:"number",required:!1,description:"Threshold value"}]},responses:[{status:200,description:"Alert updated"},{status:404,description:"Alert not found"}]},{id:"admin-monitoring-alerts-delete",method:"DELETE",path:"/api/admin/monitoring/alerts/{id}",summary:"Delete alert",description:"Deletes an alert rule",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Alert ID"}],responses:[{status:200,description:"Alert deleted"},{status:404,description:"Alert not found"}]},{id:"admin-monitoring-alerts-acknowledge",method:"POST",path:"/api/admin/monitoring/alerts/{id}/acknowledge",summary:"Acknowledge alert",description:"Acknowledges an active alert",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Alert ID"}],requestBody:{contentType:"application/json",fields:[{name:"note",type:"string",required:!1,description:"Acknowledgment note"}]},responses:[{status:200,description:"Alert acknowledged"},{status:404,description:"Alert not found"}]},{id:"admin-monitoring-alerts-resolve",method:"POST",path:"/api/admin/monitoring/alerts/{id}/resolve",summary:"Resolve alert",description:"Marks an alert as resolved",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Alert ID"}],requestBody:{contentType:"application/json",fields:[{name:"resolution",type:"string",required:!1,description:"Resolution notes"}]},responses:[{status:200,description:"Alert resolved"},{status:404,description:"Alert not found"}]},{id:"admin-monitoring-errors-list",method:"GET",path:"/api/admin/monitoring/errors",summary:"List application errors",description:"Returns grouped application errors with filtering",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["unresolved","resolved","ignored"]},{name:"level",type:"string",required:!1,location:"query",description:"Filter by level",enum:["error","warning"]},{name:"startDate",type:"string",required:!1,location:"query",description:"Start date filter"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date filter"},{name:"search",type:"string",required:!1,location:"query",description:"Search in error messages"}],responses:[{status:200,description:"List of errors",example:{success:!0,data:{errors:[],total:0}}}]},{id:"admin-monitoring-errors-get",method:"GET",path:"/api/admin/monitoring/errors/{fingerprint}",summary:"Get error details",description:"Returns details and occurrences of a specific error",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"fingerprint",type:"string",required:!0,location:"path",description:"Error fingerprint"}],responses:[{status:200,description:"Error details with occurrences"},{status:404,description:"Error not found"}]},{id:"admin-monitoring-errors-update",method:"PATCH",path:"/api/admin/monitoring/errors/{fingerprint}",summary:"Update error status",description:"Updates the status of an error group",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"fingerprint",type:"string",required:!0,location:"path",description:"Error fingerprint"}],requestBody:{contentType:"application/json",fields:[{name:"status",type:"string",required:!0,description:"New status",enum:["unresolved","resolved","ignored"]},{name:"assignedTo",type:"string",required:!1,description:"Assigned user ID"}]},responses:[{status:200,description:"Error updated"},{status:404,description:"Error not found"}]},{id:"admin-monitoring-errors-comments",method:"GET",path:"/api/admin/monitoring/errors/{fingerprint}/comments",summary:"Get error comments",description:"Returns comments on an error group",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"fingerprint",type:"string",required:!0,location:"path",description:"Error fingerprint"}],responses:[{status:200,description:"List of comments"}]},{id:"admin-monitoring-errors-comments-create",method:"POST",path:"/api/admin/monitoring/errors/{fingerprint}/comments",summary:"Add error comment",description:"Adds a comment to an error group",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"fingerprint",type:"string",required:!0,location:"path",description:"Error fingerprint"}],requestBody:{contentType:"application/json",fields:[{name:"content",type:"string",required:!0,description:"Comment content"}]},responses:[{status:201,description:"Comment added"}]},{id:"admin-monitoring-errors-export",method:"GET",path:"/api/admin/monitoring/errors/export",summary:"Export errors",description:"Exports errors to CSV or JSON format",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"format",type:"string",required:!1,location:"query",description:"Export format",enum:["csv","json"]},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"}],responses:[{status:200,description:"Export file"}]},{id:"admin-monitoring-errors-resolve",method:"POST",path:"/api/admin/monitoring/errors/resolve",summary:"Resolve error",description:"Marks a single error as resolved",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"fingerprint",type:"string",required:!0,description:"Error fingerprint"},{name:"resolution",type:"string",required:!1,description:"Resolution notes"}]},responses:[{status:200,description:"Error resolved"}]},{id:"admin-monitoring-errors-resolve-bulk",method:"POST",path:"/api/admin/monitoring/errors/resolve-bulk",summary:"Bulk resolve errors",description:"Resolves multiple errors at once",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"fingerprints",type:"array",required:!0,description:"Array of error fingerprints"},{name:"status",type:"string",required:!0,description:"New status",enum:["resolved","ignored"]}]},responses:[{status:200,description:"Errors resolved",example:{success:!0,data:{updated:5}}}]},{id:"admin-monitoring-errors-stats",method:"GET",path:"/api/admin/monitoring/errors/stats",summary:"Get error statistics",description:"Returns aggregated error statistics including counts by type, trends, and top errors",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"period",type:"string",required:!1,location:"query",description:"Time period",enum:["1h","24h","7d","30d"]}],responses:[{status:200,description:"Error statistics",example:{success:!0,data:{totalErrors:150,unresolvedCount:45,resolvedCount:100,ignoredCount:5,byType:{TypeError:50,NetworkError:30,ValidationError:70},trend:[{date:"2024-01-01",count:10}],topErrors:[]}}}]},{id:"admin-monitoring-performance",method:"GET",path:"/api/admin/monitoring/performance",summary:"Get performance overview",description:"Returns overall system performance metrics",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"period",type:"string",required:!1,location:"query",description:"Time period",enum:["1h","24h","7d","30d"]}],responses:[{status:200,description:"Performance metrics"}]},{id:"admin-monitoring-performance-database",method:"GET",path:"/api/admin/monitoring/performance/database",summary:"Get database performance",description:"Returns database query performance metrics",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"period",type:"string",required:!1,location:"query",description:"Time period"}],responses:[{status:200,description:"Database performance metrics"}]},{id:"admin-monitoring-performance-metrics",method:"GET",path:"/api/admin/monitoring/performance/metrics",summary:"Get detailed metrics",description:"Returns detailed performance metrics",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"metric",type:"string",required:!1,location:"query",description:"Specific metric to fetch"},{name:"period",type:"string",required:!1,location:"query",description:"Time period"}],responses:[{status:200,description:"Detailed metrics"}]},{id:"admin-monitoring-slo-history",method:"GET",path:"/api/admin/monitoring/slo-history",summary:"Get SLO history",description:"Returns historical SLO data and trends",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"sloName",type:"string",required:!1,location:"query",description:"SLO name filter"},{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"}],responses:[{status:200,description:"SLO history data"}]},{id:"admin-monitoring-stream",method:"GET",path:"/api/admin/monitoring/stream",summary:"Real-time monitoring stream",description:"Server-sent events stream for real-time monitoring data",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"SSE stream of monitoring events"}]},{id:"admin-monitoring-traces-list",method:"GET",path:"/api/admin/monitoring/traces",summary:"List traces",description:"Returns distributed traces for request tracking",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"service",type:"string",required:!1,location:"query",description:"Filter by service"},{name:"minDuration",type:"number",required:!1,location:"query",description:"Minimum duration in ms"},{name:"limit",type:"number",required:!1,location:"query",description:"Number of traces"}],responses:[{status:200,description:"List of traces"}]},{id:"admin-monitoring-traces-get",method:"GET",path:"/api/admin/monitoring/traces/{id}",summary:"Get trace details",description:"Returns detailed trace with all spans",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Trace ID"}],responses:[{status:200,description:"Trace details with spans"},{status:404,description:"Trace not found"}]},{id:"admin-monitoring-web-vitals",method:"GET",path:"/api/admin/monitoring/web-vitals",summary:"Get Web Vitals",description:"Returns Core Web Vitals metrics (LCP, CLS, FID, etc.)",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"period",type:"string",required:!1,location:"query",description:"Time period",enum:["24h","7d","30d"]},{name:"page",type:"string",required:!1,location:"query",description:"Filter by page path"}],responses:[{status:200,description:"Web Vitals metrics",example:{success:!0,data:{lcp:2500,cls:.1,fid:100}}}]},{id:"admin-monitoring-performance-endpoint-details",method:"GET",path:"/api/admin/monitoring/performance/endpoints/{path}",summary:"Get endpoint performance details",description:"Returns detailed performance metrics for a specific API endpoint including response times, percentiles, and status code distribution",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"path",type:"string",required:!0,location:"path",description:"URL-encoded endpoint path"},{name:"timeRange",type:"string",required:!1,location:"query",description:"Time range",enum:["1h","6h","24h","7d","30d"]},{name:"page",type:"number",required:!1,location:"query",description:"Page number (default: 1)"},{name:"limit",type:"number",required:!1,location:"query",description:"Results per page (default: 50, max: 100)"}],responses:[{status:200,description:"Endpoint performance details",example:{success:!0,data:{data:[],pagination:{},summary:{totalRequests:100,avgDuration:150}}}},{status:400,description:"Invalid parameters"},{status:404,description:"No data found for endpoint"}]},{id:"admin-monitoring-performance-slow",method:"GET",path:"/api/admin/monitoring/performance/slow",summary:"Get slow requests",description:"Returns requests that exceeded the duration threshold, sorted by duration descending",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"threshold",type:"number",required:!1,location:"query",description:"Duration threshold in ms (default: 500)"},{name:"timeRange",type:"string",required:!1,location:"query",description:"Time range",enum:["1h","6h","24h","7d","30d"]},{name:"path",type:"string",required:!1,location:"query",description:"Filter by endpoint path"},{name:"page",type:"number",required:!1,location:"query",description:"Page number (default: 1)"},{name:"limit",type:"number",required:!1,location:"query",description:"Results per page (default: 50, max: 100)"}],responses:[{status:200,description:"Slow requests with summary",example:{success:!0,data:{data:[],pagination:{},summary:{totalSlowRequests:10,avgSlowDuration:1500,topOffenders:[]}}}},{status:400,description:"Invalid threshold or pagination parameters"}]},{id:"admin-monitoring-performance-export",method:"GET",path:"/api/admin/monitoring/performance/export",summary:"Export performance data",description:"Exports performance metrics to CSV or JSON format. Rate limited to 10 requests per minute.",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"format",type:"string",required:!1,location:"query",description:"Export format (default: json)",enum:["csv","json"]},{name:"timeRange",type:"string",required:!1,location:"query",description:"Time range",enum:["1h","6h","24h","7d","30d"]},{name:"path",type:"string",required:!1,location:"query",description:"Filter by endpoint path"}],responses:[{status:200,description:"Export file download (CSV or JSON)"},{status:400,description:"Invalid format or time range"},{status:429,description:"Rate limit exceeded (10 requests per minute)"}]},{id:"admin-monitoring-performance-aggregate",method:"GET",path:"/api/admin/monitoring/performance/aggregate",summary:"Get aggregated metrics",description:"Returns aggregated performance metrics grouped by path, method, status code, or time period",category:"admin-monitoring",requiresAuth:!0,adminOnly:!0,parameters:[{name:"groupBy",type:"string",required:!1,location:"query",description:"Group by field (default: path)",enum:["path","method","statusCode","hour","day"]},{name:"metric",type:"string",required:!1,location:"query",description:"Metric to aggregate (default: avgDuration)",enum:["avgDuration","maxDuration","minDuration","count","errorRate"]},{name:"timeRange",type:"string",required:!1,location:"query",description:"Time range",enum:["1h","6h","24h","7d","30d"]},{name:"path",type:"string",required:!1,location:"query",description:"Filter by endpoint path"},{name:"limit",type:"number",required:!1,location:"query",description:"Number of results (default: 20, max: 100)"}],responses:[{status:200,description:"Aggregated metrics",example:{success:!0,data:{groupBy:"path",metric:"avgDuration",data:[{key:"/api/products",value:150,count:100}]}}},{status:400,description:"Invalid groupBy or metric parameter"}]}]},{id:"admin-dev-tools",name:"Admin: Dev Tools",description:"Development tools for linting, tests, and TypeScript",icon:"tool",endpoints:[{id:"admin-dev-tools-docs-guides",method:"GET",path:"/api/admin/dev-tools/docs/guides",summary:"List documentation guides",description:"Returns list of available documentation guides",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of guides",example:{success:!0,data:{guides:[]}}}]},{id:"admin-dev-tools-docs-guides-get",method:"GET",path:"/api/admin/dev-tools/docs/guides/{slug}",summary:"Get guide content",description:"Returns content of a specific documentation guide",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,parameters:[{name:"slug",type:"string",required:!0,location:"path",description:"Guide slug"}],responses:[{status:200,description:"Guide content"},{status:404,description:"Guide not found"}]},{id:"admin-dev-tools-docs-plans",method:"GET",path:"/api/admin/dev-tools/docs/plans",summary:"List development plans",description:"Returns list of development plan documents",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["active","archived"]}],responses:[{status:200,description:"List of plans"}]},{id:"admin-dev-tools-docs-plans-get",method:"GET",path:"/api/admin/dev-tools/docs/plans/{slug}",summary:"Get plan content",description:"Returns content of a specific development plan",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,parameters:[{name:"slug",type:"string",required:!0,location:"path",description:"Plan slug"}],responses:[{status:200,description:"Plan content"},{status:404,description:"Plan not found"}]},{id:"admin-dev-tools-lint-status",method:"GET",path:"/api/admin/dev-tools/lint",summary:"Get lint status",description:"Returns current ESLint status and issues",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Lint status",example:{success:!0,data:{errors:0,warnings:5}}}]},{id:"admin-dev-tools-lint-run",method:"POST",path:"/api/admin/dev-tools/lint",summary:"Run linter",description:"Triggers a lint run on the codebase",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"fix",type:"boolean",required:!1,description:"Auto-fix issues"},{name:"path",type:"string",required:!1,description:"Specific path to lint"}]},responses:[{status:200,description:"Lint results"}]},{id:"admin-dev-tools-tests-status",method:"GET",path:"/api/admin/dev-tools/tests",summary:"Get test status",description:"Returns test suite status and recent results",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Test status",example:{success:!0,data:{passed:150,failed:2,coverage:85}}}]},{id:"admin-dev-tools-tests-run",method:"POST",path:"/api/admin/dev-tools/tests",summary:"Run tests",description:"Triggers test execution",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"pattern",type:"string",required:!1,description:"Test file pattern"},{name:"coverage",type:"boolean",required:!1,description:"Generate coverage report"}]},responses:[{status:200,description:"Test results"}]},{id:"admin-dev-tools-typescript-status",method:"GET",path:"/api/admin/dev-tools/typescript",summary:"Get TypeScript status",description:"Returns TypeScript compilation status and errors",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"TypeScript status",example:{success:!0,data:{errors:0,warnings:3}}}]},{id:"admin-dev-tools-typescript-check",method:"POST",path:"/api/admin/dev-tools/typescript",summary:"Run type check",description:"Triggers TypeScript type checking",category:"admin-dev-tools",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Type check results"}]}]},{id:"admin-security",name:"Admin: Security",description:"Security monitoring, events, and blocked IPs",icon:"shield",endpoints:[{id:"admin-security-overview",method:"GET",path:"/api/admin/security/overview",summary:"Get security overview",description:"Returns security dashboard with threat summary",category:"admin-security",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Security overview",example:{success:!0,data:{threats:0,blockedRequests:150,suspiciousActivity:3}}}]},{id:"admin-security-events",method:"GET",path:"/api/admin/security/events",summary:"List security events",description:"Returns security events and audit log",category:"admin-security",requiresAuth:!0,adminOnly:!0,parameters:[{name:"type",type:"string",required:!1,location:"query",description:"Event type filter",enum:["login","failed_login","password_change","suspicious"]},{name:"severity",type:"string",required:!1,location:"query",description:"Severity filter",enum:["low","medium","high","critical"]},{name:"startDate",type:"string",required:!1,location:"query",description:"Start date"},{name:"endDate",type:"string",required:!1,location:"query",description:"End date"},{name:"limit",type:"number",required:!1,location:"query",description:"Number of events"}],responses:[{status:200,description:"List of security events"}]},{id:"admin-security-blocked-ips-list",method:"GET",path:"/api/admin/security/blocked-ips",summary:"List blocked IPs",description:"Returns list of blocked IP addresses",category:"admin-security",requiresAuth:!0,adminOnly:!0,parameters:[{name:"active",type:"boolean",required:!1,location:"query",description:"Filter active blocks only"}],responses:[{status:200,description:"List of blocked IPs"}]},{id:"admin-security-blocked-ips-create",method:"POST",path:"/api/admin/security/blocked-ips",summary:"Block IP address",description:"Adds an IP address to the block list",category:"admin-security",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"ip",type:"string",required:!0,description:"IP address to block"},{name:"reason",type:"string",required:!0,description:"Reason for blocking"},{name:"expiresAt",type:"string",required:!1,description:"Expiration date (ISO 8601)"}]},responses:[{status:201,description:"IP blocked"},{status:400,description:"Invalid IP address"}]},{id:"admin-security-blocked-ips-delete",method:"DELETE",path:"/api/admin/security/blocked-ips",summary:"Unblock IP address",description:"Removes an IP address from the block list",category:"admin-security",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"ip",type:"string",required:!0,description:"IP address to unblock"}]},responses:[{status:200,description:"IP unblocked"},{status:404,description:"IP not found in block list"}]}]},{id:"admin-api-docs",name:"Admin: API Docs",description:"API documentation collections and saved requests",icon:"book",endpoints:[{id:"admin-api-docs-collections-list",method:"GET",path:"/api/admin/api-docs/collections",summary:"List API collections",description:"Returns saved API request collections",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of collections"}]},{id:"admin-api-docs-collections-create",method:"POST",path:"/api/admin/api-docs/collections",summary:"Create collection",description:"Creates a new API request collection",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Collection name"},{name:"description",type:"string",required:!1,description:"Collection description"}]},responses:[{status:201,description:"Collection created"}]},{id:"admin-api-docs-collections-delete",method:"DELETE",path:"/api/admin/api-docs/collections",summary:"Delete collection",description:"Deletes an API request collection",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"id",type:"string",required:!0,description:"Collection ID"}]},responses:[{status:200,description:"Collection deleted"},{status:404,description:"Collection not found"}]},{id:"admin-api-docs-history",method:"GET",path:"/api/admin/api-docs/history",summary:"Get request history",description:"Returns history of API requests made in the playground",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,parameters:[{name:"limit",type:"number",required:!1,location:"query",description:"Number of entries"}],responses:[{status:200,description:"Request history"}]},{id:"admin-api-docs-saved-requests-list",method:"GET",path:"/api/admin/api-docs/saved-requests",summary:"List saved requests",description:"Returns saved API requests",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,parameters:[{name:"collectionId",type:"string",required:!1,location:"query",description:"Filter by collection"}],responses:[{status:200,description:"List of saved requests"}]},{id:"admin-api-docs-saved-requests-create",method:"POST",path:"/api/admin/api-docs/saved-requests",summary:"Save request",description:"Saves an API request for later use",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Request name"},{name:"method",type:"string",required:!0,description:"HTTP method"},{name:"path",type:"string",required:!0,description:"API path"},{name:"headers",type:"object",required:!1,description:"Request headers"},{name:"body",type:"object",required:!1,description:"Request body"},{name:"collectionId",type:"string",required:!1,description:"Collection to add to"}]},responses:[{status:201,description:"Request saved"}]},{id:"admin-api-docs-saved-requests-delete",method:"DELETE",path:"/api/admin/api-docs/saved-requests",summary:"Delete saved request",description:"Deletes a saved API request",category:"admin-api-docs",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"id",type:"string",required:!0,description:"Request ID"}]},responses:[{status:200,description:"Request deleted"}]}]},{id:"admin-cache",name:"Admin: Cache",description:"Cache statistics and invalidation",icon:"database",endpoints:[{id:"admin-cache-stats",method:"GET",path:"/api/admin/cache/stats",summary:"Get cache statistics",description:"Returns cache hit/miss statistics and memory usage",category:"admin-cache",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"Cache statistics",example:{success:!0,data:{hits:15e3,misses:500,hitRate:96.8,memoryUsage:"25MB"}}}]},{id:"admin-cache-invalidate",method:"POST",path:"/api/admin/cache/invalidate",summary:"Invalidate cache",description:"Invalidates cache entries by pattern or key",category:"admin-cache",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"pattern",type:"string",required:!1,description:"Cache key pattern to invalidate"},{name:"keys",type:"array",required:!1,description:"Specific cache keys to invalidate"},{name:"all",type:"boolean",required:!1,description:"Invalidate all cache entries"}]},responses:[{status:200,description:"Cache invalidated",example:{success:!0,data:{invalidated:25}}}]}]},{id:"admin-inventory",name:"Admin: Inventory",description:"Inventory and stock management",icon:"archive",endpoints:[{id:"admin-inventory-list",method:"GET",path:"/api/admin/inventory",summary:"List inventory",description:"Returns inventory status for all products",category:"admin-inventory",requiresAuth:!0,adminOnly:!0,parameters:[{name:"status",type:"string",required:!1,location:"query",description:"Filter by stock status",enum:["in_stock","low_stock","out_of_stock"]},{name:"categoryId",type:"number",required:!1,location:"query",description:"Filter by category"},{name:"search",type:"string",required:!1,location:"query",description:"Search product name"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"Inventory list",example:{success:!0,data:{items:[],total:0}}}]},{id:"admin-inventory-get",method:"GET",path:"/api/admin/inventory/{productId}",summary:"Get product inventory",description:"Returns inventory details for a specific product",category:"admin-inventory",requiresAuth:!0,adminOnly:!0,parameters:[{name:"productId",type:"number",required:!0,location:"path",description:"Product ID"}],responses:[{status:200,description:"Product inventory"},{status:404,description:"Product not found"}]},{id:"admin-inventory-update",method:"PATCH",path:"/api/admin/inventory/{productId}",summary:"Update inventory",description:"Updates inventory quantity for a product",category:"admin-inventory",requiresAuth:!0,adminOnly:!0,parameters:[{name:"productId",type:"number",required:!0,location:"path",description:"Product ID"}],requestBody:{contentType:"application/json",fields:[{name:"quantity",type:"number",required:!1,description:"New stock quantity"},{name:"adjustment",type:"number",required:!1,description:"Adjustment amount (+/-)"},{name:"reason",type:"string",required:!1,description:"Reason for adjustment"},{name:"lowStockThreshold",type:"number",required:!1,description:"Low stock alert threshold"}]},responses:[{status:200,description:"Inventory updated"},{status:404,description:"Product not found"}]}]},{id:"admin-cron",name:"Admin: Cron Jobs",description:"Scheduled tasks and maintenance operations",icon:"clock",endpoints:[{id:"admin-cron-cleanup-errors",method:"GET",path:"/api/cron/cleanup-errors",summary:"Clean up old error data",description:"Removes error logs older than 30 days, resets counts on resolved errors, and deletes orphaned statistics. Should be called by a cron scheduler (e.g., Vercel Cron).",category:"admin-cron",requiresAuth:!0,adminOnly:!0,parameters:[],requestBody:void 0,responses:[{status:200,description:"Cleanup completed successfully",example:{success:!0,retentionDays:30,cutoffDate:"2024-01-01T00:00:00.000Z",deletedLogs:150,resetStatistics:25,deletedOrphanedStats:10,durationMs:1250}},{status:401,description:"Unauthorized - invalid or missing CRON_SECRET"},{status:500,description:"Cleanup failed"}]}]},{id:"analytics",name:"Analytics Tracking",description:"Client-side analytics event tracking",icon:"activity",endpoints:[{id:"analytics-track-events",method:"POST",path:"/api/analytics/track",summary:"Track analytics events",description:"Track custom analytics events (supports batching up to 50 events)",category:"analytics",requiresAuth:!1,requestBody:{contentType:"application/json",fields:[{name:"events",type:"array",required:!0,description:"Array of events to track (1-50 events)"},{name:"events[].eventType",type:"string",required:!0,description:"Event type/category (max 50 chars)"},{name:"events[].eventName",type:"string",required:!0,description:"Event name/action (max 100 chars)"},{name:"events[].sessionId",type:"string",required:!0,description:"Session ID"},{name:"events[].visitorId",type:"string",required:!0,description:"Visitor ID (max 50 chars)"},{name:"events[].path",type:"string",required:!0,description:"Page path (max 500 chars)"},{name:"events[].referrer",type:"string",required:!1,description:"Referrer URL (max 500 chars)"},{name:"events[].properties",type:"object",required:!1,description:"Additional event properties"}],example:{events:[{eventType:"interaction",eventName:"add_to_cart",sessionId:"sess_123",visitorId:"vis_456",path:"/products/123",properties:{productId:123,quantity:1}}]}},responses:[{status:200,description:"Events tracked successfully",example:{success:!0,eventsTracked:1}},{status:400,description:"Invalid event format or validation failed"},{status:500,description:"Failed to track events"}]}]},{id:"user-loyalty",name:"User: Loyalty",description:"User loyalty points, tiers, and rewards",icon:"award",endpoints:[{id:"user-loyalty-get",method:"GET",path:"/api/user/loyalty",summary:"Get user loyalty information",description:"Get current user's loyalty program status, points, tier, and transaction history",category:"user-loyalty",requiresAuth:!0,responses:[{status:200,description:"Loyalty information including points, tier, progress, and transactions",example:{success:!0,data:{enrolled:!0,program:{id:1,name:"Rewards",pointsPerDollar:10,redemptionRate:.01},points:{current:500,lifetime:1200,value:5},tier:{id:1,name:"Silver",minPoints:0,pointsMultiplier:1},nextTier:{id:2,name:"Gold",minPoints:1e3,pointsToReach:800,progressPercent:20},transactions:[]}}},{status:401,description:"Unauthorized"}]}]},{id:"user-affiliate",name:"User: Affiliate Program",description:"Affiliate registration, tracking, sales, and payouts",icon:"share-2",endpoints:[{id:"user-affiliate-get",method:"GET",path:"/api/user/affiliate",summary:"Get affiliate account",description:"Get current user's affiliate account and dashboard data",category:"user-affiliate",requiresAuth:!0,responses:[{status:200,description:"Affiliate account with referral URL, earnings, and dashboard data",example:{success:!0,data:{id:1,code:"JOHN123",referralUrl:"https://example.com/ref/JOHN123",status:"active",commissionRate:10,totalEarnings:250,pendingEarnings:50,totalClicks:500,totalSales:25}}},{status:401,description:"Unauthorized",example:{success:!1,error:{code:"UNAUTHORIZED",message:"Authentication required"}}},{status:404,description:"Not an affiliate",example:{success:!1,error:{code:"NOT_FOUND",message:"No affiliate account found"}}}]},{id:"user-affiliate-register",method:"POST",path:"/api/user/affiliate",summary:"Register as affiliate",description:"Register as an affiliate to earn commissions from referrals",category:"user-affiliate",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"website",type:"string",required:!1,description:"Affiliate website URL (max 255 chars)"},{name:"bio",type:"string",required:!1,description:"Affiliate bio/description (max 1000 chars)"}],example:{website:"https://mysite.com",bio:"Tech influencer with 100k followers"}},responses:[{status:200,description:"Affiliate registration submitted",example:{success:!0,data:{id:1,code:"JOHN123",status:"pending",message:"Your application is under review"}}},{status:400,description:"Validation failed or already registered",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"You are already registered as an affiliate"}}}]},{id:"user-affiliate-update",method:"PUT",path:"/api/user/affiliate",summary:"Update affiliate profile",description:"Update affiliate profile information",category:"user-affiliate",requiresAuth:!0,requestBody:{contentType:"application/json",fields:[{name:"website",type:"string",required:!1,description:"Website URL"},{name:"bio",type:"string",required:!1,description:"Bio/description"},{name:"payoutMethod",type:"string",required:!1,description:"Preferred payout method"}],example:{payoutMethod:"PayPal"}},responses:[{status:200,description:"Updated affiliate profile",example:{success:!0,data:{id:1,website:"https://mysite.com",payoutMethod:"PayPal",updatedAt:"2024-01-15T10:00:00Z"}}},{status:400,description:"Validation failed",example:{success:!1,error:{code:"VALIDATION_ERROR",message:"Invalid website URL"}}},{status:404,description:"No affiliate account found",example:{success:!1,error:{code:"NOT_FOUND",message:"No affiliate account found"}}}]},{id:"user-affiliate-clicks",method:"GET",path:"/api/user/affiliate/clicks",summary:"Get affiliate click statistics",description:"Get click tracking data and statistics for affiliate account",category:"user-affiliate",requiresAuth:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number",example:1},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page",example:50},{name:"period",type:"string",required:!1,location:"query",description:"Time period",enum:["7d","30d","90d"]}],responses:[{status:200,description:"Click data with statistics and daily breakdown",example:{success:!0,data:{totalClicks:500,uniqueVisitors:350,dailyBreakdown:[{date:"2024-01-15",clicks:45,uniqueVisitors:30}],pagination:{page:1,limit:50,total:500,totalPages:10}}}},{status:404,description:"No affiliate account found",example:{success:!1,error:{code:"NOT_FOUND",message:"No affiliate account found"}}}]},{id:"user-affiliate-sales",method:"GET",path:"/api/user/affiliate/sales",summary:"Get affiliate sales",description:"Get sales attributed to affiliate referrals",category:"user-affiliate",requiresAuth:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number",example:1},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page",example:20},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","approved","paid","cancelled"]}],responses:[{status:200,description:"Paginated list of affiliate sales with commission details",example:{success:!0,data:{sales:[{id:1,orderId:100,amount:150,commission:15,status:"approved",createdAt:"2024-01-15T10:00:00Z"}],totals:{totalSales:25,totalAmount:2500,totalCommission:250},pagination:{page:1,limit:20,total:25,totalPages:2}}}},{status:404,description:"No affiliate account found",example:{success:!1,error:{code:"NOT_FOUND",message:"No affiliate account found"}}}]},{id:"user-affiliate-payouts-list",method:"GET",path:"/api/user/affiliate/payouts",summary:"Get affiliate payouts",description:"Get payout history for affiliate account",category:"user-affiliate",requiresAuth:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number",example:1},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page",example:20},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status",enum:["pending","approved","paid","rejected"]}],responses:[{status:200,description:"Paginated list of payouts",example:{success:!0,data:{payouts:[{id:1,amount:100,status:"paid",method:"PayPal",requestedAt:"2024-01-10T10:00:00Z",paidAt:"2024-01-15T10:00:00Z"}],pendingBalance:50,pagination:{page:1,limit:20,total:5,totalPages:1}}}},{status:404,description:"No affiliate account found",example:{success:!1,error:{code:"NOT_FOUND",message:"No affiliate account found"}}}]},{id:"user-affiliate-payouts-request",method:"POST",path:"/api/user/affiliate/payouts",summary:"Request affiliate payout",description:"Request a payout of earned commissions",category:"user-affiliate",requiresAuth:!0,responses:[{status:200,description:"Payout request submitted",example:{success:!0,data:{payoutId:123,amount:50,status:"pending",message:"Payout request submitted successfully"}}},{status:400,description:"Account not active or insufficient balance",example:{success:!1,error:{code:"INSUFFICIENT_BALANCE",message:"Minimum payout amount is $50"}}},{status:404,description:"No affiliate account found",example:{success:!1,error:{code:"NOT_FOUND",message:"No affiliate account found"}}}]},{id:"affiliate-track-click",method:"GET",path:"/api/affiliates/{code}/track",summary:"Track affiliate click",description:"Track a click from an affiliate referral link",category:"user-affiliate",requiresAuth:!1,parameters:[{name:"code",type:"string",required:!0,location:"path",description:"Affiliate referral code"}],responses:[{status:200,description:"Click tracked successfully",example:{success:!0,data:{tracked:!0}}},{status:404,description:"Invalid affiliate code",example:{success:!1,error:{code:"INVALID_CODE",message:"Affiliate code not found"}}}]}]},{id:"dev-tickets",name:"Dev: Tickets",description:"Development ticket management",icon:"clipboard",endpoints:[{id:"dev-tickets-list",method:"GET",path:"/api/dev/tickets",summary:"List dev tickets",description:"Returns paginated list of development tickets",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,parameters:[{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"},{name:"type",type:"string",required:!1,location:"query",description:"Filter by type"},{name:"priority",type:"string",required:!1,location:"query",description:"Filter by priority"},{name:"projectId",type:"string",required:!1,location:"query",description:"Filter by project"}],responses:[{status:200,description:"List of tickets"}]},{id:"dev-tickets-create",method:"POST",path:"/api/dev/tickets",summary:"Create dev ticket",description:"Creates a new development ticket",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"title",type:"string",required:!0,description:"Ticket title"},{name:"description",type:"string",required:!1,description:"Ticket description"},{name:"type",type:"string",required:!0,description:"Ticket type"},{name:"priority",type:"string",required:!0,description:"Priority level"},{name:"projectId",type:"string",required:!0,description:"Project ID"}]},responses:[{status:201,description:"Ticket created"}]},{id:"dev-tickets-get",method:"GET",path:"/api/dev/tickets/{id}",summary:"Get dev ticket",description:"Returns a single development ticket",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],responses:[{status:200,description:"Ticket details"},{status:404,description:"Ticket not found"}]},{id:"dev-tickets-update",method:"PUT",path:"/api/dev/tickets/{id}",summary:"Update dev ticket",description:"Updates an existing development ticket",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Ticket ID"}],requestBody:{contentType:"application/json",fields:[{name:"title",type:"string",required:!1,description:"Ticket title"},{name:"description",type:"string",required:!1,description:"Ticket description"},{name:"status",type:"string",required:!1,description:"Ticket status"},{name:"priority",type:"string",required:!1,description:"Priority level"}]},responses:[{status:200,description:"Ticket updated"},{status:404,description:"Ticket not found"}]}]},{id:"dev-projects",name:"Dev: Projects",description:"Development project management",icon:"folder",endpoints:[{id:"dev-projects-list",method:"GET",path:"/api/dev/projects",summary:"List dev projects",description:"Returns list of development projects",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,responses:[{status:200,description:"List of projects"}]},{id:"dev-projects-create",method:"POST",path:"/api/dev/projects",summary:"Create dev project",description:"Creates a new development project",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Project name"},{name:"key",type:"string",required:!0,description:"Project key (e.g., CORE)"},{name:"description",type:"string",required:!1,description:"Project description"},{name:"color",type:"string",required:!1,description:"Project color"}]},responses:[{status:201,description:"Project created"}]},{id:"dev-projects-get",method:"GET",path:"/api/dev/projects/{id}",summary:"Get project details",description:"Returns project with stats, milestones, and recent sprints",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Project ID"}],responses:[{status:200,description:"Project details with stats"},{status:404,description:"Project not found"}]},{id:"dev-projects-update",method:"PATCH",path:"/api/dev/projects/{id}",summary:"Update project",description:"Updates project details",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Project ID"}],requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Project name"},{name:"key",type:"string",required:!1,description:"Project key"},{name:"description",type:"string",required:!1,description:"Project description"},{name:"color",type:"string",required:!1,description:"Project color"},{name:"leadId",type:"number",required:!1,description:"Project lead user ID"},{name:"isActive",type:"boolean",required:!1,description:"Active status"}]},responses:[{status:200,description:"Project updated"},{status:404,description:"Project not found"}]},{id:"dev-projects-delete",method:"DELETE",path:"/api/dev/projects/{id}",summary:"Delete project",description:"Deletes project (fails if tickets exist)",category:"dev-tickets",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Project ID"}],responses:[{status:200,description:"Project deleted"},{status:400,description:"Project has tickets"},{status:404,description:"Project not found"}]},{id:"dev-labels-list",method:"GET",path:"/api/dev/labels",summary:"List labels",description:"Returns all ticket labels with usage counts",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"search",type:"string",required:!1,location:"query",description:"Search in name/description"}],responses:[{status:200,description:"List of labels"}]},{id:"dev-labels-create",method:"POST",path:"/api/dev/labels",summary:"Create label",description:"Creates a new ticket label",category:"dev-projects",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Label name (unique)"},{name:"color",type:"string",required:!0,description:"Label color (hex)"},{name:"description",type:"string",required:!1,description:"Label description"}],example:{name:"bug",color:"#ef4444",description:"Bug reports"}},responses:[{status:201,description:"Label created"},{status:400,description:"Label name exists"}]},{id:"dev-labels-delete",method:"DELETE",path:"/api/dev/labels",summary:"Delete label",description:"Deletes a label (disconnects from tickets)",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"query",description:"Label ID"}],responses:[{status:200,description:"Label deleted"},{status:404,description:"Label not found"}]},{id:"dev-milestones-list",method:"GET",path:"/api/dev/milestones",summary:"List milestones",description:"Returns milestones with progress stats",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"projectId",type:"string",required:!1,location:"query",description:"Filter by project"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"Paginated list of milestones"}]},{id:"dev-milestones-create",method:"POST",path:"/api/dev/milestones",summary:"Create milestone",description:"Creates a new milestone for a project",category:"dev-projects",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Milestone name"},{name:"description",type:"string",required:!1,description:"Milestone description"},{name:"projectId",type:"string",required:!0,description:"Project ID"},{name:"startDate",type:"string",required:!1,description:"Start date (ISO)"},{name:"dueDate",type:"string",required:!1,description:"Due date (ISO)"}]},responses:[{status:201,description:"Milestone created"},{status:404,description:"Project not found"}]},{id:"dev-milestones-get",method:"GET",path:"/api/dev/milestones/{id}",summary:"Get milestone",description:"Returns milestone with tickets and progress stats",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Milestone ID"}],responses:[{status:200,description:"Milestone with stats"},{status:404,description:"Milestone not found"}]},{id:"dev-milestones-update",method:"PATCH",path:"/api/dev/milestones/{id}",summary:"Update milestone",description:"Updates milestone details or status",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Milestone ID"}],requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Milestone name"},{name:"description",type:"string",required:!1,description:"Description"},{name:"status",type:"string",required:!1,description:"Status",enum:["PLANNING","ACTIVE","COMPLETED","CANCELLED"]},{name:"startDate",type:"string",required:!1,description:"Start date"},{name:"dueDate",type:"string",required:!1,description:"Due date"}]},responses:[{status:200,description:"Milestone updated"},{status:404,description:"Milestone not found"}]},{id:"dev-milestones-delete",method:"DELETE",path:"/api/dev/milestones/{id}",summary:"Delete milestone",description:"Deletes milestone (unlinks tickets)",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Milestone ID"}],responses:[{status:200,description:"Milestone deleted"},{status:404,description:"Milestone not found"}]},{id:"dev-sprints-list",method:"GET",path:"/api/dev/sprints",summary:"List sprints",description:"Returns sprints with progress stats",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"projectId",type:"string",required:!1,location:"query",description:"Filter by project"},{name:"status",type:"string",required:!1,location:"query",description:"Filter by status"},{name:"page",type:"number",required:!1,location:"query",description:"Page number"},{name:"limit",type:"number",required:!1,location:"query",description:"Items per page"}],responses:[{status:200,description:"Paginated list of sprints"}]},{id:"dev-sprints-create",method:"POST",path:"/api/dev/sprints",summary:"Create sprint",description:"Creates a new sprint (checks for date overlaps)",category:"dev-projects",requiresAuth:!0,adminOnly:!0,requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!0,description:"Sprint name"},{name:"goal",type:"string",required:!1,description:"Sprint goal"},{name:"projectId",type:"string",required:!0,description:"Project ID"},{name:"startDate",type:"string",required:!0,description:"Start date (ISO)"},{name:"endDate",type:"string",required:!0,description:"End date (ISO)"}]},responses:[{status:201,description:"Sprint created"},{status:400,description:"Overlapping sprint exists"}]},{id:"dev-sprints-get",method:"GET",path:"/api/dev/sprints/{id}",summary:"Get sprint",description:"Returns sprint with tickets and detailed stats",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Sprint ID"}],responses:[{status:200,description:"Sprint with stats"},{status:404,description:"Sprint not found"}]},{id:"dev-sprints-update",method:"PATCH",path:"/api/dev/sprints/{id}",summary:"Update sprint",description:"Updates sprint (only one active per project)",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Sprint ID"}],requestBody:{contentType:"application/json",fields:[{name:"name",type:"string",required:!1,description:"Sprint name"},{name:"goal",type:"string",required:!1,description:"Sprint goal"},{name:"status",type:"string",required:!1,description:"Status",enum:["PLANNING","ACTIVE","COMPLETED","CANCELLED"]},{name:"startDate",type:"string",required:!1,description:"Start date"},{name:"endDate",type:"string",required:!1,description:"End date"}]},responses:[{status:200,description:"Sprint updated"},{status:400,description:"Another active sprint exists"},{status:404,description:"Sprint not found"}]},{id:"dev-sprints-delete",method:"DELETE",path:"/api/dev/sprints/{id}",summary:"Delete sprint",description:"Deletes sprint (unlinks tickets)",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Sprint ID"}],responses:[{status:200,description:"Sprint deleted"},{status:404,description:"Sprint not found"}]},{id:"dev-sprints-start",method:"POST",path:"/api/dev/sprints/{id}/start",summary:"Start sprint",description:"Starts a sprint (only one active per project)",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Sprint ID"}],responses:[{status:200,description:"Sprint started"},{status:400,description:"Another sprint is active"},{status:404,description:"Sprint not found"}]},{id:"dev-sprints-complete",method:"POST",path:"/api/dev/sprints/{id}/complete",summary:"Complete sprint",description:"Completes a sprint and optionally moves incomplete tickets",category:"dev-projects",requiresAuth:!0,adminOnly:!0,parameters:[{name:"id",type:"string",required:!0,location:"path",description:"Sprint ID"}],requestBody:{contentType:"application/json",fields:[{name:"moveIncompleteToSprintId",type:"string",required:!1,description:"Sprint ID to move incomplete tickets to"},{name:"moveIncompleteToBacklog",type:"boolean",required:!1,description:"Move incomplete tickets to backlog"}]},responses:[{status:200,description:"Sprint completed"},{status:400,description:"Sprint not active"},{status:404,description:"Sprint not found"}]}]},{id:"dev-metrics",name:"Dev: Metrics",description:"Development metrics, burndown charts, and velocity tracking",icon:"trending-up",endpoints:[{id:"dev-metrics-dashboard",method:"GET",path:"/api/dev/metrics/dashboard",summary:"Get metrics dashboard",description:"Returns development metrics dashboard data",category:"dev-metrics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"projectId",type:"number",required:!1,location:"query",description:"Filter by project"}],responses:[{status:200,description:"Dashboard metrics",example:{success:!0,data:{openTickets:25,closedThisWeek:15,velocity:42}}}]},{id:"dev-metrics-burndown",method:"GET",path:"/api/dev/metrics/burndown",summary:"Get burndown chart",description:"Returns sprint burndown chart data",category:"dev-metrics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"sprintId",type:"number",required:!0,location:"query",description:"Sprint ID"}],responses:[{status:200,description:"Burndown data",example:{success:!0,data:{ideal:[],actual:[],remaining:25}}}]},{id:"dev-metrics-velocity",method:"GET",path:"/api/dev/metrics/velocity",summary:"Get velocity metrics",description:"Returns team velocity metrics over time",category:"dev-metrics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"sprints",type:"number",required:!1,location:"query",description:"Number of sprints to include"},{name:"projectId",type:"number",required:!1,location:"query",description:"Filter by project"}],responses:[{status:200,description:"Velocity data"}]},{id:"dev-reports-workload",method:"GET",path:"/api/dev/reports/workload",summary:"Get workload report",description:"Returns team workload distribution report",category:"dev-metrics",requiresAuth:!0,adminOnly:!0,parameters:[{name:"projectId",type:"number",required:!1,location:"query",description:"Filter by project"}],responses:[{status:200,description:"Workload report",example:{success:!0,data:{byAssignee:[],unassigned:5}}}]}]}],apiRegistry={version:"1.0.0",title:"Elite Events API",description:"API documentation for the Elite Events e-commerce platform",baseUrl:"/api",categories};function getEndpointById(id){for(const category of categories){const endpoint=category.endpoints.find(e=>e.id===id);if(endpoint)return endpoint}}function searchEndpoints(query){const lowerQuery=query.toLowerCase();return function getAllEndpoints(){return categories.flatMap(c=>c.endpoints)}().filter(e=>e.summary.toLowerCase().includes(lowerQuery)||e.path.toLowerCase().includes(lowerQuery)||e.description?.toLowerCase().includes(lowerQuery))}}}]);