# N8N Setup Guide for Food Waste Assistant This guide helps you set up the backend logic using n8n. You will need to create a new workflow (or multiple) to handle the 4 main API endpoints. ## Prerequisites - An active [n8n](https://n8n.io/) instance (Cloud or Self-hosted). - A database (Google Sheets, Airtable, or Postgres) to store inventory. This guide assumes **Google Sheets** for simplicity. ## Quick Start (Import Workflow) I have updated `workflow.json` to be much simpler. It now uses a **Single Webhook URL** that handles everything (`add_item`, `get_items`, etc.). 1. Download the updated `workflow.json` from this project. 2. Go to your n8n dashboard. 3. Click **Workflows** > **Import from File**. 4. Select `workflow.json`. 5. **Activate** the workflow. 6. Open the "Webhook (Router)" node: - Copy the **Production URL**. - **CRITICAL**: Set **Respond** to **"Using 'Respond to Webhook' Node"**. - **If you forget this, you will get "Unexpected End of JSON Input" error!** 7. Paste the URL into your app's Settings. ## 🚀 Making It Real (Google Sheets) To save data permanently, use `workflow_real.json` instead. ### 1. Prepare Google Sheet Create a new Sheet driven by these columns in Row 1: `id` | `name` | `quantity` | `expiryDate` | `category` ### 2. Import Real Workflow 1. Import `workflow_real.json` into N8N. 2. Double-click **Google Sheets (Add)** and **Google Sheets (Read)** nodes. 3. Authenticate with your Google Account ("Sign in with Google"). 4. Select your Spreadsheet and Sheet Name. - For **Add Node**: Map the fields (`name` -> `{{$json.body.name}}`, etc). 5. Activate and copy the new Webhook URL to your app settings. ## Workflow Details Below are the details if you want to build it manually or understand how it works. Create a workflow with a **Webhook** node. - **Method**: `POST` (and `GET` if you want a single entry point, but easier to use distinct hooks). - **Authentication**: None (for this demo) or Header Auth. ### Endpoint 1: Add Item 1. **Webhook Node**: Listen for `POST` on `/add-item`. 2. **AI Node (Optional)**: Use an OpenAI node to predict expiry date based on the "Name" if "ExpiryDate" is empty. 3. **Google Sheets Node**: "Append" row to Sheet "Inventory". - Map: `Name`, `Quantity`, `ExpiryDate`, `Category`. 4. **Respond to Webhook Node**: Return `{ "success": true }`. ### Endpoint 2: Get Inventory 1. **Webhook Node**: Listen for `GET` on `/get-items`. 2. **Google Sheets Node**: "Read" all rows from Sheet "Inventory". 3. **Code Node**: Calculate `daysRemaining` for each item. 4. **Respond to Webhook Node**: Return JSON `{ "items": [...] }`. ### Endpoint 3: Dashboard Stats 1. **Webhook Node**: Listen for `GET` on `/dashboard-stats`. 2. **Google Sheets Node**: Read all rows. 3. **Code Node**: - Count total items. - Filter items where `expiryDate` is within 3 days. - Calculate potential waste savings. 4. **Respond to Webhook Node**: Return Stats JSON. ### Endpoint 4: Suggest Recipes 1. **Webhook Node**: Listen for `POST` on `/suggest-recipes`. 2. **Google Sheets Node**: Read "Inventory" (find items expiring soon). 3. **OpenAI Node** (or other LLM): - **System Prompt**: "You are a chef. Suggest 3 recipes based on these ingredients: [List of ingredients]. Return valid JSON." 4. **Respond to Webhook Node**: Return the JSON list of recipes. ## Connecting to Frontend 1. After activating your workflow, copy the **Production URL** of your Webhook nodes. 2. If you used different URLs for each endpoint, you might need to adjust `app.js` or use a single Router workflow (recommended). - **Router Approach**: Have one Webhook URL and route based on `body.action` or query param? - **Current App Support**: The `app.js` assumes a base URL structure: - `BASE_URL/add-item` - `BASE_URL/get-items` - etc. - **Tip**: In n8n, you can set the path for the Webhook node. Ensure you set 4 separate Webhook nodes with these specific suffixes, or use a Reverse Proxy to route them.