<?php
namespace App\Http\Controllers\Service\v1;
use App\Http\Controllers\Utils\Code;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Builder;
class UserService extends BaseService
{
private static $instance;
public static function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new static();
}
return self::$instance;
}
public function getUserLists($user, array $pagination = ['page' => 1, 'limit' => 10], array $order = ['order' => 'id', 'direction' => 'asc'], bool $getAll = false, array $column = ['*'])
{
$this->return['lists'] = $this->userModel->getLists($user, $pagination, $order, $getAll, $column);
foreach ($this->return['lists']['data'] as &$item) {
$item->created_at = date('Y-m-d H:i:s', $item->created_at);
$item->updated_at = date('Y-m-d H:i:s', $item->updated_at);
}
return $this->return;
}
public function loginSYS(&$form)
{
$user = $this->userModel->getOne([['email', $form['email']]]);
if (!empty($form['password'])) {
if (!$user) {
$this->return['code'] = Code::NOT_FOUND;
$this->return['message'] = 'user not exists';
return $this->return;
}
if ($user->status === 2) {
$this->return['code'] = Code::FORBIDDEN;
$this->return['message'] = 'users not allowed login system';
return $this->return;
}
}
return !empty($form['password']) ? $this->accountLogin($form, $user) : $this->mailLogin($form, $user);
}
protected function accountLogin($form, $user)
{
$password = md5(md5($form['password']).$user->salt);
if ($password !== $user->password) {
$this->return['code'] = Code::ERROR;
$this->return['message'] = 'password validator failed';
return $this->return;
}
return $this->updateUsers($form, $user, 'account login system successfully');
}
protected function mailLogin($form, $user)
{
return !empty($user) ? $this->updateUsers($form, $user, 'mail login system successfully') : $this->registerUsers($form, 'mail register system successfully');
}
protected function updateUsers($form, $user, $message)
{
$form['salt'] = getRoundNum(8, 'all');
$form['password'] = md5(md5($form['password']).$form['salt']);
$form['remember_token'] = encrypt($user->password);
$form['ip_address'] = getServerIp();
$form['updated_at'] = time();
$this->userModel->updateOne(['id' => $user->id], $form);
$this->setVerifyCode($form['remember_token'], $form['remember_token'], config('app.app_refresh_login_time'));
$form['uuid'] = $user->uuid ?? '';
$form['avatar_url'] = $user->avatar_url ?? $this->getUserAvatarImage();
$form['username'] = $user->username ?? $form['email'];
$form['socket'] = config('app.socket_url');
$form['websocket'] = config('app.websocket');
$form['url'] = config('app.url');
$this->return['lists'] = $form;
$this->return['message'] = $message;
return $this->return;
}
protected function registerUsers($form, $message)
{
$form['avatar_url'] = $this->getUserAvatarImage();
$form['salt'] = getRoundNum(8, 'all');
$form['password'] = md5(md5(getRoundNum(9, 'all')).$form['salt']);
$form['remember_token'] = encrypt($form['password']);
$form['ip_address'] = getServerIp();
$form['updated_at'] = time();
$form['created_at'] = time();
$form['uuid'] = config('app.client_id');
$form['status'] = 1;
$form['role_id'] = 2;
$form['username'] = explode("@", $form['email'])[0];
$id = $this->userModel->saveOne($form);
$this->userModel->updateOne(['id' => $id], [$form['uuid'] => config('app.client_id').$id]);
$userCenter = ['u_name' => $form['username'], 'uid' => $id,'token' => $form['remember_token'], 'notice_status' => 1, 'user_status' =>1 ];
$this->userCenterModel->saveOne($userCenter);
$this->updateUsersAvatarImage();
$this->redisClient->del($form['email']);
$this->setVerifyCode($form['remember_token'], $form['remember_token'], config('app.app_refresh_login_time'));
$this->return['lists'] = $form;
$this->return['message'] = $message;
return $this->return;
}
private function getUserAvatarImage()
{
$users = json_decode($this->redisClient->sMembers(config('app.chat_user_key'))[0], true);
$avatarUrl = [];
foreach ($users as $user) {
if ($user['client_name']!=='admin') {
$avatarUrl[] = $user['client_img'];
}
}
return $avatarUrl[rand(0, count($avatarUrl))];
}
public function updateUsersAvatarImage()
{
$_column = ['username as client_name', 'avatar_url as client_img', 'uuid as uid', 'id'];
$users = $this->userModel->getLists([], [], [], true, $_column);
foreach ($users as &$user) {
$user->centerInfo = $this->userCenterModel->getOne(['uid' => $user->id], ['desc','tags','ip_address','local']);
$user->id = md5($user->id);
}
if ($this->redisClient->sMembers(config('app.chat_user_key'))) {
$this->redisClient->del(config('app.chat_user_key'));
}
return $this->redisClient->sAdd(config('app.chat_user_key'), json_encode($users, JSON_UNESCAPED_UNICODE));
}
public function getUser($where, $columns = ['*'])
{
return $this->userModel->getOne($where, $columns);
}
}