diff --git a/Sources/AdminPanel/Providers/AdminPanelProvider.swift b/Sources/AdminPanel/Providers/AdminPanelProvider.swift index 984c737..d7e15a9 100644 --- a/Sources/AdminPanel/Providers/AdminPanelProvider.swift +++ b/Sources/AdminPanel/Providers/AdminPanelProvider.swift @@ -137,7 +137,8 @@ public final class AdminPanelProvider: Provider { "adminpanel:sidebar:heading": SidebarHeadingTag(), "adminpanel:sidebar:menuitem": SidebarMenuItemTag(), "adminpanel:user": CurrentUserTag(), - "adminpanel:user:requireRole": RequireRoleTag() + "adminpanel:user:requireRole": RequireRoleTag(), + "adminpanel:user:roleAllows": RoleAllowsTag() ]) return .done(on: container) diff --git a/Sources/AdminPanel/Tags/RoleAllowsTag.swift b/Sources/AdminPanel/Tags/RoleAllowsTag.swift new file mode 100644 index 0000000..9dbda01 --- /dev/null +++ b/Sources/AdminPanel/Tags/RoleAllowsTag.swift @@ -0,0 +1,28 @@ +import Leaf +import Authentication +import Sugar + +public final class RoleAllowsTag: TagRenderer { + public func render(tag: TagContext) throws -> Future { + try tag.requireParameterCount(1) + + let container = try tag.container.make( + CurrentUserContainer.self + ) + + guard + let roleString: String = tag.parameters[0].string, + let requiredRole = U.Role.init(roleString) + else { + throw tag.error(reason: "Invalid role requirement") + } + + guard + let userRole = container.user?.role + else { + return tag.future(.bool(false)) + } + + return tag.future(.bool(userRole >= requiredRole)) + } +}