window-calculator-pro / api-client.js
escambalkon's picture
sunucuya veritabanı kur
7bfe715 verified
// 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;
}