Roles#

Role Types#

RoleSourceDescription
ownerusers.roleSystem admin, can access admin panel
memberusers.roleRegular user (default)

Backend Permission Check#

typescriptimport { requireAuth } from "@/middleware/auth"
import { sendError } from "@/shared/response"

router.get("/admin-data", requireAuth, async (req, res) => {
  if (req.user!.role !== "owner") {
    return sendError(res, 403, "Requires admin access")
  }
  // Admin logic
})

Frontend Menu Filtering#

Sidebar shows admin menu only for owner role:

tsxconst { user } = useUserStore()
const isOwner = user?.role === "owner"

{isOwner && <AdminMenu />}

Admin Management#

bashnpm run owner:set your@email.com     # Set owner
npm run owner:remove your@email.com  # Remove owner
npm run owner:list                   # List all owners

Admin Panel Pages#

Pages accessible to owner role (/owner/):

PageFunction
/owner/usersUser management (view, disable, change role)
/owner/productsProduct management (Stripe product sync)
/owner/pricesPrice management (Stripe price sync)
/owner/email-templatesEmail template editor
/owner/settingsSystem settings
/owner/valkeyCache management
/owner/envEnvironment variables viewer