Add module management system for enabling/disabling features

Stores can enable/disable feature modules from Settings. When disabled,
nav links are hidden and API routes return 403. Designed as the
foundation for future license-based gating (licensed + enabled flags).

Core modules (Accounts, Members, Users, Roles, Settings) are always on.

- module_config table with slug, name, description, licensed, enabled
- In-memory cache for fast per-request module checks
- requireModule middleware wraps route groups in main.ts
- Settings page Modules card with toggle switches
- Sidebar hides nav links for disabled modules
- Default modules seeded: inventory, pos, repairs, rentals, lessons,
  files, vault, email, reports
This commit is contained in:
Ryan Moon
2026-03-30 06:52:27 -05:00
parent 1f9297f533
commit e346e072b8
10 changed files with 294 additions and 13 deletions

View File

@@ -0,0 +1,28 @@
import { queryOptions } from '@tanstack/react-query'
import { api } from '@/lib/api-client'
export interface ModuleConfig {
id: string
slug: string
name: string
description: string | null
licensed: boolean
enabled: boolean
createdAt: string
updatedAt: string
}
export const moduleKeys = {
list: ['modules'] as const,
}
export function moduleListOptions() {
return queryOptions({
queryKey: moduleKeys.list,
queryFn: () => api.get<{ data: ModuleConfig[] }>('/v1/modules'),
})
}
export const moduleMutations = {
toggle: (slug: string, enabled: boolean) => api.patch<ModuleConfig>(`/v1/modules/${slug}`, { enabled }),
}