store userId in the json record and rehydrate the User via UserRepository. throws DomainException if the referenced user no longer exists.
129 lines
2.6 KiB
PHP
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;
|
|
}
|
|
}
|