141 lines
4.1 KiB
PHP
141 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Temporal\UserMigration;
|
|
|
|
use App\Models\User;
|
|
use App\Temporal\Shared\FaultSimulator;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Str;
|
|
use Temporal\Activity;
|
|
|
|
class UserMigrationActivity implements UserMigrationActivityInterface
|
|
{
|
|
public function fetchExternalUsers(int $count, array $simulationConfig = []): array
|
|
{
|
|
$users = [];
|
|
$pageSize = 25;
|
|
$totalPages = (int) ceil($count / $pageSize);
|
|
|
|
for ($page = 0; $page < $totalPages; $page++) {
|
|
Activity::heartbeat(['page' => $page + 1, 'totalPages' => $totalPages]);
|
|
|
|
FaultSimulator::maybeApply($simulationConfig, 'fetchExternalUsers');
|
|
|
|
$start = $page * $pageSize + 1;
|
|
$end = min(($page + 1) * $pageSize, $count);
|
|
|
|
for ($i = $start; $i <= $end; $i++) {
|
|
$users[] = [
|
|
'name' => 'User ' . $i,
|
|
'email' => 'user_' . $i . '_' . Str::random(4) . '@example.com',
|
|
'legacy_id' => 'LEG-' . $i,
|
|
];
|
|
}
|
|
}
|
|
|
|
return $users;
|
|
}
|
|
|
|
public function validateUsers(array $users, array $simulationConfig = []): array
|
|
{
|
|
FaultSimulator::maybeApply($simulationConfig, 'validateUsers');
|
|
|
|
$validUsers = array_filter($users, function (array $user) {
|
|
if (empty($user['name'])) {
|
|
return false;
|
|
}
|
|
|
|
if (!filter_var($user['email'] ?? '', FILTER_VALIDATE_EMAIL)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
});
|
|
|
|
$validUsers = array_values($validUsers);
|
|
|
|
Log::info(sprintf(
|
|
'Validated users: %d valid out of %d total',
|
|
count($validUsers),
|
|
count($users)
|
|
));
|
|
|
|
return $validUsers;
|
|
}
|
|
|
|
public function createAccounts(array $users, array $simulationConfig = []): array
|
|
{
|
|
FaultSimulator::maybeApply($simulationConfig, 'createAccounts');
|
|
|
|
$created = 0;
|
|
$failed = 0;
|
|
$createdIds = [];
|
|
$errors = [];
|
|
|
|
foreach ($users as $index => $userData) {
|
|
Activity::heartbeat(sprintf('Creating account %d of %d', $index + 1, count($users)));
|
|
|
|
try {
|
|
$user = User::create([
|
|
'name' => $userData['name'],
|
|
'email' => $userData['email'],
|
|
'password' => Hash::make(Str::random(16)),
|
|
]);
|
|
|
|
$createdIds[] = $user->id;
|
|
$created++;
|
|
} catch (\Throwable $e) {
|
|
$failed++;
|
|
$errors[] = [
|
|
'email' => $userData['email'],
|
|
'error' => $e->getMessage(),
|
|
];
|
|
|
|
Log::warning(sprintf(
|
|
'Failed to create account for %s: %s',
|
|
$userData['email'],
|
|
$e->getMessage()
|
|
));
|
|
}
|
|
}
|
|
|
|
return [
|
|
'created' => $created,
|
|
'failed' => $failed,
|
|
'created_ids' => $createdIds,
|
|
'errors' => $errors,
|
|
'attempt' => Activity::getInfo()->attempt,
|
|
];
|
|
}
|
|
|
|
public function sendWelcomeEmails(array $userIds, array $simulationConfig = []): bool
|
|
{
|
|
FaultSimulator::maybeApply($simulationConfig, 'sendWelcomeEmails');
|
|
|
|
foreach ($userIds as $id) {
|
|
Log::info(sprintf('Sending welcome email to user ID: %s', $id));
|
|
usleep(50000);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function generateMigrationReport(int $totalUsers, int $processedUsers, int $failedUsers, array $simulationConfig = []): array
|
|
{
|
|
FaultSimulator::maybeApply($simulationConfig, 'generateMigrationReport');
|
|
|
|
$successRate = $totalUsers > 0
|
|
? round(($processedUsers / $totalUsers) * 100, 2)
|
|
: 0.0;
|
|
|
|
return [
|
|
'total_users' => $totalUsers,
|
|
'processed_users' => $processedUsers,
|
|
'failed_users' => $failedUsers,
|
|
'success_rate' => $successRate,
|
|
'timestamp' => now()->toIso8601String(),
|
|
];
|
|
}
|
|
}
|