diff --git a/api_services/api_builds/auth_service/endpoints/auth/router.py b/api_services/api_builds/auth_service/endpoints/auth/router.py index d2c2b63..d30ec33 100644 --- a/api_services/api_builds/auth_service/endpoints/auth/router.py +++ b/api_services/api_builds/auth_service/endpoints/auth/router.py @@ -20,7 +20,7 @@ from endpoints.index import endpoints_index from api_validations.defaults.validations import CommonHeaders from api_middlewares.token_provider import TokenProvider - +from events.auth.events import LoginHandler auth_route = APIRouter(prefix="/authentication", tags=["Authentication Cluster"]) @@ -124,8 +124,12 @@ auth_route_check_token = "AuthCheckToken" ) def check_token(headers: CommonHeaders = Depends(CommonHeaders.as_dependency)): """Check if token is valid""" - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - return None + try: + if token_object := LoginHandler.authentication_check_token_valid(access_token=headers.token, domain=headers.domain): + return JSONResponse(status_code=status.HTTP_200_OK, content={"success": True}) + except Exception as e: + print(e) + return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED, content={"success": False}) auth_route_refresh_token = "AuthRefreshToken" diff --git a/api_services/api_builds/auth_service/events/auth/events.py b/api_services/api_builds/auth_service/events/auth/events.py index e7e5ea8..ed3ef60 100644 --- a/api_services/api_builds/auth_service/events/auth/events.py +++ b/api_services/api_builds/auth_service/events/auth/events.py @@ -402,14 +402,7 @@ class LoginHandler: def authentication_check_token_valid(cls, domain, access_token: str) -> bool: redis_handler = RedisHandlers() if auth_token := redis_handler.get_object_from_redis(access_token=access_token): - if auth_token.is_employee: - if domain not in auth_token.domain_list: - raise ValueError("EYS_00112") - return True - elif auth_token.is_occupant: - if domain not in auth_token.domain_list: - raise ValueError("EYS_00113") - return True + return True return False diff --git a/api_services/api_middlewares/token_provider.py b/api_services/api_middlewares/token_provider.py index eecb821..5e16c08 100644 --- a/api_services/api_middlewares/token_provider.py +++ b/api_services/api_middlewares/token_provider.py @@ -26,10 +26,32 @@ class TokenProvider: return OccupantTokenObject(**redis_object) raise ValueError("Invalid user type") + + @classmethod + def get_login_token_from_redis( + cls, token: Optional[str] = None, user_uu_id: Optional[str] = None + ) -> Union[TokenDictType, List[TokenDictType]]: + """ + Retrieve token object from Redis using token and user_uu_id + """ + token_to_use, user_uu_id_to_use = token or "*", user_uu_id or "*" + list_of_token_dict, auth_key_list = [], [cls.AUTH_TOKEN, token_to_use, user_uu_id_to_use] + if token: + result = RedisActions.get_json(list_keys=auth_key_list, limit=1) + if first_record := result.first: + return cls.convert_redis_object_to_token(first_record) + elif user_uu_id: + result = RedisActions.get_json(list_keys=auth_key_list) + if all_records := result.all: + for all_record in all_records: + list_of_token_dict.append(cls.convert_redis_object_to_token(all_record)) + return list_of_token_dict + raise ValueError("Token not found in Redis. Please check the token or user_uu_id.") + @classmethod def get_dict_from_redis( cls, token: Optional[str] = None, user_uu_id: Optional[str] = None - ) -> Union[TokenDictType, List[TokenDictType]]: + ) -> Union[TokenDictType, List[TokenDictType]]: """ Retrieve token object from Redis using token and user_uu_id """ diff --git a/web_services/client_frontend/src/apifetchers/api-fetcher.ts b/web_services/client_frontend/src/apifetchers/api-fetcher.ts index 2683bb6..1c71416 100644 --- a/web_services/client_frontend/src/apifetchers/api-fetcher.ts +++ b/web_services/client_frontend/src/apifetchers/api-fetcher.ts @@ -1,5 +1,4 @@ "use server"; -import { retrieveAccessToken } from "@/apifetchers/mutual/cookies/token"; import { DEFAULT_RESPONSE, defaultHeaders, @@ -8,6 +7,7 @@ import { ApiResponse, DEFAULT_TIMEOUT, } from "./basics"; +import { retrieveAccessToken } from "@/apifetchers/mutual/cookies/token"; /** * Creates a promise that rejects after a specified timeout @@ -42,11 +42,11 @@ async function coreFetch( payload?: any ): Promise> { 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, @@ -73,7 +73,7 @@ async function coreFetch( // Parse response const responseData = await response.json(); - + // Return standardized response return { status: response.status, @@ -116,7 +116,7 @@ async function fetchDataWithToken( cache: boolean = false, timeout: number = DEFAULT_TIMEOUT ): Promise> { - const accessToken = (await retrieveAccessToken()) || ""; + const accessToken = (await retrieveAccessToken()); const headers = { ...defaultHeaders, "eys-acs-tkn": accessToken, diff --git a/web_services/client_frontend/src/apifetchers/custom/login/login.tsx b/web_services/client_frontend/src/apifetchers/custom/login/login.tsx index 20f9345..73bd252 100644 --- a/web_services/client_frontend/src/apifetchers/custom/login/login.tsx +++ b/web_services/client_frontend/src/apifetchers/custom/login/login.tsx @@ -12,6 +12,7 @@ import { defaultLinkList } from "@/types/mutual/context/validations"; import { retrievePageList } from "@/apifetchers/mutual/cookies/token"; +import { deleteAllCookies } from "@/apifetchers/mutual/cookies/cookie-actions"; import { setMenuToRedis } from "@/apifetchers/mutual/context/page/menu/fetch"; const loginEndpoint = `${baseUrlAuth}/authentication/login`; @@ -33,11 +34,8 @@ interface LoginSelectOccupant { } async function logoutActiveSession() { - const cookieStore = await cookies(); const response = await fetchDataWithToken(logoutEndpoint, {}, "GET", false); - cookieStore.delete("eys-zzz"); - cookieStore.delete("eys-yyy"); - cookieStore.delete("eys-sel"); + await deleteAllCookies(); return response; } @@ -82,6 +80,7 @@ async function loginViaAccessKeys(payload: LoginViaAccessKeys) { "POST", false ); + await deleteAllCookies() if (response.status === 200 || response.status === 202) { const loginRespone: any = response?.data; @@ -157,8 +156,7 @@ async function loginSelectEmployee(payload: LoginSelect) { const employeeUUID = payload.uuid; const redisKey = `CLIENT:EMPLOYEE:${employeeUUID}`; const selectResponse: any = await fetchDataWithToken(loginSelectEndpoint, { uuid: employeeUUID }, "POST", false); - - cookieStore.delete("eys-sel"); + cookieStore.delete({ name: "eys-sel", ...cookieObject }); if (selectResponse.status === 200 || selectResponse.status === 202) { const usersSelection = await nextCrypto.encrypt( 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 4ac8002..89801cc 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 @@ -3,30 +3,201 @@ import { redis } from "@/lib/redis"; import { functionRetrieveUserSelection } from "@/apifetchers/utils"; import { ClientRedisToken } from "@/types/mutual/context/validations"; +// Redis operation timeout (5 seconds) +const REDIS_TIMEOUT = 5000; + +// Default values for Redis data +const defaultValues: ClientRedisToken = { + online: { + lastLogin: new Date(), + lastLogout: new Date(), + lastAction: new Date(), + lastPage: "/dashboard", + userType: "employee", + lang: "tr", + timezone: "GMT+3" + }, + pageConfig: { + mode: "light", + textFont: 14, + theme: "default" + }, + menu: { + selectionList: ["/dashboard"], + activeSelection: "/dashboard" + }, + header: { + header: [], + activeDomain: "", + listOfDomains: [], + connections: [] + }, + selection: { + selectionList: [], + activeSelection: {} + }, + user: { + uuid: "", + avatar: "", + email: "", + phone_number: "", + user_tag: "", + password_expiry_begins: new Date().toISOString(), + person: { + uuid: "", + firstname: "", + surname: "", + middle_name: "", + sex_code: "", + person_tag: "", + country_code: "", + birth_date: "" + } + }, + settings: { + lastOnline: new Date(), + token: "" + }, + chatRoom: { + linkList: [] + }, + notifications: { + linkList: [] + }, + messages: { + linkList: [] + } +}; + +/** + * Gets the complete data from Redis with improved error handling and timeouts + * @returns The complete Redis data or default values if there's an error + */ const getCompleteFromRedis = 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"); - return JSON.parse(result); + try { + let decrpytUserSelection; + try { + decrpytUserSelection = await functionRetrieveUserSelection(); + } catch (error) { + console.error('Error retrieving user selection:', 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; + } + + 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 setCompleteToRedis = async (completeObject: ClientRedisToken) => { - 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 (!completeObject) throw new Error("No complete object provided"); - await redis.set(redisKey, JSON.stringify(completeObject)); - return true; +/** + * Sets the complete data in Redis with improved error handling and timeouts + * @param completeObject The complete data to set in Redis + * @returns True if successful, false otherwise + */ +const setCompleteToRedis = async (completeObject: ClientRedisToken): Promise => { + try { + if (!completeObject) { + return false; + } + + let decrpytUserSelection; + try { + decrpytUserSelection = await functionRetrieveUserSelection(); + } catch (error) { + return false; + } + + if (!decrpytUserSelection) { + return false; + } + + const redisKey = decrpytUserSelection?.redisKey; + 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 + ]); + return true; + } catch (redisError) { + return false; + } + } catch (error) { + return false; + } } -const setNewCompleteToRedis = async (completeObject: ClientRedisToken, redisKey: string) => { - if (!redisKey) throw new Error("No redis key found"); - if (!completeObject) throw new Error("No complete object provided"); - await redis.set(redisKey, JSON.stringify(completeObject)); - return true; +/** + * Sets new complete data in Redis with a specific key with improved error handling and timeouts + * @param completeObject The complete data to set in Redis + * @param redisKey The specific Redis key to use + * @returns True if successful, false otherwise + */ +const setNewCompleteToRedis = async (completeObject: ClientRedisToken, redisKey: string): Promise => { + try { + 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 + ]); + return true; + } catch (redisError) { + return false; + } + } catch (error) { + return false; + } } export { getCompleteFromRedis, setCompleteToRedis, setNewCompleteToRedis }; 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 a602fdf..82857dc 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 @@ -4,79 +4,170 @@ 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" +}; + +// Redis operation timeout (5 seconds) +const REDIS_TIMEOUT = 5000; + +/** + * Gets the online state from Redis + * @returns The online state object + */ const getOnlineFromRedis = async (): Promise => { try { + console.log('Getting online state from Redis...'); + // Get user selection with default fallback - const decrpytUserSelection = await functionRetrieveUserSelection(); + 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 === "default") { - return { - lang: "en", - userType: "occupant", - lastLogin: new Date(), - lastLogout: new Date(), - lastAction: new Date(), - lastPage: "/auth/login", - timezone: "GMT+3" - }; + if (!redisKey || redisKey === "default") { + console.log('Using default online object due to default/missing redisKey'); + return defaultOnlineObject; } - // Try to get data from Redis - const result = await redis.get(`${redisKey}`); + // Try to get data from Redis with timeout + let result; + 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) { - return { - lang: "en", - userType: "occupant", - lastLogin: new Date(), - lastLogout: new Date(), - lastAction: new Date(), - lastPage: "/auth/login", - timezone: "GMT+3" - }; + console.log('No data found in Redis for key:', redisKey); + return defaultOnlineObject; } // Parse the result - const parsedResult = JSON.parse(result); - if (!parsedResult.online) { - return { - lang: "en", - userType: "occupant", - lastLogin: new Date(), - lastLogout: new Date(), - lastAction: new Date(), - lastPage: "/auth/login", - timezone: "GMT+3" - }; + 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'); + return parsedResult.online; + } catch (parseError) { + console.error('Error parsing Redis result:', parseError); + return defaultOnlineObject; } - - return parsedResult.online; } catch (error) { - console.error("Error getting online from Redis:", error); - // Return default online object in case of any error - return { - lang: "en", - userType: "occupant", - lastLogin: new Date(), - lastLogout: new Date(), - lastAction: new Date(), - lastPage: "/auth/login", - timezone: "GMT+3" - }; + console.error('Unexpected error in getOnlineFromRedis:', error); + return defaultOnlineObject; } } -const setOnlineToRedis = async (onlineObject: ClientOnline) => { - 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 (!onlineObject) throw new Error("No online object provided"); - const oldData = await getCompleteFromRedis(); - if (!oldData) throw new Error("No old data found in redis"); - await setCompleteToRedis({ ...oldData, online: onlineObject }); - return true; +/** + * Sets the online state in Redis + * @param onlineObject The online state to set + * @returns True if successful, false otherwise + */ +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 + 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 { + 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'); + return true; + } catch (redisError) { + console.error('Error updating Redis:', redisError); + return false; + } + } catch (error) { + console.error('Unexpected error in setOnlineToRedis:', error); + return false; + } } export { getOnlineFromRedis, setOnlineToRedis }; diff --git a/web_services/client_frontend/src/apifetchers/mutual/cookies/cookie-actions.tsx b/web_services/client_frontend/src/apifetchers/mutual/cookies/cookie-actions.tsx new file mode 100644 index 0000000..7862add --- /dev/null +++ b/web_services/client_frontend/src/apifetchers/mutual/cookies/cookie-actions.tsx @@ -0,0 +1,18 @@ +'use server'; + +import { cookies } from "next/headers"; +import { cookieObject } from "@/apifetchers/basics"; + +/** + * Server action to delete all access cookies at once + * This is a direct server action that can be called from server components + */ +export async function deleteAllCookies() { + try { + const cookieStore = await cookies(); + if (cookieStore.has("eys-zzz")) { cookieStore.delete({ name: "eys-zzz", ...cookieObject }); } + if (cookieStore.has("eys-yyy")) { cookieStore.delete({ name: "eys-yyy", ...cookieObject }); } + if (cookieStore.has("eys-sel")) { cookieStore.delete({ name: "eys-sel", ...cookieObject }); } + return true; + } catch (error) { console.error("Error in deleteAllCookies:", error); return false } +} 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 e38700e..49ae7c9 100644 --- a/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx +++ b/web_services/client_frontend/src/apifetchers/mutual/cookies/token.tsx @@ -1,4 +1,3 @@ -"use server"; import NextCrypto from "next-crypto"; import { fetchDataWithToken } from "@/apifetchers/api-fetcher"; @@ -18,7 +17,7 @@ function fetchResponseStatus(response: any) { async function checkAccessTokenIsValid() { try { const response = await fetchDataWithToken(checkToken, {}, "GET", false); - return fetchResponseStatus(response) ? true : false; + return fetchResponseStatus(response); } catch (error) { console.error("Error checking token validity:", error); return false; @@ -37,15 +36,22 @@ async function retrieveApplicationbyUrl(pageUrl: string) { async function retrieveAccessToken() { const cookieStore = await cookies(); - const encrpytAccessToken = cookieStore.get("eys-zzz")?.value || ""; - return encrpytAccessToken ? await nextCrypto.decrypt(encrpytAccessToken) : null; + try { + const encrpytAccessToken = cookieStore.get("eys-zzz")?.value || ""; + return await nextCrypto.decrypt(encrpytAccessToken) || ""; + } + catch (error) { console.error("Error retrieving access token:", error) } + return ""; } async function retrieveAccessObjects() { const cookieStore = await cookies(); - const encrpytAccessObject = cookieStore.get("eys-yyy")?.value || ""; - const decrpytAccessObject = await nextCrypto.decrypt(encrpytAccessObject); - return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null; + try { + const encrpytAccessObject = cookieStore.get("eys-yyy")?.value || ""; + return await nextCrypto.decrypt(encrpytAccessObject) || ""; + } + catch (error) { console.error("Error retrieving access objects:", error) } + return ""; } export { diff --git a/web_services/client_frontend/src/apifetchers/utils.tsx b/web_services/client_frontend/src/apifetchers/utils.tsx index 00957b6..300cecf 100644 --- a/web_services/client_frontend/src/apifetchers/utils.tsx +++ b/web_services/client_frontend/src/apifetchers/utils.tsx @@ -5,13 +5,48 @@ import { cookies } from "next/headers"; const nextCrypto = new NextCrypto(tokenSecret); +/** + * Retrieves user selection from cookies with graceful fallback + * @returns User selection object or default selection if not found + */ const functionRetrieveUserSelection = async () => { - const cookieStore = await cookies(); - const encrpytUserSelection = cookieStore.get("eys-sel")?.value || ""; - if (!encrpytUserSelection) throw new Error("No user selection found"); - const decrpytUserSelection = await nextCrypto.decrypt(encrpytUserSelection); - if (!decrpytUserSelection) throw new Error("No user selection found"); - return JSON.parse(decrpytUserSelection); + try { + const cookieStore = await cookies(); + const encrpytUserSelection = cookieStore.get("eys-sel")?.value || ""; + + 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() + }; + } + + return JSON.parse(decrpytUserSelection); + } 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) => { 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 aed3e40..59434c4 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 @@ -1,17 +1,21 @@ 'use server'; import { AuthLayout } from "@/layouts/auth/layout"; import { AuthServerProps } from "@/validations/mutual/pages/props"; -import { checkContextPageOnline } from "@/components/mutual/context/online/context"; -import getPage from "@/webPages/getPage"; +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"; -const AuthPageEn = async ({ params, searchParams }: AuthServerProps) => { - const online = await checkContextPageOnline(); - const lang = online?.lang || "en"; +const AuthPageSSR = async ({ params, searchParams }: AuthServerProps) => { const awaitedParams = await params; const awaitedSearchParams = await searchParams; const pageUrlFromParams = `/${awaitedParams.page?.join("/")}` || "/login"; - const FoundPage = getPage(pageUrlFromParams, { language: lang, query: awaitedSearchParams }); - return + const tokenValid = await checkAccessTokenIsValid(); + let FoundPage = + const online = await getOnlineFromRedis(); + if (tokenValid && online) { FoundPage = ; - } catch (error) { - redirect("/auth/login"); - return null; - } -} - -export default SelectPage; diff --git a/web_services/client_frontend/src/webPages/auth/select/types.ts b/web_services/client_frontend/src/webPages/auth/select/types.ts index e333a73..9b40ecd 100644 --- a/web_services/client_frontend/src/webPages/auth/select/types.ts +++ b/web_services/client_frontend/src/webPages/auth/select/types.ts @@ -32,7 +32,7 @@ interface BuildingMap { interface SelectListProps { language: LanguageTypes; - query?: { [key: string]: string | string[] | undefined }; + type: string; } interface LoginOccupantProps { diff --git a/web_services/client_frontend/src/webPages/getPage.tsx b/web_services/client_frontend/src/webPages/getPage.tsx deleted file mode 100644 index 2cbb421..0000000 --- a/web_services/client_frontend/src/webPages/getPage.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import LoginPage from "./auth/login/serverPage"; -import SelectPage from "./auth/select/serverPage"; - -export default function getPage(pageName: string, props: any) { - switch (pageName) { - case "/login": - return ; - case "/select": - return ; - default: - return ; - } - return <> -} -