Goal-Calibration/app/Text/JsonTextRepository.php
Yisroel Baum 4635fef3c7
persist user id in json text repository
store userId in the json record and rehydrate the User via
UserRepository. throws DomainException if the referenced user
no longer exists.
2026-05-02 21:27:40 +03:00

129 lines
2.6 KiB
PHP

<?php
namespace App\Text;
use App\Text\Text;
use App\Text\CreateTextDto;
use App\Text\TextRepository;
use App\User\UserRepository;
use DomainException;
class JsonTextRepository implements TextRepository
{
private string $filePath;
public function __construct(
private UserRepository $userRepo,
) {
$this->filePath = __DIR__ . '/../../data/texts.json';
}
public function create(CreateTextDto $dto): Text
{
$texts = $this->readTexts();
$id = $this->getNextId($texts);
$text = new Text(
id: $id,
name: $dto->name,
user: $dto->user,
);
$texts[] = [
'id' => $id,
'name' => $dto->name,
'userId' => $dto->user->getId(),
];
$this->writeTexts($texts);
return $text;
}
public function find(int $id): ?Text
{
$texts = $this->readTexts();
foreach ($texts as $data) {
if ($data['id'] === $id) {
return $this->hydrate($data);
}
}
return null;
}
/**
* @return Text[]
*/
public function getAll(): array
{
$texts = $this->readTexts();
return array_map(
function (array $data) {
return $this->hydrate($data);
},
$texts
);
}
private function hydrate(array $data): Text
{
$user = $this->userRepo->find($data['userId']);
if ($user === null) {
throw new DomainException(
"User with id: {$data['userId']} doesnt exist"
);
}
return new Text(
id: $data['id'],
name: $data['name'],
user: $user,
);
}
/**
* @return array
*/
private function readTexts(): array
{
if (!file_exists($this->filePath)) {
return [];
}
$content = file_get_contents($this->filePath);
return json_decode($content, true) ?? [];
}
/**
* @param array $texts
*/
private function writeTexts(array $texts): void
{
file_put_contents(
$this->filePath,
json_encode($texts, JSON_PRETTY_PRINT)
);
}
/**
* @param array $texts
*/
private function getNextId(array $texts): int
{
if (empty($texts)) {
return 1;
}
$maxId = 0;
foreach ($texts as $text) {
if ($text['id'] > $maxId) {
$maxId = $text['id'];
}
}
return $maxId + 1;
}
}