refactor: suppression de la sauvegarde json (JsonExporter, data/)
This commit is contained in:
1 parent
56244d2e95
commit
7de8e4782b
8 files changed
+4
-48
No files matched your search
@@ -1,7 +1,6 @@
|
|||||||
.git
|
.git
|
||||||
*.sqlite
|
*.sqlite
|
||||||
*.sqlite-journal
|
*.sqlite-journal
|
||||||
data/*.json
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
data/*.json
|
|
||||||
*.sqlite
|
*.sqlite
|
||||||
*.sqlite-journal
|
*.sqlite-journal
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ API REST en PHP natif (POO) pour gérer des liens de vidéos YouTube.
|
|||||||
|
|
||||||
- PHP natif uniquement : aucun framework, aucune dépendance, aucun Composer
|
- PHP natif uniquement : aucun framework, aucune dépendance, aucun Composer
|
||||||
- Stockage SQLite via PDO
|
- Stockage SQLite via PDO
|
||||||
- À chaque création / modification / suppression, un snapshot complet de la table est écrit dans `data/data.json`
|
|
||||||
|
|
||||||
## Prérequis
|
## Prérequis
|
||||||
|
|
||||||
@@ -66,10 +65,6 @@ php database/migrate.php
|
|||||||
|
|
||||||
`title` et `link_url` sont obligatoires ; `description` et `thumbnail` sont optionnels. `link_url` doit être une URL valide et unique.
|
`title` et `link_url` sont obligatoires ; `description` et `thumbnail` sont optionnels. `link_url` doit être une URL valide et unique.
|
||||||
|
|
||||||
## Fichier `data/data.json`
|
|
||||||
|
|
||||||
Régénéré à chaque POST / PUT / DELETE : contient la liste complète des liens, formatée (pretty print).
|
|
||||||
|
|
||||||
## Tests manuels
|
## Tests manuels
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -94,7 +89,7 @@ docker compose down -v # supprime la base (reset complet)
|
|||||||
|
|
||||||
### Persistance
|
### Persistance
|
||||||
|
|
||||||
La base SQLite est stockée dans le Docker volume `db-data` et le fichier `data/data.json` dans le volume `data-data`. Ils survivent aux `down`/`up` successifs. Un `down -v` les supprime ; le prochain démarrage recrée la base via les migrations.
|
La base SQLite est stockée dans le Docker volume `db-data` : elle survit aux `down`/`up` successifs. Un `down -v` la supprime ; le prochain démarrage recrée la base via les migrations.
|
||||||
|
|
||||||
### Rebuild après modification du code
|
### Rebuild après modification du code
|
||||||
|
|
||||||
@@ -111,13 +106,11 @@ public/
|
|||||||
src/
|
src/
|
||||||
Database.php # connexion PDO SQLite + exécution des migrations
|
Database.php # connexion PDO SQLite + exécution des migrations
|
||||||
LinkRepository.php # CRUD SQL
|
LinkRepository.php # CRUD SQL
|
||||||
JsonExporter.php # écriture de data/data.json
|
|
||||||
LinkController.php # routage, validation, orchestration
|
LinkController.php # routage, validation, orchestration
|
||||||
database/
|
database/
|
||||||
migrate.php # runner de migrations (CLI)
|
migrate.php # runner de migrations (CLI)
|
||||||
migrations/ # fichiers SQL versionnés
|
migrations/ # fichiers SQL versionnés
|
||||||
data/ # data.json (volume Docker dédié)
|
|
||||||
Dockerfile # image PHP 8.4 Apache + mod_rewrite
|
Dockerfile # image PHP 8.4 Apache + mod_rewrite
|
||||||
docker-compose.yml # service web + volumes db-data et data-data
|
docker-compose.yml # service web + volume db-data
|
||||||
.dockerignore
|
.dockerignore
|
||||||
```
|
```
|
||||||
+1
-3
@@ -8,8 +8,6 @@ services:
|
|||||||
- "8000:80"
|
- "8000:80"
|
||||||
volumes:
|
volumes:
|
||||||
- db-data:/var/www/html/database
|
- db-data:/var/www/html/database
|
||||||
- data-data:/var/www/html/data
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
db-data:
|
db-data:
|
||||||
data-data:
|
|
||||||
@@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
require_once __DIR__ . '/../src/Database.php';
|
require_once __DIR__ . '/../src/Database.php';
|
||||||
require_once __DIR__ . '/../src/LinkRepository.php';
|
require_once __DIR__ . '/../src/LinkRepository.php';
|
||||||
require_once __DIR__ . '/../src/JsonExporter.php';
|
|
||||||
require_once __DIR__ . '/../src/LinkController.php';
|
require_once __DIR__ . '/../src/LinkController.php';
|
||||||
|
|
||||||
header('Content-Type: application/json; charset=utf-8');
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
@@ -22,7 +21,6 @@ try {
|
|||||||
|
|
||||||
$controller = new LinkController(
|
$controller = new LinkController(
|
||||||
new LinkRepository($pdo),
|
new LinkRepository($pdo),
|
||||||
new JsonExporter($pdo, dirname(__DIR__) . '/data/data.json'),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
final class JsonExporter
|
|
||||||
{
|
|
||||||
private PDO $pdo;
|
|
||||||
private string $filePath;
|
|
||||||
|
|
||||||
public function __construct(PDO $pdo, string $filePath)
|
|
||||||
{
|
|
||||||
$this->pdo = $pdo;
|
|
||||||
$this->filePath = $filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function export(): void
|
|
||||||
{
|
|
||||||
$links = $this->pdo->query('SELECT * FROM links ORDER BY id DESC')->fetchAll();
|
|
||||||
|
|
||||||
$json = json_encode($links, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
|
||||||
|
|
||||||
file_put_contents($this->filePath, $json . PHP_EOL, LOCK_EX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,6 @@ final class LinkController
|
|||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private readonly LinkRepository $repository,
|
private readonly LinkRepository $repository,
|
||||||
private readonly JsonExporter $exporter,
|
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +79,6 @@ final class LinkController
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->exporter->export();
|
|
||||||
$this->json($this->repository->find($id), 201);
|
$this->json($this->repository->find($id), 201);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +113,6 @@ final class LinkController
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->exporter->export();
|
|
||||||
$this->json($this->repository->find($id));
|
$this->json($this->repository->find($id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +125,6 @@ final class LinkController
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->repository->delete($id);
|
$this->repository->delete($id);
|
||||||
$this->exporter->export();
|
|
||||||
http_response_code(204);
|
http_response_code(204);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -34,7 +34,4 @@ echo "== GET /links/999 (introuvable -> 404) =="
|
|||||||
curl -s -w "\n[%{http_code}]\n" "$URL/999"
|
curl -s -w "\n[%{http_code}]\n" "$URL/999"
|
||||||
|
|
||||||
echo "== DELETE /links/1 (suppression) =="
|
echo "== DELETE /links/1 (suppression) =="
|
||||||
curl -s -w "\n[%{http_code}]\n" -X DELETE "$URL/1"
|
curl -s -w "\n[%{http_code}]\n" -X DELETE "$URL/1"
|
||||||
|
|
||||||
echo "== data.json =="
|
|
||||||
cat data/data.json
|
|
||||||
Reference in new issue
Block a user