feat: clean URLs + fix addFileMeta silent failure

This commit is contained in:
Cedric Abonnel
2026-05-12 10:04:58 +02:00
parent 045e93cffd
commit 70fd55be6f
20 changed files with 314 additions and 206 deletions
+70 -25
View File
@@ -40,7 +40,7 @@ class ArticleManager
$articles[] = $article;
}
usort($articles, static fn ($a, $b) => strcmp($b['created_at'] ?? '', $a['created_at'] ?? ''));
usort($articles, static fn ($a, $b) => strcmp($b['published_at'] ?? '', $a['published_at'] ?? ''));
return $articles;
}
@@ -131,28 +131,33 @@ class ArticleManager
$slug = $slug !== '' ? $this->sanitizeSlug($slug) : $this->generateSlug($title);
$slug = $this->uniqueSlug($slug, $uuid);
// Snapshot de l'état courant avant écrasement
$revisions = $article['revisions'] ?? [];
$revDir = $this->dataDir . '/' . $uuid . '/revisions';
if (!is_dir($revDir)) {
mkdir($revDir, 0755, true);
}
$n = count($revisions) + 1;
$revFile = sprintf('%s/%04d.md', $revDir, $n);
file_put_contents($revFile, $article['content']);
// Snapshot de l'état courant avant écrasement — uniquement si le contenu ou le titre a changé
$revisions = $article['revisions'] ?? [];
$contentChanged = ltrim($content) !== ($article['content'] ?? '');
$titleChanged = $title !== ($article['title'] ?? '');
$revisions[] = [
'n' => $n,
'date' => date('Y-m-d H:i:s'),
'comment' => $revisionComment,
'title' => $article['title'],
];
if ($contentChanged || $titleChanged) {
$revDir = $this->dataDir . '/' . $uuid . '/revisions';
if (!is_dir($revDir)) {
mkdir($revDir, 0755, true);
}
$n = count($revisions) + 1;
$revFile = sprintf('%s/%04d.md', $revDir, $n);
file_put_contents($revFile, $article['content']);
// Limite à MAX_REVISIONS
if (count($revisions) > self::MAX_REVISIONS) {
$oldest = array_shift($revisions);
@unlink(sprintf('%s/%04d.md', $revDir, (int)($oldest['n'] ?? 0)));
}
$revisions[] = [
'n' => $n,
'date' => date('Y-m-d H:i:s'),
'comment' => $revisionComment,
'title' => $article['title'],
];
// Limite à MAX_REVISIONS
if (count($revisions) > self::MAX_REVISIONS) {
$oldest = array_shift($revisions);
@unlink(sprintf('%s/%04d.md', $revDir, (int)($oldest['n'] ?? 0)));
}
} // fin if ($contentChanged || $titleChanged)
$meta = [
'uuid' => $uuid,
@@ -211,10 +216,6 @@ class ArticleManager
return;
}
$filename = basename($filename);
$path = $this->dataDir . '/' . $uuid . '/files/' . $filename;
if (!file_exists($path)) {
return;
}
$raw = file_get_contents($this->dataDir . '/' . $uuid . '/meta.json');
if ($raw === false) {
@@ -774,6 +775,50 @@ class ArticleManager
return $meta;
}
public function deleteRevision(string $uuid, int $revN): void
{
if (!$this->isValidUuid($uuid) || $revN < 1) {
return;
}
$dir = $this->dataDir . '/' . $uuid;
$raw = @file_get_contents($dir . '/meta.json');
$meta = $raw !== false ? json_decode($raw, true) : null;
if (!is_array($meta)) {
return;
}
$revisions = $meta['revisions'] ?? [];
$newRevisions = [];
foreach ($revisions as $rev) {
if ((int)($rev['n'] ?? 0) === $revN) {
@unlink(sprintf('%s/revisions/%04d.md', $dir, $revN));
} else {
$newRevisions[] = $rev;
}
}
$meta['revisions'] = array_values($newRevisions);
$this->writeMeta($dir, $meta);
}
public function deleteAllRevisions(string $uuid): void
{
if (!$this->isValidUuid($uuid)) {
return;
}
$dir = $this->dataDir . '/' . $uuid;
$revDir = $dir . '/revisions';
if (is_dir($revDir)) {
foreach (glob($revDir . '/*.md') ?: [] as $f) {
@unlink($f);
}
}
$raw = @file_get_contents($dir . '/meta.json');
$meta = $raw !== false ? json_decode($raw, true) : null;
if (is_array($meta)) {
$meta['revisions'] = [];
$this->writeMeta($dir, $meta);
}
}
private function writeMeta(string $dir, array $meta): void
{
file_put_contents(