Code: Backend – PHP API
Disclaimer
In this part, ChatGPT was used to generate code comments such as class, method and function headers, which helped to maintain a standard and write correct code comments. It is a reflection of the code comments and structure of the code.
Api Class (Api/Routes/Api.php)
Main API Router
Handles all incoming HTTP requests, manages CORS, parses URIs, and dispatches to controller or view handlers.
Properties
| Name | Type | Visibility | Description |
|---|---|---|---|
requestMethod |
string |
private | The HTTP method used in the current request. |
resource |
?string |
private | The resource name (table or view) from the URI. |
id |
?string |
private | The optional ID parameter from the URI. |
pathParts |
string[] |
private | Array of URI path segments. |
Methods
__construct()
Initializes API routing, sets headers, and extracts request parameters.
- Visibility: Public
setHeaders()
Sets the response headers.
- Visibility: Private
handleCors()
Handles CORS headers for cross-origin requests.
- Visibility: Private
parseRequestUri()
Parses the request URI to determine resource and ID.
- Visibility: Private
run()
Runs the API and routes the request to the appropriate handler.
- Visibility: Public
handleViewRequest()
Handles API requests for database views.
- Visibility: Private
handleTableRequest()
Handles API requests for database tables.
- Visibility: Private
validateIdBeforeModification()
Validates if ID is present before update or delete operations.
- Visibility: Private
sendResponse(data, status = 200)
Sends a JSON response with an HTTP status code.
- Visibility: Private
- Parameter:
data:arrayResponse data. - Parameter:
status:intHTTP status code.
handleReadingWithSensorData()
Handles a combined insert of reading and sensor data in one POST request. Expects JSON body with: { device_id: int, sensor_data: [ {sensor_id, value}, ... ] }
- Visibility: Private
Controller Class (Api/Controllers/Controller.php)
Generic Table Controller
Handles CRUD operations for any table dynamically.
Properties
| Name | Type | Visibility | Description |
|---|---|---|---|
model |
Model |
protected | Model instance bound to a table. |
Methods
__construct(table)
Initializes the controller with a specific model.
- Visibility: Public
- Parameter:
table:stringThe name of the database table.
getAll()
Returns all records as JSON.
- Visibility: Public
getById(id)
Returns a single record by ID as JSON.
- Visibility: Public
- Parameter:
id:int— Record ID
create()
Creates a new record (supports single and bulk inserts).
- Visibility: Public
update(id)
Updates an existing record.
- Visibility: Public
- Parameter:
id:intThe ID of the record.
delete(id)
Deletes a record.
- Visibility: Public
- Parameter:
id:intThe ID of the record.
sendJsonResponse(data, status = 200)
Sends a JSON response with the specified status code.
- Visibility: Private
- Parameter:
data:arrayResponse data. - Parameter:
status:intHTTP status code.
getJsonRequestBody()
Retrieves the JSON request body as an associative array.
- Visibility: Private
- Return Type:
arrayThe decoded JSON body.
ReadingWithSensorDataController Class (Api/Controllers/ReadingWithSensorDataController.php)
Custom Controller
Handles atomic insert of a reading and associated sensor data in one transaction.
Properties
| Name | Type | Visibility | Description |
|---|---|---|---|
db |
mysqli |
private | Database connection instance. |
readingModel |
Model |
private | Model for the reading table. |
sensorDataModel |
Model |
private | Model for the sensordata table. |
Methods
__construct()
Initializes the controller with a specific database models.
- Visibility: Public
createWithSensorData(payload)
Creates a reading and inserts all associated sensor data in one transaction.
- Visibility: Public
- Parameter:
payload:arrayInput data from the client. - Return Type:
arrayAPI response.
Database Class (Api/Models/Database.php)
Database Singleton
Manages a single MySQLi connection instance across the backend.
Properties
| Name | Type | Visibility | Description |
|---|---|---|---|
instance |
?Database |
private | Singleton instance of the class. |
connection |
mysqli |
private | Active MySQLi connection. |
Methods
getInstance()
Retrieves the singleton instance of the Database class.
- Visibility: Public
- Return Type:
DatabaseThe singleton instance.
getConnection()
Gets the MySQLi connection instance.
- Visibility: Public
- Return Type:
mysqliThe active database connection.
initializeConnection()
Initializes the database connection.
- Visibility: Private
sendJsonErrorResponse(errorMessage)
Sends a JSON error response and terminates execution.
- Visibility: Private
- Parameter:
errorMessage:stringThe error message.
Model Class (Api/Models/Model.php)
Generic Model
IProvides CRUD operations for any table dynamically
Properties
| Name | Type | Visibility | Description |
|---|---|---|---|
connection |
mysqli |
protected | Database connection instance |
table |
string |
protected | Database table name |
Methods
__construct(table)
Initializes the model with a specific database table.
- Visibility: Public
- Parameter:
table:stringThe name of the database table.
getAll()
Retrieves all records from the table.
- Visibility: Public
- Return Type:
arrayReturns an associative array of all records.
getById(id)
Retrieves a single record by its ID.
- Visibility: Public
- Parameter:
id:intThe ID of the record. - Return Type:
?arrayReturns the record as an associative array, or null if not found.
create(data)
Inserts a new record into the table.
- Visibility: Public
- Parameter:
data:arrayAn associative array representing the record. - Return Type:
?intReturns true if the insert operation was successful.
createBulk(dataSet)
Inserts multiple records into the table efficiently.
- Visibility: Public
- Parameter:
dataSet:array[]Array of records to insert. - Return Type:
boolReturns true if the operation was successful.
update(id, data)
Updates an existing record in the database.
- Visibility: Public
- Parameter:
id:intThe ID of the record to update. - Parameter:
data:arrayAn associative array of column-value pairs to update. - Return Type:
boolReturns true if the update was successful.
delete(id)
Deletes a record from the database.
- Visibility: Public
- Parameter:
id:intThe ID of the record to delete. - Return Type:
boolReturns true if the deletion was successful.
executeQuery(query)
Executes a prepared query and returns true on success.
- Visibility: Private
- Parameter:
query:stringThe SQL query. - Return Type:
arrayThe query result as an associative array.
execute(query, types, params)
Executes a prepared query and returns true on success.
- Visibility: Private
- Parameter:
query:stringThe SQL query with placeholders. - Parameter:
types:stringThe types of parameters. - Parameter:
params:arrayThe parameters to bind. - Return Type:
boolReturns true if successful, false otherwise.
fetchSingle(query, types, params)
Executes a prepared query and fetches a single record.
- Visibility: Private
- Parameter:
query:stringThe SQL query with placeholders. - Parameter:
types:stringThe types of parameters. - Parameter:
params:arrayThe parameters to bind. - Return Type:
?arrayReturns the fetched record as an associative array or null.
executeInsertOrUpdate(queryPrefix, data, querySuffix = "")
Executes an insert or update query dynamically.
- Visibility: Private
- Parameter:
queryPrefix:stringThe query prefix (INSERT INTO or UPDATE ... SET). - Parameter:
data:arrayThe data to insert or update. - Parameter:
querySuffix:stringOptional suffix (used for WHERE conditions in updates). - Return Type:
boolReturns true if the operation was successful.