Added database structure and components
This commit is contained in:
@@ -0,0 +1,173 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user