A comprehensive Spring Boot backend system for managing AUCA laboratory resources, equipment, bookings, and maintenance.
- Prerequisites
- Setup Instructions
- Default Admin User
- Authentication
- API Endpoints
- Response Format
- Error Handling
- Testing with Postman
- Java 21 or higher
- Maven 3.6+
- MySQL 8.0+
- Postman (for API testing)
-
Clone the repository (if applicable) or navigate to the project directory
-
Create MySQL Database
CREATE DATABASE elisa;
-
Update Database Configuration (if needed)
- Edit
src/main/resources/application.properties - Update database URL, username, and password
- Edit
-
Build the Project
mvn clean install
-
Run the Application
mvn spring-boot:run
The application will start on
http://localhost:8080
On first startup, the system automatically creates a default admin user:
- Username:
admin - Password:
admin123 - Email:
admin@auca.rw - Role:
ADMIN
All endpoints (except /api/auth/**) require JWT authentication. Include the token in the Authorization header:
Authorization: Bearer <your_jwt_token>
- Register a new user or login with existing credentials
- Copy the
tokenfrom the response - Use it in subsequent requests
http://localhost:8080
- POST
/api/auth/register - Description: Register a new user (default role: STUDENT)
- Auth Required: No
- Request Body:
{ "username": "john_doe", "email": "john@example.com", "password": "password123", "firstName": "John", "lastName": "Doe", "labId": null } - Success Response (200):
{ "success": true, "message": "User registered successfully", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "type": "Bearer", "id": 1, "username": "john_doe", "email": "john@example.com", "firstName": "John", "lastName": "Doe", "role": "STUDENT" }, "timestamp": "2024-01-15T10:30:00" }
- POST
/api/auth/login - Description: Login with username and password
- Auth Required: No
- Request Body:
{ "username": "admin", "password": "admin123" } - Success Response (200):
{ "success": true, "message": "Login successful", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "type": "Bearer", "id": 1, "username": "admin", "email": "admin@auca.rw", "firstName": "System", "lastName": "Administrator", "role": "ADMIN" }, "timestamp": "2024-01-15T10:30:00" }
All endpoints require ADMIN role
- POST
/api/admin/users?labId={labId} - Description: Create a new user (Admin, Lab Manager, Instructor, or Student)
- Auth Required: Yes (ADMIN)
- Request Body:
{ "username": "lab_manager1", "email": "manager@auca.rw", "password": "password123", "firstName": "Jane", "lastName": "Manager", "role": "LAB_MANAGER", "active": true } - Query Parameters:
labId(optional): Assign user to a lab
- PUT
/api/admin/users/{id}?labId={labId} - Description: Update user information
- Auth Required: Yes (ADMIN)
- DELETE
/api/admin/users/{id} - Description: Delete a user
- Auth Required: Yes (ADMIN)
- GET
/api/admin/users - Description: Retrieve all users
- Auth Required: Yes (ADMIN)
- GET
/api/admin/users/{id} - Description: Retrieve user by ID
- Auth Required: Yes (ADMIN)
- GET
/api/admin/users/role/{role} - Description: Get users filtered by role (ADMIN, LAB_MANAGER, INSTRUCTOR, STUDENT)
- Auth Required: Yes (ADMIN)
- POST
/api/admin/labs - Description: Create a new lab
- Auth Required: Yes (ADMIN)
- Request Body:
{ "name": "Computer Lab 101", "location": "Building A, Room 101", "capacity": 30, "type": "MAIN_COMPUTER_LAB", "labManagerId": 2 } - Lab Types:
MAIN_COMPUTER_LABEXTENSION_104EXTENSION_108EXTENSION_204EXTENSION_209EXTENSION_310ENGLISH_LAB
- PUT
/api/admin/labs/{id} - Description: Update lab information
- Auth Required: Yes (ADMIN)
- DELETE
/api/admin/labs/{id} - Description: Delete a lab
- Auth Required: Yes (ADMIN)
- GET
/api/labs - Description: Retrieve all labs
- Auth Required: Yes
- GET
/api/labs/active - Description: Retrieve only active labs
- Auth Required: Yes
- GET
/api/labs/{id} - Description: Retrieve lab by ID
- Auth Required: Yes
- GET
/api/lab-manager/labs - Description: Get labs managed by current user
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- POST
/api/lab-manager/equipment - Description: Add new equipment to a lab
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- Request Body:
{ "name": "Desktop Computer", "description": "Dell OptiPlex 7090", "serialNumber": "DL-2024-001", "labId": 1, "status": "AVAILABLE" } - Equipment Status:
AVAILABLEIN_USEUNDER_MAINTENANCEBROKEN
- PUT
/api/lab-manager/equipment/{id} - Description: Update equipment information
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- DELETE
/api/lab-manager/equipment/{id} - Description: Delete equipment
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- GET
/api/equipment - Description: Retrieve all equipment
- Auth Required: Yes
- GET
/api/equipment/{id} - Description: Retrieve equipment by ID
- Auth Required: Yes
- GET
/api/equipment/lab/{labId} - Description: Get all equipment in a specific lab
- Auth Required: Yes
- GET
/api/equipment/status/{status} - Description: Get equipment filtered by status
- Auth Required: Yes
- POST
/api/instructor/bookings - Description: Instructor creates a booking (auto-approved)
- Auth Required: Yes (INSTRUCTOR or ADMIN)
- Request Body:
{ "labId": 1, "startTime": "2024-01-20T09:00:00", "endTime": "2024-01-20T11:00:00", "purpose": "Database Systems Class" }
- POST
/api/student/bookings - Description: Student creates a booking request (pending approval)
- Auth Required: Yes (STUDENT or ADMIN)
- Request Body: Same as instructor booking
- PUT
/api/instructor/bookings/{id} - Description: Update booking details
- Auth Required: Yes (INSTRUCTOR or ADMIN)
- POST
/api/lab-manager/bookings/{id}/approve - Description: Approve a pending booking
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- POST
/api/lab-manager/bookings/{id}/reject - Description: Reject a pending booking
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- POST
/api/bookings/{id}/cancel - Description: Cancel a booking
- Auth Required: Yes (any authenticated user)
- DELETE
/api/admin/bookings/{id} - Description: Delete a booking
- Auth Required: Yes (ADMIN)
- GET
/api/bookings - Description: Retrieve all bookings
- Auth Required: Yes
- GET
/api/bookings/{id} - Description: Retrieve booking by ID
- Auth Required: Yes
- GET
/api/bookings/user/{userId} - Description: Get all bookings for a specific user
- Auth Required: Yes
- GET
/api/bookings/my-bookings - Description: Get current user's bookings
- Auth Required: Yes
- GET
/api/bookings/lab/{labId} - Description: Get all bookings for a specific lab
- Auth Required: Yes
- GET
/api/bookings/lab/{labId}/availability?start=2024-01-20T00:00:00&end=2024-01-21T23:59:59 - Description: Get bookings for a lab within a date range
- Auth Required: Yes
- POST
/api/lab-manager/maintenance - Description: Create a maintenance request
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- Request Body:
{ "equipmentId": 1, "description": "Computer not booting", "assignedTechnicianId": 5, "cost": null, "notes": null }
- POST
/api/lab-manager/maintenance/{id}/assign?technicianId={technicianId} - Description: Assign a technician to maintenance request
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- POST
/api/lab-manager/maintenance/{id}/complete?cost=150.00¬es=Replaced hard drive - Description: Mark maintenance as completed
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- PUT
/api/lab-manager/maintenance/{id} - Description: Update maintenance request details
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- POST
/api/lab-manager/maintenance/{id}/cancel - Description: Cancel a maintenance request
- Auth Required: Yes (LAB_MANAGER or ADMIN)
- GET
/api/maintenance - Description: Retrieve all maintenance requests
- Auth Required: Yes
- GET
/api/maintenance/{id} - Description: Retrieve maintenance request by ID
- Auth Required: Yes
- GET
/api/maintenance/equipment/{equipmentId} - Description: Get maintenance history for equipment
- Auth Required: Yes
- GET
/api/maintenance/status/{status} - Description: Get maintenance filtered by status (PENDING, IN_PROGRESS, COMPLETED, CANCELLED)
- Auth Required: Yes
- GET
/api/maintenance/technician/{technicianId} - Description: Get maintenance assigned to a technician
- Auth Required: Yes
All endpoints require ADMIN role
- GET
/api/admin/reports/monthly-lab-usage?yearMonth=2024-01 - Description: Generate monthly lab usage report
- Auth Required: Yes (ADMIN)
- Query Parameters:
yearMonth: FormatYYYY-MM(e.g.,2024-01)
- GET
/api/admin/reports/equipment-utilization - Description: Generate equipment utilization statistics
- Auth Required: Yes (ADMIN)
- GET
/api/admin/reports/maintenance-statistics - Description: Generate maintenance cost and frequency statistics
- Auth Required: Yes (ADMIN)
All API responses follow a consistent format:
{
"success": true,
"message": "Operation successful",
"data": { ... },
"timestamp": "2024-01-15T10:30:00"
}{
"success": false,
"message": "Error message",
"data": null,
"timestamp": "2024-01-15T10:30:00"
}{
"success": false,
"message": "Validation failed",
"data": {
"username": "Username is required",
"email": "Email should be valid"
},
"timestamp": "2024-01-15T10:30:00"
}The API handles errors with appropriate HTTP status codes:
- 200 OK: Successful request
- 400 Bad Request: Validation errors or business logic errors
- 401 Unauthorized: Missing or invalid JWT token
- 403 Forbidden: Insufficient permissions
- 404 Not Found: Resource not found
- 500 Internal Server Error: Server error
Common error messages:
"Username is already taken""Email is already in use""User not found""Lab not found""Lab is already booked for this time slot""Invalid username or password""Account is deactivated"
-
Create a new Collection: "AUCA Lab Management System"
-
Set Collection Variables:
base_url:http://localhost:8080token: (will be set after login)
-
Create Environment Variables:
- Create a new environment
- Add variable
tokenwith initial value empty
- Create a POST request to
{{base_url}}/api/auth/login - Body (JSON):
{ "username": "admin", "password": "admin123" } - Add a Test Script to save the token:
if (pm.response.code === 200) { var jsonData = pm.response.json(); pm.environment.set("token", jsonData.data.token); }
- Go to Collection settings
- Add Authorization:
- Type: Bearer Token
- Token:
{{token}}
Now all requests will automatically include the token. Test endpoints in this order:
- Create Lab →
/api/admin/labs - Create User →
/api/admin/users(create Lab Manager, Instructor, Student) - Create Equipment →
/api/lab-manager/equipment - Create Booking →
/api/instructor/bookings - Create Maintenance →
/api/lab-manager/maintenance - View Reports →
/api/admin/reports/equipment-utilization
POST {{base_url}}/api/auth/register
Content-Type: application/json
{
"username": "student1",
"email": "student1@auca.rw",
"password": "password123",
"firstName": "Student",
"lastName": "One"
}
POST {{base_url}}/api/admin/labs
Authorization: Bearer {{token}}
Content-Type: application/json
{
"name": "Computer Lab 101",
"location": "Building A, Room 101",
"capacity": 30,
"type": "MAIN_COMPUTER_LAB"
}
POST {{base_url}}/api/instructor/bookings
Authorization: Bearer {{token}}
Content-Type: application/json
{
"labId": 1,
"startTime": "2024-02-20T09:00:00",
"endTime": "2024-02-20T11:00:00",
"purpose": "Database Systems Class"
}
- Full access to all endpoints
- Can manage users, labs, equipment
- Can view all reports
- Manage assigned labs
- Manage equipment in assigned labs
- Approve/reject student bookings
- Create maintenance requests
- View reports for assigned labs
- Create bookings (auto-approved)
- View own bookings
- View lab schedules
- Create booking requests (pending approval)
- View own bookings
- View lab schedules
- Request equipment usage
The system automatically creates the following tables:
users- User accounts with roleslabs- Laboratory informationequipment- Equipment inventorybookings- Lab booking reservationsmaintenance- Maintenance requests and historyaudit_logs- System audit trail
- All timestamps are in ISO 8601 format
- JWT tokens expire after 24 hours (86400000 ms)
- Date/time fields should be in format:
YYYY-MM-DDTHH:mm:ss - The system logs all actions to
audit_logstable for compliance - Equipment status is automatically updated when maintenance is created/completed
For issues or questions, contact the development team.
Version: 1.0.0
Last Updated: January 2024