SpreadQuiz/groupmgr.php
2024-09-25 09:19:28 +02:00

193 lines
5.6 KiB
PHP

<?php
require_once "globals.php";
require_once "common_func.php";
require_once "usermgr.php";
$groupdb = new \SleekDB\Store(GROUPDB, DATADIR, ["timeout" => false]);
function create_group(string $groupname, string $owner, string $description = ""): bool
{
global $groupdb;
// test name uniqueness
$unique = manage_unique_in_siblings(0, $groupname);
// initialize group data
$group_data = [
"groupname" => $groupname,
"unique" => $unique,
"owner" => $owner,
"description" => $description,
"editors" => [],
"users" => [],
"games" => []
];
$groupdb->insert($group_data); // insert group
return true;
}
function get_group(string $groupid): array
{
global $groupdb;
return $groupdb->findById($groupid);
}
function update_group(array $group_data)
{
global $groupdb;
$groupdb->update($group_data);
}
function delete_group(string $groupid)
{
global $groupdb;
$group_data = get_group($groupid);
if (count($group_data) !== 0) {
foreach ($group_data["users"] as $nickname) { // remove all references to this group
change_user_group_assignments($nickname, null, $groupid);
}
}
$groupdb->deleteById($groupid);
}
function get_all_groups()
{
global $groupdb;
return $groupdb->findAll();
}
function change_group_user_assignments(string $groupid, $nickname_add, $nickname_remove)
{
$group_data = get_group($groupid);
if (count($group_data) != 0) {
// --------- UPDATE group assignments (DEV ONLY!)------
$group_data["editors"] = $group_data["editors"] ?? [];
// ---------
alter_array_contents($group_data["users"], $nickname_add, $nickname_remove); // add to local storage
alter_array_contents($group_data["editors"], null, $nickname_remove); // removed users must be excluded from the editors' list as well
update_group($group_data); // update user
if ($nickname_add !== null) {
change_user_group_assignments($nickname_add, $groupid, null); // add to user's storage remote
}
if ($nickname_remove !== null) {
change_user_group_assignments($nickname_remove, null, $groupid); // remove from user's storage
}
}
}
function change_group_game_assignments(string $groupid, $gameid_add, $gameid_remove)
{
$group_data = get_group($groupid);
if (count($group_data) != 0) {
alter_array_contents($group_data["games"], $gameid_add, $gameid_remove); // add to local storage
update_group($group_data); // update user
if ($gameid_add !== null) {
change_game_group_assignments($gameid_add, $groupid, null); // add to user's storage remote
}
if ($gameid_remove !== null) {
change_game_group_assignments($gameid_remove, null, $groupid); // remove from user's storage
}
}
}
function search_groups(string $needle): array
{
if (strlen($needle) < 3) {
return [];
}
global $groupdb;
$parts = explode("#", $needle, 2);
$groupname = $parts[0];
$group_data_array = [];
if (count($parts) === 1) {
$group_data_array = $groupdb->findBy(["groupname", "LIKE", "%$groupname%"]);
} else if (count($parts) > 1) {
$groupid = $parts[1];
$group_data_array = $groupdb->findBy([["groupname", "LIKE", "%$groupname%"], "AND", ["_id", "LIKE", "%$groupid%"]]);
}
$results = [];
foreach ($group_data_array as $group_data) {
$results[] = [
"groupname" => $group_data["groupname"],
"_id" => $group_data["_id"],
"unique" => $group_data["unique"]
];
}
return $results;
}
function manage_unique_in_siblings(int $current_gid, $groupname): bool
{
// make test on name uniqueness
global $groupdb;
$twins = $groupdb->findBy([["groupname", "=", "$groupname"], "AND", ["_id", "!=", $current_gid]]);
$unique = count($twins) == 0;
if (count($twins) === 1) { // if fails, then also indicate in the original group that its name is no longer unique
$twins[0]["unique"] = false;
update_group($twins[0]);
}
return $unique;
}
function get_groupids_by_compounds(array $compounds): array
{
global $groupdb;
$groupids = [];
foreach ($compounds as $compound) {
if (trim($compound) === "") { // skip empty entries
continue;
}
// fetch the group
$parts = explode("#", $compound);
$group_data = [];
if (count($parts) === 1) {
$fetch_cmd = ["groupname", "=", $parts[0]];
$group_data = $groupdb->findBy($fetch_cmd);
if (count($group_data) == 1) { // too many hits
$group_data = $group_data[0];
} else {
$group_data = [];
}
} else {
$group_data = $groupdb->findById($parts[1]);
}
if ($group_data !== []) {
$groupids[] = $group_data["_id"];
}
}
return $groupids;
}
function is_user_editor_to_group(string $groupid, string $nickname): bool
{
$group_data = get_group($groupid);
if (count($group_data) === 0) {
return false;
}
return in_array($nickname, $group_data["editors"]) || ($group_data["owner"] === $nickname);
}
function get_group_unique_name(string $groupid): string
{
$group_data = get_group($groupid);
if (count($group_data) !== 0) {
return $group_data["groupname"] . (!$group_data["unique"] ? "#" . $groupid : "");
}
return "";
}
function resolve_groupids(array &$groups): void
{
for ($i = 0; $i < count($groups); $i++) {
$groups[$i] = get_group_unique_name($groups[$i]);
}
}