Skip to content

Commit 02f5877

Browse files
committed
updated user deleted status
Signed-off-by: bidi <bidi@apidemia.com>
1 parent 265058a commit 02f5877

File tree

11 files changed

+52
-50
lines changed

11 files changed

+52
-50
lines changed

data/doctrine/migrations/Version20241120160406.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function up(Schema $schema): void
2121
{
2222
// this up() migration is auto-generated, please modify it to your needs
2323
$this->addSql('CREATE TABLE contact_message (uuid BINARY(16) NOT NULL, email VARCHAR(150) NOT NULL, name VARCHAR(150) NOT NULL, subject LONGTEXT NOT NULL, message LONGTEXT NOT NULL, platform LONGTEXT NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, PRIMARY KEY(uuid)) DEFAULT CHARACTER SET utf8mb4');
24-
$this->addSql('CREATE TABLE user (uuid BINARY(16) NOT NULL, identity VARCHAR(191) NOT NULL, password VARCHAR(191) NOT NULL, status ENUM(\'active\', \'pending\') DEFAULT \'pending\' NOT NULL, isDeleted TINYINT(1) NOT NULL, hash VARCHAR(64) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_8D93D6496A95E9C4 (identity), UNIQUE INDEX UNIQ_8D93D649D1B862B8 (hash), PRIMARY KEY(uuid)) DEFAULT CHARACTER SET utf8mb4');
24+
$this->addSql('CREATE TABLE user (uuid BINARY(16) NOT NULL, identity VARCHAR(191) NOT NULL, password VARCHAR(191) NOT NULL, status ENUM(\'active\', \'pending\', \'deleted\') DEFAULT \'pending\' NOT NULL, hash VARCHAR(64) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_8D93D6496A95E9C4 (identity), UNIQUE INDEX UNIQ_8D93D649D1B862B8 (hash), PRIMARY KEY(uuid)) DEFAULT CHARACTER SET utf8mb4');
2525
$this->addSql('CREATE TABLE user_roles (userUuid BINARY(16) NOT NULL, roleUuid BINARY(16) NOT NULL, INDEX IDX_54FCD59FD73087E9 (userUuid), INDEX IDX_54FCD59F88446210 (roleUuid), PRIMARY KEY(userUuid, roleUuid)) DEFAULT CHARACTER SET utf8mb4');
2626
$this->addSql('CREATE TABLE user_avatar (uuid BINARY(16) NOT NULL, name VARCHAR(191) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) NOT NULL, UNIQUE INDEX UNIQ_73256912D73087E9 (userUuid), PRIMARY KEY(uuid)) DEFAULT CHARACTER SET utf8mb4');
2727
$this->addSql('CREATE TABLE user_detail (uuid BINARY(16) NOT NULL, firstName VARCHAR(191) DEFAULT NULL, lastName VARCHAR(191) DEFAULT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) NOT NULL, UNIQUE INDEX UNIQ_4B5464AED73087E9 (userUuid), PRIMARY KEY(uuid)) DEFAULT CHARACTER SET utf8mb4');

src/App/src/Middleware/RememberMeMiddleware.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
4646
$hash === $rememberUser->getRememberMeToken() &&
4747
$rememberUser->getUserAgent() === $deviceType &&
4848
$rememberUser->getExpireDate() > new DateTimeImmutable('now') &&
49-
$user->getIsDeleted() === false
49+
$user->isDeleted() === false
5050
) {
5151
$userIdentity = UserIdentity::fromEntity($user);
5252
$this->authenticationService->getStorage()->write($userIdentity);

src/User/src/Controller/AccountController.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ public function activateAction(): ResponseInterface
6666
return new RedirectResponse($this->router->generateUri('user', ['action' => 'login']));
6767
}
6868

69+
if ($user->isDeleted()) {
70+
$this->messenger->addError(Message::ACCOUNT_NOT_FOUND, 'user-login');
71+
return new RedirectResponse($this->router->generateUri('user', ['action' => 'login']));
72+
}
73+
6974
if ($user->isActive()) {
7075
$this->messenger->addError(Message::USER_ALREADY_ACTIVATED, 'user-login');
7176
return new RedirectResponse($this->router->generateUri('user', ['action' => 'login']));
@@ -96,7 +101,7 @@ public function unregisterAction(): ResponseInterface
96101
return new RedirectResponse($this->router->generateUri('user', ['action' => 'login']));
97102
}
98103

99-
if ($user->getIsDeleted() === User::IS_DELETED_YES) {
104+
if ($user->isDeleted()) {
100105
$this->messenger->addError(Message::USER_ALREADY_DEACTIVATED, 'user-login');
101106
return new RedirectResponse($this->router->generateUri('user', ['action' => 'login']));
102107
}
@@ -107,7 +112,7 @@ public function unregisterAction(): ResponseInterface
107112
}
108113

109114
try {
110-
$this->userService->updateUser($user, ['isDeleted' => User::IS_DELETED_YES]);
115+
$this->userService->deleteUser($user);
111116
} catch (Exception $exception) {
112117
$this->messenger->addError($exception->getMessage(), 'user-login');
113118
return new RedirectResponse($this->router->generateUri('user', ['action' => 'login']));
@@ -423,10 +428,8 @@ public function deleteAccountAction(): ResponseInterface
423428
if (RequestMethodInterface::METHOD_POST === $this->request->getMethod()) {
424429
$form->setData($this->request->getParsedBody());
425430
if ($form->isValid()) {
426-
/** @var array $userData */
427-
$userData = $form->getData();
428431
try {
429-
$this->userService->updateUser($user, $userData);
432+
$this->userService->deleteUser($user);
430433
$this->userService->deleteAvatar($user);
431434
} catch (Exception $e) {
432435
$this->messenger->addData('shouldRebind', true);

src/User/src/Entity/User.php

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ class User extends AbstractEntity implements UserInterface
4545
#[ORM\Column(type: 'user_status_enum', options: ['default' => UserStatusEnum::Pending])]
4646
protected UserStatusEnum $status = UserStatusEnum::Pending;
4747

48-
#[ORM\Column(name: 'isDeleted', type: 'boolean')]
49-
protected bool $isDeleted = self::IS_DELETED_NO;
50-
5148
#[ORM\Column(name: 'hash', type: 'string', length: 64, unique: true, nullable: false)]
5249
protected string $hash;
5350

@@ -138,18 +135,6 @@ public function setStatus(UserStatusEnum $status): self
138135
return $this;
139136
}
140137

141-
public function getIsDeleted(): bool
142-
{
143-
return $this->isDeleted;
144-
}
145-
146-
public function setIsDeleted(bool $isDeleted): self
147-
{
148-
$this->isDeleted = $isDeleted;
149-
150-
return $this;
151-
}
152-
153138
public function getHash(): string
154139
{
155140
return $this->hash;
@@ -213,11 +198,9 @@ public function isPending(): bool
213198
return $this->status === UserStatusEnum::Pending;
214199
}
215200

216-
public function markAsDeleted(): self
201+
public function isDeleted(): bool
217202
{
218-
$this->isDeleted = self::IS_DELETED_YES;
219-
220-
return $this;
203+
return $this->status === UserStatusEnum::Deleted;
221204
}
222205

223206
public function getName(): string

src/User/src/Entity/UserInterface.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ public function addRole(UserRole $role): UserInterface;
3838

3939
public function removeRole(UserRole $role): UserInterface;
4040

41-
public function getIsDeleted(): bool;
42-
4341
public function getArrayCopy(): array;
4442

4543
public function activate(): UserInterface;

src/User/src/Enum/UserStatusEnum.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ enum UserStatusEnum: string
88
{
99
case Active = 'active';
1010
case Pending = 'pending';
11+
case Deleted = 'deleted';
1112
}

src/User/src/Form/ProfileDeleteForm.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public function init(): void
4444
'title' => 'Delete account',
4545
],
4646
'options' => [
47-
'label' => 'I want to delete account',
47+
'label' => 'I want to delete my account',
4848
'use_hidden_element' => false,
4949
'checked_value' => (string) User::IS_DELETED_YES,
5050
'unchecked_value' => (string) User::IS_DELETED_NO,

src/User/src/Repository/UserRepository.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Exception;
1212
use Frontend\User\Entity\User;
1313
use Frontend\User\Entity\UserRememberMe;
14+
use Frontend\User\Enum\UserStatusEnum;
1415
use Ramsey\Uuid\Uuid;
1516

1617
use function is_string;
@@ -36,6 +37,9 @@ public function findByUuid(string $uuid): ?User
3637
->where("user.uuid = :uuid")
3738
->setParameter('uuid', $uuid)
3839
->setMaxResults(1);
40+
41+
//ignore deleted users
42+
$qb->andWhere('user.status != :status')->setParameter('status', UserStatusEnum::Deleted);
3943
return $qb->getQuery()->useQueryCache(true)->getOneOrNullResult();
4044
}
4145

@@ -72,7 +76,10 @@ public function findByResetPasswordHash(string $hash): ?User
7276
$qb = $this->getEntityManager()->createQueryBuilder();
7377
$qb->select(['user', 'resetPasswords'])->from(User::class, 'user')
7478
->leftJoin('user.resetPasswords', 'resetPasswords')
75-
->andWhere('resetPasswords.hash = :hash')->setParameter('hash', $hash);
79+
->andWhere('resetPasswords.hash = :hash')
80+
->setParameter('hash', $hash)
81+
->andWhere('user.status != :deleted')
82+
->setParameter('deleted', UserStatusEnum::Deleted);
7683

7784
return $qb->getQuery()->useQueryCache(true)->getSingleResult();
7885
} catch (Exception) {
@@ -95,7 +102,9 @@ public function getRememberUser(string $token): ?UserRememberMe
95102
$qb->select('user_remember_me')
96103
->from(UserRememberMe::class, 'user_remember_me')
97104
->where('user_remember_me.rememberMeToken = :token')
98-
->setParameter('token', $token);
105+
->setParameter('token', $token)
106+
->andWhere('user.status != :deleted')
107+
->setParameter('deleted', UserStatusEnum::Deleted);
99108

100109
return $qb->getQuery()->useQueryCache(true)->getOneOrNullResult();
101110
}
@@ -111,7 +120,9 @@ public function findRememberMeUser(User $user, string $userAgent): ?UserRemember
111120
->where('user_remember_me.user = :uuid')
112121
->setParameter('uuid', $user->getUuid()->getBytes())
113122
->andWhere('user_remember_me.userAgent = :userAgent')
114-
->setParameter('userAgent', $userAgent);
123+
->setParameter('userAgent', $userAgent)
124+
->andWhere('user.status != :deleted')
125+
->setParameter('deleted', UserStatusEnum::Deleted);
115126

116127
return $qb->getQuery()->useQueryCache(true)->getOneOrNullResult();
117128
}

src/User/src/Service/UserService.php

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,22 +138,6 @@ public function updateUser(User $user, array $data = []): User
138138
$user->setStatus($data['status']);
139139
}
140140

141-
if (isset($data['isDeleted'])) {
142-
$user->setIsDeleted((bool) $data['isDeleted']);
143-
144-
if ((bool) $data['isDeleted'] === true) {
145-
// make user anonymous
146-
$user->setIdentity(
147-
sprintf('anonymous%s@%s', date('dmYHis'), $this->config['userAnonymizeAppend'])
148-
);
149-
$userDetails = $user->getDetail();
150-
$userDetails->setFirstName('anonymous' . date('dmYHis'));
151-
$userDetails->setLastName('anonymous' . date('dmYHis'));
152-
153-
$user->setDetail($userDetails);
154-
}
155-
}
156-
157141
if (isset($data['hash'])) {
158142
$user->setHash($data['hash']);
159143
}
@@ -189,6 +173,28 @@ public function updateUser(User $user, array $data = []): User
189173
return $this->userRepository->saveUser($user);
190174
}
191175

176+
public function deleteUser(User $user): User
177+
{
178+
$user->setStatus(UserStatusEnum::Deleted);
179+
180+
if ($user->isDeleted()) {
181+
$placeholder = $this->getAnonymousPlaceholder();
182+
183+
// make user anonymous
184+
$user
185+
->setIdentity($placeholder . $this->config['userAnonymizeAppend'])
186+
->getDetail()
187+
->setFirstName($placeholder)
188+
->setLastName($placeholder);
189+
}
190+
return $this->userRepository->saveUser($user);
191+
}
192+
193+
private function getAnonymousPlaceholder(): string
194+
{
195+
return 'anonymous' . date('dmYHis');
196+
}
197+
192198
protected function createAvatar(User $user, UploadedFile $uploadedFile): UserAvatar
193199
{
194200
$path = sprintf('%s/%s/', $this->config['uploads']['user']['path'], $user->getUuid()->toString());

src/User/src/Service/UserServiceInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public function deleteExpiredRememberMeTokens(): void;
3434

3535
public function updateUser(User $user, array $data = []): UserInterface;
3636

37+
public function deleteUser(User $user): UserInterface;
38+
3739
public function deleteAvatar(User $user): void;
3840

3941
public function deleteAvatarFile(string $path): bool;

0 commit comments

Comments
 (0)