RentEase Portal is a comprehensive, full-stack real estate platform engineered to automate property onboarding, lease contract signatures, automated invoice billing, online payment gateway settlement, and tenant maintenance ticketing. The system integrates a robust Spring Boot 3 REST API Engine (Java 21) with a highly responsive, standalone Angular 21 Web Application backed by a reactive NgRx global state store.
- Live Web App (Production): https://rentease-portal.vercel.app/
- Backend API Swagger Interface: http://localhost:8080/swagger-ui/index.html (Only accessible while local backend is running)
- OpenAPI Specification File: http://localhost:8080/v3/api-docs (Only accessible while local backend is running)
- Screenshots & User Interface Walkthrough
- Project Overview & Philosophy
- Full-Stack Architecture Topology
- Role-Based Feature Matrix
- Role-Based Use Case Diagrams
- Database Schema & ERD Overview
- Technology Stack & Rationales
- Detailed REST API Endpoints Summary
- Local Environment Setup & Configuration
- Detailed Documentation Modules
- Contact & Support
Below are high-fidelity user interface previews demonstrating the application's key modules, designed with a premium HSL color palette, custom glassmorphism, responsive dashboard grids, and complete light/dark theme adaptation.
Looking for screenshots? Please check out the
/docs/screenshots/folder in this repository for complete visual steps. Click to expand the sections below to see previews of the Tenant and Landlord workspaces.
Click to expand: Tenant (Customer) Panel Walkthrough
-
Tenant Dashboard Overview: Comprehensive customer control panel displaying active rentals, quick navigation, and recent activities.

-
Property Filter Catalog: Browse listings with real-time budget sliders, room filters, locality searches, and availability toggles.

-
Property Detail & Reviews: Extended descriptions, geographic details, photos, reviews, and average rating computations.

-
Rental Application Form: Onboarding portal where applicants upload document proof (managed by Cloudinary) and state move-in preferences.

-
My Applications Tracker: Real-time application tracker showing under-review, approved, or rejected statuses.

-
Digital Lease Canvas E-Signature: Interactive base64 canvas capture designed for tenants to read contract text and attach sign proof.

-
Lease Agreement View: Digital lease contract terms, payment schedules, and verified signatures.

-
Rent Transactions Ledger: Monthly ledger checking payment histories and triggering online Razorpay checkouts.

-
Razorpay Payment Gateway: Secure modal payment checkout integration supporting card, UPI, and net banking options.

-
PDF Invoice Receipt: Custom generated styled PDF receipt file available for immediate download post-payment.

-
Submit Maintenance Request: Reporting portal for issues with photograph attachments and urgency levels.

-
Maintenance Ticket Tracking: Real-time status tracking for raised issues with administrative notes.

-
Notification Alerts Center: Personal alert feed for application updates, rent invoices, and general announcements.

Click to expand: Landlord / Admin Panel Walkthrough
-
Admin Dashboard & Analytics: High-level platform metrics showing revenue summaries, maintenance metrics, and listing counts.

-
Property Inventory Management: Listing creator, editor, status monitoring, and availability toggles.

-
Add / Edit Property Listing: Comprehensive property listing creator with photo uploads, amenities checklist, and pricing details.

-
Tenant Applications Verification: Document inspector and status resolver to approve or reject rental requests.

-
Lease Agreements Generator: Custom lease contract generator to set terms, monthly rent, deposit, and condition clauses.

-
Tenant Registry & Directory: Database tracker of registered tenant profiles, contact details, and assigned properties.

-
Rent Billing & Invoicing Management: Manual invoice creator, payment tracking, and ledger management for tenant accounts.

-
Maintenance Issues Resolution: Dispatched contractor coordinator, ticket status updates, and note logger.

-
System Broadcast & Announcements: Platform-wide messaging tool to dispatch system notifications and maintenance updates.

The project is architected around the core goal of eliminating operational bottlenecks in residential and commercial leasing. RentEase Portal provides a secure, fully automated path from a tenant's initial search query to moving in and settling rent bills.
- Isolated Dashboards: Each Landlord/Admin manages only their own property listings, received rental applications, drafted leases, monthly invoices, and tenant maintenance tickets.
- Strict Security Boundaries: Cross-landlord access is blocked at the database and service layers. For example, trying to view or mutate an application, lease, rent record, or maintenance request for a property owned by another landlord throws an
AccessDeniedException(HTTP 403). - Dynamic Tenant-to-Landlord Mapping: Customer interfaces adapt dynamically to display the specific landlord's name, email, and signature across rental applications, digitally signed leases, and generated PDF invoice receipts instead of generic portal branding.
- Zero-Credential Access: Users can explore both the Tenant and Landlord dashboards directly from the login/register forms using "Guest Customer" or "Guest Landlord" buttons.
- Strict Mutation Interception: Guest accounts (identified by a
"guest-"prefix) are restricted from write operations. Any attempt to post property, submit an application, sign a lease, create invoices, pay rents, file maintenance tickets, or modify profiles returns a block from the backend and triggers a premium global signup prompt modal on the frontend. - Ephemeral Uploads: Image uploads (properties, tickets, or signatures) during guest mode are converted directly to temporary client-rendered Base64 data URLs, completely bypassing third-party Cloudinary APIs.
- Privacy-Enhanced Directories: Tenant listings in the guest admin panel are filtered, showing only other guest profiles to prevent exposure of real customer credentials.
The application utilizes a classic Spring 3-Tier Layered Architecture (Controller -> Service -> Repository) coupled with custom Servlet security filters and third-party SaaS engines on the backend, communicating with an Angular 21 Single Page Application via REST.
graph TD
classDef client fill:#38bdf8,stroke:#0369a1,stroke-width:2px,color:#0f172a;
classDef gateway fill:#a78bfa,stroke:#6d28d9,stroke-width:2px,color:#0f172a;
classDef security fill:#fb7185,stroke:#be123c,stroke-width:2px,color:#0f172a;
classDef logic fill:#34d399,stroke:#047857,stroke-width:2px,color:#0f172a;
classDef db fill:#facc15,stroke:#a16207,stroke-width:2px,color:#0f172a;
classDef external fill:#f472b6,stroke:#be185d,stroke-width:2px,color:#0f172a;
A[Client Web App / Angular SPA]:::client -->|HTTP Request| B(API Entrypoint / Port 8080):::gateway
B --> C{Security Context Filter}:::security
C -->|Bearer JWT Validated| D[Protected REST Controllers]:::logic
C -->|Public / Open Routes| E[Public REST Controllers]:::logic
D --> F[Business Service Layer]:::logic
E --> F
F --> G[(MongoDB Database Store)]:::db
F --> H[Cloudinary CDN API]:::external
F --> I[Razorpay Payment API]:::external
F --> J[OpenPDF Printing Engine]:::external
The platform dynamically adjusts UI capabilities based on active JSON Web Token roles.
| Feature Module | Guest User | Tenant (Customer) | Landlord / Admin |
|---|---|---|---|
| Interactive Landing Page | Read Only | View & Navigate | Dashboard Access |
| Property Directory Catalog | Browse / Filter | Search / Add to Wishlist | Full Inventory Control |
| Property Review Ratings | Read Reviews | Write & Submit Reviews | Delete / Audit Reviews |
| Authentication & Registration | Create Account | Read Profile Details | Audit Registered Tenants |
| Rental Application Submission | β | Submit Forms & Income Proof | Approve / Reject Applications |
| Digital Lease Contracts | β | Read & Sign on Canvas Pad | Create / Edit Agreement Terms |
| Online Rent Payments | β | Razorpay Payments & Mock | View Ledger / Create Bills |
| PDF Invoices Download | β | Download Invoice PDFs | Track and Audit Payments |
| Maintenance Tickets | β | Raise Tickets & Upload photos | Update Status & Add notes |
| Notification Center | β | Read personal alerts | Receive system-wide alerts |
| Admin Stats & Charts | β | View personal expenses | Revenue & maintenance graphs |
The following diagrams illustrate system capabilities separated by role to ensure clean, readable layout structures:
flowchart TD
Guest[π€ Guest User] -->|Explore| Landing["Landing Page / Hero Section"]
Guest -->|Browse| Search["Property Catalog & Advanced Filters"]
Guest -->|Register & Login| Auth["Authentication & Registration Module"]
Guest -->|One-Click Entry| GuestDashboard["Dashboard (Guest Customer / Landlord)"]
flowchart TD
Customer[π Authenticated Tenant] -->|Apply| AppSubmit["Submit Rental Application"]
Customer -->|Review & Sign| LeaseSign["E-Signature on Lease Canvas"]
Customer -->|Pay Bills| PayRent["Razorpay Online Rent Checkout"]
Customer -->|Report Problems| MainReq["Raise Maintenance Ticket"]
Customer -->|Read Alerts| Alerts["Notifications Center"]
Customer -->|Preferences| Profile["Manage Profile & Wishlist"]
flowchart TD
Admin[π’ Administrator / Landlord] -->|Monitor| AdminDash["Analytics & Revenue Graphs"]
Admin -->|Control Listings| PropertyCRUD["Property Listings CRUD"]
Admin -->|Verify Docs| AppAudit["Approve/Reject Applications"]
Admin -->|Draft Leases| LeaseGen["Generate Lease Agreements"]
Admin -->|Invoice Management| RentBill["Create/Manage Rent Invoices"]
Admin -->|Dispatch Repairs| ResolveMain["Update Maintenance Tickets"]
The database structure is document-oriented (MongoDB), mapping to the following schemas:
erDiagram
USER {
string id PK
string name
string email
string password
string role "customer | admin"
string phone
string city
list preferredLocations
int budgetMin
int budgetMax
string createdAt
boolean emailAlerts
boolean smsAlerts
set wishlist "propertyIds"
}
PROPERTY {
string id PK
string title
string city
string locality
string type
int bedrooms
int bathrooms
double rent
double deposit
string furnishing
boolean available
string availableFrom
int area
string description
list amenities
list images
string ownerId FK
string ownerName
string postedAt
double averageRating
int totalReviews
}
REVIEW {
string id PK
string propertyId FK
string userId FK
string userName
int rating
string comment
string createdAt
}
RENTAL_APPLICATION {
string id PK
string applicantName
string applicantEmail
string applicantPhone
string moveInDate
double monthlyIncome
int occupants
string message
string propertyId FK
string customerId FK
list documents
string status "under_review | approved | rejected"
string appliedAt
}
LEASE {
string id PK
string applicationId FK
string propertyId FK
string tenantId FK
string landlordName
string startDate
string endDate
double monthlyRent
double deposit
string status "pending_signature | active | terminated"
string conditions
string propertyTitle
string signatureImage "base64"
string contractText
string createdAt
}
RENT {
string id PK
string leaseId FK
string tenantId FK
string month "e.g., June 2026"
double amount
string dueDate
string paidDate
string status "pending | paid | overdue"
string transactionId
string razorpayOrderId
string razorpayPaymentId
string razorpaySignature
}
MAINTENANCE_REQUEST {
string id PK
string category
string description
string urgency "low | medium | high | emergency"
string propertyId FK
string tenantId FK
string status "raised | in progress | resolved"
string raisedAt
string resolvedAt
string adminNote
list images
}
NOTIFICATION {
string id PK
string userId FK
string title
string message
string type "success | info | warning | alert | error"
boolean isRead
string createdAt
}
USER ||--o{ PROPERTY : "owns"
USER ||--o{ REVIEW : "writes"
USER ||--o{ RENTAL_APPLICATION : "submits"
USER ||--o{ LEASE : "enters"
USER ||--o{ RENT : "settles"
USER ||--o{ MAINTENANCE_REQUEST : "reports"
USER ||--o{ NOTIFICATION : "receives"
PROPERTY ||--o{ REVIEW : "hosts"
PROPERTY ||--o{ RENTAL_APPLICATION : "receives"
PROPERTY ||--o{ LEASE : "binds"
RENTAL_APPLICATION ||--o| LEASE : "converts_to"
LEASE ||--o{ RENT : "invoices"
| Library/Framework | Version | Purpose | Rationale |
|---|---|---|---|
| Angular 21 | 21.2.0 |
Core Web Architecture | Standalone elements, fast change detection, and native route structures. |
| NgRx Store/Effects | 21.1.1 |
Global State Container | Unified event loops for clean, predictable page modifications. |
| TypeScript | 5.9 |
Strongly Typed Script | Reduces runtime object errors and provides seamless type validation. |
| ngx-sonner | 3.1.0 |
Alert Notification Toasts | Highly responsive visual messages without blocking UI interactions. |
| CSS | Standard | Visual Design | Maximum control over HSL tokens, animations, and custom theme switches. |
| Vitest | 4.0.8 |
Component Testing runner | Sub-second testing execution speeds compared to standard Karma/Jasmine. |
| Library/Framework | Version | Purpose | Rationale |
|---|---|---|---|
| Java Platform | 21 (LTS) |
Runtime Environment | High concurrency handling with virtual threads, pattern matching, and record models. |
| Spring Boot | 4.1.0 |
REST API Server Engine | Configures MVC servlet bindings, dependency injection, and automatic configuration mapping. |
| Spring Security | Included | Authorization & Filter Pipelines | Handles CORS permissions, CSRF blocks, and parses incoming stateless JWT tokens. |
| MongoDB Driver | Included | NoSQL Database Client | High performance data retrieval with flexible schemas. |
| JJWT (JJWT-API) | 0.13.0 |
Token Sign & Parse | Standardized cryptographic claims verification for secure API route controls. |
| Razorpay Java SDK | 1.4.8 |
Payment Gateway Adapter | Integrates checkout processing and calculates signature checksum verifications. |
| Cloudinary SDK | 2.4.0 |
Image Storage CDN | Dynamic asset uploads, CDN file mapping, and custom sizing features. |
| OpenPDF | 3.0.5 |
Document PDF Drawer | Programmatic layout designer rendering styled transactional PDF invoice sheets. |
| Lombok | Runtime | Compile-Time Boilerplate | Automatically generates constructors, getter methods, and builder patterns. |
| SpringDoc OpenApi | 2.8.5 |
Swagger UI Document Generator | Generates dynamic endpoint documentation pages and interactive execution testers. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
POST |
/auth/register |
Public / Anonymous | Creates a new user profile inside database (defaults as customer). |
POST |
/auth/login |
Public / Anonymous | Validates password matching and issues client JWT tokens. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/users |
ADMIN only |
Retrieves a list of users filtered by query param role. |
GET |
/users/{id} |
Account Owner / ADMIN |
Retrieves specific profile properties excluding credential hash. |
PATCH |
/users/{id} |
Account Owner only | Partially updates settings, preferred locations, or alerts preferences. |
POST |
/users/{userId}/wishlist/{propertyId} |
Account Owner only | Appends a property item to the user's saved wishlist set. |
DELETE |
/users/{userId}/wishlist/{propertyId} |
Account Owner only | Removes a property item from the user's saved wishlist set. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/properties |
Public / Anonymous | Searches properties using query filters (min/max budget, city, type). |
GET |
/properties/{id} |
Public / Anonymous | Retrieves specific details of a property listing. |
POST |
/properties |
ADMIN only |
Inserts a new real estate inventory post with image endpoints. |
PATCH |
/properties/{id} |
ADMIN only |
Updates specifications, prices, availability, or images. |
DELETE |
/properties/{id} |
ADMIN only |
Purges a property listing record from database. |
GET |
/properties/{id}/reviews |
Public / Anonymous | Fetches reviews and rating grades for the property. |
POST |
/properties/{id}/reviews |
Authenticated Users | Inserts a new review rating and triggers property average recalculation. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/applications |
Authenticated Users | Lists applications filtered by customerId (tenant view) or propertyId (admin view). |
GET |
/applications/{id} |
Authenticated Users | Retrieves detailed application variables. |
POST |
/applications |
Authenticated Users | Submits a new tenancy application, flagging status as under_review. |
PATCH |
/applications/{id} |
ADMIN only |
Updates status (approved / rejected). Automatically toggles property availability. |
DELETE |
/applications/{id} |
Authenticated Users | Deletes application records. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/leases |
Authenticated Users | Retrieves active/pending leases filtered by tenantId. |
GET |
/leases/{id} |
Authenticated Users | Fetches contract text, signature files, and dates. |
POST |
/leases |
ADMIN only |
Drafts a lease agreement based on an approved application. |
PATCH |
/leases/{id} |
ADMIN only |
Modifies conditions, dates, or lease terms. |
POST |
/leases/{id}/sign |
Lease Tenant only | Appends a base64 signature image, updates status to active, and bills rent. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/rents |
Authenticated Users | Returns a list of rent invoices filtered by tenantId and status. |
POST |
/rents |
ADMIN / System |
Creates a manual rent invoice. |
PATCH |
/rents/{id} |
ADMIN / System |
Modifies rent invoice amounts, dates, or status fields. |
POST |
/rents/{id}/pay |
Authenticated Tenant | Quick mock payment endpoint flagging rents as paid and creating dummy TXN- logs. |
POST |
/rents/{id}/order |
Authenticated Tenant | Binds a Razorpay transaction order ID to the rent billing record. |
POST |
/rents/{id}/verify |
Authenticated Tenant | Validates HMAC-SHA-256 signatures from Razorpay and marks status as paid. |
GET |
/rents/{id}/invoice |
Authenticated Tenant | Generates and downloads a custom styled PDF receipt file. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/maintenanceRequests |
Authenticated Users | Returns maintenance tickets filtered by tenantId. |
POST |
/maintenanceRequests |
Authenticated Tenant | Files a ticket with attachments (photos), categorizing the issue. |
PATCH |
/maintenanceRequests/{id} |
ADMIN only |
Resolves tickets, updates status, and appends admin resolution notes. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/notifications |
Authenticated Users | Fetches system notifications matching the user ID. |
POST |
/notifications |
System / ADMIN |
Dispatches new warning/alert objects. |
PATCH |
/notifications/{id} |
Authenticated Users | Toggles notification status from unread to read (isRead = true). |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
POST |
/upload |
Authenticated Users | Uploads files to Cloudinary and returns a secure image/file CDN URL. |
| HTTP Method | API Path | Access Role | Description |
|---|---|---|---|
GET |
/analytics/admin |
ADMIN only |
Returns portal metrics (revenues, properties, maintenance, active tenants). |
GET |
/analytics/customer/{userId} |
User / ADMIN |
Returns tenant stats (total paid, active leases, complaints, expenses). |
The project is configured to read credential imports directly from a parent folder configuration. In the root workspace directory (parent folder of both backend and frontend projects), create a .env file containing the environment settings shown below:
# System Server Port
PORT=8080
# Database Bindings
MONGODB_URI=mongodb://localhost:27017
MONGODB_DATABASE=rental_portal
# JSON Web Token Secret (Provide a secure string at least 256 bits long)
SECURITY_JWT_SECRET=YourStrongAndSecure256BitSecretKeyHereMustBeLongEnough
JWT_EXPIRATION_MS=86400000
# Cloudinary CDN Configuration (Optional: Empty fallback triggers mock Unsplash images)
CLOUDINARY_CLOUD_NAME=your_cloudinary_cloud_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_API_SECRET=your_cloudinary_api_secret
# Razorpay Payment Gateway Keys (Use test keys for development)
RAZORPAY_KEY_ID=rzp_test_YourKeyIdHere
RAZORPAY_KEY_SECRET=YourRazorpayKeySecretHere
# Multipart Files Constraints
MAX_FILE_SIZE=10MB
MAX_REQUEST_SIZE=10MB
# CORS Allowed Client Domain (Matches your frontend development URL)
FRONTEND_URL=http://localhost:4200You can build and spin up the database, backend services, and frontend client in a single command.
Ensure you have created the parent .env file and installed Docker, then execute the following in the root workspace folder:
# Build and launch all services in the background
docker-compose up -d --buildThis starts the following:
- MongoDB Container: Exposed on port
27017with persistent volume mappings. - Spring Boot API Backend: Running on host port
8080. - Angular Web App: Running on host port
4200.
- JDK 21 or later installed.
- Apache Maven 3.8+ (or use the included
./mvnwscript wrapper). - MongoDB instance running locally on port
27017(or Atlas cloud link).
To run a local MongoDB container in the background, navigate to the parent workspace and run:
docker run -d -p 27017:27017 --name local-mongo mongo:latestNavigate to the backend module folder:
cd rental-portal-backendRun using the Maven Wrapper:
# Windows
mvnw.cmd spring-boot:run
# Linux / MacOS
./mvnw spring-boot:runOn start, the backend console prints a confirmation log validating the database link:
=================================================
Validating MongoDB connection...
MongoDB Connection Status: SUCCESSFUL!
=================================================
The server will boot on port 8080.
- Node.js v20+ or v22+ installed.
- npm (comes packaged with Node).
Navigate to the frontend module folder:
cd rental-portal-frontend
npm installStart the local webpack development server:
npm startThe application compiles and runs on http://localhost:4200. (Communicates with the backend API target configured in src/app/core/global/api-service.ts).
For module-specific architecture summaries, component breakdowns, dependencies configurations, and execution guides, explore the sub-project documentation modules:
Contributions are welcome! If you have suggestions or want to fix bugs, feel free to open a Pull Request.
- Developer Name: Saksham Agrahari
- Email: agrahari0899@gmail.com
- GitHub Profile: @saksham2882
- LinkedIn Profile: @saksham-agrahari
- Portfolio Website: saksham-agrahari.vercel.app
Made with β€οΈ by Saksham Agrahari
