154 lines
2.3 KiB
PHP
154 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace rosavox\helpers\storage;
|
|
|
|
require_once('helpers/storage-interface.php');
|
|
|
|
|
|
/**
|
|
*/
|
|
class class_jsonfile implements interface_/*<int,any>*/
|
|
{
|
|
|
|
/**
|
|
*/
|
|
private string $path;
|
|
|
|
|
|
/**
|
|
*/
|
|
private \Closure $id_encode;
|
|
|
|
|
|
/**
|
|
*/
|
|
private \Closure $id_decode;
|
|
|
|
|
|
/**
|
|
*/
|
|
public function __construct(
|
|
string $path,
|
|
\Closure $id_encode,
|
|
\Closure $id_decode
|
|
)
|
|
{
|
|
$this->path = $path;
|
|
$this->id_encode = $id_encode;
|
|
$this->id_decode = $id_decode;
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
private function get() : array
|
|
{
|
|
$content = (\file_exists($this->path) ? \file_get_contents($this->path) : null);
|
|
return (
|
|
($content === null)
|
|
?
|
|
['last_id' => 0, 'entries' => []]
|
|
:
|
|
\json_decode($content, true)
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
private function put(array $data) : void
|
|
{
|
|
$content = \json_encode($data, \JSON_PRETTY_PRINT);
|
|
\file_put_contents($this->path, $content);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
public function setup() : void
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
public function list_() : array
|
|
{
|
|
$data = $this->get();
|
|
return \array_map(
|
|
fn ($id_encoded) => [
|
|
'id' => ($this->id_decode)($id_encoded),
|
|
'value' => $data['entries'][$id_encoded],
|
|
],
|
|
\array_keys($data['entries'])
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
public function read($id)
|
|
{
|
|
$data = $this->get();
|
|
$id_encoded = ($this->id_encode)($id);
|
|
if (! \array_key_exists($id_encoded, $data['entries']))
|
|
{
|
|
throw (new \Exception('not found'));
|
|
}
|
|
else
|
|
{
|
|
return $data['entries'][$id_encoded];
|
|
}
|
|
}
|
|
|
|
public function create($value)
|
|
{
|
|
$data = $this->get();
|
|
$id = ($data['last_id'] + 1);
|
|
$id_encoded = ($this->id_encode)($id);
|
|
$data['last_id'] = $id;
|
|
$data['entries'][$id_encoded] = $value;
|
|
$this->put($data);
|
|
return $id;
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
public function update($id, $value) : void
|
|
{
|
|
$data = $this->get();
|
|
$id_encoded = ($this->id_encode)($id);
|
|
if (! \array_key_exists($id_encoded, $data['entries']))
|
|
{
|
|
throw (new \Exception('not found'));
|
|
}
|
|
else
|
|
{
|
|
$data['entries'][$id_encoded] = $value;
|
|
$this->put($data);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
public function delete($id) : void
|
|
{
|
|
$data = $this->get();
|
|
$id_encoded = ($this->id_encode)($id);
|
|
if (! \array_key_exists($id_encoded, $data['entries']))
|
|
{
|
|
throw (new \Exception('not found'));
|
|
}
|
|
else
|
|
{
|
|
unset($data['entries'][$id_encoded]);
|
|
$this->put($data);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
?>
|