diff --git a/web_services/client_frontend/src/apifetchers/api-fetcher.ts b/web_services/client_frontend/src/apifetchers/api-fetcher.ts index 1c71416..1cf70d2 100644 --- a/web_services/client_frontend/src/apifetchers/api-fetcher.ts +++ b/web_services/client_frontend/src/apifetchers/api-fetcher.ts @@ -44,10 +44,7 @@ async function coreFetch( const { method = "POST", cache = false, timeout = DEFAULT_TIMEOUT } = options; try { - // Setup controller for timeout handling const controller = new AbortController(); - - // Prepare fetch options const fetchOptions: RequestInit = { method, headers, @@ -55,26 +52,17 @@ async function coreFetch( signal: controller.signal, }; - // Add body for non-GET requests with payload if (method !== "GET" && payload) { fetchOptions.body = JSON.stringify( payload.payload ? payload.payload : payload ); } - - // Create timeout promise const timeoutPromise = createTimeoutPromise(timeout, controller); - - // Execute request with timeout const response = await Promise.race([ fetch(url, fetchOptions), timeoutPromise, ]); - - // Parse response const responseData = await response.json(); - - // Return standardized response return { status: response.status, data: responseData || ({} as T), @@ -116,12 +104,8 @@ async function fetchDataWithToken( cache: boolean = false, timeout: number = DEFAULT_TIMEOUT ): Promise> { - const accessToken = (await retrieveAccessToken()); - const headers = { - ...defaultHeaders, - "eys-acs-tkn": accessToken, - }; - + const accessToken = await retrieveAccessToken(); + const headers = { ...defaultHeaders, "eys-acs-tkn": accessToken }; return coreFetch(endpoint, { method, cache, timeout }, headers, payload); } @@ -136,12 +120,8 @@ async function updateDataWithToken( cache: boolean = false, timeout: number = DEFAULT_TIMEOUT ): Promise> { - const accessToken = (await retrieveAccessToken()) || ""; - const headers = { - ...defaultHeaders, - "eys-acs-tkn": accessToken, - }; - + const accessToken = await retrieveAccessToken(); + const headers = { ...defaultHeaders, "eys-acs-tkn": accessToken }; return coreFetch( `${endpoint}/${uuid}`, { method, cache, timeout }, diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx index 89801cc..344d422 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/complete/fetch.tsx @@ -2,6 +2,7 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientRedisToken } from "@/types/mutual/context/validations"; +import { AuthError } from "@/types/mutual/context/validations"; // Redis operation timeout (5 seconds) const REDIS_TIMEOUT = 5000; @@ -76,51 +77,20 @@ const defaultValues: ClientRedisToken = { const getCompleteFromRedis = async (): Promise => { try { let decrpytUserSelection; - try { - decrpytUserSelection = await functionRetrieveUserSelection(); - } catch (error) { - console.error('Error retrieving user selection:', error); - return defaultValues; - } - + try { decrpytUserSelection = await functionRetrieveUserSelection() } catch (error) { return defaultValues } const redisKey = decrpytUserSelection?.redisKey; - - if (!redisKey) { - console.error("No redis key found in user selection"); - return defaultValues; - } - - if (redisKey === "default") { - return defaultValues; - } + if (!redisKey) { return defaultValues } + if (redisKey === "default") { return defaultValues } try { const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT); }); - - // Race the Redis operation against the timeout - const result = await Promise.race([ - redis.get(`${redisKey}`), - timeoutPromise - ]); - - if (!result) { - return defaultValues; - } - - try { - const parsedResult = JSON.parse(result); - return parsedResult; - } catch (parseError) { - return defaultValues; - } - } catch (redisError) { - return defaultValues; - } - } catch (error) { - return defaultValues; - } + const result = await Promise.race([redis.get(`${redisKey}`), timeoutPromise]); + if (!result) { return defaultValues } + try { const parsedResult = JSON.parse(result); return parsedResult } catch (parseError) { return defaultValues } + } catch (redisError) { return defaultValues } + } catch (error) { return defaultValues } } /** @@ -130,41 +100,18 @@ const getCompleteFromRedis = async (): Promise => { */ const setCompleteToRedis = async (completeObject: ClientRedisToken): Promise => { try { - if (!completeObject) { - return false; - } - + if (!completeObject) { return false } let decrpytUserSelection; - try { - decrpytUserSelection = await functionRetrieveUserSelection(); - } catch (error) { - return false; - } - - if (!decrpytUserSelection) { - return false; - } - + try { decrpytUserSelection = await functionRetrieveUserSelection() } catch (error) { return false } + if (!decrpytUserSelection) { return false } const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) { - return false; - } - + if (!redisKey) { return false } try { - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT); - }); - await Promise.race([ - redis.set(redisKey, JSON.stringify(completeObject)), - timeoutPromise - ]); + const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT) }); + await Promise.race([redis.set(redisKey, JSON.stringify(completeObject)), timeoutPromise]); return true; - } catch (redisError) { - return false; - } - } catch (error) { - return false; - } + } catch (redisError) { return false } + } catch (error) { return false } } /** @@ -175,29 +122,14 @@ const setCompleteToRedis = async (completeObject: ClientRedisToken): Promise => { try { - if (!redisKey) { - return false; - } - - if (!completeObject) { - return false; - } - + if (!redisKey) { return false } + if (!completeObject) { return false } try { - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT); - }); - await Promise.race([ - redis.set(redisKey, JSON.stringify(completeObject)), - timeoutPromise - ]); + const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT) }); + await Promise.race([redis.set(redisKey, JSON.stringify(completeObject)), timeoutPromise]) return true; - } catch (redisError) { - return false; - } - } catch (error) { - return false; - } + } catch (redisError) { return false } + } catch (error) { return false } } export { getCompleteFromRedis, setCompleteToRedis, setNewCompleteToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx index 863e4e0..4910444 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/dash/selection/fetch.tsx @@ -3,6 +3,7 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientSelection } from "@/types/mutual/context/validations"; import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; +import { AuthError } from "@/types/mutual/context/validations"; const getSelectionFromRedis = async (): Promise => { try { @@ -18,15 +19,28 @@ const getSelectionFromRedis = async (): Promise => { } const setSelectionToRedis = async (selectionObject: ClientSelection) => { - const decrpytUserSelection = await functionRetrieveUserSelection() - if (!decrpytUserSelection) throw new Error("No user selection found"); - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - if (!selectionObject) throw new Error("No selection object provided"); - const oldData = await getCompleteFromRedis(); - if (!oldData) throw new Error("No old data found in redis"); - await setCompleteToRedis({ ...oldData, selection: selectionObject }) - return true; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new AuthError("No user selection found"); + + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + + if (!selectionObject) throw new AuthError("No selection object provided"); + + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new AuthError("No old data found in redis"); + + await setCompleteToRedis({ ...oldData, selection: selectionObject }) + return true; + } catch (error) { + // Re-throw AuthError instances, wrap other errors as AuthError + if (error instanceof AuthError) { + throw error; + } else { + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } + } } export { getSelectionFromRedis, setSelectionToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx index 5731b1a..be2a9e1 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/dash/settings/fetch.tsx @@ -3,28 +3,46 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientSettings } from "@/types/mutual/context/validations"; import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; +import { AuthError } from "@/types/mutual/context/validations"; const getSettingsFromRedis = async (): Promise => { - const decrpytUserSelection = await functionRetrieveUserSelection() - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - const result = await redis.get(`${redisKey}`); - if (!result) throw new Error("No data found in redis"); - const parsedResult = JSON.parse(result); - if (!parsedResult.settings) throw new Error("No settings found in redis"); - return parsedResult.settings; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + + const result = await redis.get(`${redisKey}`); + if (!result) throw new AuthError("No data found in redis"); + + const parsedResult = JSON.parse(result); + if (!parsedResult.settings) throw new AuthError("No settings found in redis"); + + return parsedResult.settings; + } catch (error) { + if (error instanceof AuthError) { throw error } + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } } const setSettingsToRedis = async (settingsObject: ClientSettings) => { - const decrpytUserSelection = await functionRetrieveUserSelection() - if (!decrpytUserSelection) throw new Error("No user selection found"); - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - if (!settingsObject) throw new Error("No settings object provided"); - const oldData = await getCompleteFromRedis(); - if (!oldData) throw new Error("No old data found in redis"); - await setCompleteToRedis({ ...oldData, settings: settingsObject }) - return true; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new AuthError("No user selection found"); + + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + + if (!settingsObject) throw new AuthError("No settings object provided"); + + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new AuthError("No old data found in redis"); + + await setCompleteToRedis({ ...oldData, settings: settingsObject }) + return true; + } catch (error) { + if (error instanceof AuthError) { throw error } + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } } export { getSettingsFromRedis, setSettingsToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx index e6c20f4..74f46bc 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/dash/user/fetch.tsx @@ -3,28 +3,46 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientUser } from "@/types/mutual/context/validations"; import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; +import { AuthError } from "@/types/mutual/context/validations"; const getUserFromRedis = async (): Promise => { - const decrpytUserSelection = await functionRetrieveUserSelection() - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - const result = await redis.get(`${redisKey}`); - if (!result) throw new Error("No data found in redis"); - const parsedResult = JSON.parse(result); - if (!parsedResult.user) throw new Error("No user found in redis"); - return parsedResult.user; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + + const result = await redis.get(`${redisKey}`); + if (!result) throw new AuthError("No data found in redis"); + + const parsedResult = JSON.parse(result); + if (!parsedResult.user) throw new AuthError("No user found in redis"); + + return parsedResult.user; + } catch (error) { + if (error instanceof AuthError) { throw error } + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } } const setUserToRedis = async (userObject: ClientUser) => { - const decrpytUserSelection = await functionRetrieveUserSelection() - if (!decrpytUserSelection) throw new Error("No user selection found"); - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - if (!userObject) throw new Error("No user object provided"); - const oldData = await getCompleteFromRedis(); - if (!oldData) throw new Error("No old data found in redis"); - await setCompleteToRedis({ ...oldData, user: userObject }); - return true; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new AuthError("No user selection found"); + + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + + if (!userObject) throw new AuthError("No user object provided"); + + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new AuthError("No old data found in redis"); + + await setCompleteToRedis({ ...oldData, user: userObject }); + return true; + } catch (error) { + if (error instanceof AuthError) { throw error } + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } } export { getUserFromRedis, setUserToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx index 19c66ab..bfaf72f 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/page/config/fetch.tsx @@ -3,28 +3,39 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientSettings } from "@/types/mutual/context/validations"; import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; +import { AuthError } from "@/types/mutual/context/validations"; const getConfigFromRedis = async (): Promise => { - const decrpytUserSelection = await functionRetrieveUserSelection() - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - const result = await redis.get(`${redisKey}`); - if (!result) throw new Error("No data found in redis"); - const parsedResult = JSON.parse(result); - if (!parsedResult.settings) throw new Error("No settings found in redis"); - return parsedResult.settings; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new AuthError("No data found in redis"); + const parsedResult = JSON.parse(result); + if (!parsedResult.settings) throw new AuthError("No settings found in redis"); + return parsedResult.settings; + } catch (error) { + if (error instanceof AuthError) { throw error } + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } } const setConfigToRedis = async (settingsObject: ClientSettings) => { - const decrpytUserSelection = await functionRetrieveUserSelection() - if (!decrpytUserSelection) throw new Error("No user selection found"); - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - if (!settingsObject) throw new Error("No settings object provided"); - const oldData = await getCompleteFromRedis(); - if (!oldData) throw new Error("No old data found in redis"); - await setCompleteToRedis({ ...oldData, settings: settingsObject }); - return true; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new AuthError("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + if (!settingsObject) throw new AuthError("No settings object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new AuthError("No old data found in redis"); + await setCompleteToRedis({ ...oldData, settings: settingsObject }); + return true; + } catch (error) { + if (error instanceof AuthError) { throw error } + throw new AuthError(error instanceof Error ? error.message : "Unknown error"); + } } diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx index 67170f9..151dbd7 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/page/menu/fetch.tsx @@ -3,28 +3,33 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientMenu } from "@/types/mutual/context/validations"; import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; +import { AuthError } from "@/types/mutual/context/validations"; const getMenuFromRedis = async (): Promise => { - const decrpytUserSelection = await functionRetrieveUserSelection() - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - const result = await redis.get(`${redisKey}`); - if (!result) throw new Error("No data found in redis"); - const parsedResult = JSON.parse(result); - if (!parsedResult.menu) throw new Error("No menu found in redis"); - return parsedResult.menu; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + const result = await redis.get(`${redisKey}`); + if (!result) throw new AuthError("No data found in redis"); + const parsedResult = JSON.parse(result); + if (!parsedResult.menu) throw new AuthError("No menu found in redis"); + return parsedResult.menu; + } catch (error) { if (error instanceof AuthError) { throw error } else { throw new AuthError(error instanceof Error ? error.message : "Unknown error") } } } const setMenuToRedis = async (menuObject: ClientMenu) => { - const decrpytUserSelection = await functionRetrieveUserSelection() - if (!decrpytUserSelection) throw new Error("No user selection found"); - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) throw new Error("No redis key found"); - if (!menuObject) throw new Error("No menu object provided"); - const oldData = await getCompleteFromRedis(); - if (!oldData) throw new Error("No old data found in redis"); - await setCompleteToRedis({ ...oldData, menu: menuObject }); - return true; + try { + const decrpytUserSelection = await functionRetrieveUserSelection() + if (!decrpytUserSelection) throw new AuthError("No user selection found"); + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) throw new AuthError("No redis key found"); + if (!menuObject) throw new AuthError("No menu object provided"); + const oldData = await getCompleteFromRedis(); + if (!oldData) throw new AuthError("No old data found in redis"); + await setCompleteToRedis({ ...oldData, menu: menuObject }); + return true; + } catch (error) { if (error instanceof AuthError) { throw error } else { throw new AuthError(error instanceof Error ? error.message : "Unknown error") } } } export { getMenuFromRedis, setMenuToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx b/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx index 82857dc..1204e88 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/context/page/online/fetch.tsx @@ -3,17 +3,7 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientOnline } from "@/types/mutual/context/validations"; import { getCompleteFromRedis, setCompleteToRedis } from "@/apifetchers/mutual/context/complete/fetch"; - -// Default online object to use as fallback -const defaultOnlineObject: ClientOnline = { - lang: "en", - userType: "occupant", - lastLogin: new Date(), - lastLogout: new Date(), - lastAction: new Date(), - lastPage: "/auth/login", - timezone: "GMT+3" -}; +import { AuthError } from "@/types/mutual/context/validations"; // Redis operation timeout (5 seconds) const REDIS_TIMEOUT = 5000; @@ -24,72 +14,25 @@ const REDIS_TIMEOUT = 5000; */ const getOnlineFromRedis = async (): Promise => { try { - console.log('Getting online state from Redis...'); - - // Get user selection with default fallback - let decrpytUserSelection; - try { - decrpytUserSelection = await functionRetrieveUserSelection(); - console.log('User selection retrieved successfully'); - } catch (error) { - console.error('Error retrieving user selection:', error); - return defaultOnlineObject; - } - - const redisKey = decrpytUserSelection?.redisKey; - console.log('Redis key:', redisKey); - - // If we have a default redisKey, return a default online object - if (!redisKey || redisKey === "default") { - console.log('Using default online object due to default/missing redisKey'); - return defaultOnlineObject; - } - - // Try to get data from Redis with timeout let result; + let decrpytUserSelection; + try { decrpytUserSelection = await functionRetrieveUserSelection() } catch (error) { throw new AuthError('Failed to retrieve user selection') } + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) { throw new AuthError('No redis key found') } + if (redisKey === "default") { throw new AuthError('Invalid redis key') } try { - // Create a promise that rejects after the timeout - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT); - }); - - // Race the Redis operation against the timeout - result = await Promise.race([ - redis.get(`${redisKey}`), - timeoutPromise - ]) as string | null; - - console.log('Redis get operation completed'); - } catch (redisError) { - console.error('Error accessing Redis:', redisError); - return defaultOnlineObject; - } - - if (!result) { - console.log('No data found in Redis for key:', redisKey); - return defaultOnlineObject; - } + const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT) }); + result = await Promise.race([redis.get(`${redisKey}`), timeoutPromise]) as string | null; + } catch (redisError) { throw new AuthError('Failed to access Redis data') } + + if (!result) { throw new AuthError('No data found in redis') } - // Parse the result try { const parsedResult = JSON.parse(result); - console.log('Successfully parsed Redis result'); - - if (!parsedResult.online) { - console.warn('No online object in parsed result'); - return defaultOnlineObject; - } - - console.log('Returning online object from Redis'); + if (!parsedResult.online) { throw new AuthError('No online data found in redis') } return parsedResult.online; - } catch (parseError) { - console.error('Error parsing Redis result:', parseError); - return defaultOnlineObject; - } - } catch (error) { - console.error('Unexpected error in getOnlineFromRedis:', error); - return defaultOnlineObject; - } + } catch (parseError) { throw new AuthError('Invalid data format in redis') } + } catch (error) { if (error instanceof AuthError) { throw error } else { throw new AuthError(error instanceof Error ? error.message : 'Unknown error') } } } /** @@ -99,75 +42,23 @@ const getOnlineFromRedis = async (): Promise => { */ const setOnlineToRedis = async (onlineObject: ClientOnline): Promise => { try { - console.log('Setting online state in Redis:', onlineObject); - - // Validate input - if (!onlineObject) { - console.error('No online object provided'); - return false; - } - - // Get user selection + if (!onlineObject) { throw new AuthError('No online object provided') } + let decrpytUserSelection; - try { - decrpytUserSelection = await functionRetrieveUserSelection(); - console.log('User selection retrieved successfully'); - } catch (error) { - console.error('Error retrieving user selection:', error); - return false; - } - - if (!decrpytUserSelection) { - console.error('No user selection found'); - return false; - } - - const redisKey = decrpytUserSelection?.redisKey; - if (!redisKey) { - console.error('No redis key found in user selection'); - return false; - } - - console.log('Using Redis key:', redisKey); - - // Get existing data from Redis let oldData; + + try { decrpytUserSelection = await functionRetrieveUserSelection() } catch (error) { throw new AuthError('Failed to retrieve user selection') } + if (!decrpytUserSelection) { throw new AuthError('No user selection found') } + const redisKey = decrpytUserSelection?.redisKey; + if (!redisKey) { throw new AuthError('No redis key found') } + try { oldData = await getCompleteFromRedis() } catch (error) { throw new AuthError('Failed to retrieve existing data from Redis') } + if (!oldData) { throw new AuthError('No old data found in redis') } try { - oldData = await getCompleteFromRedis(); - console.log('Retrieved existing data from Redis'); - } catch (error) { - console.error('Error getting complete data from Redis:', error); - return false; - } - - if (!oldData) { - console.error('No existing data found in Redis'); - return false; - } - - // Update Redis with timeout - try { - // Create a promise that rejects after the timeout - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT); - }); - - // Race the Redis operation against the timeout - await Promise.race([ - setCompleteToRedis({ ...oldData, online: onlineObject }), - timeoutPromise - ]); - - console.log('Successfully updated online state in Redis'); + const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('Redis operation timed out')), REDIS_TIMEOUT) }); + await Promise.race([setCompleteToRedis({ ...oldData, online: onlineObject }), timeoutPromise]); return true; - } catch (redisError) { - console.error('Error updating Redis:', redisError); - return false; - } - } catch (error) { - console.error('Unexpected error in setOnlineToRedis:', error); - return false; - } + } catch (redisError) { throw new AuthError('Failed to update Redis data') } + } catch (error) { if (error instanceof AuthError) throw error; throw new AuthError(error instanceof Error ? error.message : 'Unknown error') } } export { getOnlineFromRedis, setOnlineToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx b/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx index 49ae7c9..e64a5a5 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx @@ -3,6 +3,7 @@ import NextCrypto from "next-crypto"; import { fetchDataWithToken } from "@/apifetchers/api-fetcher"; import { baseUrlAuth, baseUrlRestriction, tokenSecret } from "@/apifetchers/basics"; import { cookies } from "next/headers"; +import { AuthError } from "@/types/mutual/context/validations"; const checkToken = `${baseUrlAuth}/authentication/token/check`; const pageValid = `${baseUrlRestriction}/restrictions/page/valid`; @@ -18,10 +19,7 @@ async function checkAccessTokenIsValid() { try { const response = await fetchDataWithToken(checkToken, {}, "GET", false); return fetchResponseStatus(response); - } catch (error) { - console.error("Error checking token validity:", error); - return false; - } + } catch (error) { throw new AuthError("No access token found") } } async function retrievePageList() { @@ -40,8 +38,7 @@ async function retrieveAccessToken() { const encrpytAccessToken = cookieStore.get("eys-zzz")?.value || ""; return await nextCrypto.decrypt(encrpytAccessToken) || ""; } - catch (error) { console.error("Error retrieving access token:", error) } - return ""; + catch (error) { throw new AuthError("No access token found") } } async function retrieveAccessObjects() { @@ -50,8 +47,7 @@ async function retrieveAccessObjects() { const encrpytAccessObject = cookieStore.get("eys-yyy")?.value || ""; return await nextCrypto.decrypt(encrpytAccessObject) || ""; } - catch (error) { console.error("Error retrieving access objects:", error) } - return ""; + catch (error) { throw new AuthError("No access objects found") } } export { diff --git a/web_services/client_frontend/src/apifetchers/utils.tsx b/web_services/client_frontend/src/apifetchers/utils.tsx index 300cecf..09e7514 100644 --- a/web_services/client_frontend/src/apifetchers/utils.tsx +++ b/web_services/client_frontend/src/apifetchers/utils.tsx @@ -13,51 +13,20 @@ const functionRetrieveUserSelection = async () => { try { const cookieStore = await cookies(); const encrpytUserSelection = cookieStore.get("eys-sel")?.value || ""; - - if (!encrpytUserSelection) { - return { - redisKey: "default", - uuid: "", - timestamp: new Date().toISOString() - }; - } - + if (!encrpytUserSelection) { return { redisKey: "default", uuid: "", timestamp: new Date().toISOString() } } try { const decrpytUserSelection = await nextCrypto.decrypt(encrpytUserSelection); - if (!decrpytUserSelection) { - return { - redisKey: "default", - uuid: "", - timestamp: new Date().toISOString() - }; - } - + if (!decrpytUserSelection) { return { redisKey: "default", uuid: "", timestamp: new Date().toISOString() } } return JSON.parse(decrpytUserSelection); - } catch (decryptError) { - return { - redisKey: "default", - uuid: "", - timestamp: new Date().toISOString() - }; - } - } catch (error) { - return { - redisKey: "default", - uuid: "", - timestamp: new Date().toISOString() - }; - } + } catch (decryptError) { return { redisKey: "default", uuid: "", timestamp: new Date().toISOString() } } + } catch (error) { return { redisKey: "default", uuid: "", timestamp: new Date().toISOString() } } } const functionSetUserSelection = async (userSelection: any) => { const cookieStore = await cookies(); const encrpytUserSelection = await nextCrypto.encrypt(JSON.stringify(userSelection)); if (!encrpytUserSelection) throw new Error("No user selection found"); - cookieStore.set({ - name: "eys-sel", - value: encrpytUserSelection, - ...cookieObject, - }); + cookieStore.set({ name: "eys-sel", value: encrpytUserSelection, ...cookieObject }); } const functionRemoveUserSelection = async () => { diff --git a/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx b/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx index 59434c4..421f0cd 100644 --- a/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx +++ b/web_services/client_frontend/src/app/(AuthLayout)/auth/[...page]/page.tsx @@ -3,19 +3,17 @@ import { AuthLayout } from "@/layouts/auth/layout"; import { AuthServerProps } from "@/validations/mutual/pages/props"; import { LanguageTypes } from "@/validations/mutual/language/validations"; import { checkAccessTokenIsValid } from "@/apifetchers/mutual/cookies/token"; -import Login from "@/webPages/auth/login/page"; -import Select from "@/webPages/auth/select/page"; import { getOnlineFromRedis } from "@/apifetchers/mutual/context/page/online/fetch"; +import { redirect } from "next/navigation"; +import Login from "@/webPages/auth/login/page"; const AuthPageSSR = async ({ params, searchParams }: AuthServerProps) => { const awaitedParams = await params; const awaitedSearchParams = await searchParams; const pageUrlFromParams = `/${awaitedParams.page?.join("/")}` || "/login"; const tokenValid = await checkAccessTokenIsValid(); - let FoundPage = - const online = await getOnlineFromRedis(); - if (tokenValid && online) { FoundPage =