/
Centermant
/
web-nodejs
Обзор
Документация
Войти
/
Centermant
/
web-nodejs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/src/services/lab10/adminService.js
297 строк
8 KB
Centermant
feat(lab9.1 final)
04 дек 2025, 00:36
04 дек 2025, 00:36
8ccd8ce
Код
Авторство
О чём код?
class AdminService { async getProducts(db) { try { const { rows } = await db.query(` SELECT p.*, c.name as category_name, c.id as category_id FROM lab10.products p LEFT JOIN lab10.categories c ON p.category_id = c.id ORDER BY p.id `); return rows; } catch (error) { throw new Error(`Failed to get products: ${error.message}`); } } async getUsers(db) { try { const { rows } = await db.query(` SELECT id, name as username, email, role, created_at, (SELECT COUNT(*) FROM lab10.orders WHERE user_id = users.id) as order_count FROM lab10.users ORDER BY created_at DESC `); return rows; } catch (error) { throw new Error(`Failed to get users: ${error.message}`); } } async getOrders(db, { page = 1, limit = 10, status } = {}) { try { const offset = (page - 1) * limit; // Формируем условия для фильтрации const conditions = []; const values = []; // Фильтр по статусу if (status) { values.push(status); conditions.push(`o.status = $${values.length}`); } // Собираем WHERE часть const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''; // Запрос для получения заказов const sql = ` SELECT o.*, u.name as user_name, u.email as user_email, (SELECT SUM(oi.quantity) FROM lab10.order_items oi WHERE oi.order_id = o.id) as total_items FROM lab10.orders o LEFT JOIN lab10.users u ON o.user_id = u.id ${whereClause} ORDER BY o.created_at DESC LIMIT $${values.length + 1} OFFSET $${values.length + 2} `; // Запрос для получения общего количества заказов const countSql = ` SELECT COUNT(*) as count FROM lab10.orders o ${whereClause} `; // Выполняем оба запроса const dataResult = await db.query(sql, [...values, limit, offset]); const countResult = await db.query(countSql, values); const total = parseInt(countResult.rows[0].count); return { data: dataResult.rows, total, page: parseInt(page), limit: parseInt(limit), totalPages: Math.ceil(total / limit) }; } catch (error) { throw new Error(`Failed to get orders: ${error.message}`); } } async getOrderDetails(db, orderId) { try { // Получаем информацию о заказе const { rows: orderRows } = await db.query(` SELECT o.*, u.name as user_name, u.email as user_email FROM lab10.orders o LEFT JOIN lab10.users u ON o.user_id = u.id WHERE o.id = $1 `, [orderId]); if (orderRows.length === 0) { throw new Error('Order not found'); } const order = orderRows[0]; // Получаем товары в заказе const { rows: items } = await db.query(` SELECT oi.*, p.title as product_title, p.image as product_image FROM lab10.order_items oi JOIN lab10.products p ON oi.product_id = p.id WHERE oi.order_id = $1 `, [orderId]); return { ...order, items }; } catch (error) { throw new Error(`Failed to get order details: ${error.message}`); } } async createProduct(db, product) { const { title, description, price, amount, categoryId, image } = product; try { const { rows } = await db.query(` INSERT INTO lab10.products (title, description, price, amount, category_id, image) VALUES ($1, $2, $3, $4, $5, $6) RETURNING * `, [title, description, price, amount, categoryId, image]); return rows[0]; } catch (error) { throw new Error(`Failed to create product: ${error.message}`); } } async updateProduct(db, id, product) { const { title, description, price, amount, categoryId, image } = product; try { const { rows } = await db.query(` UPDATE lab10.products SET title = $1, description = $2, price = $3, amount = $4, category_id = $5, image = $6 WHERE id = $7 RETURNING * `, [title, description, price, amount, categoryId, image, id]); if (rows.length === 0) { throw new Error('Product not found'); } return rows[0]; } catch (error) { throw new Error(`Failed to update product: ${error.message}`); } } async deleteProduct(db, id) { try { const { rows } = await db.query(` DELETE FROM lab10.products WHERE id = $1 RETURNING id `, [id]); if (rows.length === 0) { throw new Error('Product not found'); } return { success: true, id }; } catch (error) { throw new Error(`Failed to delete product: ${error.message}`); } } async createUser(db, userData) { try { const { username, email, password, role = 'user' } = userData; // Хешируем пароль const passwordHash = await bcrypt.hash(password, 10); const { rows } = await db.query(` INSERT INTO lab10.users (name, password, email, role) VALUES ($1, $2, $3, $4) RETURNING id, name as username, email, role, created_at `, [username, passwordHash, email, role]); return rows[0]; } catch (error) { throw new Error(`Failed to create user: ${error.message}`); } } async updateUser(db, userId, userData) { try { const { username, email, role } = userData; const fields = []; const values = []; if (username) { values.push(username); fields.push(`name = $${values.length}`); } if (email) { values.push(email); fields.push(`email = $${values.length}`); } if (role) { values.push(role); fields.push(`role = $${values.length}`); } if (fields.length === 0) { throw new Error('No fields to update'); } values.push(userId); const { rows } = await db.query(` UPDATE lab10.users SET ${fields.join(', ')}, updated_at = NOW() WHERE id = $${values.length} RETURNING id, name as username, email, role, created_at `, values); if (rows.length === 0) { throw new Error('User not found'); } return rows[0]; } catch (error) { throw new Error(`Failed to update user: ${error.message}`); } } async deleteUser(db, userId) { try { const { rows } = await db.query(` DELETE FROM lab10.users WHERE id = $1 RETURNING id `, [userId]); if (rows.length === 0) { throw new Error('User not found'); } return { success: true, id: userId }; } catch (error) { throw new Error(`Failed to delete user: ${error.message}`); } } async updateOrderStatus(db, orderId, status) { try { const validStatuses = ['created', 'processing', 'shipped', 'delivered', 'cancelled']; if (!validStatuses.includes(status)) { throw new Error('Invalid order status'); } const { rows } = await db.query(` UPDATE lab10.orders SET status = $1 WHERE id = $2 RETURNING id, status, created_at as updated_at `, [status, orderId]); if (rows.length === 0) { throw new Error('Order not found'); } return rows[0]; } catch (error) { throw new Error(`Failed to update order status: ${error.message}`); } } } export default new AdminService();