Files
DADProject/api/database/seeders/UsersSeeder.php

174 lines
7.2 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Faker\Factory;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use stdClass;
class UsersSeeder extends Seeder
{
use SeederUtils;
private $faker = null;
private $files_M = [];
private $files_F = [];
public static $hashPasword = "";
public static $dbUsers = null;
public static $fixedUsers = [
['type' => 'A', 'name' => 'First Administrator', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => false],
['type' => 'A', 'name' => 'Second Administrator', 'email' => '[email protected]', 'gender' => 'F', 'softdelete' => false],
['type' => 'A', 'name' => 'Third Administrator', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => false],
['type' => 'A', 'name' => 'Forth Administrator', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => true],
['type' => 'P', 'name' => 'Player A', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => false],
['type' => 'P', 'name' => 'Player B', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => false],
['type' => 'P', 'name' => 'Player C', 'email' => '[email protected]', 'gender' => 'F', 'softdelete' => false],
['type' => 'P', 'name' => 'Player D', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => true],
['type' => 'P', 'name' => 'Player E', 'email' => '[email protected]', 'gender' => 'F', 'softdelete' => false],
['type' => 'P', 'name' => 'Player F', 'email' => '[email protected]', 'gender' => 'M', 'softdelete' => true],
];
public static $userTypes = [
'A' => 10,
'P' => 500];
public function run(): void
{
$this->command->line("Creating Users.");
self::$hashPasword = bcrypt('123');
//$this->faker = Factory::create('pt_PT');
$this->faker = Factory::create(DatabaseSeeder::$seedLanguage);
$this->cleanStorageFolder('photos_avatars');
$this->addUsersToDatabase();
$this->addPhotoFiles();
DB::table('users')->where('type', 'A')->update(['nickname' => null]);
self::$dbUsers = DB::table('users')->orderBy('id')->get();
$this->command->line("Users Created Successfully.");
}
private function addUsersToDatabase()
{
$this->command->line("Adding users to the database");
$usersAdded = Self::$fixedUsers;
foreach (self::$userTypes as $userType => $totalUsers) {
for ($i = 0; $i < $totalUsers; $i++) {
$gender = null;
$name = null;
$email = null;
$this->randomName($this->faker, $gender, $name, $email, false);
$usersAdded[] = [
'type' => $userType,
'name' => $name,
'email' => $email,
'gender' => $gender,
'softdelete' => random_int(1, 20) == 1,
];
}
}
$createdDate = DatabaseSeeder::$startDate->copy()->addMinutes(mt_rand(20000, 100000));
foreach ($usersAdded as $key => $user) {
$usersAdded[$key]['password'] = self::$hashPasword;
$createdDate = $createdDate->copy()->addMinutes(mt_rand(10, 60));
$usersAdded[$key]['created_at'] = $createdDate;
$usersAdded[$key]['email_verified_at'] = $createdDate->copy()->addMinutes(mt_rand(1, 9));
if (random_int(1, 7) > 1) {
$usersAdded[$key]['updated_at'] = $createdDate->copy()->addMinutes(mt_rand(10, 10000));
} else {
$usersAdded[$key]['updated_at'] = $createdDate;
}
$usersAdded[$key]['nickname'] = ($user['gender'] == 'M' ? 'Mickey' : 'Minnie') . ($key + 1) ;
$usersAdded[$key]['blocked'] = false;
$usersAdded[$key]['photo_avatar_filename'] = null;
$usersAdded[$key]['coins_balance'] = 0;
$usersAdded[$key]['deleted_at'] = null;
if ($usersAdded[$key]['softdelete']) {
$usersAdded[$key]['deleted_at'] = $createdDate->copy()->addMinutes(mt_rand(10001, 100000));
}
}
$arrayToStore = [];
foreach ($usersAdded as $user) {
unset($user['gender']);
unset($user['softdelete']);
$arrayToStore[] = $user;
if (count($arrayToStore) >= DatabaseSeeder::$dbInsertBlockSize) {
DB::table('users')->insert($arrayToStore);
$this->command->line("Created " . count($arrayToStore) . " users");
$arrayToStore = [];
}
}
if (count($arrayToStore) >= 1) {
DB::table('users')->insert($arrayToStore);
$this->command->line("Created " . count($arrayToStore) . " users");
}
$this->command->line("Total users created: " . DB::table('users')->count());
self::$dbUsers = DB::table('users')->get();
print_r(self::$dbUsers);
}
private function addPhotoFiles()
{
$this->command->line("Copying users' photos");
$this->fillPhotoFilesNames();
$total = count($this->files_M) + count($this->files_F);
$sortedUsers = self::$dbUsers->sortBy(function (stdClass $user) {
if ($user->id <= 10 ) {
return $user->id;
}
return match($user->type) {
'A' => 20 + $user->id,
'P' => 1000 + $user->id,
default => ($user->id < 50) ? 2000 + $user->id : 3000 + mt_rand(0, 100000),
};
});
$i = 0;
foreach($sortedUsers as $user) {
$originalFilename = str_starts_with($user->nickname, 'Mickey') ? array_shift($this->files_M) : array_shift($this->files_F);
if (!$originalFilename) {
if ((count($this->files_M) == 0) && (count($this->files_F) == 0))
break;
}
if ($originalFilename) {
$originalFilename = basename($originalFilename);
$newFileName = $this->copyFileToStorage('photos', $originalFilename, 'photos_avatars', $user->id);
$user->photo_avatar_filename = $newFileName;
DB::table('users')->where('id', $user->id)->update(['photo_avatar_filename' => $user->photo_avatar_filename]);
$i++;
if ($i % 10 == 0) {
$this->command->line("User photo $i/$total copied");
}
}
}
$this->command->line("Total of $total user's photos were copied!");
$this->directCopyFileToStorage('photos', 'anonymous.png', 'photos_avatars');
$this->command->line("Image for user with no associated photo was copied!");
}
private function fillPhotoFilesNames()
{
$allFiles = collect(File::files(database_path('seeders/photos')));
foreach ($allFiles as $f) {
if (strpos($f->getPathname(), 'm_')) {
$this->files_M[] = $f->getPathname();
} else if (strpos($f->getPathname(), 'w_')) {
$this->files_F[] = $f->getPathname();
}
}
shuffle($this->files_M);
shuffle($this->files_F);
}
}