This is a full-stack Gmail-like system built as part of an advanced programming university course.
It includes a Node.js + Express backend, React frontend, Android mobile client, and a custom C++ Bloom filter for spam detection.
The project was built following TDD and Agile methodologies, adhering to SOLID principles.
- Backend: Node.js with Express for handling IO between users and backend.
C++ for handling the Bloom Filter in spam detection. - Frontend: React.js for web, Android using Java + XML for mobile.
- Database: MongoDB
- DevOps: Dockerized using docker compose and implemented CI using GitHub Actions to run tests before approving PRs
Click to view project's architecture
flowchart LR
%% === Groups ===
subgraph Clients
user([User])
react[React Web App]
android[Android App]
end
subgraph Backend
node[Node.js + Express]
cpp[C++ Bloom Filter]
mongo[(MongoDB)]
end
subgraph Infrastructure
docker[Docker / Docker Compose]
actions[GitHub Actions]
end
%% === Edges ===
user --> react
user --> android
react <--> node
android <--> node
node <--> |TCP| cpp
node <--> |Mongoose| mongo
node -.build/run.-> docker
docker -.CI pipeline.-> actions
Click to view DB schemas
erDiagram
USER {
number id
string fullName
string mail
string password
string dateOfBirth
string image
date createdAt
date updatedAt
}
LABEL {
number id
string name
number owner
number parent
date createdAt
date updatedAt
}
FILE {
string name
string data
number size
string type
}
MAIL {
number id
number owner
number from
string subject
string body
boolean isRead
boolean isStarred
boolean isTrashed
boolean isSpam
boolean isDraft
date createdAt
date updatedAt
}
USER ||--o{ LABEL : owns
LABEL o|--o{ LABEL : parent_of
USER ||--o{ MAIL : owns
USER ||--o{ MAIL : sends
MAIL ||--o{ FILE : has
MAIL ||--o{ USER : has
MAIL ||--o{ LABEL : has
First clone the project
git clone https://github.com/YuvalAnteby/Gmail-AdvancedSystemProgramming.git
cd Gmail-AdvancedSystemProgramming/python_clientIf you want to change the configuration (ports, names, bloom filter integers etc.) you can do it in dockerfiles and docker compose.
This will build and run only the test related containers (CPP server, gtest, python test)
docker compose --profile tests up --buildThis will build and run only the web application related containers (React, Node.js, CPP server)
docker compose --profile web_app up -d --build web_server mongoIn Node.js and React root folders you can find .env files with default values to help you check the project.
In a real world application these wouldn't be uploaded, we did it for easier set up for the checkers :)
NOTE: The instructions didn't ask to run the python client and express server together using the same command
docker compose run client --build- Reminder, to exit the container gracefully use
control+c- ensure the backend is running using docker using the previous instructions
- Download and install the official android studio software
- Set up an emulator device using an API version of 26 or greater (most modern phones will suffice)
- You can install the project's app using 2 versions:
-
Easy way:
- get from the root folder the given APK file
- ensure the emulator's device is up and running
- drag the file to the emulator's window, it will be installed in it
-
The Custom way:
- Open android studio when targeting the folder
android_appinstead of the root folder - Wait for android studio to finish the intial gradle build of the project
- click on the green run button using the built in tools and set up to your desire
- Open android studio when targeting the folder
-
in case you need to change the backend's API URL you can do so in
gradle.propertieslocated in the sub root folderandroid_app
For more screenshots click here





