Built for a third-year software engineering course, TorqueDesk is a platform designed to take the headache out of automotive repairs for both the mechanic and the vehicle owner.
Kalan Roye, Shane Edelstein, Sviatoslav Kolodii, Daimen Miller, Aaron Serro
Welcome Screen - Entry point to log in or sign up
The app’s landing screen prompts users to log in or create a new TorqueDesk account to continue.
Signup Screen - Create a TorqueDesk account (including mechanic details)
Users register by entering personal/account details, and mechanics additionally provide shop name, hourly rate, and their specialties.
Messages Screen - Mechanics and customers communicate about job work
Mechanics and customers can exchange messages related to appointments and job work order details.
Search Screen - Customers find mechanics by specialty, rate, and rating
Customers can search for mechanics using filters like specialty, maximum hourly rate, and minimum rating, then select a mechanic from the results.
Job Screen - Track repair progress, activity, and costs
The job view shows repair stage progress with an activity log, along with job details such as customer/vehicle information, cost breakdown, and controls to update stages and mark the job complete.
TorqueDesk uses CMake (>= 3.20), Ninja, and C++20. Dependencies (nlohmann/json + GoogleTest, etc.) are downloaded automatically via CMake FetchContent (no manual installs needed beyond basic build tools).
The following packages must be installed before building. Everything listed under Auto-fetched below is downloaded automatically by CMake - no manual install needed for those.
| Library | Version | Purpose |
|---|---|---|
| SQLiteCpp | 3.3.3 | C++ SQLite wrapper |
| nlohmann/json | v3.12.0 | JSON serialization |
| GoogleTest | v1.17.0 | Unit testing |
| jwt-cpp | v0.7.0 | JWT generation/validation |
| Package | Component | Used by |
|---|---|---|
| C++20 toolchain (GCC ≥ 11 or Clang ≥ 13) | — | Everything |
| CMake ≥ 3.20 | — | Build system |
| Ninja | — | Build generator |
| Git | — | FetchContent |
| OpenSSL (dev headers + libs) | libssl / libcrypto | jwt-cpp |
| Qt 5 | Core, Widgets, Network | Client (TorqueClient) |
| Boost | system | Server (TorqueServer) |
- Install Xcode Command Line Tools:
xcode-select --install
- Install all required packages via Homebrew:
brew install cmake ninja openssl qt@5 boost
- If CMake cannot find Qt5, add it to your path:
export PATH="$(brew --prefix qt@5)/bin:$PATH"
Install all required packages via your distro package manager.
Ubuntu / Debian / WSL:
sudo apt update && sudo apt install -y \
build-essential \
cmake \
ninja-build \
git \
libssl-dev \
qtbase5-dev \
libboost-system-devNote: First configure/build may take longer because CMake will fetch and build dependencies.
From the repo root:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build build
After building, you can run all tests at once via CTest:
ctest --test-dir build --output-on-failureOr run each test suite individually:
| Suite | Source file | Command |
|---|---|---|
| Engine tests | test_engine.cpp |
./build/tests/UnitTests |
| Customer service tests | test_customer_service.cpp |
./build/tests/CustomerServiceTests |
| Mechanic service tests | test_mechanic_service.cpp |
./build/tests/MechanicServiceTests |
| Auth service tests | test_auth_service.cpp |
./build/tests/AuthServiceTests |
This section describes the physical SQLite schema (DatabaseManager), not response DTOs.
customersid(PK),name,phone,email(UNIQUE),password,role,createdAt
mechanicsid(PK),userId(UNIQUE, FK ->customers.id),displayName,shopName,hourlyRate,specialties
vehiclesid(PK),ownerUserId(FK ->customers.id),vin(UNIQUE),make,model,year,mileage,createdAt
symptom_formsid(PK),customerId(FK ->customers.id),vehicleId(FK ->vehicles.id),description,severity,createdAt
mechanic_availability(not really used)id(PK),mechanicId(FK ->mechanics.id),start,end, UNIQUE(mechanicId,start,end)
appointmentsid(PK),customerId(FK ->customers.id),mechanicId(FK ->mechanics.id),vehicleId(FK ->vehicles.id),symptomFormId(FK ->symptom_forms.id),scheduledAt,status,note,createdAt
jobsid(PK),appointmentId(UNIQUE FK ->appointments.id),mechanicId(FK ->mechanics.id),customerId(FK ->customers.id),vehicleId(FK ->vehicles.id),stage,percentComplete,lastNote,updatedAt,startedAt,completedAt,completionNote
reviewsid(PK),jobId(UNIQUE FK ->jobs.id),customerId(FK ->customers.id),mechanicId(FK ->mechanics.id),rating,comment,createdAt
- Appointment-facing extras:
customerName,customerEmail,customerPhone,mechanicName,vehicleDescription,symptoms - Job-facing extras:
customerName,customerEmail,vehicleDescription,isBlocked - Mechanic-facing extras:
averageRating,reviewCount - Review-facing extras:
customerName
- The project currently initializes schema at startup with
CREATE TABLE IF NOT EXISTS. - Existing local DB files may not pick up newer constraints/relations automatically.
- During development, resetting/recreating
torquedesk.dbis expected when schema changes.
Registration/login, user profile routes, and /users/{id}/... nested routes.
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| POST | /auth/register |
Creates a new user account and returns an authenticated session token. | Implemented | null |
| POST | /auth/login |
Authenticates a user and returns a JWT-backed session token. | Implemented | null |
| GET | /users/{id} |
Returns profile details for the specified user. | Implemented | null |
| PATCH | /users/{id} |
Updates editable profile fields for the specified user. | Implemented | null |
| DELETE | /users/{id} |
Deletes the specified user account. | Implemented | null |
| PATCH | /users/{id}/password |
Changes the password for the specified user. | Implemented | null |
| GET | /users/{userId}/vehicles |
Lists vehicles owned by the specified user. | Implemented | null |
| POST | /users/{userId}/vehicles |
Adds a new vehicle under the specified user. | Implemented | null |
| GET | /users/{userId}/symptoms |
Lists symptom forms created by the specified user. | Implemented | null |
| GET | /users/{userId}/appointments |
Lists appointments belonging to the specified user. | Implemented | null |
| GET | /users/{userId}/reviews |
Lists reviews authored by the specified user. | Implemented | null |
CRUD for vehicles and any /vehicles/{id}/… nested routes.
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| GET | /vehicles/{id} |
Returns details for a specific vehicle record. | Implemented | null |
| PATCH | /vehicles/{id} |
Updates editable data on a specific vehicle record. | Implemented | null |
| DELETE | /vehicles/{id} |
Removes a specific vehicle record. | Implemented | null |
| POST | /vehicles/{vehicleId}/symptoms |
Creates a new symptom form linked to the specified vehicle. | Implemented | null |
Direct symptom-form access (/symptoms/… routes only).
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| GET | /symptoms/{id} |
Returns one symptom form by ID. | Implemented | null |
| PATCH | /symptoms/{id} |
Updates fields on an existing symptom form. | Implemented | null |
| DELETE | /symptoms/{id} |
Deletes a symptom form by ID. | Implemented | null |
Search, profile management, and any /mechanics/{id}/… nested routes.
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| GET | /mechanics |
Searches mechanics using optional query filters like specialty and distance. | Implemented | null |
| GET | /mechanics/{id} |
Returns profile details for a specific mechanic. | Implemented | null |
| PATCH | /mechanics/{id} |
Updates profile fields for a specific mechanic. | Implemented | null |
| GET | /mechanics/{id}/jobs |
Lists open jobs assigned to the specified mechanic. | Implemented | null |
| GET | /mechanics/{id}/appointments |
Lists incoming appointment requests for the specified mechanic. | Implemented | null |
| GET | /mechanics/{id}/reviews |
Lists reviews associated with the specified mechanic. | Implemented | null |
Scheduling logic (/appointments/… routes only).
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| POST | /appointments |
Creates a new appointment request between customer and mechanic. | Implemented | null |
| GET | /appointments/{id} |
Returns details for a specific appointment. | Implemented | null |
| PATCH | /appointments/{id}/status |
Updates the status of an existing appointment. | Implemented | null |
| POST | /appointments/{id}/job |
Starts a repair job from the specified appointment. | Implemented | null |
Active work tracking (/jobs/… routes only).
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| GET | /jobs/{id} |
Returns detailed progress data for a specific job. | Implemented | null |
| PUT | /jobs/{id}/stage |
Updates the job stage, completion percentage, and optional note. | Implemented | null |
| POST | /jobs/{id}/complete |
Marks the job as completed with a required completion note. | Implemented | null |
| GET | /jobs/{id}/notes |
Returns all timeline notes attached to the job. | Implemented | null |
| POST | /jobs/{id}/notes |
Adds a new mechanic note to the job timeline. | Implemented | null |
Direct review access (/reviews/… routes only).
| HTTP Method | Endpoint | Purpose | Status | Tested |
|---|---|---|---|---|
| POST | /reviews |
Submits a customer review for a completed job. | Implemented | null |
| DELETE | /reviews/{id} |
Deletes a review by ID when it belongs to the requester. | Implemented | null |




