[CORE][Nickname] Properly set nickname for existing accounts
This commit is contained in:
parent
1056bc661f
commit
d713429d88
@ -166,7 +166,7 @@ class Group extends FeedController
|
||||
return [
|
||||
'_template' => 'group/settings.html.twig',
|
||||
'group' => $group,
|
||||
'personal_info_form' => ActorForms::personalInfo($request, $group)->createView(),
|
||||
'personal_info_form' => ActorForms::personalInfo($request, $actor, $group)->createView(),
|
||||
'open_details_query' => $this->string('open'),
|
||||
];
|
||||
} else {
|
||||
|
@ -21,10 +21,18 @@ declare(strict_types = 1);
|
||||
|
||||
namespace Component\Group\Entity;
|
||||
|
||||
use App\Core\Cache;
|
||||
use App\Core\DB\DB;
|
||||
use App\Core\Entity;
|
||||
|
||||
use App\Entity\Actor;
|
||||
use App\Util\Exception\NicknameEmptyException;
|
||||
use App\Util\Exception\NicknameException;
|
||||
use App\Util\Exception\NicknameInvalidException;
|
||||
use App\Util\Exception\NicknameNotAllowedException;
|
||||
use App\Util\Exception\NicknameTakenException;
|
||||
use App\Util\Exception\NicknameTooLongException;
|
||||
use App\Util\Nickname;
|
||||
use DateTimeInterface;
|
||||
|
||||
/**
|
||||
@ -114,6 +122,29 @@ class LocalGroup extends Entity
|
||||
return $res === [] ? null : $res[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if desired nickname is allowed, and in case it is, it sets Actor's nickname cache to newly set nickname
|
||||
*
|
||||
* @param string $nickname Desired NEW nickname (do not use in local user creation)
|
||||
*
|
||||
* @throws NicknameEmptyException
|
||||
* @throws NicknameException
|
||||
* @throws NicknameInvalidException
|
||||
* @throws NicknameNotAllowedException
|
||||
* @throws NicknameTakenException
|
||||
* @throws NicknameTooLongException
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setNicknameSanitizedAndCached(string $nickname): self
|
||||
{
|
||||
$nickname = Nickname::normalize($nickname, check_already_used: true, which: Nickname::CHECK_LOCAL_GROUP, check_is_allowed: true);
|
||||
$this->setNickname($nickname);
|
||||
$this->getActor()->setNickname($nickname);
|
||||
/// XXX: cache?
|
||||
return $this;
|
||||
}
|
||||
|
||||
public static function schemaDef(): array
|
||||
{
|
||||
return [
|
||||
|
@ -77,7 +77,7 @@ class UserPanel extends Controller
|
||||
$user = Common::ensureLoggedIn();
|
||||
$actor = $user->getActor();
|
||||
|
||||
$personal_form = ActorForms::personalInfo($request, $actor);
|
||||
$personal_form = ActorForms::personalInfo($request, $actor, $user);
|
||||
$email_form = self::email($request);
|
||||
$password_form = self::password($request);
|
||||
$notifications_form_array = self::notifications($request);
|
||||
|
@ -29,6 +29,7 @@ use App\Core\Entity;
|
||||
use App\Core\UserRoles;
|
||||
use App\Util\Common;
|
||||
use App\Util\Exception\NicknameEmptyException;
|
||||
use App\Util\Exception\NicknameException;
|
||||
use App\Util\Exception\NicknameInvalidException;
|
||||
use App\Util\Exception\NicknameNotAllowedException;
|
||||
use App\Util\Exception\NicknameTakenException;
|
||||
@ -349,19 +350,18 @@ class LocalUser extends Entity implements UserInterface, PasswordAuthenticatedUs
|
||||
/**
|
||||
* Checks if desired nickname is allowed, and in case it is, it sets Actor's nickname cache to newly set nickname
|
||||
*
|
||||
* @param string $nickname Desired new nickname
|
||||
*
|
||||
* @param string $nickname Desired NEW nickname (do not use in local user creation)
|
||||
* @return $this
|
||||
* @throws NicknameEmptyException
|
||||
* @throws NicknameInvalidException
|
||||
* @throws NicknameNotAllowedException
|
||||
* @throws NicknameTakenException
|
||||
* @throws NicknameTooLongException
|
||||
*
|
||||
* @return $this
|
||||
* @throws NicknameException
|
||||
*/
|
||||
public function setNicknameSanitizedAndCached(string $nickname): self
|
||||
{
|
||||
$nickname = Nickname::normalize($nickname, check_already_used: false, which: Nickname::CHECK_LOCAL_USER, check_is_allowed: true);
|
||||
$nickname = Nickname::normalize($nickname, check_already_used: true, which: Nickname::CHECK_LOCAL_USER, check_is_allowed: true);
|
||||
$this->setNickname($nickname);
|
||||
$this->getActor()->setNickname($nickname);
|
||||
Cache::delete(self::cacheKeys($this->getId())['nickname']);
|
||||
|
@ -46,6 +46,7 @@ use App\Util\Exception\NicknameTakenException;
|
||||
use App\Util\Exception\NicknameTooLongException;
|
||||
use App\Util\Exception\NoLoggedInUser;
|
||||
use App\Util\Exception\ServerException;
|
||||
use Component\Group\Entity\LocalGroup;
|
||||
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
|
||||
@ -65,7 +66,7 @@ class ActorForms
|
||||
* @throws NoLoggedInUser
|
||||
* @throws ServerException
|
||||
*/
|
||||
public static function personalInfo(Request $request, Actor $target, ?LocalUser $user = null): mixed
|
||||
public static function personalInfo(Request $request, Actor $target, LocalUser|LocalGroup $user): mixed
|
||||
{
|
||||
// Defining the various form fields
|
||||
$form_definition = [
|
||||
@ -80,9 +81,7 @@ class ActorForms
|
||||
|
||||
// Setting nickname normalised and setting actor cache
|
||||
$extra_step = function ($data, $extra_args) use ($user, $target) {
|
||||
if (!\is_null($user)) {
|
||||
$user->setNicknameSanitizedAndCached($data['nickname']);
|
||||
}
|
||||
$user->setNicknameSanitizedAndCached($data['nickname']);
|
||||
|
||||
$cache_keys = Actor::cacheKeys($target->getId());
|
||||
foreach (['id', 'nickname', 'fullname'] as $key) {
|
||||
|
@ -24,6 +24,7 @@ declare(strict_types = 1);
|
||||
namespace App\Util;
|
||||
|
||||
use App\Core\DB\DB;
|
||||
use App\Entity\LocalUser;
|
||||
use App\Util\Exception\BugFoundException;
|
||||
use App\Util\Exception\DuplicateFoundException;
|
||||
use App\Util\Exception\NicknameEmptyException;
|
||||
@ -33,7 +34,7 @@ use App\Util\Exception\NicknameNotAllowedException;
|
||||
use App\Util\Exception\NicknameTakenException;
|
||||
use App\Util\Exception\NicknameTooLongException;
|
||||
use App\Util\Exception\NotFoundException;
|
||||
use App\Util\Exception\NotImplementedException;
|
||||
use Component\Group\Entity\LocalGroup;
|
||||
use Functional as F;
|
||||
use InvalidArgumentException;
|
||||
|
||||
@ -150,7 +151,7 @@ class Nickname
|
||||
switch ($which) {
|
||||
case self::CHECK_LOCAL_USER:
|
||||
try {
|
||||
$lu = DB::findOneBy('local_user', ['nickname' => $nickname]);
|
||||
$lu = DB::findOneBy(LocalUser::class, ['nickname' => $nickname]);
|
||||
throw new NicknameTakenException($lu->getActor());
|
||||
} catch (NotFoundException) {
|
||||
// continue
|
||||
@ -158,9 +159,16 @@ class Nickname
|
||||
throw new BugFoundException("Duplicate entry in `local_user` for nickname={$nickname}");
|
||||
}
|
||||
break;
|
||||
// @codeCoverageIgnoreStart
|
||||
case self::CHECK_LOCAL_GROUP:
|
||||
throw new NotImplementedException();
|
||||
try {
|
||||
$lg = DB::findOneBy(LocalGroup::class, ['nickname' => $nickname]);
|
||||
throw new NicknameTakenException($lg->getActor());
|
||||
} catch (NotFoundException) {
|
||||
// continue
|
||||
} catch (DuplicateFoundException) {
|
||||
throw new BugFoundException("Duplicate entry in `local_group` for nickname={$nickname}");
|
||||
}
|
||||
break; // @codeCoverageIgnoreStart
|
||||
default:
|
||||
throw new InvalidArgumentException();
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
Loading…
Reference in New Issue
Block a user