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
This commit is contained in:
2025-10-05 11:05:04 +02:00
parent 887847dde6
commit 5050c7d73a
36686 changed files with 196456 additions and 12398919 deletions

View File

@@ -0,0 +1,112 @@
<?php
declare(strict_types=1);
namespace App\Domain\SmartLink\ValueObjects;
final readonly class LinkSettings
{
public function __construct(
public bool $trackClicks,
public bool $enableGeoRouting,
public bool $showPreview,
public ?string $customDomain,
public ?int $clickLimit,
public ?string $password
) {}
public static function default(): self
{
return new self(
trackClicks: true,
enableGeoRouting: true,
showPreview: true,
customDomain: null,
clickLimit: null,
password: null
);
}
public function withClickTracking(bool $enabled): self
{
return new self(
trackClicks: $enabled,
enableGeoRouting: $this->enableGeoRouting,
showPreview: $this->showPreview,
customDomain: $this->customDomain,
clickLimit: $this->clickLimit,
password: $this->password
);
}
public function withGeoRouting(bool $enabled): self
{
return new self(
trackClicks: $this->trackClicks,
enableGeoRouting: $enabled,
showPreview: $this->showPreview,
customDomain: $this->customDomain,
clickLimit: $this->clickLimit,
password: $this->password
);
}
public function withClickLimit(?int $limit): self
{
return new self(
trackClicks: $this->trackClicks,
enableGeoRouting: $this->enableGeoRouting,
showPreview: $this->showPreview,
customDomain: $this->customDomain,
clickLimit: $limit,
password: $this->password
);
}
public function withPassword(?string $password): self
{
return new self(
trackClicks: $this->trackClicks,
enableGeoRouting: $this->enableGeoRouting,
showPreview: $this->showPreview,
customDomain: $this->customDomain,
clickLimit: $this->clickLimit,
password: $password ? password_hash($password, PASSWORD_BCRYPT) : null
);
}
public function isPasswordProtected(): bool
{
return $this->password !== null;
}
public function verifyPassword(string $password): bool
{
if (!$this->isPasswordProtected()) {
return true;
}
return password_verify($password, $this->password);
}
public function hasClickLimitReached(int $currentClicks): bool
{
if ($this->clickLimit === null) {
return false;
}
return $currentClicks >= $this->clickLimit;
}
public function toArray(): array
{
return [
'track_clicks' => $this->trackClicks,
'enable_geo_routing' => $this->enableGeoRouting,
'show_preview' => $this->showPreview,
'custom_domain' => $this->customDomain,
'click_limit' => $this->clickLimit,
'has_password' => $this->isPasswordProtected(),
];
}
}