Files
temporalio-test/app/Temporal/UserMigration/UserMigrationActivity.php
2026-05-09 01:18:51 +02:00

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(),
];
}
}