Files
ladill-woo-manager/app/Services/Woo/DemoLoginReseeder.php
T
isaaccladandCursor 9744f0fe01
Deploy Ladill Woo Manager / deploy (push) Successful in 47s
Seed DemoWorld business and customer continuity for Woo Manager demos
Store site names now reference the DemoWorld business identity for the
active plan, and order customers use DemoWorld people (name, email,
phone) instead of generic "Demo Customer N" placeholders. Staff logins
skip the login reseed.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 13:43:07 +00:00

95 lines
2.6 KiB
PHP

<?php
namespace App\Services\Woo;
use App\Models\User;
use App\Support\DemoWorld;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
/**
* Reseed Woo Manager demo tenants after a fresh SSO login.
*
* Only owner demo accounts trigger a full reseed. Staff training logins
* share the owner tenant but never wipe mid-demo.
*/
class DemoLoginReseeder
{
public function maybeResetAfterLogin(User $user): void
{
if (! (bool) config('demo_accounts.enabled', false)
|| ! (bool) config('demo_accounts.reset_on_login', true)) {
return;
}
if (DemoWorld::isStaffDemoEmail($user->email)) {
return;
}
$plan = $this->planForEmail($user->email);
if ($plan === null) {
return;
}
$seedUser = $this->resolveSeedUser($user);
if (! $seedUser) {
return;
}
$lockKey = 'demo-reseed:woo:'.$seedUser->public_id;
if (! Cache::add($lockKey, 1, 120)) {
return;
}
$identity = (string) ($seedUser->email ?: $seedUser->public_id);
dispatch(function () use ($identity, $plan, $lockKey) {
try {
Artisan::call('demo:seed', [
'identity' => $identity,
'--plan' => $plan,
'--reset' => true,
]);
} catch (\Throwable $e) {
Log::warning('demo_woo_login_reseed_failed', [
'identity' => $identity,
'plan' => $plan,
'error' => $e->getMessage(),
]);
} finally {
Cache::forget($lockKey);
}
})->afterResponse();
}
private function planForEmail(?string $email): ?string
{
$email = strtolower(trim((string) $email));
if ($email === '') {
return null;
}
$accounts = (array) config('demo_accounts.accounts', []);
if (isset($accounts[$email])) {
return $accounts[$email];
}
$members = (array) config('demo_accounts.member_emails', []);
$ownerEmail = $members[$email] ?? null;
return $ownerEmail ? ($accounts[$ownerEmail] ?? null) : null;
}
private function resolveSeedUser(User $user): ?User
{
$email = strtolower((string) $user->email);
$ownerEmail = ((array) config('demo_accounts.member_emails', []))[$email] ?? null;
if (! $ownerEmail) {
return $user;
}
return User::query()->where('email', $ownerEmail)->first() ?? $user;
}
}