Rahhal is our project for the seventh semester Advanced Computer Lab (ACL) course at the German University in Cairo. The goal was to design a platform that simplifies vacation planning for tourists by combining everything they need in one place - from booking activities, joining fully planned itineraries, and purchasing tickets for historical sites, hotels, flights, and transportation, to even buying souvenirs. Rahhal also provides a space where advertisers, tour guides, sellers, and authorized tourism authorities can manage their businesses. You can find the full list of features we offer in this sheet, which was given to us as the desired list of requirements.
Find it live at rahhal.dev, and for all the nitty gritty details about our journey developing and deploying Rahhal, you can check the blog post we wrote about it here
Rahhal is a microservices project, and in this repository you can find the code for the different services, along with guidance on how to use the system, set up the project on your local machine, and important technical details you need to know beforehand.
All backend services are running behind an API Gateway, which handles requests from the client-side through a REST API. You can check the Swagger OpenAPI Specification of the entire API here.
A simple suite of unit tests was written for most of the services. While they do not cover all possible cases, they still provide a good foundation for building more comprehensive test suites in the future. We are using vitest for running the unit tests, and you can run the tests for the different services by executing the following commands in the root directory of the project:
# On a Linux environment (e.g. native linux, wsl, git terminal)
chmod +x run-tests.sh
./run-tests.shWe also tested some of the routes manually using Postman Collections. You can check the collection we used here.
The website’s UI design was created in Figma, following a custom design system. The Figma project includes the main color palette, design sketches for different pages of the system, custom-designed logos, and more. You can view the Figma design system here.
In the project structure, each directory represents a separate microservice. After cloning the repo, the first step is to navigate into each service directory and create a new .env file if required. You can find a .env.example file in each relevant directory to guide you; it specifies the necessary variables along with brief descriptions.
By default, the Docker containers communicate with each other, the database instances, and the messaging queue through the Docker environment network. However, if you plan to host these containers on a service like Cloud Run, you will need to make sure you fill in the deployment environment variables, which can also be found in the
.env.examplefiles.
After creating and populating the necessary .env files, run the following command in the project’s root directory to build all microservice images and run the containers in the background:
docker compose up -dOn the first run, this process may take some time since all images will be built from scratch. However, subsequent runs will be much faster. Once the containers are up, you can check if they are running properly using docker ps or stop them all with docker compose down. The client-side frontend will be available locally at http://localhost:5173, and you can monitor the containers using Docker Desktop.
This section includes short videos that briefly illustrate how to navigate and use the system as different stakeholders:
Tourist_Tour.mp4
Admin_Tour.mp4
Seller_Tour.mp4
Tourguide_Tour.mp4
Advertiser_Tour.mp4
TourismGov_Tour.mp4
We welcome contributions to Rahhal! If you wish to contribute, simply fork the repository and create a pull request. When adding your changes, please make sure to follow these code styling rules to maintain consistency across the codebase:
- Use camelCase for variable names and function names.
- Use kebab-case for file names.
- Use PascalCase for class names.
- Use nouns (not verbs) to represent resources
✅ http://api.example.com/v1/store/items/{item-id}
❌ http://api.example.com/v1/store/CreateItems/{item-id}- Use plural nouns for collections
✅ http://api.example.com/v1/store/items/{item-id}
❌ http://api.example.com/v1/store/item/{item-id}- Use hyphens (-) to improve readability
✅ http://api.example.com/v1/store/inventory-management
❌ http://api.example.com/v1/store/inventory_management- Use forward slashes for hierarchy, avoid trailing slashes
✅ http://api.example.com/v1/store/items
❌ http://api.example.com/v1/store/items/- Avoid file extensions in URIs
✅ http://api.example.com/v1/store/items
❌ http://api.example.com/v1/store/items.jsonSpecial thanks are extended to all the team members. Their exceptional efforts, dedication, and attention to detail are what made these achievements possible. High standards were already set for completing this project, yet they managed to exceed them by miles.
All love, gratitude, and appreciation go to Abdelrahman Talaat, Abdullah Mahmoud, Abdullah Ahmed, Ahmed Hawater, Ahd Mostafa, Ali Shokry, Amr Hegazy, Farah Faisal, Youssef ElBorolosy, and Ziad Abdelrahman
This software is open source under the Apache 2.0 License.
