<?php
namespace App\Models;
use \App\Entity\Group;
class Groups {
public function total_group_by_user(int $user_id) :int {
$tablename = Group::get_tablename();
$sql = "SELECT COUNT(*) FROM `{$tablename}` WHERE `user_id`='{$user_id}'";
$result = app() -> db() -> query($sql);
if(!$result) {
return throw new \Exception("Error of db query");
}
$d = $result -> fetch_assoc();
return $d["COUNT(*)"];
}
public function create_group(int $user_id, String $title, String $type) :Group {
$group = new Group();
$group -> user_id = $user_id;
$group -> title = $title;
$group -> type = $type;
$group -> position = $this -> total_group_by_user($user_id) + 1;
$group -> update_at = get_formatted_timestamp();
$group -> create_at = get_formatted_timestamp();
$group -> create_new();
return $group;
}
public function get_groups_by_user_id(int $user_id) :Array {
$tablename = Group::get_tablename();
$sql = "SELECT * FROM `{$tablename}` WHERE `user_id`='{$user_id}' ORDER BY `position` ASC";
$results = app() -> db() -> query($sql);
if(!$results) {
return throw new \Exception("Error of query to database");
}
$groups = [];
while($row = $results -> fetch_assoc()) {
$groups[] = Group::instance_from_data($row);
}
return $groups;
}
public function change_group_position(int $group_id, int $new_position) :bool {
$tablename = Group::get_tablename();
$session = get_current_session();
$groups = $session -> user() -> get_groups();
list($selected_group) = array_values(array_filter($groups, function($group) use($group_id) {
return $group -> get_id() == $group_id;
}));
$pos_min = min($selected_group -> position, $new_position);
$pos_max = max($selected_group -> position, $new_position);
$current_position = $selected_group->position;
foreach($groups as $i => $group) {
if($group -> position < $pos_min or $group -> position > $pos_max) {
continue;
}
if($group -> get_id() == $group_id) {
$group -> position = $new_position;
continue;
}
if ($new_position > $current_position) {
if ($group->position > $current_position && $group->position <= $new_position) {
$group->position--;
}
} else {
if ($group->position < $current_position && $group->position >= $new_position) {
$group->position++;
}
}
}
array_map(function($group){
$group -> update();
}, $groups);
return true;
}
}