Skip to Content
API v1Database

Database

Dual Database Setup

The API connects to two MySQL databases:

  1. Main database ($link) - Core application data (users, houses, viewings, perks, etc.)
  2. Bills database ($billsLink) - UK-only bills data (quotes, orders, meters, etc.)

The bills database connection is only established when $USA is falsy (i.e., UK mode).

Connection Setup

From api/include/configdb.php:

$link = db_connect(); // Main database - always connected if (!(array_key_exists('USA', $_ENV) && json_decode($_ENV['USA']))) { $billsLink = db_connect($_ENV['DB_DATABASE_BILLS']); // Bills DB - UK only }

The db_connect() function uses mysqli with retry logic (3 attempts, 5-second timeout, 1-second delay between retries).

Database Names by Environment

EnvironmentMain DBBills DB
UK Devhousr_database_devhousr_bills_dev
UK UAThousr_database_uathousr_bills_test
UK Prodhousr_database_prodhousr_bills_prod
US Devhousr_database_us_devN/A
US UAThousr_database_us_uatN/A
US Prodhousr_database_us_prodN/A
Demohousr_database_demo_apphousr_bills_test

Database Servers

  • UK (UAT/Prod): Aurora MySQL cluster in eu-west-2 (London)
  • US/Dev: RDS instance in us-east-1 / us-east-2

Query Patterns

Direct mysqli (most common)

Most endpoints use raw mysqli_query() calls:

$sql = "SELECT * FROM users WHERE id = '$uuid'"; $result = mysqli_query($link, $sql); $row = mysqli_fetch_assoc($result);

Prepared statements (newer code)

Some endpoints use prepared statements:

$sql = "SELECT * FROM houses WHERE city = ? AND status = 1"; $statement = mysqli_prepare($link, $sql); mysqli_stmt_bind_param($statement, 's', $city); mysqli_stmt_execute($statement); $result = mysqli_stmt_get_result($statement);

Utility functions

api/utils/dbFunctions.php provides reusable query helpers:

findById($link, 'users', $userId); // SELECT * WHERE id = ? findByColumn($link, 'users', 'email', $email); // SELECT * WHERE column = ? findAllByColumn($link, 'houses', 'city', $city); findByCondition($link, 'contracts', "user_id=$id AND status='active'"); updateValue($link, 'users', 'city', 'London', "id=$userId"); deleteByCondition($link, 'liked_houses', "tenant_id=$userId AND house_id=$houseId");

Key Tables (Main Database)

Users & Auth

TablePurpose
usersCore user table (students, agents/landlords, admins). role field: 1=admin, 3=student
user_sessionsLogin session tracking
api_keysAPI keys for external access
feature_flagsFeature flag toggles (feature, enabled)

Properties

TablePurpose
housesProperty listings (title, address, lat/lng, bedrooms, price_pw/price_pm, images JSON, agent_id, city, status)
liked_housesUser likes (tenant_id, house_id)
houses_viewedView tracking for trending calculation
houses_housr_plusHousr Plus premium listings
boost_creditsBoost credit system for property promotion
house_image_roomsRoom labels for property images
house_lease_termsUS lease terms by academic year
building_detailsUS building info (title, logo, cover image)
property_operatorsUS property management companies
super_agentsSuper agent designation
video_toursVideo tour links for properties
uob_approved_agentsUoB-approved letting agents (Birmingham)

Viewings

TablePurpose
viewing_requestsViewing/tour requests (user_id, house_id, time, status, slot_id)
viewing_slotsAgent-defined viewing time slots
viewing_ratingsPost-viewing ratings
viewing_request_rewardsViewing reward codes per city
bookable_viewingsAgents with bookable viewing slots

Chat

TablePurpose
chat_roomsChat rooms (name, house_id, status)
chat_room_membersRoom membership (room_id, user_id)
chat_room_moderationUS moderation records

Friends & Groups

TablePurpose
friendsFriend relationships (sender_id, receiver_id, status)
housemate_groupsHousemate group membership (group_id, user_id, status)
user_house_filtersSaved house search filters per user

Perks

TablePurpose
perksPerk listings (company, deal, type, city, category, etc.)
perks_redeemedPerk redemption records
perk_categoriesPerk category definitions
perk_codesUnique perk codes (perk_id, user_id, code)
perk_tokensWallet tokens (perk_id, user_id, redeemed_at)
perk_exclusivesExclusive perk access (perk_id, exclusiveable_type, exclusiveable_id)
perk_partnersPerk partner businesses (subscription_tier)
perks_refReferral code tracking

Roomie

TablePurpose
roomie_profilesRoomie profiles (role, personality, study_year, smoker, preferences)
roomie_blocked_usersBlock list

Contracts & Bills

TablePurpose
contractsTenancy contracts
contract_membersContract member assignments
huddle_contractsHuddle (bills provider) contract links

Notifications

TablePurpose
scheduled_notificationsQueued push notifications
portal_notificationsPortal (landlord) notifications

Moderation (US)

TablePurpose
ratings_moderationModeration ratings
ratings_periodsRating period windows
ratings_studentsStudent-to-student ratings
ratings_usersUser rating aggregates

Bills Database (UK Only)

TablePurpose
bills_included_pricesBills pricing by city and bedrooms
bills_included_agentsAgents with bills included (which utilities)
Various Huddle tablesBills order, payment, and meter data

Charset

Most endpoints set charset before queries:

mysqli_set_charset($link, "utf8mb4"); // or mysqli_set_charset($link, "utf8");
Last updated on