Files
PIbd-23_Baryshev_D.A._Inter…/components/likes/model.js
Baryshev Dmitry ae4a4e755f вроде почти все
осталось вывод категорий и состояний
2025-09-26 15:06:01 +04:00

70 lines
2.3 KiB
JavaScript

// components/likes/model.js
export class LikesModel {
constructor() {
this.apiUrl = 'http://localhost:3000';
}
async request(url, options = {}) {
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();
}
async getLikesItems() {
try {
return await this.request('/likes');
} catch (error) {
console.error('Ошибка при получении избранного:', error);
return [];
}
}
async addToLikes(product) {
try {
const items = await this.getLikesItems();
const exists = items.find(item => item.id === product.id);
if (!exists) {
const response = await fetch(`${this.apiUrl}/likes`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(product)
});
return await response.json();
}
} catch (error) {
console.error('Ошибка при добавлении в избранное:', error);
}
}
async removeFromLikes(productId) {
try {
await fetch(`${this.apiUrl}/likes/${productId}`, { method: 'DELETE' });
} catch (error) {
console.error('Ошибка при удалении из избранного:', error);
}
}
async moveToBasket(product) {
try {
// 1. Добавляем в корзину
const basketRes = await fetch(`${this.apiUrl}/basket`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ...product, quantity: 1, addedAt: new Date().toISOString() })
});
await basketRes.json();
// 2. Удаляем из избранного
await this.removeFromLikes(product.id);
} catch (error) {
console.error('Ошибка при переносе товара в корзину:', error);
}
}
}