meraproject/module/core/user/account/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

229 lines
7.3 KiB
PHP

<?php
use \core\db\structure\Column as C;
use \core\db\structure\eColumnType;
use core\lang\structure\LangVariable as V;
use core\user\account\structure\accountLang as Vars;
use core\Token;
use market\Purchase;
use market\Item as MarketItem;
class Account extends \ModuleTable {
static $table_name = 'account';
static $controller = 'core.user.account';
static $ID = 'id';
static $NAME = 'name';
static $LOGIN = 'login';
static $EMAIL = 'email';
static $PASSWORD = 'password';
static $DATE = 'date';
static $self;
static $cookieIDKey = 'id';
static $cookieHashKey = 'h';
static $data = [];
static $isSuper = false;
static $purchases = [];
static $purchases_values = [];
static function getPurchased($account_id){
$account_id = intval($account_id);
if($c = self::$purchases[$account_id]) return $c;
$r = Purchase::select([
\Query::WHERE => new \Where(\Where::_operator(Purchase::$ACCOUNT,'=',$account_id))
],true);
self::$purchases[$account_id] = $r;
foreach ($r as $v){
self::$purchases[$account_id]['types'][] = $v[MarketItem::$TYPE];
}
return self::$purchases[$account_id];
}
static function getPurchaseTypes($account_id){
self::getPurchased($account_id);
return self::$purchases[$account_id]['types'];
}
static function init(){
define("IF_AUTH",self::if_auth());
define("UID",IF_AUTH ? self::$data[ self::$ID ] : 0);
static::$isSuper = (intval(UID)===1);
}
static function afterInstall() {
parent::afterInstall(); // TODO: Change the autogenerated stub
self::add([
self::$LOGIN=>'test@test.ru',
self::$PASSWORD=>'test',
]);
}
static function exit(){
Core::setCookie(self::$cookieIDKey,'-');
Core::setCookie(self::$cookieHashKey,'-');
}
static function getName($v, array $options = []): string {
$x = [];
//if($c = trim($v[self::$SNAME])) $x[] = $c;
if($c = trim($v[self::$ID])) $x[] = '#'.$c.' ';
if($c = trim($v[self::$NAME])) $x[] = $c;
//if($c = trim($v[self::$FNAME])) $x[] = $c;
return implode(" ",$x);
}
static function reg($data){
$res = new stdClass();
$res->e = 0;
$res->m = '';
$login = self::prepareLogin($data['login']);
$pass = self::prepareLogin($data['pass']);
$acc = self::getByLogin($login);
if(!$acc) {
$r = self::add([
self::$PASSWORD=>$pass,
self::$NAME=>$data['name'],
self::$LOGIN=>$login,
]);
$acc = self::getByID($r->id);
$hash = $acc[self::$PASSWORD];
Core::setCookie(self::$cookieIDKey,$acc[self::$ID]);
Core::setCookie(self::$cookieHashKey,$hash);
$res->id = $r->id;
$res->h = $hash;
\ms\MS::prepareNewUser($r->id);
} else {
$res->e = 1;
$res->m = V::get(Vars::$ACCOUNT_BUSY);
}
return $res;
}
static function if_auth(){
if (!empty($_COOKIE[self::$cookieIDKey]) && !empty($_COOKIE[self::$cookieHashKey])) {
$uid = intval($_COOKIE[self::$cookieIDKey]);
$hash = $_COOKIE[self::$cookieHashKey];
$acc = self::getByID($uid);
$res = strcmp($acc[self::$PASSWORD],$hash)==0;
if($res) self::$data = $acc;
return $res;
} else if( \Core::$TOKEN ){
$token = Token::getByHash(\Core::$TOKEN);
if($token[Token::$ACCOUNT]){
self::$data = self::getByID( $token[Token::$ACCOUNT] );
return true;
} else return false;
} else return false;
}
static function prepareLogin($login) {return trim(strtolower((string)$login));}
static function preparePass($pass) {return trim((string)$pass);}
static function login($login,$pass){
$res = new stdClass();
$res->e = 0;
$res->m = '';
$login = self::prepareLogin($login);
$pass = self::preparePass($pass);
$acc = self::getByLogin($login);
if($acc) {
if(self::checkPassword($acc,$pass)){
Core::setCookie(self::$cookieIDKey ,$acc[self::$ID]);
Core::setCookie(self::$cookieHashKey,$acc[self::$PASSWORD]);
if(Core::$IS_APP) {
$hash = Token::getHash($acc[self::$ID],0,\Site::$portal_id);
Token::insert([
Token::$ACCOUNT => $acc[self::$ID],
Token::$HASH => $hash,
]);
$res->token = $hash;
}
} else {
$res->e = 1;
$res->m = V::get(Vars::$WRONG_PASSWORD);
}
} else {
$res->e = 1;
$res->m = V::get(Vars::$ACCOUNT_NOT_FOUND);
}
return $res;
}
static function getSystemLangValues():array{ return Vars::getArray(); }
static function add($values){
$res = new stdClass();
$res->e = 0;
$res->m = '';
$admin = self::getByLogin($values[ self::$LOGIN ]);
if(!$admin) {
$r = self::insert($values);
$a = self::getByID($r->id);
$c[self::$PASSWORD] = self::hash($a);
self::updateById($r->id, $c);
$res->id = $r->id;
} else {
$res->e = 1;
$res->m = V::get(Vars::$ACCOUNT_BUSY);
}
return $res;
}
static function hash($acc){ return md5(\Config::$SALT.$acc[self::$ID].self::$DATE.\Config::$SALT.$acc[self::$PASSWORD]); }
static function checkPassword($acc,$pass):bool{
$hash = $acc[self::$PASSWORD];
$acc[self::$PASSWORD] = $pass;
return strcmp($hash, self::hash($acc) )===0;
}
static function getByLogin(string $account){
return DB::fetch(self::select( [Query::WHERE => new Where (Where::_operator(self::$LOGIN,'=',$account)) ] ));
}
static function columnInfo() : array {
return [
new C([
C::VAR_NAME =>&self::$ID,
C::TYPE =>eColumnType::INT,
C::AUTO_INCREMENT =>true,
C::PRIMARY =>true,
C::DEFAULT =>0,
]),
new C([
C::VAR_NAME =>&self::$NAME,
C::TYPE =>eColumnType::VARCHAR,
C::LENGTH =>255,
]),
new C([
C::VAR_NAME =>&self::$LOGIN,
C::TYPE =>eColumnType::VARCHAR,
C::LENGTH =>255,
]),
new C([
C::VAR_NAME =>&self::$EMAIL,
C::TYPE =>eColumnType::VARCHAR,
C::LENGTH =>255,
]),
new C([
C::VAR_NAME =>&self::$PASSWORD,
C::TYPE =>eColumnType::VARCHAR,
C::LENGTH =>255,
]),
new C([
C::VAR_NAME =>&self::$DATE,
C::TYPE =>eColumnType::INT,
C::DEFAULT =>time(),
]),
];
}
}
new Account();