{"info":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","description":"<html><head></head><body><p>Ravine Coffee API v1 provides a complete set of endpoints for managing the operational workflow of Ravine Coffee, including ordering, menu management, and user administration. The API is designed to integrate seamlessly with the frontend client, admin dashboard, and cashier system.</p>\n<p>This version of the API serves as the foundation for the first generation of the Ravine Coffee application and can be extended with additional capabilities in the future.</p>\n<p><strong>BASE_URL</strong> = <a href=\"http://ravine-coffee-be.vercel.app/\">http://ravine-coffee-be.vercel.app</a></p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"33200982","collectionId":"30bb0443-b35d-4dd1-bd90-6eb08850613b","publishedId":"2sB3WwowG9","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2025-11-15T19:10:11.000Z"},"item":[{"name":"Auth","item":[{"name":"Login","id":"64bc700c-d872-4433-92d2-cae5e2d99b32","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"email\": \"<string>\",\r\n    \"password\": \"<string>\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/auth/login","description":"<h3 id=\"summary\">Summary</h3>\n<p>Authenticates a user (Admin or Cashier) and returns an access token along with user information.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>No authentication required for this endpoint.</p>\n<h3 id=\"payload\">Payload</h3>\n<ul>\n<li><p>email (string, required): User's email address.</p>\n</li>\n<li><p>password (string, required): User's password.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"User not found\"</p>\n<p>400 Bad Request:<br />\"User is Customer\"<br />\"Invalid credentials\"<br />\"Your account is inactive, please contact admin\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Login successful\",\n  \"result\": {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjdiNmYyM2I4LWRmNGQtNGMxMS05ZjI1LTRkOTZiODcwMzgwMSIsImVtYWlsIjoiYWRtaW5AZ21haWwuY29tIiwiaWF0IjoxNzYzMjQ1ODg2LCJleHAiOjE3NjMzMzIyODZ9.PjYB8LOpuKo7RIZRyd9t4ciDs7B-Qbh7I0K3R5hkUZM\",\n    \"user\": {\n      \"id\": \"7b6f23b8-df4d-4c11-9f25-4d96b8703801\",\n      \"email\": \"admin@gmail.com\",\n      \"fullName\": \"admin\",\n      \"phoneNumber\": \"085643536253\",\n      \"avatar\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/avatars/1763128817021-pas foto.jpg\",\n      \"dateOfBirth\": null,\n      \"status\": \"ACTIVE\",\n      \"city\": \"Bali\",\n      \"role\": \"ADMIN\",\n      \"createdAt\": \"2025-11-07T21:08:58.322Z\",\n      \"updatedAt\": \"2025-11-14T14:00:18.586Z\"\n    }\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["api","auth","login"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"64bc700c-d872-4433-92d2-cae5e2d99b32"},{"name":"Me","id":"e64e70b5-a64e-401b-8bc5-1384de4e4963","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"{{BASE_URL}}/api/auth/me","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves the authenticated user's profile information. Works for both Admin and Cashier accounts.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"User not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"User fetched successfully\",\n  \"result\": {\n    \"id\": \"e6f0de76-8de9-42b7-aa14-2789336ef63f\",\n    \"email\": \"cashier1@gmail.com\",\n    \"fullName\": \"cashier1\",\n    \"phoneNumber\": \"08232323223\",\n    \"avatar\": null,\n    \"dateOfBirth\": \"2001-11-08T00:00:00.000Z\",\n    \"status\": \"ACTIVE\",\n    \"city\": \"Jakarta\",\n    \"role\": \"CASHIER\",\n    \"createdAt\": \"2025-11-07T21:13:42.661Z\",\n    \"updatedAt\": \"2025-11-15T22:28:02.292Z\"\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["api","auth","me"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e64e70b5-a64e-401b-8bc5-1384de4e4963"}],"id":"bbdbba63-c670-41a2-ade2-69e4b5fcb340","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"8c072ffd-fe27-4756-bed9-69d0e7ca9628","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"4bc60c85-d349-4b4c-9fb9-676aa36071b7","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"bbdbba63-c670-41a2-ade2-69e4b5fcb340","description":""},{"name":"Admin","item":[{"name":"Product","item":[{"name":"Get Products","id":"aa0b63e2-e88c-4b5a-b0a4-a52cbf25e81a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/products?cursor=<string>&offset=<number>&category=<coffee|milk|tea|food|snack|bundle>&limit=<number>","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves an cursor-based pagination of products for the admin area. Supports optional filtering by category and search, using cursor-based pagination.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<ul>\n<li><p><strong>limit</strong> (integer, optional, default: 12): Number of items to return per batch.</p>\n</li>\n<li><p><strong>cursor</strong> (string, optional): Cursor ID used to fetch the next batch of products.</p>\n</li>\n<li><p><strong>category</strong> (string, optional): Filter products by category. One of: coffee, milk, tea, food, snack, bundle</p>\n</li>\n<li><p><strong>search</strong> (string, optional): Search products by name.</p>\n</li>\n</ul>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Products fetched successfully\",\n  \"result\": {\n    \"products\": [\n      {\n        \"name\": \"Hazelnut Coffee\",\n        \"id\": \"3b765e6c-cb4d-41b2-b4c6-a016dd019f39\",\n        \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762712860579-Varian 1.png\",\n        \"category\": \"coffee\",\n        \"isAvailable\": true,\n        \"price\": \"22000\",\n        \"description\": \"\",\n        \"slug\": \"hazelnut-coffee\"\n      }\n    ],\n    \"nextCursor\": null\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","products"],"host":["{{BASE_URL}}"],"query":[{"key":"cursor","value":"<string>"},{"key":"offset","value":"<number>"},{"key":"category","value":"<coffee|milk|tea|food|snack|bundle>"},{"key":"limit","value":"<number>"}],"variable":[]}},"response":[],"_postman_id":"aa0b63e2-e88c-4b5a-b0a4-a52cbf25e81a"},{"name":"Get Total Products","id":"955d612b-a32f-4998-a80f-57ae2db5ee24","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/products/count","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves the total number of products available in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Total products fetched successfully\",\n  \"result\": 14\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","products","count"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"955d612b-a32f-4998-a80f-57ae2db5ee24"},{"name":"Create Product","id":"9120cc89-bdff-4e9b-a0d3-14dd7b4241cd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"name","value":"<string>","type":"text","uuid":"2452baa9-dba9-4b2a-bfe1-da58bf5d1a52"},{"key":"price","value":"<number>","type":"text","uuid":"3435660c-4e1c-40fc-845d-6dd9f11908db"},{"key":"category","value":"<coffee|milk|tea|food|snack|bundle>","type":"text","uuid":"53d8ed65-ddb7-4e59-acfa-fc17329163b5"},{"key":"image","type":"file","uuid":"c2363ebf-f614-4a08-8f01-2af44e26d0f0","value":null},{"key":"description","value":"<string>?","type":"text","uuid":"71274210-91b6-48d9-b420-3b5aa10c6f13"}]},"url":"{{BASE_URL}}/api/admin/products","description":"<h3 id=\"summary\">Summary</h3>\n<p>Creates a new product in the admin area. This endpoint accepts multipart/form-data because it includes an image upload.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"payload-multipartform-data\">Payload (multipart/form-data)</h3>\n<ul>\n<li><p><strong>image</strong> (file, required): Product image file.</p>\n</li>\n<li><p><strong>name</strong> (string, required): Name of the product.</p>\n</li>\n<li><p><strong>price</strong> (number, required): Price of the product.</p>\n</li>\n<li><p><strong>category</strong> (string, required): Product category. One of: coffee, milk, tea, food, snack, bundle</p>\n</li>\n<li><p><strong>description</strong> (string, optional): Product description.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Product image is required\"<br />\"Invalid input\"<br />\"Product name already exist\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Product created successfully\",\n  \"product\": {\n    \"id\": \"a9cd8b8f-90d8-4e7d-8c2e-7c95d65dcb12\",\n    \"name\": \"Hazelnut Latte\",\n    \"description\": \"Smooth espresso with hazelnut flavor.\",\n    \"slug\": \"hazelnut-latte\",\n    \"price\": \"25000\",\n    \"image\": \"https://example.cdn.com/product-images/hazelnut-latte.png\",\n    \"isAvailable\": true,\n    \"category\": \"coffee\",\n    \"createdAt\": \"2025-11-16T08:12:45.123Z\",\n    \"updatedAt\": \"2025-11-16T08:12:45.123Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","products"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9120cc89-bdff-4e9b-a0d3-14dd7b4241cd"},{"name":"Update Product","id":"8cd36f16-028f-41dc-b240-5b0e95e0545f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"formdata","formdata":[{"key":"name","value":"<string>","type":"text","uuid":"f9c754f5-9041-4d72-9d92-3dabff8ad96c"},{"key":"description","value":"<string>?","type":"text","uuid":"2452baa9-dba9-4b2a-bfe1-da58bf5d1a52"},{"key":"price","value":"<number>","type":"text","uuid":"3435660c-4e1c-40fc-845d-6dd9f11908db"},{"key":"category","value":"<coffee|milk|tea|food|snack|bundle>","type":"text","uuid":"53d8ed65-ddb7-4e59-acfa-fc17329163b5"},{"key":"image","type":"file","uuid":"c2363ebf-f614-4a08-8f01-2af44e26d0f0","value":null}]},"url":"{{BASE_URL}}/api/admin/products/:productId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Updates an existing product in the admin area. This endpoint accepts multipart/form-data and supports updating any product field, including replacing the product image.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"payload-multipartform-data\">Payload (multipart/form-data)</h3>\n<ul>\n<li><p><strong>image</strong> (file, optional): New product image file. If provided, the old image will be deleted and replaced.</p>\n</li>\n<li><p><strong>name</strong> (string, required): Updated product name.</p>\n</li>\n<li><p><strong>price</strong> (number, required): Updated product price.</p>\n</li>\n<li><p><strong>category</strong> (string, required): Updated product category. One of: coffee, milk, tea, food, snack, bundle</p>\n</li>\n<li><p><strong>description</strong> (string, optional): Updated product description.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>404 Not Found:<br />\"Product not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Product updated successfully\",\n  \"product\": {\n    \"id\": \"a9cd8b8f-90d8-4e7d-8c2e-7c95d65dcb12\",\n    \"name\": \"Hazelnut Latte Premium\",\n    \"description\": \"Smooth espresso with enhanced hazelnut flavor.\",\n    \"slug\": \"hazelnut-latte-premium\",\n    \"price\": \"28000\",\n    \"image\": \"https://example.cdn.com/product-images/hazelnut-latte-premium.png\",\n    \"isAvailable\": true,\n    \"category\": \"coffee\",\n    \"createdAt\": \"2025-11-10T08:12:45.123Z\",\n    \"updatedAt\": \"2025-11-16T10:22:12.987Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","products",":productId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"productId"}]}},"response":[],"_postman_id":"8cd36f16-028f-41dc-b240-5b0e95e0545f"},{"name":"Update Active Status Product","id":"eeb55857-b998-47b7-b7a7-2bcfb8ef0d78","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\r\n    \"isAvailable\": \"<boolean>\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/admin/products/status/:productId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Updates the availability status of a product in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"payload-json-body\">Payload (JSON Body)</h3>\n<ul>\n<li><strong>isAvailable</strong> (boolean, required): Determines whether the product is available or unavailable.</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>404 Not Found:<br />\"Product not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Product updated successfully\",\n  \"result\": {\n    \"id\": \"a9cd8b8f-90d8-4e7d-8c2e-7c95d65dcb12\",\n    \"name\": \"Hazelnut Latte\",\n    \"description\": \"Smooth espresso with hazelnut flavor.\",\n    \"slug\": \"hazelnut-latte\",\n    \"price\": \"25000\",\n    \"image\": \"https://example.cdn.com/product-images/hazelnut-latte.png\",\n    \"isAvailable\": true,\n    \"category\": \"coffee\",\n    \"createdAt\": \"2025-11-15T18:48:42.721Z\",\n    \"updatedAt\": \"2025-11-15T18:58:36.657Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","products","status",":productId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"productId"}]}},"response":[],"_postman_id":"eeb55857-b998-47b7-b7a7-2bcfb8ef0d78"},{"name":"Delete Product","id":"bffb1381-ccb3-48b2-aad3-2ea0f43807e9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"{{BASE_URL}}/api/admin/products/:productId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Deletes an existing product in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"Product not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Product deleted successfully\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","products",":productId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"productId"}]}},"response":[],"_postman_id":"bffb1381-ccb3-48b2-aad3-2ea0f43807e9"}],"id":"531c48a1-37f9-4047-909a-894562ba4c4e","_postman_id":"531c48a1-37f9-4047-909a-894562ba4c4e","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"User","item":[{"name":"Get Cashiers","id":"0b28bb6c-be28-47e2-95f2-b9d5c1f48742","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/users?limit=<number>&cursor=<string>","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves a list of cashiers using cursor-based pagination in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<ul>\n<li><p><strong>limit</strong> (number, optional, default: 10): Number of cashiers to return per batch.</p>\n</li>\n<li><p><strong>cursor</strong> (string, optional): Cursor used to fetch the next batch of cashiers.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Cashiers fetched successfully\",\n  \"result\": {\n    \"cashier\": [\n      {\n        \"id\": \"e6f0de76-8de9-42b7-aa14-2789336ef63f\",\n        \"email\": \"cashier1@gmail.com\",\n        \"fullName\": \"Cashier One\",\n        \"phoneNumber\": \"08121212112\",\n        \"avatar\": null,\n        \"dateOfBirth\": \"2025-11-03T17:00:00.000Z\",\n        \"status\": \"ACTIVE\",\n        \"city\": \"Jakarta Utara\",\n        \"role\": \"CASHIER\",\n        \"createdAt\": \"2025-11-07T21:13:42.661Z\",\n        \"updatedAt\": \"2025-11-09T19:08:16.445Z\"\n      }\n    ],\n    \"nextCursor\": null\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","users"],"host":["{{BASE_URL}}"],"query":[{"key":"limit","value":"<number>"},{"key":"cursor","value":"<string>"}],"variable":[]}},"response":[],"_postman_id":"0b28bb6c-be28-47e2-95f2-b9d5c1f48742"},{"name":"Get Single Cashier","id":"17e7c7ce-a7c6-4a65-b8ea-efcb411d9346","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/users/:cashierId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves a single cashier by ID in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"Cashier not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Cashier fetched successfully\",\n  \"result\": {\n    \"id\": \"e6f0de76-8de9-42b7-aa14-2789336ef63f\",\n    \"email\": \"cashier1@gmail.com\",\n    \"fullName\": \"Cashier One\",\n    \"phoneNumber\": \"08121212112\",\n    \"avatar\": null,\n    \"dateOfBirth\": \"2025-11-03T17:00:00.000Z\",\n    \"status\": \"ACTIVE\",\n    \"city\": \"Jakarta Utara\",\n    \"role\": \"CASHIER\",\n    \"createdAt\": \"2025-11-07T21:13:42.661Z\",\n    \"updatedAt\": \"2025-11-09T19:08:16.445Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","users",":cashierId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"cashierId"}]}},"response":[],"_postman_id":"17e7c7ce-a7c6-4a65-b8ea-efcb411d9346"},{"name":"Create Cashier","id":"cd082376-1908-4800-87e3-cb0c2e211376","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"fullName","value":"<string>","type":"text"},{"key":"email","value":"<string>","type":"text"},{"key":"password","value":"<string>","type":"text"},{"key":"avatar","type":"file","uuid":"3795ecb9-5203-4f43-8753-4e0dd686c995","value":null}]},"url":"{{BASE_URL}}/api/admin/users","description":"<h3 id=\"summary\">Summary</h3>\n<p>Creates a new cashier account in the admin area. This endpoint accepts multipart/form-data to allow uploading an avatar image.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"payload-multipartform-data\">Payload (multipart/form-data)</h3>\n<ul>\n<li><p>fullName (string, required): Cashier's full name.</p>\n</li>\n<li><p>email (string, required): Cashier's email address.</p>\n</li>\n<li><p>password (string, required): Cashier's password.</p>\n</li>\n<li><p>avatar (file, optional): Cashier profile image.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"<br />\"User already exists\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Cashier created successfully\",\n  \"result\": {\n    \"id\": \"b27d6e54-9fc1-4c32-9f83-82fe23e4a912\",\n    \"email\": \"cashier.john@example.com\",\n    \"fullName\": \"John Doe\",\n    \"phoneNumber\": null,\n    \"avatar\": \"https://example.cdn.com/avatars/john-doe.png\",\n    \"dateOfBirth\": null,\n    \"status\": \"ACTIVE\",\n    \"city\": null,\n    \"role\": \"CASHIER\",\n    \"createdAt\": \"2025-10-12T14:22:18.124Z\",\n    \"updatedAt\": \"2025-10-12T14:22:18.124Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","users"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"cd082376-1908-4800-87e3-cb0c2e211376"},{"name":"Update Status","id":"d40f72bf-6b8b-4fa1-8d81-e67026d0503b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\r\n    \"status\": \"<ACTIVE|INACTIVE>\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/admin/users/:cashierId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Updates the status of a cashier in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"payload-json-body\">Payload (JSON Body)</h3>\n<ul>\n<li>status (string, required): Cashier status. One of: ACTIVE, INACTIVE</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Validation Error\"<br />\"Invalid option: expected one of \"ACTIVE\"|\"INACTIVE\"\"</p>\n<p>404 Not Found:<br />\"Cashier not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Cashier status updated successfully\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","users",":cashierId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"cashierId"}]}},"response":[],"_postman_id":"d40f72bf-6b8b-4fa1-8d81-e67026d0503b"},{"name":"Delete Cashier","id":"e41f910e-9dcf-4f2f-937a-b14b0ab38f8b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"{{BASE_URL}}/api/admin/users/:cashierId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Deletes a cashier in the admin area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"Cashier not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Cashier deleted successfully\",\n  \"result\": {\n    \"id\": \"c4821b77-9f3c-4b86-9bd0-2f5c4e4bd912\",\n    \"email\": \"cashier.john@example.com\",\n    \"fullName\": \"John Doe\",\n    \"phoneNumber\": null,\n    \"avatar\": \"https://example.cdn.com/avatars/john-doe.png\",\n    \"dateOfBirth\": null,\n    \"status\": \"INACTIVE\",\n    \"city\": null,\n    \"role\": \"CASHIER\",\n    \"createdAt\": \"2025-10-12T14:22:18.124Z\",\n    \"updatedAt\": \"2025-10-12T14:25:41.553Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","users",":cashierId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"cashierId"}]}},"response":[],"_postman_id":"e41f910e-9dcf-4f2f-937a-b14b0ab38f8b"}],"id":"b1f7cb5a-4961-40f3-a306-e61c0cb773a0","_postman_id":"b1f7cb5a-4961-40f3-a306-e61c0cb773a0","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"Voucher","item":[{"name":"Get Vouchers","id":"2541c650-5621-4b5f-b574-ffff7e381ce7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"query":[],"variable":[]},"url":""},"response":[],"_postman_id":"2541c650-5621-4b5f-b574-ffff7e381ce7"},{"name":"Create Voucherse","id":"5ba2c3f1-2b66-4f0f-a7c5-6dce4e53659e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"name\": \"Weekend Special\",\r\n  \"code\": \"WEEKEND10\",\r\n  \"discountValue\": 10,\r\n  \"minimumAmount\": 50000,\r\n  \"maximumAmount\": 200000,\r\n  \"startDate\": \"2025-10-15T00:00:00.000Z\",\r\n  \"endDate\": \"2025-10-31T00:00:00.000Z\",\r\n  \"description\": \"Get 10% off for weekend purchases\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/admin/vouchers","urlObject":{"path":["api","admin","vouchers"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5ba2c3f1-2b66-4f0f-a7c5-6dce4e53659e"},{"name":"Update Voucherse","id":"90df6199-caa6-4733-8eb8-e1b454223570","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n  \"name\": \"Weekend Special\",\r\n  \"code\": \"WEEKEND10\",\r\n  \"discountValue\": 10,\r\n  \"minimumAmount\": 50000,\r\n  \"maximumAmount\": 200000,\r\n  \"startDate\": \"2025-10-15T00:00:00.000Z\",\r\n  \"endDate\": \"2025-10-31T00:00:00.000Z\",\r\n  \"description\": \"Get 10% off for weekend purchases\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/admin/vouchers","urlObject":{"path":["api","admin","vouchers"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"90df6199-caa6-4733-8eb8-e1b454223570"},{"name":"Delete Voucherse","id":"7a04be88-d62b-4def-b6f5-d807590f5bfa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\r\n  \"name\": \"Weekend Special\",\r\n  \"code\": \"WEEKEND10\",\r\n  \"discountValue\": 10,\r\n  \"minimumAmount\": 50000,\r\n  \"maximumAmount\": 200000,\r\n  \"startDate\": \"2025-10-15T00:00:00.000Z\",\r\n  \"endDate\": \"2025-10-31T00:00:00.000Z\",\r\n  \"description\": \"Get 10% off for weekend purchases\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/admin/vouchers/dcfb864b-5dca-47e9-8059-c0b021f72762","urlObject":{"path":["api","admin","vouchers","dcfb864b-5dca-47e9-8059-c0b021f72762"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7a04be88-d62b-4def-b6f5-d807590f5bfa"}],"id":"984eda7f-d544-4a5e-8931-7ed28b90b35f","_postman_id":"984eda7f-d544-4a5e-8931-7ed28b90b35f","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"Overview","item":[{"name":"Get Overview","id":"9e71244c-0195-48f4-aef2-63aadcbcb899","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/overview","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves overview statistics for the admin dashboard, including totals, averages, and growth metrics.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Overview fetched successfully\",\n  \"result\": {\n    \"totalRevenue\": 209000,\n    \"totalOrders\": 6,\n    \"averageExpenses\": 3166.67,\n    \"averageRevenue\": 34833.33,\n    \"growth\": {\n      \"totalRevenue\": 10.5,\n      \"totalOrders\": 20,\n      \"averageExpenses\": -7.9,\n      \"averageRevenue\": -7.9\n    }\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","overview"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9e71244c-0195-48f4-aef2-63aadcbcb899"},{"name":"Get Revenue Chart","id":"1f9b9e48-36c3-4ece-8eb5-88498088eacc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/overview/revenue-chart?period=<weekly|monthly|annual>","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves revenue chart data for the admin dashboard based on the selected period.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<ul>\n<li>period (string, required): Chart period. One of: weekly, monthly, annual</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Revenue chart fetched successfully\",\n  \"result\": [\n    {\n      \"label\": \"Monday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Tuesday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Wednesday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Thursday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Friday\",\n      \"current\": 189200,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Saturday\",\n      \"current\": 209000,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Sunday\",\n      \"current\": 0,\n      \"last\": 204600\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","overview","revenue-chart"],"host":["{{BASE_URL}}"],"query":[{"key":"period","value":"<weekly|monthly|annual>"}],"variable":[]}},"response":[],"_postman_id":"1f9b9e48-36c3-4ece-8eb5-88498088eacc"},{"name":"Get Order Types","id":"6be7dd1f-e024-45f4-b2f3-9de12bbab3b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/overview/revenue-chart","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves revenue chart data for the admin dashboard.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Revenue chart fetched successfully\",\n  \"result\": [\n    {\n      \"label\": \"Monday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Tuesday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Wednesday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Thursday\",\n      \"current\": 0,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Friday\",\n      \"current\": 189200,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Saturday\",\n      \"current\": 209000,\n      \"last\": 0\n    },\n    {\n      \"label\": \"Sunday\",\n      \"current\": 0,\n      \"last\": 204600\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","overview","revenue-chart"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6be7dd1f-e024-45f4-b2f3-9de12bbab3b3"},{"name":"Get Payment Methods","id":"52f7739a-8649-445d-a883-6029d12766a0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/overview/payment-methods","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves payment method statistics for the admin dashboard.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Payment methods fetched successfully\",\n  \"result\": [\n    {\n      \"method\": \"QRIS\",\n      \"count\": 3,\n      \"percentage\": 50\n    },\n    {\n      \"method\": \"CASH\",\n      \"count\": 3,\n      \"percentage\": 50\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","overview","payment-methods"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"52f7739a-8649-445d-a883-6029d12766a0"},{"name":"Get Order Today","id":"51bec311-3844-4ee0-9315-4821bb5c03f4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/overview/order-today","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves a list of today's completed orders for the admin dashboard.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Today's completed orders fetched successfully\",\n  \"result\": [\n    {\n      \"id\": \"a64353e5-6099-4504-ac9b-3dc46527a348\",\n      \"name\": \"Lychee Tea\",\n      \"qty\": 1,\n      \"image\": \"https://example.cdn.com/product-images/lychee-tea.png\",\n      \"price\": 22000\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","overview","order-today"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"51bec311-3844-4ee0-9315-4821bb5c03f4"},{"name":"Get Category Sales","id":"d45de5b1-aeb6-4e83-a00b-eb6864ee2e97","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/overview/category-sales","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves category sales distribution for the admin dashboard.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Category sales fetched successfully\",\n  \"result\": [\n    {\n      \"category\": \"Coffee\",\n      \"total\": 16.67\n    },\n    {\n      \"category\": \"Milk\",\n      \"total\": 33.33\n    },\n    {\n      \"category\": \"Tea\",\n      \"total\": 16.67\n    },\n    {\n      \"category\": \"Food\",\n      \"total\": 0\n    },\n    {\n      \"category\": \"Snack\",\n      \"total\": 16.67\n    },\n    {\n      \"category\": \"Bundle\",\n      \"total\": 16.67\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","overview","category-sales"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d45de5b1-aeb6-4e83-a00b-eb6864ee2e97"}],"id":"900389a1-f62d-4571-a316-61f035f427db","_postman_id":"900389a1-f62d-4571-a316-61f035f427db","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"History","item":[{"name":"Get History","id":"f9bc6e3e-81fb-4b3e-a188-30df7ed18a07","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/history","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves order history records for the admin area using cursor-based pagination.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"History fetched successfully\",\n  \"result\": {\n    \"history\": [\n      {\n        \"orderStatus\": \"CANCELED\",\n        \"id\": \"53f387da-c0da-4338-8834-77a420ff0849\",\n        \"Order\": {\n          \"id\": \"H8SAY3OU\",\n          \"tableNumber\": \"12\",\n          \"totalAmount\": \"19800\",\n          \"createdAt\": \"2025-11-15T14:54:38.017Z\",\n          \"Customer\": {\n            \"fullName\": \"John\"\n          }\n        }\n      },\n    ],\n    \"nextCursor\": \"2b1c8e7d-4226-4906-b257-44d3e8208050\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","history"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f9bc6e3e-81fb-4b3e-a188-30df7ed18a07"},{"name":"Get Summary","id":"7e1fc74e-0d5d-442c-92b5-c9001acf4389","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/admin/history/summary","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves order summary statistics for the admin history section.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Summary fetched successfully\",\n  \"result\": {\n    \"totalOrders\": 20,\n    \"totalCompletedOrders\": 10,\n    \"totalCanceledOrders\": 0,\n    \"inProgressOrders\": 9\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","admin","history","summary"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7e1fc74e-0d5d-442c-92b5-c9001acf4389"}],"id":"710890fb-2bbb-465c-a4e1-4f4bace5b566","_postman_id":"710890fb-2bbb-465c-a4e1-4f4bace5b566","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}}],"id":"e2b6e2aa-21a7-44fc-b1b6-12ebca9276de","_postman_id":"e2b6e2aa-21a7-44fc-b1b6-12ebca9276de","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"Cashier","item":[{"name":"Product","item":[{"name":"Get Products","id":"c1f0632d-503c-4ca3-acfe-7d47375d2394","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/cashier/products?category=<coffee|milk|tea|food|snack|bundle>&limit=<number>&cursor=<string>&search=<string>","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves an infinite-scroll list of products for the cashier area. Supports filtering by <strong>category</strong> (required) and optional search with cursor-based pagination.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<ul>\n<li><p>category (string, required): Product category. One of: coffee, milk, tea, food, snack, bundle</p>\n</li>\n<li><p>limit (number, optional, default: 12): Number of items to return per batch.</p>\n</li>\n<li><p>cursor (string, optional): Cursor used to fetch the next batch of products.</p>\n</li>\n<li><p>search (string, optional): Search products by name.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Products fetched successfully\",\n  \"result\": {\n    \"products\": [\n      {\n        \"id\": \"3b765e6c-cb4d-41b2-b4c6-a016dd019f39\",\n        \"name\": \"Hazelnut Coffee\",\n        \"image\": \"https://example.cdn.com/products/hazelnut-coffee.png\",\n        \"category\": \"coffee\",\n        \"isAvailable\": true,\n        \"price\": \"22000\",\n        \"description\": \"\",\n        \"slug\": \"hazelnut-coffee\"\n      },\n      {\n        \"id\": \"4580e8c4-b517-4140-8b83-6b084e45059f\",\n        \"name\": \"Americano\",\n        \"image\": \"https://example.cdn.com/products/americano.png\",\n        \"category\": \"coffee\",\n        \"isAvailable\": true,\n        \"price\": \"18000\",\n        \"description\": \"\",\n        \"slug\": \"americano\"\n      },\n      {\n        \"id\": \"f069a6ae-74cf-4255-9db2-be2be9edf7fb\",\n        \"name\": \"Red Velvet\",\n        \"image\": \"https://example.cdn.com/products/red-velvet.png\",\n        \"category\": \"coffee\",\n        \"isAvailable\": true,\n        \"price\": \"22000\",\n        \"description\": \"\",\n        \"slug\": \"red-velvet\"\n      }\n    ],\n    \"nextCursor\": null\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","cashier","products"],"host":["{{BASE_URL}}"],"query":[{"key":"category","value":"<coffee|milk|tea|food|snack|bundle>"},{"key":"limit","value":"<number>"},{"key":"cursor","value":"<string>"},{"key":"search","value":"<string>"}],"variable":[]}},"response":[],"_postman_id":"c1f0632d-503c-4ca3-acfe-7d47375d2394"}],"id":"43db1e11-e78a-4c88-8470-9017aa9c1548","_postman_id":"43db1e11-e78a-4c88-8470-9017aa9c1548","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"Order","item":[{"name":"Get Orders","id":"2c7fb6f1-3af6-48e1-8229-de400b8b3174","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/cashier/orders?limit=<number>?&cursor=<string>?&statusParam=<completed|inprogress|openbill|canceled>?&orderDate=<string(yyyy-mm-dd)>?","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves an infinite-scroll list of orders for the cashier area. Supports optional filtering by status, order date, and search with cursor-based pagination.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<ul>\n<li><p>limit (number, optional, default: 10): Number of items to return per batch.</p>\n</li>\n<li><p>cursor (string, optional): Cursor used to fetch the next batch of orders.</p>\n</li>\n<li><p>status (string, optional): Order status. One of: completed, inprogress, openbill, canceled.</p>\n</li>\n<li><p>orderDate (string, optional): Filter by order creation date in yyyy-mm-dd format.</p>\n</li>\n<li><p>search (string, optional): Search orders by customer name or related fields.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Orders fetched successfully\",\n  \"result\": {\n    \"items\": [\n      {\n        \"id\": \"H8SAY3OU\",\n        \"createdAt\": \"2025-11-15T14:54:38.017Z\",\n        \"totalAmount\": \"19800\",\n        \"tableNumber\": \"12\",\n        \"orderStatus\": \"INPROGRESS\",\n        \"Customer\": {\n          \"fullName\": \"john\"\n        }\n      },\n      {\n        \"id\": \"a64353e5-6099-4504-ac9b-3dc46527a348\",\n        \"createdAt\": \"2025-11-15T00:16:29.457Z\",\n        \"totalAmount\": \"24200\",\n        \"tableNumber\": \"10\",\n        \"orderStatus\": \"COMPLETED\",\n        \"Customer\": {\n          \"fullName\": \"Milk\"\n        }\n      }\n    ],\n    \"nextCursor\": \"59de4bdb-1300-42f5-adcd-0c96801e8256\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","cashier","orders"],"host":["{{BASE_URL}}"],"query":[{"key":"limit","value":"<number>?"},{"key":"cursor","value":"<string>?"},{"key":"statusParam","value":"<completed|inprogress|openbill|canceled>?"},{"key":"orderDate","value":"<string(yyyy-mm-dd)>?"}],"variable":[]}},"response":[],"_postman_id":"2c7fb6f1-3af6-48e1-8229-de400b8b3174"},{"name":"Get Single Order","id":"aafedebc-ade0-4f3a-8c69-fd7537af5db7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/cashier/orders/:orderId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves detailed information for a specific order in the cashier area, including customer data, items, pricing breakdown, and status.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<p>No query parameters are required for this request.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>404 Not Found:<br />\"Order not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Order fetched successfully\",\n  \"result\": {\n    \"id\": \"H8SAY3OU\",\n    \"tableNumber\": \"12\",\n    \"createdAt\": \"2025-11-15T14:54:38.017Z\",\n    \"orderType\": \"DINE_IN\",\n    \"taxAmount\": \"1800\",\n    \"paymentMethod\": \"QRIS\",\n    \"subTotalAmount\": \"18000\",\n    \"totalAmount\": \"19800\",\n    \"discountAmount\": \"0\",\n    \"orderStatus\": \"INPROGRESS\",\n    \"midtransOrderId\": \"0dd2f700-8162-40a7-9022-da94c6c97615\",\n    \"notes\": null,\n    \"Voucher\": null,\n    \"Customer\": {\n      \"fullName\": \"john\",\n      \"phoneNumber\": null,\n      \"email\": \"john_lgom@gmail.com\"\n    },\n    \"OrderItem\": [\n      {\n        \"quantity\": 1,\n        \"subtotal\": \"18000\",\n        \"productImage\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762713271468-Sausage.png\",\n        \"productName\": \"Sausage\",\n        \"productPrice\": \"18000\"\n      }\n    ],\n    \"Cashier\": null\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","cashier","orders",":orderId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"orderId"}]}},"response":[],"_postman_id":"aafedebc-ade0-4f3a-8c69-fd7537af5db7"},{"name":"Update Order Status","id":"85a6872b-928a-401e-adaa-795f3a958c07","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\r\n    \"status\": \"<completed|inprogress|openbill|canceled>\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/cashier/orders/:orderId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Updates the status of a specific order in the cashier area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query--payload\">Query / Payload</h3>\n<ul>\n<li>status (string, required): New status for the order. One of: completed, inprogress, openbill, canceled.</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>404 Not Found:<br />\"Order not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Order status updated successfully\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","cashier","orders",":orderId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"orderId"}]}},"response":[],"_postman_id":"85a6872b-928a-401e-adaa-795f3a958c07"},{"name":"Verify Internal Qr Code","id":"88ab76a1-9bb6-4a24-bbb5-96679691a43e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"{\r\n  \"fullName\": \"John Doe\",\r\n  \"email\": \"john.doe@example.com\",\r\n  \"phoneNumber\": \"081234567890\",\r\n  \"tableNumber\": \"12\",\r\n  \"orderType\": \"DINE_IN\",\r\n  \"paymentMethod\": \"QRIS\",\r\n  \"items\": [\r\n    {\r\n      \"productId\": \"prod_abc123\",\r\n      \"quantity\": 2\r\n    },\r\n    {\r\n      \"productId\": \"prod_xyz456\",\r\n      \"quantity\": 1\r\n    }\r\n  ]\r\n}\r\n","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/cashier/orders/verify-qrcode/:code","description":"<h3 id=\"summary\">Summary</h3>\n<p>Verifies a QR code associated with an order in the cashier area.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<p>No query parameters are required for this request.<br />The QR code value is passed directly in the URL as <code>:code</code>.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Order expired, Please tell the customer to order again\"</p>\n<p>404 Not Found:<br />\"QR code not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"QR code verified successfully\"\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","cashier","orders","verify-qrcode",":code"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"code"}]}},"response":[],"_postman_id":"88ab76a1-9bb6-4a24-bbb5-96679691a43e"}],"id":"51bd3a45-6d54-46d6-95da-264ec8c32000","_postman_id":"51bd3a45-6d54-46d6-95da-264ec8c32000","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}}],"id":"74ad4bbb-2df1-4f2d-8f7a-01d7318258c4","_postman_id":"74ad4bbb-2df1-4f2d-8f7a-01d7318258c4","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"Profile","item":[{"name":"Update Profile","id":"490ba8ab-39ba-4d87-864b-8ae4448eb889","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"body":{"mode":"formdata","formdata":[{"key":"phoneNumber","value":"<string>","type":"text","uuid":"212732d9-be6d-4dd2-8774-609decca5653"},{"key":"city","value":"<string>","type":"text","uuid":"200bff4a-c2d5-412c-a22d-db5b6c8e8530"},{"key":"dateOfBirth","value":"<string(yyyy-mm-dd)>","type":"text","uuid":"30c6c9e2-04d6-4e18-a40a-4d6251bd0a5b"},{"key":"avatar","type":"file","uuid":"dbc7412c-d3e8-4f2b-9157-597842ec23c8","value":null},{"key":"fullName","value":"<string>","type":"text","uuid":"063844ce-cbed-49c9-a0d2-7b9d5692b3e0"}]},"url":"{{BASE_URL}}/api/profile","description":"<h3 id=\"summary\">Summary</h3>\n<p>Updates the profile information for the currently authenticated user. This endpoint is available for both Admin and Cashier roles. It accepts multipart/form-data to allow updating the avatar image.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"payload-multipartform-data\">Payload (multipart/form-data)</h3>\n<ul>\n<li><p>fullName (string, optional): User's full name.</p>\n</li>\n<li><p>phoneNumber (string, optional): User's phone number.</p>\n</li>\n<li><p>city (string, optional): User's city.</p>\n</li>\n<li><p>dateOfBirth (string, optional, format: yyyy-mm-dd): User's date of birth.</p>\n</li>\n<li><p>avatar (file, optional): User profile image.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Profile updated successfully\",\n  \"result\": {\n    \"id\": \"e6f0de76-8de9-42b7-aa14-2789336ef63f\",\n    \"email\": \"cashier1@gmail.com\",\n    \"fullName\": \"cashier1\",\n    \"phoneNumber\": \"08232323223\",\n    \"avatar\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/avatars/1763245439313-dsf.png\",\n    \"dateOfBirth\": \"2001-11-08T00:00:00.000Z\",\n    \"status\": \"ACTIVE\",\n    \"city\": \"Jakarta\",\n    \"role\": \"CASHIER\",\n    \"createdAt\": \"2025-11-07T21:13:42.661Z\",\n    \"updatedAt\": \"2025-11-15T22:23:59.432Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","profile"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"490ba8ab-39ba-4d87-864b-8ae4448eb889"},{"name":"Delete Avatar","id":"9dccb8d9-3ba3-4589-bdcb-9144a5b442e6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"body":{"mode":"formdata","formdata":[{"key":"fullName","value":"ldsfja","type":"text","uuid":"756ce9db-f5f9-4691-b139-c6e54dea4db8"},{"key":"phoneNumber","value":"08232323223","type":"text","uuid":"212732d9-be6d-4dd2-8774-609decca5653"},{"key":"city","value":"","type":"text","uuid":"200bff4a-c2d5-412c-a22d-db5b6c8e8530"},{"key":"dateOfBirth","value":"","type":"text","uuid":"30c6c9e2-04d6-4e18-a40a-4d6251bd0a5b"},{"key":"avatar","type":"file","uuid":"dbc7412c-d3e8-4f2b-9157-597842ec23c8","src":"postman-cloud:///1efefc7a-1ede-4eb0-9bef-f0bb9b9372ab"}]},"url":"{{BASE_URL}}/api/profile/avatar","description":"<h3 id=\"summary\">Summary</h3>\n<p>Deletes the current avatar of the authenticated user. This endpoint is available for both Admin and Cashier roles.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>This endpoint requires a Bearer Access Token.</p>\n<p>Possible Authentication Errors:</p>\n<ul>\n<li><p>401: Token required</p>\n</li>\n<li><p>401: Invalid or expired token</p>\n</li>\n<li><p>403: Access denied</p>\n</li>\n<li><p>404: User not found</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"Avatar not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Profile avatar deleted\",\n  \"result\": {\n    \"id\": \"e6f0de76-8de9-42b7-aa14-2789336ef63f\",\n    \"email\": \"cashier1@gmail.com\",\n    \"fullName\": \"cashier1\",\n    \"phoneNumber\": \"08232323223\",\n    \"avatar\": null,\n    \"dateOfBirth\": \"2001-11-08T00:00:00.000Z\",\n    \"status\": \"ACTIVE\",\n    \"city\": \"Jakarta\",\n    \"role\": \"CASHIER\",\n    \"createdAt\": \"2025-11-07T21:13:42.661Z\",\n    \"updatedAt\": \"2025-11-15T22:28:02.292Z\"\n  }\n}\n\n</code></pre>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}},"urlObject":{"path":["api","profile","avatar"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9dccb8d9-3ba3-4589-bdcb-9144a5b442e6"}],"id":"2512be17-8317-4c17-ab22-3d9dbf047fae","_postman_id":"2512be17-8317-4c17-ab22-3d9dbf047fae","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","id":"30bb0443-b35d-4dd1-bd90-6eb08850613b","name":"Ravine Coffee API v1","type":"collection"}}},{"name":"Order","item":[{"name":"Create Order","id":"d70cb7e8-d383-4410-ab7b-efd882fa6072","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"fullName\": \"<string>\",\r\n  \"email\": \"<string>\",\r\n  \"phoneNumber\": \"<string>\",\r\n  \"tableNumber\": \"<string>\",\r\n  \"orderType\": \"<DINE_IN|TAKE_AWAY>\",\r\n  \"orderChannel\": \"<ONLINE|CASHIER>\",\r\n  \"paymentMethod\": \"<CASH|QRIS>\",\r\n  \"items\": [\r\n    {\r\n      \"productId\": \"<string>\",\r\n      \"quantity\": \"<number>\"\r\n    }\r\n  ]\r\n}\r\n","options":{"raw":{"language":"json"}}},"url":"{{BASE_URL}}/api/orders","description":"<h3 id=\"summary\">Summary</h3>\n<p>Creates a new order with customer information, order details, items, and payment method. Supports both DINE_IN and TAKE_AWAY orders, as well as ONLINE and CASHIER order channels. Payment can be made using CASH or QRIS.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>No authentication required for this endpoint.</p>\n<h3 id=\"payload-json\">Payload (JSON)</h3>\n<p>All fields below are <strong>required</strong>, and values are <strong>case-sensitive</strong>.</p>\n<ul>\n<li><p>fullName (string, required): Customer full name.</p>\n</li>\n<li><p>email (string, required): Customer email address.</p>\n</li>\n<li><p>phoneNumber (string, required): Customer phone number.</p>\n</li>\n<li><p>tableNumber (string, required): Table number for the order.</p>\n</li>\n<li><p>orderType (string, required): Must be one of: <strong>DINE_IN</strong>, <strong>TAKE_AWAY</strong>.</p>\n</li>\n<li><p>orderChannel (string, required): Must be one of: <strong>ONLINE</strong>, <strong>CASHIER</strong>.</p>\n</li>\n<li><p>paymentMethod (string, required): Must be one of: <strong>CASH</strong>, <strong>QRIS</strong>.</p>\n</li>\n<li><p>items (array, required): List of order items.</p>\n<ul>\n<li><p>productId (string, required): Product identifier.</p>\n</li>\n<li><p>quantity (number, required): Quantity to order.</p>\n</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Order created successfully\",\n  \"result\": {\n    \"order\": {\n      \"id\": \"F579ISQE\",\n      \"tableNumber\": \"12\",\n      \"createdAt\": \"2025-11-15T22:38:28.299Z\",\n      \"orderType\": \"DINE_IN\",\n      \"taxAmount\": \"4400\",\n      \"paymentMethod\": \"QRIS\",\n      \"orderStatus\": \"OPENBILL\",\n      \"internalQrCode\": null,\n      \"subTotalAmount\": \"44000\",\n      \"discountAmount\": \"0\",\n      \"expiredInternalQrCode\": null,\n      \"totalAmount\": \"48400\",\n      \"expiredQrisMidtransUrl\": \"2025-11-15T22:48:23.000Z\",\n      \"notes\": null,\n      \"Voucher\": null,\n      \"Customer\": {\n        \"fullName\": \"John Doe\",\n        \"phoneNumber\": \"081234567890\",\n        \"email\": \"john.doe_r1ld@example.com\"\n      },\n      \"OrderItem\": [\n        {\n          \"quantity\": 2,\n          \"subtotal\": \"44000\",\n          \"productImage\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762712899919-Varian 4.png\",\n          \"productName\": \"Red Velvet\",\n          \"productPrice\": \"22000\"\n        }\n      ],\n      \"Cashier\": null\n    },\n    \"payment\": {\n      \"method\": \"QRIS\",\n      \"qrisUrl\": \"https://api.sandbox.midtrans.com/v2/qris/0f3fbbb4-6ae3-41e6-a54e-a0e170f43890/qr-code\",\n      \"svgQrCode\": null\n    }\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["api","orders"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d70cb7e8-d383-4410-ab7b-efd882fa6072"},{"name":"Check Order Status","id":"de6690a9-e2f0-47b5-a1a3-a5c330befc4a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"GET","header":[],"url":"{{BASE_URL}}/api/orders/:orderId","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves the current status of a specific order. Useful for checking payment or processing progress.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>No authentication required for this endpoint.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>404 Not Found:<br />\"Order not found\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Order status fetched successfully\",\n  \"result\": {\n    \"orderStatus\": \"COMPLETED\"\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["api","orders",":orderId"],"host":["{{BASE_URL}}"],"query":[],"variable":[{"type":"any","value":"<string>","key":"orderId"}]}},"response":[],"_postman_id":"de6690a9-e2f0-47b5-a1a3-a5c330befc4a"}],"id":"7c990158-9f18-4cbb-aa9f-b39bcd448ae5","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"338f70a4-9030-4d94-aca8-d3bf8e3b7f6b","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"e24caee5-c2d5-4ae0-9771-855140d22c8b","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"7c990158-9f18-4cbb-aa9f-b39bcd448ae5","description":""},{"name":"Product","item":[{"name":"get Producs","id":"6a4612e7-74ac-4c68-9d18-3d497927af06","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"GET","header":[],"body":{"mode":"raw","raw":"{\r\n  \"fullName\": \"<string>\",\r\n  \"email\": \"<string>\",\r\n  \"phoneNumber\": \"<string>\",\r\n  \"tableNumber\": \"<string>\",\r\n  \"orderType\": \"<DINE_IN|TAKE_AWAY>\",\r\n  \"orderChannel\": \"<ONLINE|CASHIER>\",\r\n  \"paymentMethod\": \"<CASH|QRIS>\",\r\n  \"items\": [\r\n    {\r\n      \"productId\": \"<string>\",\r\n      \"quantity\": \"<number>\"\r\n    }\r\n  ]\r\n}\r\n"},"url":"{{BASE_URL}}/api/products?category=<coffee|milk|tea|food|snack|bundle>&limit=<number>&cursor=<string>","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves a list of products filtered by category. Supports optional cursor-based pagination.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>No authentication required for this endpoint.</p>\n<h3 id=\"query-parameters\">Query Parameters</h3>\n<ul>\n<li><p>category (string, required): Must be one of: <strong>coffee</strong>, <strong>milk</strong>, <strong>tea</strong>, <strong>food</strong>, <strong>snack</strong>, <strong>bundle</strong>.</p>\n</li>\n<li><p>limit (number, optional): Number of products to return.</p>\n</li>\n<li><p>cursor (string, optional): Cursor for fetching the next batch of products.</p>\n</li>\n</ul>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>400 Bad Request:<br />\"Invalid input\"</p>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Products fetched successfully\",\n  \"result\": {\n    \"products\": [\n      {\n        \"name\": \"White Boba Milk\",\n        \"id\": \"2408b74d-0ddd-44e4-afd4-763f8ec52ded\",\n        \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762713086290-3.png\",\n        \"category\": \"MILK\",\n        \"isAvailable\": true,\n        \"price\": \"26000\",\n        \"description\": \"\",\n        \"slug\": \"white-boba-milk\"\n      }\n    ],\n    \"nextCursor\": null\n  }\n}\n\n</code></pre>\n","urlObject":{"path":["api","products"],"host":["{{BASE_URL}}"],"query":[{"key":"category","value":"<coffee|milk|tea|food|snack|bundle>"},{"key":"limit","value":"<number>"},{"key":"cursor","value":"<string>"}],"variable":[]}},"response":[],"_postman_id":"6a4612e7-74ac-4c68-9d18-3d497927af06"},{"name":"Get Recommendations Products","id":"bcaf9dd2-9c26-410f-b708-6e978dd26e83","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{BASE_URL}}/api/products/recommendations","description":"<h3 id=\"summary\">Summary</h3>\n<p>Retrieves a list of recommended products based on purchase frequency. The system selects the <strong>top 7 most purchased products</strong> across all customers and returns them as recommendations.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>No authentication required for this endpoint.</p>\n<h3 id=\"error-responses\">Error Responses</h3>\n<p>500 Server Error</p>\n<h3 id=\"response-example\">Response Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Products fetched successfully\",\n  \"result\": [\n    {\n      \"id\": \"3b765e6c-cb4d-41b2-b4c6-a016dd019f39\",\n      \"name\": \"Hazelnut Coffee\",\n      \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762712860579-Varian 1.png\",\n      \"price\": \"22000\",\n      \"category\": \"COFFEE\"\n    },\n    {\n      \"id\": \"32bee00f-0595-4766-935f-af838a209f29\",\n      \"name\": \"Sausage\",\n      \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762713271468-Sausage.png\",\n      \"price\": \"18000\",\n      \"category\": \"SNACK\"\n    },\n    {\n      \"id\": \"f069a6ae-74cf-4255-9db2-be2be9edf7fb\",\n      \"name\": \"Red Velvet\",\n      \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762712899919-Varian 4.png\",\n      \"price\": \"22000\",\n      \"category\": \"COFFEE\"\n    },\n    {\n      \"id\": \"b8e126e5-745a-4642-9054-9ab553be8dfe\",\n      \"name\": \"French Fries\",\n      \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762713244977-French fries.png\",\n      \"price\": \"18000\",\n      \"category\": \"SNACK\"\n    },\n    {\n      \"id\": \"966329d9-dd59-49dd-9918-29f622395b4b\",\n      \"name\": \"Chocolate Boba Milk\",\n      \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762713128834-5 (2).png\",\n      \"price\": \"26000\",\n      \"category\": \"MILK\"\n    },\n    {\n      \"id\": \"2408b74d-0ddd-44e4-afd4-763f8ec52ded\",\n      \"name\": \"White Boba Milk\",\n      \"image\": \"https://xdngzcfffaqezcrelqya.supabase.co/storage/v1/object/public/product-images/1762713086290-3.png\",\n      \"price\": \"26000\",\n      \"category\": \"MILK\"\n    }\n  ]\n}\n\n</code></pre>\n","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"6e58e321-4584-4ac0-9213-3ae116e436f6","id":"6e58e321-4584-4ac0-9213-3ae116e436f6","name":"Product","type":"folder"}},"urlObject":{"path":["api","products","recommendations"],"host":["{{BASE_URL}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bcaf9dd2-9c26-410f-b708-6e978dd26e83"}],"id":"6e58e321-4584-4ac0-9213-3ae116e436f6","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"22e08ae3-34e8-4741-9e3f-ce432f97027f","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"e3d13236-cc6b-4dab-949b-7ebdf8f66f0b","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"6e58e321-4584-4ac0-9213-3ae116e436f6","description":""}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]}},"event":[{"listen":"prerequest","script":{"id":"8daa6e44-56b8-44c7-9948-44d7bd1b7d56","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"a4baffdb-d212-4ffa-a8c1-f55d6ea6743a","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"variable":[{"key":"access_token","value":""}]}