Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add LabConfigResolver class to unify the logic around finding the current lab_config_id #132

Merged
merged 1 commit into from
Mar 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions htdocs/config/lab_config_resolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

require_once(__DIR__."/../includes/composer.php");
require_once(__DIR__."/../includes/db_lib.php");

/**
* This class exists to answer one question: What lab_config_id should I use right now?
* This is an annoying problem that is solved in many ways around the codebase...
* Now we can cram all of the logic we need in one place, and hopefully introduce some caching too.
*/
class LabConfigResolver {

private static $resolved_lab_config_id = null;

public static function resolveId() {
global $log;

if (LabConfigResolver::$resolved_lab_config_id != null) {
$log->debug("lab_config_id was cached");
return LabConfigResolver::$resolved_lab_config_id;
}

if(isset($_SESSION["lab_config_id"]) && $_SESSION["lab_config_id"] != null) {
LabConfigResolver::$resolved_lab_config_id = $_SESSION["lab_config_id"];
$log->debug("Resolved lab_config_id: ". LabConfigResolver::$resolved_lab_config_id ." from session.");
return LabConfigResolver::$resolved_lab_config_id;
}

if (isset($_SESSION["user_id"]) && $_SESSION["user_id"] != null) {
LabConfigResolver::$resolved_lab_config_id = get_user_lab_id($_SESSION["user_id"]);

if (LabConfigResolver::$resolved_lab_config_id > 0) {
$log->debug("Resolved lab_config_id: ". LabConfigResolver::$resolved_lab_config_id ." from logged in user_id: " . $_SESSION["user_id"]);
return LabConfigResolver::$resolved_lab_config_id;
}

if(User::onlyOneLabConfig($_SESSION['user_id'], $_SESSION['user_level'])) {
$lab_config_list = get_lab_configs($_SESSION['user_id']);
LabConfigResolver::$resolved_lab_config_id = $lab_config_list[0]->id;
$log->debug("Resolved lab_config_id: ". LabConfigResolver::$resolved_lab_config_id ." by looking up labs that user ID : " . $_SESSION["user_id"] . " has access to.");
return LabConfigResolver::$resolved_lab_config_id;
}

$lab_config_with_admin_uid = get_first_lab_config_with_admin_user_id($_SESSION['user_id']);
if ($lab_config_with_admin_uid) {
LabConfigResolver::$resolved_lab_config_id = $lab_config_with_admin_uid;
$log->debug("Resolved lab_config_id: ". LabConfigResolver::$resolved_lab_config_id ." by looking up labs with admin user ID : " . $_SESSION["user_id"]);
return LabConfigResolver::$resolved_lab_config_id;
}
}

$log->warn("Could not resolve lab_config_id. Logged in user ID: " . $_SESSION["user_id"]);
}
}
13 changes: 11 additions & 2 deletions htdocs/includes/db_lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -7104,14 +7104,14 @@ function get_satellite_lab_user_id($user_id)
# Retrievest the satellite_lab_id associated for the logged user
global $con;
$user_id = mysql_real_escape_string($user_id, $con);

$saved_db = DbUtil::switchToGlobal();
$query_string = "SELECT satellite_lab_id FROM user WHERE user_id = $user_id";
$record = query_associative_one($query_string);
DbUtil::switchRestore($saved_db);
return $record["satellite_lab_id"];
}

function search_specimens_by_id($q)
{
global $con;
Expand Down Expand Up @@ -16617,4 +16617,13 @@ function get_user_lab_id($user_id) {
return $res['lab_config_id'];
}

function get_first_lab_config_with_admin_user_id($user_id) {
$saved_db = DbUtil::switchToGlobal();
$uid = db_escape($user_id);
$query = "SELECT lab_config_id FROM lab_config WHERE admin_user_id = '$uid' LIMIT 1;";
$res = query_associative_one($query);
DbUtil::switchRestore($saved_db);
return $res['lab_config_id'];
}

?>
6 changes: 2 additions & 4 deletions htdocs/includes/header.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,12 @@
require_once(__DIR__."/SessionCheck.php");
require_once(__DIR__."/db_lib.php");
require_once(__DIR__."/features.php");
require_once(__DIR__."/../config/lab_config_resolver.php");

# Session hack for pages that use the header
# Make sure $_SESSION["lab_config_id"] is set... something really hates the session
# and is constantly overwriting lab_config_id. Can't figure out where.
if ($_SESSION["lab_config_id"] == null && $_SESSION["user_id"] != null) {
$lcid = get_user_lab_id($_SESSION["user_id"]);
$_SESSION["lab_config_id"] = $lcid;
}
$_SESSION["lab_config_id"] = LabConfigResolver::resolveId();

$TRACK_LOADTIME = false;
$TRACK_LOADTIMEJS = false;
Expand Down
Loading