<?php
namespace SHServ\Entities;
use \SHServ\Entities\Session;
use \SHServ\Containers\UserStatistics;
use \SHServ\Containers\Registration\UsersContainer;
use \SHServ\Containers\Registration\UAdPostsContainer;
use \SHServ\Models\UAdPosts;
use \SHServ\Models\Favourites;
use \SHServ\Models\Orders;
use \SHServ\Entities\Profile;
class User extends \SHServ\Middleware\Entity {
public static $table_name = "users";
protected static $fields = [
"id", "alias", "status", "role", "email", "password", "create_at", "update_at"
];
protected UserStatistics $statistics;
protected Profile $profile;
public function __construct(Int $uid, Array $data = []) {
parent::__construct(self::$table_name, $uid, $data);
$this -> statistics = new UserStatistics($uid);
// TODO: `uid` - is fail, need `profile_id`
$this -> profile = new Profile($uid);
UsersContainer::add_entity_item($this);
}
public function profile(): Profile {
return $this -> profile;
}
public function statistics(): UserStatistics {
return $this -> statistics;
}
public function get_last_uadpost(): ?UAdPost {
$posts = app() -> factory -> getter() -> get_uadposts_by("uid", $this -> id(), 1);
return count($posts) ? $posts[0] : null;
}
public function total_uadposts(String $state = "published"): Int {
return (new UAdPosts()) -> total_by_user($this -> id(), $state);
}
public function get_uadposts(String $state = "published", Int $page_num = 1): Array {
$uadposts = (new UAdPosts()) -> get_by_user(
$this -> id(),
$state,
FCONF["profile_uadposts_per_page"],
$page_num,
"update_at"
);
UAdPostsContainer::fill();
return $uadposts;
}
public function last_session(): ?\SHServ\Entities\Session {
return $this -> get_pet_instance("Session", function() {
return app() -> factory -> getter() -> get_session_by("uid", $this -> id());
});
}
public function total_favourites_uadposts(): Int {
return (new Favourites()) -> total_by_user( $this -> id(), "UAdPost" );
}
public function get_orders(String $utype, Int $page_num = 1, Array $including_states = []): Array {
$sorting_cases = [
"unconfirmed",
"confirmed",
"canceled",
"completed",
];
$order_by = "CASE ";
foreach($sorting_cases as $i => $case) {
$then = $i + 1;
$order_by .= "WHEN `state`='{$case}' THEN {$then} ";
}
$order_by .= " ELSE " . (count($sorting_cases) + 1) . " END";
$order_by .= ", `create_at`";
$orders_model = new Orders();
$orders = $orders_model -> get_by_user(
$utype,
$this -> id, FCONF["user_orders_per_page"],
$page_num,
$order_by,
"DESC",
$including_states
);
return $orders;
}
public function total_orders(String $utype, Array $including_states = []): Int {
return (new Orders()) -> total_by_user($utype, $this -> id, $including_states);
}
public function role_is(String $role_name): Bool {
return $this -> role == $role_name;
}
// Static methods
public static function is_exists_by(String $field_name, String $field_value): Bool {
return app() -> utils -> table_row_is_exists(
app() -> thin_builder,
self::$table_name,
$field_name,
$field_value
);
}
}