Akwa-Team is a comprehensive event management platform designed for the German University in Cairo (GUC). The system facilitates event creation, registration, payment processing, vendor management, visitor tracking, and community engagement through polls and loyalty programs. It supports multiple user roles including students, staff, professors, vendors, events office personnel, and administrators, each with tailored functionalities and access controls.
The project was developed to streamline event management processes at GUC by providing a centralized platform where:
- Events Office staff can create and manage various event types (workshops, trips, bazaars, conferences, gym sessions)
- Students, staff, and professors can discover, register, and pay for events
- Vendors can apply for bazaars and booths, manage applications, and participate in loyalty programs
- Administrators can oversee the entire system, manage users, and generate reports
- External visitors can register for events and receive QR codes for check-in
- The community can vote on vendor selection through polls
The system automates email notifications, payment processing, certificate generation, and event reminders to reduce manual administrative work and improve user experience.
✅ Production Ready - The system is fully functional with all core features implemented and tested.
- Backend: Running on Node.js with Express
- Frontend: React application with Vite
- Database: MongoDB connection established
- Authentication: JWT-based authentication implemented
- Email Service: Configured with Nodemailer
- File Uploads: Multer configured for document handling
The project follows JavaScript/Node.js best practices:
- Backend: CommonJS modules with Express.js
- Frontend: ES6 modules with React 19
- Naming Conventions:
- Controllers: camelCase (e.g.,
eventController.js) - Routes: camelCase (e.g.,
eventRoutes.js) - Models: PascalCase (e.g.,
Event.js,Student.js)
- Controllers: camelCase (e.g.,
- Code Organization:
- MVC pattern (Models, Views/Components, Controllers)
- Separation of concerns (routes, controllers, middleware, services)
- Reusable middleware for authentication and authorization
- Error Handling: Try-catch blocks with appropriate error responses
- Linting: ESLint configured for frontend code
/screenshots/admin-dashboard.png- Admin dashboard showing system overview/screenshots/student-dashboard.png- Student dashboard with upcoming events/screenshots/events-office-dashboard.png- Events Office dashboard for event management/screenshots/vendor-dashboard.png- Vendor dashboard with application status
/screenshots/create-event.png- Event creation form/screenshots/event-details.png- Event details page with registration/screenshots/payment-page.png- Payment processing interface/screenshots/certificates-page.png- Certificate management and download
/screenshots/apply-bazaar.png- Vendor bazaar application form/screenshots/vendor-polls.png- Community voting on vendor selection/screenshots/loyalty-partners.png- Loyalty program partners list
/screenshots/pending-events.png- Events pending approval/screenshots/pending-vendors.png- Vendor applications awaiting review/screenshots/reports.png- System reports and analytics/screenshots/visitor-management.png- Visitor registration and QR code generation
- Node.js (v18+) - Runtime environment
- Express.js (v5.1.0) - Web framework
- MongoDB - NoSQL database
- Mongoose (v8.19.1) - MongoDB object modeling
- JSON Web Token (v9.0.2) - Authentication
- bcryptjs (v3.0.2) - Password hashing
- Joi (v18.0.1) - Input validation
- Multer (v2.0.2) - File upload handling
- Nodemailer (v7.0.9) - Email service
- node-cron (v4.2.1) - Scheduled tasks (event reminders)
- QRCode (v1.5.4) - QR code generation
- XLSX (v0.18.5) - Excel file generation
- Puppeteer (v24.31.0) - PDF generation
- dotenv (v17.2.3) - Environment variable management
- CORS (v2.8.5) - Cross-origin resource sharing
- React (v19.1.1) - UI library
- React Router DOM (v7.9.4) - Client-side routing
- Vite (v5.4.21) - Build tool and dev server
- Axios (v1.12.2) - HTTP client
- Tailwind CSS (v4.1.14) - Utility-first CSS framework
- Framer Motion (v12.23.24) - Animation library
- Lucide React (v0.546.0) - Icon library
- QRCode (v1.5.4) - QR code generation (client-side)
- XLSX (v0.18.5) - Excel file handling (client-side)
- clsx (v2.1.1) - Conditional class names
- tailwind-merge (v3.3.1) - Tailwind class merging
- Nodemon (v3.1.10) - Auto-restart for development
- ESLint (v9.36.0) - Code linting
- Babel Plugin React Compiler - React optimization
- Multi-role authentication (Student, Staff, Professor, Vendor, Events Office, Admin)
- JWT-based session management
- Email verification for new registrations
- Role-based access control (RBAC)
- Protected routes with middleware
- Event Types: Workshops, Trips, Bazaars, Conferences, Gym Sessions
- Event Creation: Events Office can create various event types
- Event Approval: Admin/Events Office approval workflow for professor-created workshops
- Event Search: Advanced search by name, type, date range, and filters
- Event Archiving: Archive and unarchive past events
- Event Rating & Comments: Users can rate and comment on events
- Event Favorites: Save favorite events for quick access
- Past Events: View and filter past events
- Event Registration: Register for workshops, trips, and gym sessions
- Court Reservations: Reserve sports courts with time slots
- Registration Management: View, cancel, and manage registrations
- Payment Integration: Wallet-based payment system
- Payment Methods: Save and manage payment methods
- Refunds: Automatic refund processing for cancellations
- Wallet System: User wallet with balance tracking
- Payment Processing: Secure payment processing for event registrations
- Payment History: Track all payment transactions
- Refund Management: Automatic refunds for cancelled registrations
- Payment Methods: Multiple payment method support
- Vendor Registration: Vendors can register with logo and tax card upload
- Bazaar Applications: Apply to participate in bazaars with attendee information
- Booth Applications: Apply for permanent booths in the platform
- Application Status: Track application status (pending, accepted, rejected)
- Payment for Applications: Pay for accepted vendor applications
- Application Cancellation: Cancel applications before payment
- External Visitor Registration: Public registration for external visitors
- QR Code Generation: Automatic QR code generation for visitors
- QR Code Verification: Verify visitor QR codes at event check-in
- Visitor Check-in: Events Office can check in visitors
- Visitor Export: Export visitor lists and QR codes
- Email Notifications: Automated email notifications for:
- Registration confirmations
- Payment receipts
- Event reminders (24 hours and 1 hour before)
- Application status updates
- Staff verification links
- In-App Notifications: Real-time notification system
- Notification Management: Mark as read, view unread count
- Certificate Generation: Automatic certificate generation for completed workshops
- Certificate Download: Download certificates as PDF
- Certificate Email: Send certificates via email
- Completed Workshops: Track workshops eligible for certificates
- Session Creation: Events Office creates gym sessions
- Monthly Calendar View: View gym sessions by month
- Session Registration: Register for available gym sessions
- Session Management: Edit and cancel gym sessions
- Loyalty Partner Applications: Vendors can apply to become loyalty partners
- Application Review: Admin/Events Office reviews and approves applications
- Partner Directory: Public directory of approved loyalty partners
- Program Management: Vendors can cancel their loyalty program participation
- Vendor Selection Polls: Events Office creates polls for vendor selection
- Community Voting: Students, staff, and professors vote on vendor selection
- Poll Management: Create, view, close, and delete polls
- Poll Results: View poll results and statistics
- Overlapping Booth Detection: Automatically detect overlapping vendor applications
- Attendee Reports: Generate reports on event attendance
- Sales Reports: Generate sales and revenue reports
- Event Registration Export: Export event registrations to Excel
- Visitor Export: Export visitor data and QR codes
- User Management: View, block, and unblock users
- Staff Management: Assign roles, verify staff, manage staff accounts
- Admin Management: Create and manage admin accounts
- Events Office Management: Create and manage Events Office accounts
- Pending Approvals: Review and approve pending events, vendors, and staff
- System Reports: Access comprehensive system reports
// POST /api/student/register
// Register for an event
const registerForEvent = async (req, res) => {
try {
const { eventId } = req.body;
const accountId = req.user.id;
// Check if already registered
const existing = await Registration.findOne({
event: eventId,
account: accountId
});
if (existing) {
return res.status(400).json({
message: 'Already registered for this event'
});
}
// Create registration
const registration = await Registration.create({
event: eventId,
account: accountId,
status: 'pending_payment'
});
res.status(201).json({
message: 'Registration successful',
registration
});
} catch (error) {
res.status(500).json({ message: error.message });
}
};// EventCard.jsx
import { Link } from 'react-router-dom';
import { Calendar, MapPin, Users } from 'lucide-react';
function EventCard({ event }) {
return (
<div className="bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition">
<h3 className="text-xl font-bold mb-2">{event.name}</h3>
<div className="flex items-center gap-2 text-gray-600 mb-2">
<Calendar className="w-4 h-4" />
<span>{new Date(event.date).toLocaleDateString()}</span>
</div>
<div className="flex items-center gap-2 text-gray-600 mb-4">
<MapPin className="w-4 h-4" />
<span>{event.location}</span>
</div>
<Link
to={`/events/${event._id}`}
className="text-blue-600 hover:underline"
>
View Details
</Link>
</div>
);
}// middleware/auth.js
const jwt = require('jsonwebtoken');
function requireAuth(req, res, next) {
try {
const header = req.headers.authorization || '';
const [, token] = header.split(' ');
if (!token) {
return res.status(401).json({ message: 'Unauthorized: missing token' });
}
const payload = jwt.verify(token, process.env.JWT_SECRET);
req.user = {
id: payload.sub || payload.accountId,
role: payload.role?.toLowerCase(),
email: payload.email
};
next();
} catch {
return res.status(401).json({ message: 'Unauthorized: invalid token' });
}
}
function requireRole(roles = []) {
return (req, res, next) => {
if (!req.user || !roles.includes(req.user.role)) {
return res.status(403).json({ message: 'Forbidden: insufficient role' });
}
next();
};
}// services/eventReminderService.js
const { sendEmail } = require('../config/emailConfig');
const cron = require('node-cron');
async function sendOneDayReminders() {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
const events = await Event.find({
date: { $gte: tomorrow, $lt: new Date(tomorrow.getTime() + 86400000) }
});
for (const event of events) {
const registrations = await Registration.find({
event: event._id,
status: 'paid'
});
for (const reg of registrations) {
await sendEmail({
to: reg.account.email,
subject: `Reminder: ${event.name} is tomorrow!`,
html: `<p>Don't forget about ${event.name} tomorrow at ${event.time}!</p>`
});
}
}
}- Node.js (v18 or higher)
- MongoDB (v6 or higher) - Local installation or MongoDB Atlas account
- npm or yarn package manager
- Git for version control
-
Navigate to backend directory:
cd backend -
Install dependencies:
npm install
-
Create
.envfile in thebackenddirectory:# Database MONGO_URI=mongodb://localhost:27017/akwa-team # Or use MongoDB Atlas: # MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/akwa-team # JWT Secret JWT_SECRET=your-super-secret-jwt-key-change-this-in-production # Email Configuration EMAIL_HOST=smtp.gmail.com EMAIL_PORT=587 EMAIL_SECURE=false EMAIL_USER=your-email@gmail.com EMAIL_PASS=your-app-password MAIL_FROM=GUC Events <no-reply@guc.edu.eg> # Frontend URL (for email links) FRONTEND_URL=http://localhost:5173 # Server Port (optional, defaults to 5001) PORT=5001
-
Start MongoDB (if using local installation):
# Windows mongod # macOS/Linux sudo systemctl start mongod # or brew services start mongodb-community
-
Run the backend server:
# Development mode (with auto-restart) npm run dev # Production mode npm start
The backend server will start on
http://localhost:5001
-
Navigate to frontend directory:
cd frontend/Acl -
Install dependencies:
npm install
-
Create
.envfile in thefrontend/Acldirectory (if needed):VITE_API_URL=http://localhost:5001/api
-
Start the development server:
npm run dev
The frontend will start on
http://localhost:5173 -
Build for production:
npm run build
For Gmail:
- Enable 2-Step Verification on your Google account
- Generate an App Password:
- Go to Google Account settings
- Security → 2-Step Verification → App passwords
- Generate a password for "Mail"
- Use the generated app password in
EMAIL_PASS(not your regular password)
The system uses Multer for file uploads. Uploaded files are stored in:
backend/Public/uploads/vendors/- Vendor logos and tax cardsbackend/Public/uploads/attendee-ids/- Attendee identification documents
Ensure these directories exist and have write permissions.
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/auth/register |
Register new user (supports vendor file uploads) | No |
| GET | /api/auth/verify-email |
Verify email address | No |
| POST | /api/auth/login |
User login | No |
| POST | /api/auth/logout |
User logout | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/events/upcoming |
Get all upcoming events | No |
| GET | /api/events/search |
Search events by name or type | No |
| GET | /api/events/search/advanced |
Advanced event search with filters | No |
| GET | /api/events/archived |
Get archived events | No |
| GET | /api/events/past |
Get past events for authenticated user | Yes |
| GET | /api/events/past/:userId |
Get past events by user ID | No |
| GET | /api/events/:id |
Get event by ID | No |
| PATCH | /api/events/:id |
Edit event | Yes |
| PATCH | /api/events/:id/archive |
Archive event | Yes |
| PATCH | /api/events/:id/unarchive |
Unarchive event | Yes |
| POST | /api/events/:eventId/rate |
Rate an event | Yes |
| POST | /api/events/:eventId/comment |
Comment on an event | Yes |
| GET | /api/events/:eventId/comments |
Get event comments | No |
| DELETE | /api/events/comments/:commentId |
Delete comment (Admin only) | Yes (Admin) |
| GET | /api/events/:eventId/registrations |
Get event registrations | Yes (Events Office) |
| GET | /api/events/:eventId/registrations/export |
Export registrations to Excel | Yes (Events Office) |
| POST | /api/events/conference |
Create conference | Yes |
| GET | /api/events/conferences |
Get all conferences | No |
| PUT | /api/events/conference/:id |
Update conference | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/student/events/available |
Get available workshops and trips | No |
| POST | /api/student/register |
Register for event | Yes |
| GET | /api/student/registrations |
Get user registrations | No |
| GET | /api/student/my/registrations |
Get authenticated user's registrations | Yes |
| GET | /api/student/courts/available |
Get available courts | Yes |
| POST | /api/student/courts/reserve |
Reserve a court | Yes |
| GET | /api/student/courts/my-reservations |
Get my court reservations | Yes |
| GET | /api/student/payment/registrations |
Get registrations pending payment | Yes |
| GET | /api/student/payment/paid-registrations |
Get paid registrations | Yes |
| GET | /api/student/payment/wallet-balance |
Get wallet balance | Yes |
| POST | /api/student/payment/process |
Process payment | Yes |
| POST | /api/student/payment/refund |
Cancel registration and refund | Yes |
| GET | /api/student/payment/methods |
Get payment methods | Yes |
| POST | /api/student/payment/methods |
Save payment method | Yes |
| GET | /api/student/certificates/completed-workshops |
Get completed workshops | Yes |
| POST | /api/student/certificates/send |
Send certificate via email | Yes |
| GET | /api/student/certificates/download |
Download certificate | Yes |
| GET | /api/student/gym/sessions/month/:year/:month |
Get gym sessions by month | Yes |
| POST | /api/student/gym/sessions/:sessionId/register |
Register for gym session | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/professor/workshops |
Create workshop | Yes (Professor) |
| GET | /api/professor/events |
Get all available events | Yes (Professor) |
| GET | /api/professor/events/search |
Search events | Yes (Professor) |
| POST | /api/professor/events/:eventId/register |
Register for event | Yes (Professor) |
| GET | /api/professor/my-registrations |
Get my registrations | Yes (Professor) |
| PUT | /api/professor/workshops/:workshopId |
Update workshop | Yes (Professor) |
| GET | /api/professor/my-workshops |
Get my workshops | Yes (Professor) |
| GET | /api/professor/workshops/:workshopId/participants |
Get workshop participants | Yes (Professor) |
| GET | /api/professor/gym/sessions |
Get gym sessions | Yes (Professor) |
| POST | /api/professor/gym/sessions/:sessionId/register |
Register for gym session | Yes (Professor) |
| GET | /api/professor/payment/registrations |
Get payment registrations | Yes |
| GET | /api/professor/payment/paid-registrations |
Get paid registrations | Yes |
| GET | /api/professor/payment/wallet-balance |
Get wallet balance | Yes |
| POST | /api/professor/payment/process |
Process payment | Yes |
| POST | /api/professor/payment/refund |
Cancel and refund | Yes |
| GET | /api/professor/certificates/completed-workshops |
Get completed workshops | Yes |
| POST | /api/professor/certificates/send |
Send certificate | Yes |
| GET | /api/professor/certificates/download |
Download certificate | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/staff/events |
Get all available events | Yes (Staff/TA/Professor) |
| GET | /api/staff/gym/sessions/month/:year/:month |
Get gym sessions by month | Yes (Staff/TA/Professor) |
| POST | /api/staff/gym/sessions/:sessionId/register |
Register for gym session | Yes (Staff/TA/Professor) |
| GET | /api/staff/payment/registrations |
Get payment registrations | Yes |
| GET | /api/staff/payment/paid-registrations |
Get paid registrations | Yes |
| GET | /api/staff/payment/wallet-balance |
Get wallet balance | Yes |
| POST | /api/staff/payment/process |
Process payment | Yes |
| POST | /api/staff/payment/refund |
Cancel and refund | Yes |
| GET | /api/staff/certificates/completed-workshops |
Get completed workshops | Yes |
| POST | /api/staff/certificates/send |
Send certificate | Yes |
| GET | /api/staff/certificates/download |
Download certificate | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/vendor/vendor/bazaars/upcoming |
View upcoming bazaars | Yes (Vendor) |
| POST | /api/vendor/vendor/bazaars/apply |
Apply for bazaar | Yes (Vendor) |
| POST | /api/vendor/vendor/booths/apply |
Apply for booth | Yes (Vendor) |
| GET | /api/vendor/vendor/applications/accepted |
View accepted applications | Yes (Vendor) |
| GET | /api/vendor/vendor/applications/pending-rejected |
View pending/rejected applications | Yes (Vendor) |
| POST | /api/vendor/vendor/applications/cancel |
Cancel application | Yes (Vendor) |
| POST | /api/vendor/vendor/applications/pay |
Pay for accepted application | Yes (Vendor) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/admin/staff/pending |
Get pending staff applications | Yes (Admin) |
| POST | /api/admin/assign-role |
Assign role to staff | Yes (Admin) |
| GET | /api/admin/verify/:token |
Verify staff email | No |
| GET | /api/admin/staff/all |
Get all staff | Yes (Admin) |
| GET | /api/admin/admins/all |
Get all admins | Yes (Admin) |
| GET | /api/admin/eventsOffice/all |
Get all Events Office staff | Yes (Admin) |
| POST | /api/admin/admins/create |
Create admin | Yes (Admin) |
| POST | /api/admin/eventsOffice/create |
Create Events Office account | Yes (Admin) |
| DELETE | /api/admin/admins/:adminId |
Delete admin | Yes (Admin) |
| DELETE | /api/admin/eventsOffice/:adminId |
Delete Events Office account | Yes (Admin) |
| GET | /api/admin/users/all |
Get all users | Yes (Admin) |
| POST | /api/admin/users/block |
Block user | Yes (Admin) |
| POST | /api/admin/users/unblock |
Unblock user | Yes (Admin) |
| GET | /api/admin/events/upcoming |
Get upcoming events | Yes (Admin) |
| GET | /api/admin/events/pending |
Get pending events | Yes (Admin) |
| DELETE | /api/admin/events/:eventId |
Delete event | Yes (Admin) |
| GET | /api/admin/vendors/pending |
Get pending vendors | Yes (Admin) |
| GET | /api/admin/vendors/all |
Get all vendor applications | Yes (Admin) |
| POST | /api/admin/vendors/applications/:applicationId/attendees/:attendeeIndex/generate-qr |
Generate attendee QR | Yes (Admin) |
| POST | /api/admin/vendors/approve |
Approve vendor | Yes (Admin) |
| POST | /api/admin/vendors/reject |
Reject vendor | Yes (Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/events-office/bazaars |
Create bazaar | Yes (Events Office/Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/events-office/trips |
Create trip | Yes (Events Office/Admin) |
| PUT | /api/events-office/trips/:id |
Edit trip | Yes (Events Office/Admin) |
| PATCH | /api/events-office/trips/:id |
Edit trip | Yes (Events Office/Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| PATCH | /api/events-office/workshops/:id/publish |
Publish workshop | Yes |
| PATCH | /api/events-office/workshops/:id/reject |
Reject workshop | Yes |
| PATCH | /api/events-office/workshops/:id/request-edits |
Request edits | Yes (Events Office/Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/events-office/gym-sessions |
Create gym session | Yes (Events Office/Admin) |
| GET | /api/events-office/gym-sessions |
Get all gym sessions | Yes |
| GET | /api/events-office/gym-sessions/month/:year/:month |
Get gym sessions by month | Yes |
| GET | /api/events-office/gym-sessions/:id |
Get gym session by ID | Yes |
| PATCH | /api/events-office/gym-sessions/:id |
Edit gym session | Yes (Events Office/Admin) |
| PATCH | /api/events-office/gym-sessions/:id/cancel |
Cancel gym session | Yes (Events Office/Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/notifications |
Get all notifications | Yes |
| GET | /api/notifications/unread-count |
Get unread count | Yes |
| PATCH | /api/notifications/:id/read |
Mark notification as read | Yes |
| PATCH | /api/notifications/mark-all-read |
Mark all as read | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/visitors/register/:eventId |
Register visitor | No |
| POST | /api/visitors/verify |
Verify QR token | No |
| GET | /api/visitors/:visitorId |
Get visitor details | Yes |
| GET | /api/visitors/:visitorId/qr |
Get visitor QR code | Yes |
| GET | /api/visitors/event/:eventId |
Get event visitors | Yes (Events Office/Admin) |
| GET | /api/visitors/event/:eventId/export-qrs |
Export visitor QR codes | Yes (Events Office/Admin) |
| POST | /api/visitors/:visitorId/checkin |
Check in visitor | Yes (Events Office/Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/vendor-polls/find-overlapping |
Find overlapping booths | Yes (Events Office/Admin) |
| POST | /api/vendor-polls/create |
Create poll | Yes (Events Office/Admin) |
| GET | /api/vendor-polls |
Get all polls | Yes (Events Office/Admin) |
| GET | /api/vendor-polls/active/list |
Get active polls | Yes |
| GET | /api/vendor-polls/:pollId |
Get poll details | Yes |
| GET | /api/vendor-polls/:pollId/results |
Get poll results | Yes |
| POST | /api/vendor-polls/:pollId/vote |
Submit vote | Yes |
| POST | /api/vendor-polls/:pollId/close |
Close poll | Yes (Events Office/Admin) |
| DELETE | /api/vendor-polls/:pollId |
Delete poll | Yes (Events Office/Admin) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/loyalty/apply |
Apply for loyalty program | Yes (Vendor) |
| POST | /api/loyalty/cancel |
Cancel loyalty program | Yes (Vendor) |
| GET | /api/loyalty/my-status |
Get my loyalty status | Yes (Vendor) |
| GET | /api/loyalty/partners |
Get all loyalty partners | Yes |
| GET | /api/loyalty/pending |
Get pending applications | Yes (Admin/Events Office) |
| POST | /api/loyalty/:applicationId/approve |
Approve application | Yes (Admin/Events Office) |
| POST | /api/loyalty/:applicationId/reject |
Reject application | Yes (Admin/Events Office) |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/favorites |
Get favorite events | Yes |
| POST | /api/favorites |
Add favorite event | Yes |
| DELETE | /api/favorites/:eventId |
Remove favorite event | Yes |
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/reports/attendees |
Get attendees report | Yes (Events Office/Admin) |
| GET | /api/reports/sales |
Get sales report | Yes (Events Office/Admin) |
Currently, the project does not have automated test suites implemented. However, the following test files exist for manual testing:
backend/test-event-api.js- Manual API testing for eventsbackend/test-reports-api.js- Manual API testing for reportsbackend/seed-test.js- Database seeding for testing
-
Test Event API:
cd backend node test-event-api.js -
Test Reports API:
cd backend node test-reports-api.js -
Test Email Configuration:
cd backend node scripts/test-email-config.js
The following areas should be covered in future test implementations:
-
Unit Tests:
- Controllers (event, registration, payment, vendor)
- Middleware (authentication, authorization)
- Services (email, reminders)
- Utilities (validation, parsing)
-
Integration Tests:
- API endpoints
- Database operations
- File upload handling
- Email sending
-
End-to-End Tests:
- User registration and login flow
- Event creation and registration flow
- Payment processing flow
- Vendor application flow
To add comprehensive testing:
-
Install testing frameworks:
npm install --save-dev jest supertest @testing-library/react
-
Create test directories:
backend/__tests__/- Backend testsfrontend/Acl/src/__tests__/- Frontend tests
-
Add test scripts to package.json:
{ "scripts": { "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage" } }
-
Registration:
- Navigate to
/register - Select "Student" role
- Fill in registration form (name, email, password, student ID)
- Verify email via link sent to your email
- Login at
/login
- Navigate to
-
Browse Events:
- View upcoming events on dashboard
- Use search to find specific events
- Click on event to view details
-
Register for Events:
- Go to "Register" page
- Select available workshop or trip
- Complete registration form
- Proceed to payment
-
Make Payments:
- Go to "Payment" page
- View pending registrations
- Add payment method
- Process payment from wallet balance
-
Reserve Courts:
- Go to "Courts" page
- View available time slots
- Select court and time slot
- Complete reservation
-
View Certificates:
- Go to "Certificates" page
- View completed workshops
- Download or email certificates
-
Create Workshop:
- Navigate to "Create Workshop"
- Fill in workshop details (name, description, date, time, location, capacity)
- Submit for Events Office approval
-
Manage Workshops:
- View "My Workshops" to see created workshops
- Edit workshop details
- View participants list
-
Register for Events:
- Browse available events
- Register for workshops, trips, or gym sessions
- Make payments as needed
-
Registration:
- Navigate to
/register - Select "Vendor" role
- Fill in business information
- Upload logo and tax card
- Verify email and wait for admin approval
- Navigate to
-
Apply for Bazaars:
- View upcoming bazaars
- Click "Apply for Bazaar"
- Fill in application form
- Upload attendee IDs (up to 5)
- Submit application
-
Apply for Booths:
- Navigate to "Apply Booth"
- Fill in booth application
- Upload required documents
- Submit application
-
Manage Applications:
- View application status
- Pay for accepted applications
- Cancel pending applications
-
Loyalty Program:
- Apply to become a loyalty partner
- View application status
- Manage loyalty program participation
-
Create Events:
- Create Bazaars: Navigate to "Create Bazaar"
- Create Trips: Navigate to "Create Trip"
- Create Conferences: Navigate to "Create Conference"
- Create Gym Sessions: Navigate to "Create Gym Session"
-
Manage Events:
- View pending events requiring approval
- Approve or reject professor-created workshops
- Archive past events
- View event registrations
-
Manage Vendors:
- Review pending vendor applications
- Approve or reject applications
- Generate QR codes for vendor attendees
-
Manage Visitors:
- View visitor registrations for events
- Export visitor QR codes
- Check in visitors at events
-
Create Polls:
- Navigate to "Vendor Polls"
- Create polls for vendor selection
- View poll results
- Close polls when voting ends
-
Generate Reports:
- View attendee reports
- View sales reports
- Export data as needed
-
User Management:
- View all users
- Block or unblock users
- Manage staff accounts
-
Staff Management:
- Review pending staff applications
- Assign roles to staff
- Verify staff accounts
- Create admin and Events Office accounts
-
Vendor Management:
- Review all vendor applications
- Approve or reject vendors
- Generate attendee QR codes
-
System Oversight:
- View all events
- Delete events if needed
- Access comprehensive reports
- Manage loyalty program applications
-
Register for Event:
- Navigate to visitor registration link (provided by event organizer)
- Fill in visitor registration form
- Receive QR code via email
-
Check-in at Event:
- Present QR code at event entrance
- Staff will scan and verify QR code
- Complete check-in process
We welcome contributions to the Akwa-Team project! Please follow these guidelines:
-
Fork the repository
-
Create a feature branch:
git checkout -b feature/your-feature-name
-
Make your changes:
- Follow the existing code style
- Write clear, descriptive commit messages
- Test your changes thoroughly
-
Commit your changes:
git commit -m "Add: Description of your feature" -
Push to your fork:
git push origin feature/your-feature-name
-
Create a Pull Request:
- Provide a clear description of changes
- Reference any related issues
- Include screenshots if UI changes
- JavaScript/Node.js: Follow ESLint configuration
- React: Use functional components with hooks
- Naming: Use descriptive, camelCase variable names
- Comments: Add comments for complex logic
- Error Handling: Always handle errors appropriately
- Ensure your code follows the project's style guidelines
- Update documentation if needed
- Test your changes locally
- Ensure all existing tests pass
- Request review from maintainers
When reporting bugs or requesting features:
- Use clear, descriptive titles
- Provide steps to reproduce (for bugs)
- Include expected vs actual behavior
- Add screenshots if applicable
- Specify environment details (OS, Node version, etc.)
Akwa-Team - Developed for the German University in Cairo (GUC)
A special thanks to our amazing product manager Nada Ibrahim for her wonderful guidance and help.
- Abobakr Hossam (Scrum Master)
- Amr Khalefa
- Youssef Elhamy
- Amr Haitham
- Abubakr Khaled
- Ali Mohamed
- Ahmed Adham
- Salma Khaled
- Rodaina Ashraf
- Basmala Mohamed
- Built with Node.js, Express, React, and MongoDB
- UI components with Tailwind CSS and Framer Motion
- Icons provided by Lucide React
- Email service powered by Nodemailer
- QR code generation using QRCode library
- PDF generation with Puppeteer
- Automated event reminders via node-cron
- QR code-based visitor management
- Community voting system for vendor selection
- Loyalty program integration
- Certificate generation and distribution
- Comprehensive reporting system
This project is developed for academic purposes as part of the ACL (Advanced Computer Lab) course at the German University in Cairo.
Copyright © 2024 Akwa-Team
All rights reserved. This project and its source code are proprietary and confidential. Unauthorized copying, modification, distribution, or use of this project, via any medium, is strictly prohibited without express written permission from the project maintainers.
For questions or support, please contact the development team or refer to the project documentation.