Files
PIbd-23_Baryshev_D.A._Inter…/components/basket/model.js

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 [];
}
}
}