fix(edge-fn): replace getClaims with adminClient.auth.getUser(token)

fix(edge-fn): use user.id instead of claims.sub; fixes 500s and false cert_required
fix(migrations): drop broad reservations SELECT policy; add reservation_slots view with security_invoker=false
fix(tests): correct weekSlot() keys from start/end to start_time/end_time
fix(tests): spread overlap test slots across separate ISO weeks
fix(tests): update e2e assertion to match actual authenticated home text
fix(app): hide IonMenu before user is authenticated
feat(dx): add test:all script running unit, integration, and e2e in sequence
docs(claude-md): document SELinux fix, Edge Function auth pattern, security_invoker behaviour
This commit is contained in:
2026-04-20 14:32:37 -04:00
parent d07a02c9dc
commit 108c042921
33 changed files with 2745 additions and 12 deletions

View File

@@ -1,6 +1,7 @@
<template>
<IonApp>
<IonMenu content-id="main-content" menu-id="main-menu">
<IonSplitPane content-id="main-content">
<IonMenu v-if="authStore.user" content-id="main-content" menu-id="main-menu">
<IonHeader>
<IonToolbar color="primary">
<IonTitle>OYS Borrow a Boat</IonTitle>
@@ -35,9 +36,13 @@
<IonItemDivider>
<IonLabel>Management</IonLabel>
</IonItemDivider>
<IonItem button router-link="/schedule/manage" router-direction="root" @click="closeMenu">
<IonItem button router-link="/admin/intervals" router-direction="root" @click="closeMenu">
<IonIcon slot="start" :icon="calendarNumberOutline" />
<IonLabel>Manage Schedule</IonLabel>
<IonLabel>Manage Slots</IonLabel>
</IonItem>
<IonItem button router-link="/admin/templates" router-direction="root" @click="closeMenu">
<IonIcon slot="start" :icon="layersOutline" />
<IonLabel>Templates</IonLabel>
</IonItem>
</template>
@@ -51,6 +56,10 @@
<IonIcon slot="start" :icon="constructOutline" />
<IonLabel>Manage Boats</IonLabel>
</IonItem>
<IonItem button router-link="/admin/config" router-direction="root" @click="closeMenu">
<IonIcon slot="start" :icon="settingsOutline" />
<IonLabel>Booking Rules</IonLabel>
</IonItem>
</template>
<!-- Sign out -->
@@ -65,18 +74,20 @@
</IonMenu>
<IonRouterOutlet id="main-content" />
</IonSplitPane>
</IonApp>
</template>
<script setup lang="ts">
import {
IonApp, IonMenu, IonHeader, IonToolbar, IonTitle,
IonApp, IonSplitPane, IonMenu, IonHeader, IonToolbar, IonTitle,
IonContent, IonList, IonItem, IonItemDivider, IonIcon, IonLabel, IonNote,
IonRouterOutlet, menuController,
} from '@ionic/vue'
import {
homeOutline, calendarOutline, boatOutline, personOutline,
bookOutline, calendarNumberOutline, peopleOutline, constructOutline, logOutOutline,
layersOutline, settingsOutline,
} from 'ionicons/icons'
import { useAuthStore } from '~/stores/auth'