feat : audit log (table + writer + listener + API + admin UI + timeline) #9

Merged
matthieu merged 38 commits from feat/audit-log into develop 2026-05-13 08:29:31 +00:00
2 changed files with 26 additions and 7 deletions
Showing only changes of commit fa8e46471d - Show all commits
+12 -4
View File
@@ -2,14 +2,23 @@
* Composable de lecture des modules actifs (source : `/api/modules`). * Composable de lecture des modules actifs (source : `/api/modules`).
* *
* State singleton au niveau module : `useSidebar` suit la meme convention. * State singleton au niveau module : `useSidebar` suit la meme convention.
* Chargement idempotent via le flag `loaded`, reset explicite au logout * Chargement idempotent via le flag `loaded`, reset automatique au logout
* (voir pages/logout.vue). * via `onAuthSessionCleared` (cf. CLAUDE.md : « composables avec state
* singleton doivent etre reinitialises au logout »).
*/ */
import { ref } from 'vue' import { ref } from 'vue'
import { onAuthSessionCleared } from '~/shared/stores/auth'
const activeModuleIds = ref<string[]>([]) const activeModuleIds = ref<string[]>([])
const loaded = ref(false) const loaded = ref(false)
function resetModulesState(): void {
activeModuleIds.value = []
loaded.value = false
}
onAuthSessionCleared(resetModulesState)
export function useModules() { export function useModules() {
async function loadModules() { async function loadModules() {
try { try {
@@ -35,8 +44,7 @@ export function useModules() {
} }
function resetModules() { function resetModules() {
activeModuleIds.value = [] resetModulesState()
loaded.value = false
} }
return { return {
+14 -3
View File
@@ -1,10 +1,23 @@
import { ref } from 'vue' import { ref } from 'vue'
import type { SidebarSection } from '~/shared/types' import type { SidebarSection } from '~/shared/types'
import { onAuthSessionCleared } from '~/shared/stores/auth'
const sections = ref<SidebarSection[]>([]) const sections = ref<SidebarSection[]>([])
const disabledRoutes = ref<string[]>([]) const disabledRoutes = ref<string[]>([])
const loaded = ref(false) const loaded = ref(false)
function resetSidebarState(): void {
sections.value = []
disabledRoutes.value = []
loaded.value = false
}
// Auto-enregistrement singleton : purge la sidebar sur 401/logout pour
// eviter qu'un nouvel utilisateur logue sur le meme onglet voie transitoirement
// les items de l'ancienne session (cf. CLAUDE.md : « composables avec state
// singleton doivent etre reinitialises au logout »).
onAuthSessionCleared(resetSidebarState)
export function useSidebar() { export function useSidebar() {
async function loadSidebar() { async function loadSidebar() {
try { try {
@@ -31,9 +44,7 @@ export function useSidebar() {
} }
function resetSidebar() { function resetSidebar() {
sections.value = [] resetSidebarState()
disabledRoutes.value = []
loaded.value = false
} }
return { return {