updated web select
This commit is contained in:
parent
eef5982e03
commit
e4d50306ac
|
|
@ -296,6 +296,7 @@ def authentication_token_check_post(
|
||||||
"domain": domain or "",
|
"domain": domain or "",
|
||||||
"eys-ext": f"{str(uuid.uuid4())}",
|
"eys-ext": f"{str(uuid.uuid4())}",
|
||||||
"token": token,
|
"token": token,
|
||||||
|
"tz": tz or "GMT+3",
|
||||||
}
|
}
|
||||||
if not domain or not language:
|
if not domain or not language:
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
|
|
@ -303,12 +304,17 @@ def authentication_token_check_post(
|
||||||
status_code=status.HTTP_406_NOT_ACCEPTABLE,
|
status_code=status.HTTP_406_NOT_ACCEPTABLE,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
)
|
)
|
||||||
|
if AuthHandlers.LoginHandler.authentication_check_token_valid(access_token=token):
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
content={},
|
content={"message": "MSG_0001"},
|
||||||
status_code=status.HTTP_202_ACCEPTED,
|
status_code=status.HTTP_202_ACCEPTED,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
)
|
)
|
||||||
|
return JSONResponse(
|
||||||
|
content={"error": "EYS_0033"},
|
||||||
|
status_code=status.HTTP_406_NOT_ACCEPTABLE,
|
||||||
|
headers=headers,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@auth_route.get(
|
@auth_route.get(
|
||||||
|
|
|
||||||
|
|
@ -601,6 +601,13 @@ class LoginHandler:
|
||||||
token_dict=token_object,
|
token_dict=token_object,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def authentication_check_token_valid(cls, access_token: str) -> bool:
|
||||||
|
redis_handler = RedisHandlers()
|
||||||
|
if redis_handler.get_object_from_redis(access_token=access_token):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class PasswordHandler:
|
class PasswordHandler:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,14 +130,12 @@ class TokenProvider:
|
||||||
AUTH_TOKEN: str = "AUTH_TOKEN"
|
AUTH_TOKEN: str = "AUTH_TOKEN"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def process_redis_object(cls, redis_object: Dict[str, Any]) -> TokenDictType:
|
def convert_redis_object_to_token(
|
||||||
|
cls, redis_object: Dict[str, Any]
|
||||||
|
) -> TokenDictType:
|
||||||
"""
|
"""
|
||||||
Process Redis object and return appropriate token object.
|
Process Redis object and return appropriate token object.
|
||||||
"""
|
"""
|
||||||
if not redis_object.get("selected_company"):
|
|
||||||
redis_object["selected_company"] = None
|
|
||||||
if not redis_object.get("selected_occupant"):
|
|
||||||
redis_object["selected_occupant"] = None
|
|
||||||
if redis_object.get("user_type") == UserType.employee.value:
|
if redis_object.get("user_type") == UserType.employee.value:
|
||||||
return EmployeeTokenObject(**redis_object)
|
return EmployeeTokenObject(**redis_object)
|
||||||
elif redis_object.get("user_type") == UserType.occupant.value:
|
elif redis_object.get("user_type") == UserType.occupant.value:
|
||||||
|
|
@ -160,12 +158,14 @@ class TokenProvider:
|
||||||
if token:
|
if token:
|
||||||
result = RedisActions.get_json(list_keys=auth_key_list, limit=1)
|
result = RedisActions.get_json(list_keys=auth_key_list, limit=1)
|
||||||
if first_record := result.first:
|
if first_record := result.first:
|
||||||
return cls.process_redis_object(first_record)
|
return cls.convert_redis_object_to_token(first_record)
|
||||||
elif user_uu_id:
|
elif user_uu_id:
|
||||||
result = RedisActions.get_json(list_keys=auth_key_list)
|
result = RedisActions.get_json(list_keys=auth_key_list)
|
||||||
if all_records := result.all:
|
if all_records := result.all:
|
||||||
for all_record in all_records:
|
for all_record in all_records:
|
||||||
list_of_token_dict.append(cls.process_redis_object(all_record))
|
list_of_token_dict.append(
|
||||||
|
cls.convert_redis_object_to_token(all_record)
|
||||||
|
)
|
||||||
return list_of_token_dict
|
return list_of_token_dict
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Token not found in Redis. Please check the token or user_uu_id."
|
"Token not found in Redis. Please check the token or user_uu_id."
|
||||||
|
|
@ -181,6 +181,8 @@ class TokenProvider:
|
||||||
elif isinstance(tokens, list):
|
elif isinstance(tokens, list):
|
||||||
retrieved_event_apps = []
|
retrieved_event_apps = []
|
||||||
for token in tokens:
|
for token in tokens:
|
||||||
|
if not isinstance(token, TokenDictType):
|
||||||
|
continue
|
||||||
if application_codes := token.reachable_app_codes.get(page_url, None):
|
if application_codes := token.reachable_app_codes.get(page_url, None):
|
||||||
retrieved_event_apps.append(application_codes)
|
retrieved_event_apps.append(application_codes)
|
||||||
return retrieved_event_apps
|
return retrieved_event_apps
|
||||||
|
|
@ -196,10 +198,9 @@ class TokenProvider:
|
||||||
elif isinstance(tokens, List):
|
elif isinstance(tokens, List):
|
||||||
retrieved_event_codes = []
|
retrieved_event_codes = []
|
||||||
for token in tokens:
|
for token in tokens:
|
||||||
if isinstance(token, TokenDictType):
|
if not isinstance(token, TokenDictType):
|
||||||
if event_codes := token.reachable_event_codes.get(
|
continue
|
||||||
endpoint_code, None
|
if event_codes := token.reachable_event_codes.get(endpoint_code, None):
|
||||||
):
|
|
||||||
retrieved_event_codes.append(event_codes)
|
retrieved_event_codes.append(event_codes)
|
||||||
return retrieved_event_codes
|
return retrieved_event_codes
|
||||||
raise ValueError("Invalid token type or no event codes found.")
|
raise ValueError("Invalid token type or no event codes found.")
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
"use server";
|
"use server";
|
||||||
// import { retrieveAccessToken } from "@/apicalls/cookies/token";
|
import { retrieveAccessToken } from "@/apicalls/cookies/token";
|
||||||
|
|
||||||
const defaultHeaders = {
|
const defaultHeaders = {
|
||||||
accept: "application/json",
|
accept: "application/json",
|
||||||
|
|
@ -48,7 +48,7 @@ const fetchData = async (
|
||||||
cache: cache ? "force-cache" : "no-cache",
|
cache: cache ? "force-cache" : "no-cache",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (method !== "GET" && payload) {
|
if (method === "POST" && payload) {
|
||||||
fetchOptions.body = JSON.stringify(payload);
|
fetchOptions.body = JSON.stringify(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,10 +73,10 @@ const updateDataWithToken = async (
|
||||||
method: string = "POST",
|
method: string = "POST",
|
||||||
cache: boolean = false
|
cache: boolean = false
|
||||||
) => {
|
) => {
|
||||||
// const accessToken = (await retrieveAccessToken()) || "";
|
const accessToken = (await retrieveAccessToken()) || "";
|
||||||
const headers = {
|
const headers = {
|
||||||
...defaultHeaders,
|
...defaultHeaders,
|
||||||
// "evyos-session-key": accessToken,
|
"eys-acs-tkn": accessToken,
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -110,10 +110,10 @@ const fetchDataWithToken = async (
|
||||||
method: string = "POST",
|
method: string = "POST",
|
||||||
cache: boolean = false
|
cache: boolean = false
|
||||||
) => {
|
) => {
|
||||||
// const accessToken = (await retrieveAccessToken()) || "";
|
const accessToken = (await retrieveAccessToken()) || "";
|
||||||
const headers = {
|
const headers = {
|
||||||
...defaultHeaders,
|
...defaultHeaders,
|
||||||
// "evyos-session-key": accessToken,
|
"eys-acs-tkn": accessToken,
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -123,7 +123,7 @@ const fetchDataWithToken = async (
|
||||||
cache: cache ? "force-cache" : "no-cache",
|
cache: cache ? "force-cache" : "no-cache",
|
||||||
};
|
};
|
||||||
|
|
||||||
if (method !== "GET" && payload) {
|
if (method === "POST" && payload) {
|
||||||
fetchOptions.body = JSON.stringify(payload);
|
fetchOptions.body = JSON.stringify(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
||||||
|
"use server";
|
||||||
|
import { fetchDataWithToken, fetchData } from "../api-fetcher";
|
||||||
|
import { baseUrlAuth, tokenSecret } from "../basics";
|
||||||
|
import { cookies } from "next/headers";
|
||||||
|
import NextCrypto from "next-crypto";
|
||||||
|
import { console } from "inspector";
|
||||||
|
|
||||||
|
const checkToken = `${baseUrlAuth}/authentication/token/check`;
|
||||||
|
const nextCrypto = new NextCrypto(tokenSecret);
|
||||||
|
|
||||||
|
async function checkAccessTokenIsValid() {
|
||||||
|
const response = await fetchDataWithToken(checkToken, {}, "GET", false);
|
||||||
|
return response?.status === 200 || response?.status === 202 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function retrieveAccessToken() {
|
||||||
|
const cookieStore = await cookies();
|
||||||
|
const encrpytAccessToken = cookieStore.get("accessToken")?.value || "";
|
||||||
|
return encrpytAccessToken
|
||||||
|
? await nextCrypto.decrypt(encrpytAccessToken)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function retrieveUserType() {
|
||||||
|
const cookieStore = await cookies();
|
||||||
|
const encrpytaccessObject = cookieStore.get("accessObject")?.value || "{}";
|
||||||
|
const decrpytUserType = JSON.parse(
|
||||||
|
(await nextCrypto.decrypt(encrpytaccessObject)) || "{}"
|
||||||
|
);
|
||||||
|
return decrpytUserType ? decrpytUserType : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function retrieveAccessObjects() {
|
||||||
|
const cookieStore = await cookies();
|
||||||
|
const encrpytAccessObject = cookieStore.get("accessObject")?.value || "";
|
||||||
|
const decrpytAccessObject = await nextCrypto.decrypt(encrpytAccessObject);
|
||||||
|
return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function retrieveUserSelection() {
|
||||||
|
const cookieStore = await cookies();
|
||||||
|
const encrpytUserSelection = cookieStore.get("userSelection")?.value || "";
|
||||||
|
let decrpytUserSelection: any = await nextCrypto.decrypt(
|
||||||
|
encrpytUserSelection
|
||||||
|
);
|
||||||
|
decrpytUserSelection = decrpytUserSelection
|
||||||
|
? JSON.parse(decrpytUserSelection)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
const userSelection = decrpytUserSelection?.company_uu_id;
|
||||||
|
|
||||||
|
let objectUserSelection = {};
|
||||||
|
|
||||||
|
if (decrpytUserSelection?.user_type === "employee") {
|
||||||
|
const accessObjects = (await retrieveAccessObjects()) || {};
|
||||||
|
const companyList = accessObjects?.companies_list;
|
||||||
|
const selectedCompany = companyList.find(
|
||||||
|
(company: any) => company.uu_id === userSelection
|
||||||
|
);
|
||||||
|
if (selectedCompany) {
|
||||||
|
objectUserSelection = {
|
||||||
|
occupantName: `${selectedCompany?.public_name}`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else if (decrpytUserSelection?.user_type === "occupant") {
|
||||||
|
const buildPartUUID = userSelection?.build_part_uu_id;
|
||||||
|
const occupantUUID = userSelection?.occupant_uu_id;
|
||||||
|
const build_id = userSelection?.build_id;
|
||||||
|
const accessObjects = (await retrieveAccessObjects()) || {};
|
||||||
|
const availableOccupants = accessObjects?.available_occupants[build_id];
|
||||||
|
const buildName = availableOccupants?.build_name;
|
||||||
|
const buildNo = availableOccupants?.build_no;
|
||||||
|
let selectedOccupant: any = null;
|
||||||
|
const occupants = availableOccupants?.occupants;
|
||||||
|
if (occupants) {
|
||||||
|
selectedOccupant = occupants.find(
|
||||||
|
(occupant: any) =>
|
||||||
|
occupant.part_uu_id === buildPartUUID &&
|
||||||
|
occupant.uu_id === occupantUUID
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (selectedOccupant) {
|
||||||
|
objectUserSelection = {
|
||||||
|
buildName: `${buildName} - No:${buildNo}`,
|
||||||
|
occupantName: `${selectedOccupant?.description} ${selectedOccupant?.part_name}`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
...objectUserSelection,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// const avatarInfo = await retrieveAvatarInfo();
|
||||||
|
// lang: avatarInfo?.data?.lang
|
||||||
|
// ? String(avatarInfo?.data?.lang).toLowerCase()
|
||||||
|
// : undefined,
|
||||||
|
// avatar: avatarInfo?.data?.avatar,
|
||||||
|
// fullName: avatarInfo?.data?.full_name,
|
||||||
|
// async function retrieveAvatarInfo() {
|
||||||
|
// const response = await fetchDataWithToken(
|
||||||
|
// `${baseUrlAuth}/authentication/avatar`,
|
||||||
|
// {},
|
||||||
|
// "POST"
|
||||||
|
// );
|
||||||
|
// return response;
|
||||||
|
// }
|
||||||
|
|
||||||
|
export {
|
||||||
|
checkAccessTokenIsValid,
|
||||||
|
retrieveAccessToken,
|
||||||
|
retrieveUserType,
|
||||||
|
retrieveAccessObjects,
|
||||||
|
retrieveUserSelection,
|
||||||
|
// retrieveavailablePages,
|
||||||
|
};
|
||||||
|
|
@ -49,7 +49,10 @@ async function loginViaAccessKeys(payload: LoginViaAccessKeys) {
|
||||||
const loginRespone = response?.data;
|
const loginRespone = response?.data;
|
||||||
const accessToken = await nextCrypto.encrypt(loginRespone.access_token);
|
const accessToken = await nextCrypto.encrypt(loginRespone.access_token);
|
||||||
const accessObject = await nextCrypto.encrypt(
|
const accessObject = await nextCrypto.encrypt(
|
||||||
JSON.stringify(loginRespone.selection_list)
|
JSON.stringify({
|
||||||
|
userType: loginRespone.user_type,
|
||||||
|
selectionList:loginRespone.selection_list
|
||||||
|
})
|
||||||
);
|
);
|
||||||
const userProfile = await nextCrypto.encrypt(
|
const userProfile = await nextCrypto.encrypt(
|
||||||
JSON.stringify(loginRespone.user)
|
JSON.stringify(loginRespone.user)
|
||||||
|
|
@ -60,6 +63,7 @@ async function loginViaAccessKeys(payload: LoginViaAccessKeys) {
|
||||||
value: accessToken,
|
value: accessToken,
|
||||||
...cookieObject,
|
...cookieObject,
|
||||||
});
|
});
|
||||||
|
console.log("accessObject", accessObject);
|
||||||
|
|
||||||
cookieStore.set({
|
cookieStore.set({
|
||||||
name: "accessObject",
|
name: "accessObject",
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,48 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import {
|
||||||
|
checkAccessTokenIsValid,
|
||||||
|
retrieveUserType,
|
||||||
|
} from "@/apicalls/cookies/token";
|
||||||
|
import { redirect } from "next/navigation";
|
||||||
|
import SelectList from "@/components/auth/select";
|
||||||
|
|
||||||
function SelectPage() {
|
async function SelectPage() {
|
||||||
return <div>SelectPage</div>;
|
const token_is_valid = await checkAccessTokenIsValid();
|
||||||
|
const selection = await retrieveUserType();
|
||||||
|
|
||||||
|
const isEmployee = selection?.userType == "employee";
|
||||||
|
const isOccupant = selection?.userType == "occupant";
|
||||||
|
|
||||||
|
const selectionList = selection?.selectionList;
|
||||||
|
|
||||||
|
if (!selectionList || !token_is_valid) {
|
||||||
|
redirect("/login/email");
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="flex flex-col items-center justify-center h-screen">
|
||||||
|
<div className="text-2xl font-bold">Select your company</div>
|
||||||
|
<div className="flex flex-col items-center justify-center">
|
||||||
|
{isEmployee && (
|
||||||
|
<div className="text-sm text-gray-500 mt-4">
|
||||||
|
You are logged in as an employee
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{isOccupant && (
|
||||||
|
<div className="text-sm text-gray-500 mt-4">
|
||||||
|
You are logged in as an occupant
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<SelectList
|
||||||
|
isEmployee={isEmployee}
|
||||||
|
isOccupant={isOccupant}
|
||||||
|
selectionList={selectionList}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="text-sm text-gray-500 mt-4"></div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default SelectPage;
|
export default SelectPage;
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,14 @@ import { z } from "zod";
|
||||||
const loginSchema = z.object({
|
const loginSchema = z.object({
|
||||||
email: z.string().email("Invalid email address"),
|
email: z.string().email("Invalid email address"),
|
||||||
password: z.string().min(5, "Password must be at least 5 characters"),
|
password: z.string().min(5, "Password must be at least 5 characters"),
|
||||||
|
remember_me: z.boolean().optional().default(false),
|
||||||
});
|
});
|
||||||
|
|
||||||
type LoginFormData = z.infer<typeof loginSchema>;
|
type LoginFormData = {
|
||||||
|
email: string;
|
||||||
|
password: string;
|
||||||
|
remember_me?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
function Login() {
|
function Login() {
|
||||||
// Open transition for form login
|
// Open transition for form login
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
function SelectList({
|
||||||
|
selectionList,
|
||||||
|
isEmployee,
|
||||||
|
isOccupant,
|
||||||
|
}: {
|
||||||
|
selectionList: {
|
||||||
|
uu_id: string;
|
||||||
|
public_name: string;
|
||||||
|
company_type: string;
|
||||||
|
company_address: string;
|
||||||
|
}[];
|
||||||
|
isEmployee: boolean;
|
||||||
|
isOccupant: boolean;
|
||||||
|
}) {
|
||||||
|
const handleClick = (uu_id: string) => {
|
||||||
|
if (isEmployee) {
|
||||||
|
console.log("Selected isEmployee uu_id:", uu_id);
|
||||||
|
} else if (isOccupant) {
|
||||||
|
console.log("Selected isOccupant uu_id:", uu_id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{selectionList.map((item: any, index: number) => (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className="w-full p-4 m-2 bg-emerald-300 hover:bg-emerald-500 rounded-lg transition-colors duration-200 cursor-pointer"
|
||||||
|
onClick={() => handleClick(item.uu_id)}
|
||||||
|
>
|
||||||
|
<div className="flex flex-col items-center md:items-start">
|
||||||
|
<div>
|
||||||
|
<span className="text-2xl font-medium">{item.public_name}</span>
|
||||||
|
{""}
|
||||||
|
<span className="font-medium text-sky-500">
|
||||||
|
{item.company_type}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span className="flex gap-2 font-medium text-gray-600 dark:text-gray-400">
|
||||||
|
<span>{item.uu_id}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span className="flex gap-2 font-medium text-gray-600 dark:text-gray-400">
|
||||||
|
<span>{item.company_address}</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SelectList;
|
||||||
Loading…
Reference in New Issue