Ajout du système de cache pour les notifications
Problème : Les notifications étaient collectées à chaque requête sur projects.json, causant des problèmes de performance et de mémoire. Solution : Mise en cache des notifications par projet et par utilisateur - Nouvelle méthode getNotificationsLight() dans ProjectPage avec cache - Cache invalidé automatiquement via les hooks existants (page/file update) - Cache par utilisateur pour inclure le isRead spécifique Performance : Les notifications sont calculées une fois puis servies depuis le cache jusqu'à ce qu'un changement survienne (commentaire, brief, etc.) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
e73e25b1da
commit
bb71da081b
3 changed files with 62 additions and 20 deletions
|
|
@ -3,18 +3,62 @@
|
|||
use adrienpayet\notifications\NotificationsPage;
|
||||
|
||||
class ProjectPage extends NotificationsPage {
|
||||
public function getSteps() {
|
||||
public function getSteps() {
|
||||
$apiCache = kirby()->cache('api');
|
||||
$stepsData = $apiCache?->get($this->slug() . '_' . 'steps');
|
||||
|
||||
$stepsData = $apiCache?->get($this->slug() . '_' . 'steps');
|
||||
|
||||
if ($stepsData === null || count($stepsData) === 0) {
|
||||
$this->rebuildStepsCache();
|
||||
};
|
||||
|
||||
$stepsData = $apiCache->get($this->slug() . '_' . 'steps');
|
||||
|
||||
$stepsData = $apiCache->get($this->slug() . '_' . 'steps');
|
||||
|
||||
return $stepsData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère les notifications pour ce projet (version allégée avec cache).
|
||||
* Cache par utilisateur pour inclure le isRead.
|
||||
*/
|
||||
public function getNotificationsLight($user) {
|
||||
if (!$user) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$apiCache = kirby()->cache('api');
|
||||
$cacheKey = $this->slug() . '_notifications_' . $user->uuid();
|
||||
$notifications = $apiCache?->get($cacheKey);
|
||||
|
||||
// Si pas en cache, collecter et cacher
|
||||
if ($notifications === null) {
|
||||
$collector = kirby()->option('adrienpayet.pdc-notifications.collector');
|
||||
if (!$collector) {
|
||||
return [];
|
||||
}
|
||||
|
||||
try {
|
||||
$notifications = $collector->collectLight($this, $user);
|
||||
$apiCache->set($cacheKey, $notifications);
|
||||
} catch (\Throwable $e) {
|
||||
error_log("Error caching notifications for {$this->slug()}: " . $e->getMessage());
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
return $notifications;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalide le cache des notifications de ce projet pour tous les utilisateurs.
|
||||
*/
|
||||
public function invalidateNotificationsCache() {
|
||||
$apiCache = kirby()->cache('api');
|
||||
// Invalider pour tous les users
|
||||
foreach (kirby()->users() as $user) {
|
||||
$cacheKey = $this->slug() . '_notifications_' . $user->uuid();
|
||||
$apiCache->remove($cacheKey);
|
||||
}
|
||||
}
|
||||
|
||||
public function rebuildStepsCache() {
|
||||
// Create steps
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue