From 826ad8d7758ba91df64aa0d1af235bf8f183af91 Mon Sep 17 00:00:00 2001 From: alma Date: Sat, 3 May 2025 15:16:19 +0200 Subject: [PATCH] widget cache --- lib/redis.ts | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/lib/redis.ts b/lib/redis.ts index 80bd3825..d4254fe4 100644 --- a/lib/redis.ts +++ b/lib/redis.ts @@ -727,4 +727,60 @@ export async function invalidateMessagesCache( } catch (error) { console.error(`Error invalidating messages cache for user ${userId}:`, error); } -} \ No newline at end of file +} + +const hasRole = (requiredRole: string | string[] | undefined) => { + // Early returns for invalid cases + if (!requiredRole) { + console.log('No required role specified'); + return false; + } + + if (!session?.user?.role) { + console.log('No user roles found'); + return false; + } + + // Extract user roles and normalize them consistently + const userRoles = Array.isArray(session.user.role) ? session.user.role : [session.user.role]; + const cleanUserRoles = userRoles.map(role => typeof role === 'string' ? + role.replace(/^[\/]/, '') // Remove leading slash + .replace(/^ROLE_/, '') // Remove ROLE_ prefix + .replace(/^default-roles-[^/]*\//i, '') // Remove realm prefix + .toLowerCase() + : '').filter(Boolean); + + console.log('Debug roles:', { + rawUserRoles: session.user.role, + processedUserRoles: cleanUserRoles, + requiredRole + }); + + // Check against array of required roles + if (Array.isArray(requiredRole)) { + const cleanRequiredRoles = requiredRole.map(role => + typeof role === 'string' ? role.toLowerCase() : '' + ).filter(Boolean); + + console.log('Checking multiple roles:', { + requiredRoles: requiredRole, + cleanRequiredRoles, + userRoles: cleanUserRoles, + hasAnyRole: cleanRequiredRoles.some(role => cleanUserRoles.includes(role)) + }); + + return cleanRequiredRoles.some(role => cleanUserRoles.includes(role)); + } + + // Check against single required role + const cleanRequiredRole = typeof requiredRole === 'string' ? requiredRole.toLowerCase() : ''; + + console.log('Checking single role:', { + requiredRole, + cleanRequiredRole, + userRoles: cleanUserRoles, + hasRole: cleanUserRoles.includes(cleanRequiredRole) + }); + + return cleanUserRoles.includes(cleanRequiredRole); +}; \ No newline at end of file