Delete the user in a GDPR compatible way (#1151)

* Delete the user in a GDPR compatible way

* Block user from calls

* Style fix
This commit is contained in:
Nabeel S
2021-04-23 10:33:13 -04:00
committed by GitHub
parent f8c7bc31f5
commit 14d0e99a37
15 changed files with 145 additions and 18 deletions

View File

@@ -9,12 +9,14 @@ use App\Events\UserStatsChanged;
use App\Exceptions\PilotIdNotFound;
use App\Exceptions\UserPilotIdExists;
use App\Models\Airline;
use App\Models\Bid;
use App\Models\Enums\PirepState;
use App\Models\Enums\UserState;
use App\Models\Pirep;
use App\Models\Rank;
use App\Models\Role;
use App\Models\User;
use App\Models\UserFieldValue;
use App\Repositories\AircraftRepository;
use App\Repositories\AirlineRepository;
use App\Repositories\SubfleetRepository;
@@ -23,6 +25,7 @@ use App\Support\Units\Time;
use App\Support\Utils;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use function is_array;
@@ -60,14 +63,19 @@ class UserService extends Service
*
* @param $user_id
*
* @return User
* @return User|null
*/
public function getUser($user_id): User
public function getUser($user_id): ?User
{
/** @var User $user */
$user = $this->userRepo
->with(['airline', 'bids', 'rank'])
->find($user_id);
if ($user->state === UserState::DELETED) {
return null;
}
// Load the proper subfleets to the rank
$user->rank->subfleets = $this->getAllowableSubfleets($user);
$user->subfleets = $user->rank->subfleets;
@@ -117,6 +125,33 @@ class UserService extends Service
return $user;
}
/**
* Remove the user. But don't actually delete them - set the name to deleted, email to
* something random
*
* @param User $user
*
* @throws \Exception
*/
public function removeUser(User $user)
{
$user->name = 'Deleted User';
$user->email = Utils::generateApiKey().'@deleted-user.com';
$user->api_key = Utils::generateApiKey();
$user->password = Hash::make(Utils::generateApiKey());
$user->state = UserState::DELETED;
$user->save();
// Detach all roles from this user
$user->detachRoles($user->roles);
// Delete any fields which might have personal information
UserFieldValue::where('user_id', $user->id)->delete();
// Remove any bids
Bid::where('user_id', $user->id)->delete();
}
/**
* Add a user to a given role
*
@@ -125,7 +160,7 @@ class UserService extends Service
*
* @return User
*/
public function addUserToRole(User $user, $roleName): User
public function addUserToRole(User $user, string $roleName): User
{
$role = Role::where(['name' => $roleName])->first();
$user->attachRole($role);