You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.6 KiB
PHP

<?php
namespace Eater\Glim\Service;
use Eater\Glim\Model\Base\UserQuery;
use Eater\Glim\Model\InviteQuery;
use Eater\Glim\Model\Invite;
use Eater\Glim\Model\User as UserModel;
class User extends Main
{
/**
* @param string $invite
* @param string $username
* @param string $password
* @return Eater\Glim\Model\User
* @throws \Exception
*/
public function register($invite, $username, $password)
{
$invite = InviteQuery::create()->findOneByInvite($invite);
if ($invite === null) {
throw new \Exception("Invalid invite code");
}
if ($this->exists($username)) {
throw new \Exception("User already exists");
}
$user = new UserModel();
$user->setUsername($username);
$user->setPassword(\password_hash($password, PASSWORD_DEFAULT));
$user->save();
$invite->delete();
return $user;
}
/**
* @param string $username
* @return bool
*/
public function exists($username)
{
$amount = UserQuery::create()->findByUsername($username)->count();
return $amount > 0;
}
public function login($username, $password)
{
$user = UserQuery::create()->findOneByUsername($username);
if ($user === null || !password_verify($password, $user->getPassword())) {
return null;
}
return $user;
}
/**
* @return string
*/
public function createInvite()
{
$invite = new Invite();
$invite->setInvite(bin2hex(openssl_random_pseudo_bytes(20)));
$invite->save();
return $invite->getInvite();
}
}