Spaces:
Runtime error
Runtime error
| /** | |
| * ChefCode API Layer - Connected to FastAPI Backend | |
| * Gestisce tutte le chiamate al backend (port 8000) | |
| */ | |
| class ChefCodeAPI { | |
| constructor(baseURL = 'http://localhost:8000') { | |
| this.baseURL = baseURL; | |
| this.apiKey = null; // MUST be set via setMobileConfig() or setApiKey() | |
| console.log('π ChefCode API connected to:', this.baseURL); | |
| console.log('β οΈ API Key authentication required - set via setApiKey() or setMobileConfig()'); | |
| } | |
| // Set API Key (must be called before making authenticated requests) | |
| setApiKey(apiKey) { | |
| if (!apiKey) { | |
| console.error('β API Key cannot be empty'); | |
| throw new Error('API Key is required'); | |
| } | |
| this.apiKey = apiKey; | |
| console.log('β API Key configured'); | |
| } | |
| // Configurazione per mobile (React Native / Flutter) | |
| setMobileConfig(config) { | |
| this.baseURL = config.baseURL || this.baseURL; | |
| if (config.apiKey) { | |
| this.setApiKey(config.apiKey); | |
| } | |
| this.token = config.token; // Per autenticazione future (deprecated) | |
| console.log('π± API URL updated to:', this.baseURL); | |
| } | |
| // Get headers with authentication | |
| getHeaders() { | |
| if (!this.apiKey) { | |
| console.error('β API Key not set. Call setApiKey() first.'); | |
| throw new Error('API Key not configured. Call setApiKey() before making requests.'); | |
| } | |
| return { | |
| 'Content-Type': 'application/json', | |
| 'X-API-Key': this.apiKey | |
| }; | |
| } | |
| // ===== SYNC DATA ===== | |
| async syncData(data) { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/sync-data`, { | |
| method: 'POST', | |
| headers: this.getHeaders(), | |
| body: JSON.stringify(data) | |
| }); | |
| if (response.status === 401) { | |
| throw new Error('Authentication failed. Check API Key configuration.'); | |
| } | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(error.detail || 'Sync failed'); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error('β Sync error:', error); | |
| throw error; | |
| } | |
| } | |
| // ===== CHATGPT AI ===== | |
| async sendChatMessage(prompt, language = 'en') { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/chatgpt-smart`, { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, // Chat endpoint doesn't require auth for now | |
| body: JSON.stringify({ prompt, language }) | |
| }); | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(error.detail || 'ChatGPT request failed'); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error('β ChatGPT error:', error); | |
| throw error; | |
| } | |
| } | |
| // ===== INVENTORY ===== | |
| async getInventory() { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/data`); | |
| const data = await response.json(); | |
| return data.inventory || []; | |
| } catch (error) { | |
| console.error('β Get inventory error:', error); | |
| throw error; | |
| } | |
| } | |
| async addInventoryItem(item) { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/action`, { | |
| method: 'POST', | |
| headers: this.getHeaders(), | |
| body: JSON.stringify({ | |
| action: 'add-inventory', | |
| data: item | |
| }) | |
| }); | |
| if (response.status === 401) { | |
| throw new Error('Authentication failed. Check API Key configuration.'); | |
| } | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(error.detail || 'Failed to add inventory item'); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error('β Add inventory error:', error); | |
| throw error; | |
| } | |
| } | |
| // ===== RECIPES ===== | |
| async getRecipes() { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/data`); | |
| const data = await response.json(); | |
| return data.recipes || {}; | |
| } catch (error) { | |
| console.error('β Get recipes error:', error); | |
| throw error; | |
| } | |
| } | |
| async saveRecipe(name, recipe) { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/action`, { | |
| method: 'POST', | |
| headers: this.getHeaders(), | |
| body: JSON.stringify({ | |
| action: 'save-recipe', | |
| data: { name, recipe } | |
| }) | |
| }); | |
| if (response.status === 401) { | |
| throw new Error('Authentication failed. Check API Key configuration.'); | |
| } | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(error.detail || 'Failed to save recipe'); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error('β Save recipe error:', error); | |
| throw error; | |
| } | |
| } | |
| // ===== TASKS ===== | |
| async getTasks() { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/data`); | |
| const data = await response.json(); | |
| return data.tasks || []; | |
| } catch (error) { | |
| console.error('β Get tasks error:', error); | |
| throw error; | |
| } | |
| } | |
| async addTask(task) { | |
| try { | |
| const response = await fetch(`${this.baseURL}/api/action`, { | |
| method: 'POST', | |
| headers: this.getHeaders(), | |
| body: JSON.stringify({ | |
| action: 'add-task', | |
| data: task | |
| }) | |
| }); | |
| if (response.status === 401) { | |
| throw new Error('Authentication failed. Check API Key configuration.'); | |
| } | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(error.detail || 'Failed to add task'); | |
| } | |
| return await response.json(); | |
| } catch (error) { | |
| console.error('β Add task error:', error); | |
| throw error; | |
| } | |
| } | |
| // ===== HEALTH CHECK ===== | |
| async ping() { | |
| try { | |
| const response = await fetch(`${this.baseURL}/health`); | |
| return response.ok; | |
| } catch (error) { | |
| return false; | |
| } | |
| } | |
| } | |
| // Export per Web (browser) | |
| if (typeof window !== 'undefined') { | |
| window.ChefCodeAPI = ChefCodeAPI; | |
| } | |
| // Export per Mobile (React Native / Node.js) | |
| if (typeof module !== 'undefined' && module.exports) { | |
| module.exports = ChefCodeAPI; | |
| } | |
| // Export per ES6 modules | |
| if (typeof exports !== 'undefined') { | |
| exports.ChefCodeAPI = ChefCodeAPI; | |
| } | |