Role-based staff management with a React client and an Express + MongoDB server. The system uses session-based authentication, province-scoped employee management, Excel exports, and a global performance lock.
- Frontend: React 19, TypeScript, Vite, React Router 7, MUI 7, Axios, Recharts
- Backend: Node.js, Express, TypeScript, Mongoose,
express-session,connect-mongo - Tooling: pnpm, Jest, Supertest
- Login/logout with cookie-backed sessions
- Global admin province dashboard
- Province-scoped employee CRUD
- Employee detail and performance editing
- Province and global Excel exports
- Admin dashboard metrics
- Global performance lock and performance reset
globalAdmin: full access across provinces, employees, exports, and global settingsprovinceAdmin: employee management only inside the assigned province
.
├── client/ # React app
├── server/ # Express API
└── README.md
- Node.js 18+
- pnpm
- MongoDB
cd server && pnpm install
cd ../client && pnpm installCreate server/.env:
PORT=3000
MONGODB_URI=mongodb://localhost:27017/ircdb
SESSION_SECRET=super-secret
CORS_ORIGIN=http://localhost:5173Optional client/.env:
VITE_API_BASE_URL=http://localhost:3000cd server && pnpm dev
cd client && pnpm dev- API default:
http://localhost:3000 - Client default:
http://localhost:5173
| Method | Endpoint | Purpose |
|---|---|---|
| POST | /auth/login |
Create session |
| POST | /auth/logout |
Destroy session |
| GET | /provinces |
List provinces |
| GET | /provinces/:provinceId/employees |
List employees |
| POST | /provinces/:provinceId/employees |
Create employee |
| GET | /provinces/:provinceId/employees/export-excel |
Export province employees |
| GET | /employees/export-all |
Export all employees |
| DELETE | /employees/clear-performances |
Reset performance data |
| GET | /global-settings |
Read performance lock |
| POST | /global-settings/toggle-performance-lock |
Toggle performance lock |
| GET | /admin-dashboard/stats |
Dashboard metrics |
| GET | /health |
Health check |
- Users log in at
/ globalAdmingoes to/provincesprovinceAdmingoes to/provinces/:provinceId/employees- Protected pages are wrapped by
client/src/components/ProtectedRoute.tsx
cd server && pnpm build
cd ../client && pnpm buildcd server && pnpm testTests live in server/src/__tests__/ and use TEST_MONGODB_URI if set, otherwise mongodb://localhost:27017/irc-test.
cd client && pnpm lint- Province images are served from
server/src/imgunder/img - Employee operations are nested under
/provinces/:provinceId/employees - The performance lock blocks employee updates and global performance resets
- Source-of-truth behavior lives in
server/src/routesandserver/src/middleware/auth.ts