From 86d94fa833c7f96a4cf89e21b3499cfd54f21e78 Mon Sep 17 00:00:00 2001 From: Rasmus Ebbesen Date: Mon, 27 Aug 2018 12:45:18 +0200 Subject: [PATCH 1/2] added tag for boolean evaluation of user role --- .../Providers/AdminPanelProvider.swift | 3 +- Sources/AdminPanel/Tags/RoleAllowsTag.swift | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Sources/AdminPanel/Tags/RoleAllowsTag.swift diff --git a/Sources/AdminPanel/Providers/AdminPanelProvider.swift b/Sources/AdminPanel/Providers/AdminPanelProvider.swift index d2e196e..d071fce 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": UserTag(), - "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..7245a13 --- /dev/null +++ b/Sources/AdminPanel/Tags/RoleAllowsTag.swift @@ -0,0 +1,33 @@ +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") + } + + return tag.future() + .map(to: TemplateData.self) { _ in + // User is either not logged in or not allowed to see content + guard + let userRole = container.user?.role + else { + return TemplateData.bool(false) + } + + return TemplateData.bool(userRole >= requiredRole) + } + + } +} From a4baac567955fa054868fadc0f97a55a5b144454 Mon Sep 17 00:00:00 2001 From: Rasmus Ebbesen Date: Mon, 27 Aug 2018 12:57:08 +0200 Subject: [PATCH 2/2] simplified the role allows tag logit --- Sources/AdminPanel/Tags/RoleAllowsTag.swift | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Sources/AdminPanel/Tags/RoleAllowsTag.swift b/Sources/AdminPanel/Tags/RoleAllowsTag.swift index 7245a13..9dbda01 100644 --- a/Sources/AdminPanel/Tags/RoleAllowsTag.swift +++ b/Sources/AdminPanel/Tags/RoleAllowsTag.swift @@ -16,18 +16,13 @@ public final class RoleAllowsTag: TagRenderer { else { throw tag.error(reason: "Invalid role requirement") } - - return tag.future() - .map(to: TemplateData.self) { _ in - // User is either not logged in or not allowed to see content - guard - let userRole = container.user?.role - else { - return TemplateData.bool(false) - } - - return TemplateData.bool(userRole >= requiredRole) + + guard + let userRole = container.user?.role + else { + return tag.future(.bool(false)) } + return tag.future(.bool(userRole >= requiredRole)) } }