Spaces:
Configuration error
Configuration error
| // API Client for Server Communication | |
| class PencereAPI { | |
| constructor() { | |
| this.baseURL = process.env.API_BASE_URL || 'http://localhost:3001/api'; | |
| this.token = localStorage.getItem('authToken'); | |
| this.user = JSON.parse(localStorage.getItem('currentUser') || 'null'); | |
| } | |
| // Set authentication token | |
| setToken(token) { | |
| this.token = token; | |
| if (token) { | |
| localStorage.setItem('authToken', token); | |
| } else { | |
| localStorage.removeItem('authToken'); | |
| } | |
| } | |
| // Set current user | |
| setUser(user) { | |
| this.user = user; | |
| if (user) { | |
| localStorage.setItem('currentUser', JSON.stringify(user)); | |
| } else { | |
| localStorage.removeItem('currentUser'); | |
| } | |
| } | |
| // Generic request method | |
| async request(endpoint, options = {}) { | |
| const url = `${this.baseURL}${endpoint}`; | |
| const config = { | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| ...options.headers | |
| }, | |
| ...options | |
| }; | |
| if (this.token) { | |
| config.headers.Authorization = `Bearer ${this.token}`; | |
| } | |
| try { | |
| const response = await fetch(url, config); | |
| if (response.status === 401) { | |
| // Token expired or invalid | |
| this.setToken(null); | |
| this.setUser(null); | |
| window.location.href = '#login'; | |
| throw new Error('Authentication required'); | |
| } | |
| const data = await response.json(); | |
| if (!response.ok) { | |
| throw new Error(data.error || 'Request failed'); | |
| } | |
| return data; | |
| } catch (error) { | |
| console.error(`API Error (${endpoint}):`, error); | |
| throw error; | |
| } | |
| } | |
| // Authentication methods | |
| async login(username, password) { | |
| const data = await this.request('/auth/login', { | |
| method: 'POST', | |
| body: JSON.stringify({ username, password }) | |
| }); | |
| this.setToken(data.token); | |
| this.setUser(data.user); | |
| return data; | |
| } | |
| async register(userData) { | |
| return await this.request('/auth/register', { | |
| method: 'POST', | |
| body: JSON.stringify(userData) | |
| }); | |
| } | |
| logout() { | |
| this.setToken(null); | |
| this.setUser(null); | |
| } | |
| // Company methods | |
| async getCompany() { | |
| return await this.request('/company'); | |
| } | |
| async updateCompany(companyData) { | |
| return await this.request('/company', { | |
| method: 'PUT', | |
| body: companyData | |
| }); | |
| } | |
| // System methods | |
| async getSystems() { | |
| return await this.request('/systems'); | |
| } | |
| async createSystem(systemData) { | |
| return await this.request('/systems', { | |
| method: 'POST', | |
| body: systemData | |
| }); | |
| } | |
| async updateSystem(id, systemData) { | |
| return await this.request(`/systems/${id}`, { | |
| method: 'PUT', | |
| body: systemData | |
| }); | |
| } | |
| async deleteSystem(id) { | |
| return await this.request(`/systems/${id}`, { | |
| method: 'DELETE' | |
| }); | |
| } | |
| // Customer methods | |
| async getCustomers() { | |
| return await this.request('/customers'); | |
| } | |
| async createCustomer(customerData) { | |
| return await this.request('/customers', { | |
| method: 'POST', | |
| body: customerData | |
| }); | |
| } | |
| async updateCustomer(id, customerData) { | |
| return await this.request(`/customers/${id}`, { | |
| method: 'PUT', | |
| body: customerData | |
| }); | |
| } | |
| async deleteCustomer(id) { | |
| return await this.request(`/customers/${id}`, { | |
| method: 'DELETE' | |
| }); | |
| } | |
| // Position methods | |
| async getPositions(customerId = null) { | |
| const query = customerId ? `?customerId=${customerId}` : ''; | |
| return await this.request(`/positions${query}`); | |
| } | |
| async createPosition(positionData) { | |
| return await this.request('/positions', { | |
| method: 'POST', | |
| body: positionData | |
| }); | |
| } | |
| async updatePosition(id, positionData) { | |
| return await this.request(`/positions/${id}`, { | |
| method: 'PUT', | |
| body: positionData | |
| }); | |
| } | |
| async deletePosition(id) { | |
| return await this.request(`/positions/${id}`, { | |
| method: 'DELETE' | |
| }); | |
| } | |
| // PDF Settings methods | |
| async getPDFSettings(type = null) { | |
| const query = type ? `?type=${type}` : ''; | |
| return await this.request(`/pdf-settings${query}`); | |
| } | |
| async updatePDFSettings(settingsData, type = 'global') { | |
| return await this.request('/pdf-settings', { | |
| method: 'PUT', | |
| body: { type, settings: settingsData } | |
| }); | |
| } | |
| // Backup methods | |
| async createBackup() { | |
| return await this.request('/backup'); | |
| } | |
| async restoreData(backupData) { | |
| return await this.request('/restore', { | |
| method: 'POST', | |
| body: backupData | |
| }); | |
| } | |
| // File upload helper | |
| async uploadFile(file, endpoint = '/upload') { | |
| const formData = new FormData(); | |
| formData.append('file', file); | |
| const url = `${this.baseURL}${endpoint}`; | |
| const config = { | |
| method: 'POST', | |
| body: formData, | |
| headers: {} | |
| }; | |
| if (this.token) { | |
| config.headers.Authorization = `Bearer ${this.token}`; | |
| } | |
| try { | |
| const response = await fetch(url, config); | |
| const data = await response.json(); | |
| if (!response.ok) { | |
| throw new Error(data.error || 'Upload failed'); | |
| } | |
| return data; | |
| } catch (error) { | |
| console.error(`Upload Error (${endpoint}):`, error); | |
| throw error; | |
| } | |
| } | |
| // Check if user is authenticated | |
| isAuthenticated() { | |
| return !!this.token && !!this.user; | |
| } | |
| // Get user role | |
| getUserRole() { | |
| return this.user ? this.user.role : null; | |
| } | |
| // Check if user is admin | |
| isAdmin() { | |
| return this.getUserRole() === 'admin'; | |
| } | |
| } | |
| // Create global API instance | |
| const api = new PencereAPI(); | |
| // Export for use in other modules | |
| if (typeof module !== 'undefined' && module.exports) { | |
| module.exports = PencereAPI; | |
| } else { | |
| window.PencereAPI = PencereAPI; | |
| window.api = api; | |
| } |