/
Coderdev
/
web-nodejs-labs
Обзор
Документация
Войти
/
Coderdev
/
web-nodejs-labs
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
backend/src/services/lab9/product.service.js
119 строк
4 KB
Coderdev
1
12 май 2026, 12:34
12 май 2026, 12:34
f5e899f
Код
Авторство
О чём код?
// backend/src/services/lab9/product.service.js class ProductService { // Получить все товары async getAll(db) { const query = 'SELECT * FROM lab9.products ORDER BY id DESC'; const { rows } = await db.query(query); return rows; } // Получить один товар по ID async getById(db, id) { const query = 'SELECT * FROM lab9.products WHERE id = $1'; const { rows } = await db.query(query, [id]); return rows[0] || null; } // Поиск товаров по подстроке названия async search(db, q) { let query, params; if (q && q.trim().length > 0) { query = 'SELECT * FROM lab9.products WHERE title ILIKE $1 ORDER BY id DESC'; params = [`%${q.trim()}%`]; } else { query = 'SELECT * FROM lab9.products ORDER BY id DESC'; params = []; } const { rows } = await db.query(query, params); return rows; } // Статистика склада async getStock(db) { const query = ` SELECT COUNT(*) AS total_products, SUM(amount) AS total_items, SUM(price * amount) AS total_value FROM lab9.products `; const { rows } = await db.query(query); return { total_products: parseInt(rows[0].total_products), total_items: parseInt(rows[0].total_items), total_value: parseInt(rows[0].total_value), }; } // Создать товар async create(db, productData) { const { title, price, amount } = productData; const query = ` INSERT INTO lab9.products (title, price, amount) VALUES ($1, $2, $3) RETURNING * `; const { rows } = await db.query(query, [title, price, amount]); return rows[0]; } // Обновить товар (title, price, amount) async update(db, id, data) { const fields = []; const values = []; let idx = 1; if (data.title !== undefined) { fields.push(`title = $${idx++}`); values.push(data.title); } if (data.price !== undefined) { fields.push(`price = $${idx++}`); values.push(data.price); } if (data.amount !== undefined) { fields.push(`amount = $${idx++}`); values.push(data.amount); } if (fields.length === 0) return null; values.push(id); const query = `UPDATE lab9.products SET ${fields.join(', ')} WHERE id = $${idx} RETURNING *`; const { rows } = await db.query(query, values); return rows[0] || null; } // Удалить товар async delete(db, id) { const query = 'DELETE FROM lab9.products WHERE id = $1 RETURNING id'; const { rows } = await db.query(query, [id]); return rows[0]; } // Проверить наличие и купить (для корзины) async checkStock(db, items) { // items: [{id, qty}] const results = []; for (const item of items) { const { rows } = await db.query('SELECT id, title, amount FROM lab9.products WHERE id = $1', [item.id]); if (!rows[0]) { results.push({ id: item.id, ok: false, reason: 'not found', available: 0 }); } else if (rows[0].amount < item.qty) { results.push({ id: item.id, title: rows[0].title, ok: false, reason: 'insufficient', available: rows[0].amount }); } else { results.push({ id: item.id, title: rows[0].title, ok: true, available: rows[0].amount }); } } return results; } // Провести покупку (уменьшить количество) async purchase(db, items) { // Сначала проверяем const check = await this.checkStock(db, items); const failed = check.filter(r => !r.ok); if (failed.length > 0) { return { success: false, failed }; } // Списываем for (const item of items) { await db.query('UPDATE lab9.products SET amount = amount - $1 WHERE id = $2', [item.qty, item.id]); } return { success: true }; } } export default new ProductService();