Selected work / Case study

Rental Portal

My diploma project: a rental platform in Bulgarian and English, where people find a home or an office and book a viewing.

Built with
C#, ASP.NET Core MVC on .NET 8, Entity Framework Core, SQL Server, Razor, JavaScript
Languages
Bulgarian and English, in the interface and in the listings
Context
Diploma project, PGHT “Acad. N. D. Zelinskij”, Burgas, 2025
Code
Private repository
The Rental Portal listings page with search filters for title, district, type, price, area, rooms and availability

Running locally with sample listings.

01

Three kinds of user

The app is built around three roles, and each one sees a different app:

  • Visitors browse and search listings and see each property on a map. With an account they can save favourites, request viewings and set their password and notification preferences.
  • Agents manage listings and handle the viewing requests that come in.
  • Admins do the same, and also manage users and the reports.

It follows the usual ASP.NET Core MVC split. Controllers handle requests, services hold the business logic behind interfaces, Entity Framework Core maps the models to SQL Server, and Razor views render the pages.

02

Two languages, down to the data

Translating the buttons isn't enough for a rental site. The listing itself has to read naturally in both languages. Each property stores its title, description, address and type twice, in English and in Bulgarian.

A cookie remembers the visitor's language, with Bulgarian as the default. The details page loads the fields for that language. Search runs against the same columns, so someone searching for a district in Cyrillic gets matches.

The interface text lives in JSON translation files, one per page, grouped by area: admin, appointments, properties, settings and users.

The same listings page in Bulgarian, with translated filters and listing titles
The same page in Bulgarian. The filters and the listing titles both switch.

03

The listing page filters by title, several districts at once, property types, a price range, an area range, a minimum number of rooms and availability. Each filter the visitor fills in adds one condition to the same Entity Framework query. The database receives a single SQL statement and returns only the matching rows.

Each property also stores its coordinates, so its details page can show it on Google Maps.

04

Email that does work

Email goes out through SMTP, for three jobs:

  • Viewing reminders. A background service wakes every five minutes and looks for viewings starting in the next half hour. It emails each visitor a reminder in English and in Bulgarian, and keeps track of who has already been reminded.
  • Price alerts. When a listing's price changes, everyone who saved it as a favourite gets an email.
  • Password resets. A reset link carries a random token from a cryptographic generator and stops working after an hour.

Passwords are stored as salted hashes using ASP.NET Core's password hasher. The login cookie is HTTP-only, sent over HTTPS only, and never sent with requests from other sites.

05

Reports for the office

Agents confirm viewing requests from a single list. A popularity report ranks every property by how many viewings were requested, so the office can see what people actually want to look at.

A new listing can start from one of the five best-rated available properties. The form copies its details, including the Bulgarian text and the coordinates, and the agent edits from there.

06

Looking back

I'd change a few things if I built it again:

  • The list of reminders already sent lives in memory, so a restart can send a reminder twice. It belongs in the database next to the appointment.
  • Storing each translated field in its own column works for two languages, but a third would need a migration. A separate translations table would scale better.
  • Secrets like the SMTP credentials belong in user secrets or environment variables from day one, never in a settings file that gets committed.

Get in touch

I'm looking for an internship for the winter semester 2027/28. Email is the quickest way to reach me.

hsynrsdd@gmail.com