feat: clean URLs + fix addFileMeta silent failure
This commit is contained in:
+70
-25
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user