import { given } from "@nivinjoseph/n-defensive"; import { Claim } from "@nivinjoseph/n-sec"; import { Controller, type ControllerClass } from "../controller.js"; export const authorizeSymbol = Symbol.for("@nivinjoseph/n-web/authorize"); // public export function authorize(...claims: Array): ControllerAuthorizeDecorator { given(claims, "claims").ensureIsArray() .ensure(t => t.every(c => c instanceof Claim), "authorize decorator only takes Claim objects"); const decorator: ControllerAuthorizeDecorator = function (target, context) { given(context, "context") // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition .ensure(t => t.kind === "class", "authorize decorator should only be used on a class"); const className = context.name || ""; given(target, "target") .ensureHasValue() .ensure(t => t.prototype instanceof Controller, `class '${className}' decorated with authorize must extend Controller class`); context.metadata[authorizeSymbol] = claims; }; return decorator; } export type ControllerAuthorizeDecorator = ( target: ControllerClass, context: ClassDecoratorContext> ) => void;