cleaning hard 2

This commit is contained in:
alma 2025-05-03 12:05:44 +02:00
parent 4046e03261
commit 4c9c01c531
6 changed files with 146 additions and 4 deletions

61
lib/keycloak.ts Normal file
View File

@ -0,0 +1,61 @@
import KcAdminClient from '@keycloak/keycloak-admin-client';
import { Credentials } from '@keycloak/keycloak-admin-client/lib/utils/auth';
// Cache the KC admin client to avoid multiple initializations
let kcAdminClient: KcAdminClient | null = null;
/**
* Returns a configured Keycloak admin client instance
*/
export async function getKeycloakAdminClient(): Promise<KcAdminClient> {
// If we already have a client initialized, return it
if (kcAdminClient) {
try {
// Try to refresh the token before returning
await kcAdminClient.auth({
grantType: 'refresh_token',
refreshToken: kcAdminClient.refreshToken
});
return kcAdminClient;
} catch (error) {
// Token refresh failed, initialize a new client
console.log('Token refresh failed, initializing new Keycloak admin client');
kcAdminClient = null;
}
}
// Initialize a new client
kcAdminClient = new KcAdminClient({
baseUrl: process.env.KEYCLOAK_URL || process.env.NEXT_PUBLIC_KEYCLOAK_ISSUER?.replace('/realms/cercle', '') || '',
realmName: process.env.KEYCLOAK_REALM || 'cercle',
});
// Authenticate the client
await kcAdminClient.auth({
grantType: 'client_credentials',
clientId: process.env.KEYCLOAK_ADMIN_CLIENT_ID || process.env.KEYCLOAK_CLIENT_ID || '',
clientSecret: process.env.KEYCLOAK_ADMIN_CLIENT_SECRET || process.env.KEYCLOAK_CLIENT_SECRET || '',
} as Credentials);
return kcAdminClient;
}
/**
* Get a list of users from Keycloak with optional search parameters
*/
export async function getKeycloakUsers(search?: string, first?: number, max?: number) {
const client = await getKeycloakAdminClient();
return client.users.find({
search,
first,
max,
});
}
/**
* Get a specific user from Keycloak by ID
*/
export async function getKeycloakUser(userId: string) {
const client = await getKeycloakAdminClient();
return client.users.findOne({ id: userId });
}

View File

@ -43,10 +43,6 @@ const nextConfig = {
compress: true, compress: true,
// Enable production source maps for better performance debugging // Enable production source maps for better performance debugging
productionBrowserSourceMaps: false, productionBrowserSourceMaps: false,
// Optimize fonts
optimizeFonts: true,
// Enable React strict mode for better development experience
reactStrictMode: true,
// Reduce build output size // Reduce build output size
poweredByHeader: false, poweredByHeader: false,
// Add cache headers to immutable assets // Add cache headers to immutable assets

32
node_modules/.package-lock.json generated vendored
View File

@ -426,6 +426,20 @@
"@jridgewell/sourcemap-codec": "^1.4.14" "@jridgewell/sourcemap-codec": "^1.4.14"
} }
}, },
"node_modules/@keycloak/keycloak-admin-client": {
"version": "26.2.2",
"resolved": "https://registry.npmjs.org/@keycloak/keycloak-admin-client/-/keycloak-admin-client-26.2.2.tgz",
"integrity": "sha512-H0U3jjkXRHR0zU9xVcv5+GzWpDCAEab4NHKCbilVZSjrSLzqbGLMTEiGAo81NpHilseTiFpzEkz2qFm6/Hm0BA==",
"license": "Apache-2.0",
"dependencies": {
"camelize-ts": "^3.0.0",
"url-join": "^5.0.0",
"url-template": "^3.1.1"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@next/bundle-analyzer": { "node_modules/@next/bundle-analyzer": {
"version": "15.3.1", "version": "15.3.1",
"resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.3.1.tgz", "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.3.1.tgz",
@ -2952,6 +2966,15 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/camelize-ts": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelize-ts/-/camelize-ts-3.0.0.tgz",
"integrity": "sha512-cgRwKKavoDKLTjO4FQTs3dRBePZp/2Y9Xpud0FhuCOTE86M2cniKN4CCXgRnsyXNMmQMifVHcv6SPaMtTx6ofQ==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001692", "version": "1.0.30001692",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
@ -7106,6 +7129,15 @@
"requires-port": "^1.0.0" "requires-port": "^1.0.0"
} }
}, },
"node_modules/url-template": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/url-template/-/url-template-3.1.1.tgz",
"integrity": "sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==",
"license": "BSD-3-Clause",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/use-callback-ref": { "node_modules/use-callback-ref": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",

33
package-lock.json generated
View File

@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"@fullcalendar/react": "^6.1.15", "@fullcalendar/react": "^6.1.15",
"@hookform/resolvers": "^3.9.1", "@hookform/resolvers": "^3.9.1",
"@keycloak/keycloak-admin-client": "^26.2.2",
"@nextcloud/files": "^2.1.0", "@nextcloud/files": "^2.1.0",
"@prisma/client": "^6.4.1", "@prisma/client": "^6.4.1",
"@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-accordion": "^1.2.2",
@ -1292,6 +1293,20 @@
"@jridgewell/sourcemap-codec": "^1.4.14" "@jridgewell/sourcemap-codec": "^1.4.14"
} }
}, },
"node_modules/@keycloak/keycloak-admin-client": {
"version": "26.2.2",
"resolved": "https://registry.npmjs.org/@keycloak/keycloak-admin-client/-/keycloak-admin-client-26.2.2.tgz",
"integrity": "sha512-H0U3jjkXRHR0zU9xVcv5+GzWpDCAEab4NHKCbilVZSjrSLzqbGLMTEiGAo81NpHilseTiFpzEkz2qFm6/Hm0BA==",
"license": "Apache-2.0",
"dependencies": {
"camelize-ts": "^3.0.0",
"url-join": "^5.0.0",
"url-template": "^3.1.1"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@next/bundle-analyzer": { "node_modules/@next/bundle-analyzer": {
"version": "15.3.1", "version": "15.3.1",
"resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.3.1.tgz", "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.3.1.tgz",
@ -3930,6 +3945,15 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/camelize-ts": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelize-ts/-/camelize-ts-3.0.0.tgz",
"integrity": "sha512-cgRwKKavoDKLTjO4FQTs3dRBePZp/2Y9Xpud0FhuCOTE86M2cniKN4CCXgRnsyXNMmQMifVHcv6SPaMtTx6ofQ==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001692", "version": "1.0.30001692",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
@ -8084,6 +8108,15 @@
"requires-port": "^1.0.0" "requires-port": "^1.0.0"
} }
}, },
"node_modules/url-template": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/url-template/-/url-template-3.1.1.tgz",
"integrity": "sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==",
"license": "BSD-3-Clause",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/use-callback-ref": { "node_modules/use-callback-ref": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",

View File

@ -11,6 +11,7 @@
"dependencies": { "dependencies": {
"@fullcalendar/react": "^6.1.15", "@fullcalendar/react": "^6.1.15",
"@hookform/resolvers": "^3.9.1", "@hookform/resolvers": "^3.9.1",
"@keycloak/keycloak-admin-client": "^26.2.2",
"@nextcloud/files": "^2.1.0", "@nextcloud/files": "^2.1.0",
"@prisma/client": "^6.4.1", "@prisma/client": "^6.4.1",
"@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-accordion": "^1.2.2",

View File

@ -222,6 +222,15 @@
"@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14" "@jridgewell/sourcemap-codec" "^1.4.14"
"@keycloak/keycloak-admin-client@^26.2.2":
version "26.2.2"
resolved "https://registry.npmjs.org/@keycloak/keycloak-admin-client/-/keycloak-admin-client-26.2.2.tgz"
integrity sha512-H0U3jjkXRHR0zU9xVcv5+GzWpDCAEab4NHKCbilVZSjrSLzqbGLMTEiGAo81NpHilseTiFpzEkz2qFm6/Hm0BA==
dependencies:
camelize-ts "^3.0.0"
url-join "^5.0.0"
url-template "^3.1.1"
"@next/bundle-analyzer@^15.3.1": "@next/bundle-analyzer@^15.3.1":
version "15.3.1" version "15.3.1"
resolved "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.3.1.tgz" resolved "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.3.1.tgz"
@ -1432,6 +1441,11 @@ camelcase-css@^2.0.1:
resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
camelize-ts@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/camelize-ts/-/camelize-ts-3.0.0.tgz"
integrity sha512-cgRwKKavoDKLTjO4FQTs3dRBePZp/2Y9Xpud0FhuCOTE86M2cniKN4CCXgRnsyXNMmQMifVHcv6SPaMtTx6ofQ==
caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688:
version "1.0.30001692" version "1.0.30001692"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz"
@ -3914,6 +3928,11 @@ url-parse@^1.5.10:
querystringify "^2.1.1" querystringify "^2.1.1"
requires-port "^1.0.0" requires-port "^1.0.0"
url-template@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/url-template/-/url-template-3.1.1.tgz"
integrity sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==
use-callback-ref@^1.3.3: use-callback-ref@^1.3.3:
version "1.3.3" version "1.3.3"
resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz" resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz"