A complete system for managing user access to software applications with role-based permissions.
├── backend/ # Node.js + Express backend
│ ├── src/
│ │ ├── config/ # Configuration files
│ │ ├── controllers/ # API controllers
│ │ ├── entities/ # TypeORM entities
│ │ ├── middleware/ # Custom middleware
│ │ ├── routes/ # API routes
│ │ ├── utils/ # Helper functions
│ │ └── index.ts # Entry point
│ ├── .env.example # Environment variables example
│ ├── package.json # Backend dependencies
│ └── tsconfig.json # TypeScript configuration
├── frontend/ # React frontend
│ ├── public/ # Static files
│ ├── src/
│ │ ├── components/ # Reusable components
│ │ ├── context/ # React context
│ │ ├── pages/ # Page components
│ │ ├── services/ # API services
│ │ ├── utils/ # Helper functions
│ │ ├── App.tsx # Main App component
│ │ └── index.tsx # Entry point
│ ├── package.json # Frontend dependencies
│ └── tsconfig.json # TypeScript configuration
└── README.md # Project documentation
Navigate to the backend directory:
cd backend
Install dependencies:
npm install
Create a .env file based on .env.example:
cp .env.example .env
Update the .env file with your PostgreSQL credentials and JWT secret.
Start the development server:
npm run dev
Navigate to the frontend directory:
cd frontend
Install dependencies:
npm install
Start the development server:
npm start
POST /api/auth/signup - Register a new user
{ username, password }{ id, username, role }POST /api/auth/login - Login and get JWT token
{ username, password }{ token, user: { id, username, role } }GET /api/software - Get all software
[{ id, name, description, accessLevels }]POST /api/software - Create new software
{ name, description, accessLevels }{ id, name, description, accessLevels }GET /api/requests - Get all requests (filtered by role)
[{ id, user, software, accessType, reason, status }]POST /api/requests - Create a new access request
{ softwareId, accessType, reason }{ id, user, software, accessType, reason, status }PATCH /api/requests/:id - Approve or reject a request (Manager only)
{ status: 'Approved' | 'Rejected' }{ id, user, software, accessType, reason, status }