127 lines
2.8 KiB
TypeScript
127 lines
2.8 KiB
TypeScript
import type { Role } from "./authTypes.ts";
|
|
|
|
export type AuthLevel = "public" | "optional" | "required";
|
|
|
|
export interface AuthRequirement {
|
|
level: AuthLevel;
|
|
roles?: Role[];
|
|
methods?: string[];
|
|
unauthorizedRedirect?: string;
|
|
}
|
|
|
|
export interface AuthRouteRule {
|
|
name: string;
|
|
pattern: RegExp;
|
|
requirement: AuthRequirement;
|
|
}
|
|
|
|
export const authRouteRules: AuthRouteRule[] = [
|
|
{
|
|
name: "auth",
|
|
pattern: /^\/auth(?:\/|$)/,
|
|
requirement: { level: "public" },
|
|
},
|
|
{
|
|
name: "health",
|
|
pattern: /^\/health$/,
|
|
requirement: { level: "public" },
|
|
},
|
|
{
|
|
name: "static",
|
|
pattern: /^\/(?:favicon\.ico|robots\.txt)$/,
|
|
requirement: { level: "public" },
|
|
},
|
|
{
|
|
name: "blob-audio",
|
|
pattern: /^\/api\/audio-blob\//,
|
|
requirement: { level: "public" },
|
|
},
|
|
{
|
|
name: "blob-image",
|
|
pattern: /^\/api\/image-blob\//,
|
|
requirement: { level: "public" },
|
|
},
|
|
{
|
|
name: "ai-image-file",
|
|
pattern: /^\/api\/ai-images\/file\//,
|
|
requirement: { level: "public" },
|
|
},
|
|
{
|
|
name: "onboarding-post",
|
|
pattern: /^\/onboarding\/?$/,
|
|
requirement: { level: "required", methods: ["POST"] },
|
|
},
|
|
{
|
|
name: "onboarding-get",
|
|
pattern: /^\/onboarding\/?$/,
|
|
requirement: { level: "optional", methods: ["GET"] },
|
|
},
|
|
{
|
|
name: "tenant-invite",
|
|
pattern: /^\/tenant\/invite\//,
|
|
requirement: { level: "optional", methods: ["GET", "POST"] },
|
|
},
|
|
{
|
|
name: "landlord-onboarding",
|
|
pattern: /^\/landlord\/onboarding(?:\/|$)/,
|
|
requirement: { level: "required" },
|
|
},
|
|
{
|
|
name: "admin",
|
|
pattern: /^\/admin(?:\/|$)/,
|
|
requirement: {
|
|
level: "required",
|
|
roles: ["admin"],
|
|
unauthorizedRedirect: "/unauthorized",
|
|
},
|
|
},
|
|
{
|
|
name: "landlord",
|
|
pattern: /^\/landlord(?:\/|$)/,
|
|
requirement: {
|
|
level: "required",
|
|
roles: ["landlord", "admin"],
|
|
unauthorizedRedirect: "/unauthorized",
|
|
},
|
|
},
|
|
{
|
|
name: "tenant",
|
|
pattern: /^\/tenant(?:\/|$)/,
|
|
requirement: {
|
|
level: "required",
|
|
roles: ["tenant", "admin"],
|
|
unauthorizedRedirect: "/unauthorized",
|
|
},
|
|
},
|
|
{
|
|
name: "calendar",
|
|
pattern: /^\/calendar(?:\/|$)/,
|
|
requirement: { level: "required" },
|
|
},
|
|
{
|
|
name: "user-profile",
|
|
pattern: /^\/user-profile(?:\/|$)/,
|
|
requirement: { level: "required" },
|
|
},
|
|
{
|
|
name: "resync",
|
|
pattern: /^\/resync(?:\/|$)/,
|
|
requirement: { level: "required" },
|
|
},
|
|
{
|
|
name: "api-tenant",
|
|
pattern: /^\/api\/tenant(?:\/|$)/,
|
|
requirement: { level: "required", roles: ["tenant", "admin"] },
|
|
},
|
|
{
|
|
name: "api-landlord",
|
|
pattern: /^\/api\/landlord(?:\/|$)/,
|
|
requirement: { level: "required", roles: ["landlord", "admin"] },
|
|
},
|
|
{
|
|
name: "api",
|
|
pattern: /^\/api(?:\/|$)/,
|
|
requirement: { level: "required" },
|
|
},
|
|
];
|