Files
michaelschiemer/src/Framework/MagicLinks/Actions/PasswordResetAction.php
Michael Schiemer 5050c7d73a docs: consolidate documentation into organized structure
- Move 12 markdown files from root to docs/ subdirectories
- Organize documentation by category:
  • docs/troubleshooting/ (1 file)  - Technical troubleshooting guides
  • docs/deployment/      (4 files) - Deployment and security documentation
  • docs/guides/          (3 files) - Feature-specific guides
  • docs/planning/        (4 files) - Planning and improvement proposals

Root directory cleanup:
- Reduced from 16 to 4 markdown files in root
- Only essential project files remain:
  • CLAUDE.md (AI instructions)
  • README.md (Main project readme)
  • CLEANUP_PLAN.md (Current cleanup plan)
  • SRC_STRUCTURE_IMPROVEMENTS.md (Structure improvements)

This improves:
 Documentation discoverability
 Logical organization by purpose
 Clean root directory
 Better maintainability
2025-10-05 11:05:04 +02:00

62 lines
1.8 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Framework\MagicLinks\Actions;
use App\Framework\Http\ValueObjects\IpPatternCollection;
use App\Framework\MagicLinks\MagicLinkData;
use App\Framework\MagicLinks\TokenConfig;
use App\Framework\MagicLinks\ValueObjects\ActionResultData;
use App\Framework\MagicLinks\ValueObjects\Metadata;
final readonly class PasswordResetAction implements MagicLinkAction
{
public function getName(): string
{
return 'password_reset';
}
public function getDefaultConfig(): TokenConfig
{
return new TokenConfig(
expiryHours: 1, // Short expiry for security
oneTimeUse: true,
maxUses: 1,
requireSecureContext: true,
allowedIpRanges: IpPatternCollection::empty(),
metadata: Metadata::empty()
);
}
public function validatePayload(array $payload): bool
{
return ! empty($payload['user_id']) &&
! empty($payload['email']) &&
filter_var($payload['email'], FILTER_VALIDATE_EMAIL);
}
public function execute(MagicLinkData $magiclinkData, array $context = []): ActionResult
{
$payload = $magiclinkData->payload;
// Password reset form would be shown here
// Return data needed for the password reset form
return ActionResult::success(
message: "Password reset form ready",
data: ActionResultData::fromArray([
'user_id' => $payload->get('user_id'),
'email' => $payload->get('email'),
'form_action' => '/password/reset/submit',
'csrf_token' => $context['csrf_token'] ?? null,
])
);
}
public function getRequiredPermissions(): array
{
return [];
}
}