- New /catalog page with tree view: Location (🌍) → Category (📂) → Subcategory (📁) → Product - Add/delete locations, categories, subcategories, products from one page - JS-powered subcategory dropdown filtered by category - Sticky sidebar with Add Location/Category/Product forms - Responsive grid layout (tree + forms side by side, stacks on mobile) - Navigation simplified: Catalog replaces separate Locations/Categories/Products - Old routes still accessible for backward compatibility - Subcategories table migration (006_subcategories.js) - subcategory_id column added to products table - Seed data includes subcategories (VPN, Accounts, Hardware, etc.)
59 lines
2.0 KiB
JavaScript
59 lines
2.0 KiB
JavaScript
import express from 'express';
|
|
import cookieParser from 'cookie-parser';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname, join } from 'path';
|
|
import logger from '../utils/logger.js';
|
|
import { requireAuth, handleLogin, handleLogout, renderLogin } from './auth.js';
|
|
import dashboardRouter from './routes/dashboard.js';
|
|
import catalogRouter from './routes/catalog.js';
|
|
import usersRouter from './routes/users.js';
|
|
import productsRouter from './routes/products.js';
|
|
import walletsRouter from './routes/wallets.js';
|
|
import purchasesRouter from './routes/purchases.js';
|
|
import auditRouter from './routes/audit.js';
|
|
import settingsRouter from './routes/settings.js';
|
|
import categoriesRouter from './routes/categories.js';
|
|
import paymentWalletsRouter from './routes/paymentWallets.js';
|
|
import locationsRouter from './routes/locations.js';
|
|
import seedRouter from './routes/seed.js';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const app = express();
|
|
|
|
app.use(cookieParser());
|
|
app.use(express.urlencoded({ extended: true }));
|
|
app.use('/admin/style.css', express.static(join(__dirname, 'public', 'style.css')));
|
|
|
|
app.get('/health', (req, res) => {
|
|
res.json({ status: 'ok', uptime: process.uptime() });
|
|
});
|
|
|
|
app.get('/login', (req, res) => {
|
|
res.send(renderLogin());
|
|
});
|
|
|
|
app.post('/login', handleLogin);
|
|
app.get('/logout', handleLogout);
|
|
|
|
app.use(requireAuth);
|
|
|
|
app.use('/', dashboardRouter);
|
|
app.use('/catalog', catalogRouter);
|
|
app.use('/users', usersRouter);
|
|
app.use('/products', productsRouter);
|
|
app.use('/wallets', walletsRouter);
|
|
app.use('/purchases', purchasesRouter);
|
|
app.use('/audit', auditRouter);
|
|
app.use('/settings', settingsRouter);
|
|
app.use('/categories', categoriesRouter);
|
|
app.use('/locations', locationsRouter);
|
|
app.use('/payment-wallets', paymentWalletsRouter);
|
|
app.use('/seed', seedRouter);
|
|
|
|
export function startAdminPanel() {
|
|
const port = parseInt(process.env.ADMIN_PORT || '3001', 10);
|
|
app.listen(port, () => {
|
|
logger.info({ port }, 'Admin panel started');
|
|
});
|
|
}
|