118 lines
3.9 KiB
JavaScript
118 lines
3.9 KiB
JavaScript
// model.js
|
|
export class Model {
|
|
constructor() {
|
|
this.apiUrl = 'http://localhost:3000';
|
|
}
|
|
|
|
async request(url, options = {}) {
|
|
try {
|
|
const response = await fetch(`${this.apiUrl}${url}`, {
|
|
...options,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
...options.headers
|
|
}
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error('Request failed:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async getBasketItems() {
|
|
try {
|
|
return await this.request('/basket');
|
|
} catch (error) {
|
|
console.error('Ошибка при получении корзины:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
// Добавить товар в корзину
|
|
async addToBasket(product) {
|
|
try {
|
|
// Проверяем, есть ли товар уже в корзине
|
|
const basketItems = await this.getBasketItems();
|
|
const existingItem = basketItems.find(item => item.id === product.id);
|
|
|
|
if (existingItem) {
|
|
// Если товар уже есть, увеличиваем количество
|
|
await this.updateBasketItem(product.id, existingItem.quantity + 1);
|
|
} else {
|
|
// Если товара нет, добавляем новый
|
|
const basketItem = {
|
|
...product,
|
|
quantity: 1,
|
|
addedAt: new Date().toISOString()
|
|
};
|
|
|
|
const response = await fetch(`${this.apiUrl}/basket`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify(basketItem)
|
|
});
|
|
return await response.json();
|
|
}
|
|
} catch (error) {
|
|
console.error('Ошибка при добавлении в корзину:', error);
|
|
}
|
|
}
|
|
|
|
// Обновить количество товара в корзине
|
|
async updateBasketItem(productId, quantity) {
|
|
try {
|
|
const response = await fetch(`${this.apiUrl}/basket/${productId}`, {
|
|
method: 'PATCH',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify({ quantity })
|
|
});
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error('Ошибка при обновлении корзины:', error);
|
|
}
|
|
}
|
|
|
|
// Удалить товар из корзины
|
|
async removeFromBasket(productId) {
|
|
try {
|
|
await fetch(`${this.apiUrl}/basket/${productId}`, {
|
|
method: 'DELETE'
|
|
});
|
|
} catch (error) {
|
|
console.error('Ошибка при удалении из корзины:', error);
|
|
}
|
|
}
|
|
|
|
// Очистить корзину
|
|
async clearBasket() {
|
|
try {
|
|
const basketItems = await this.getBasketItems();
|
|
for (const item of basketItems) {
|
|
await this.removeFromBasket(item.id);
|
|
}
|
|
} catch (error) {
|
|
console.error('Ошибка при очистке корзины:', error);
|
|
}
|
|
}
|
|
|
|
// Получить все товары из каталога
|
|
async getProducts() {
|
|
try {
|
|
const response = await fetch(`${this.apiUrl}/shmots`);
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error('Ошибка при получении товаров:', error);
|
|
return [];
|
|
}
|
|
}
|
|
} |