diff --git a/src/(apicalls)/validations/validationProcesser.ts b/src/(apicalls)/validations/validationProcesser.ts new file mode 100644 index 0000000..cf1a7ee --- /dev/null +++ b/src/(apicalls)/validations/validationProcesser.ts @@ -0,0 +1,77 @@ +import { array, boolean, number, object, string } from "zod"; + +interface ValidationInterface { + required: string[]; + properties: Object; + title: string; + type: string; +} + +interface HeadersAndValidationsInterface { + headers: Object; + validation: ValidationInterface; + language: string; + properties: Object; +} + +class HeadersAndValidations { + headers: Object; + validation: ValidationInterface; + language: string; + properties: Object; + validated: any = {}; + + constructor({ + headers, + validation, + language, + }: HeadersAndValidationsInterface) { + this.headers = headers; + this.validation = validation; + this.language = language; + this.properties = this.validation?.properties; + this.parseProcesser(); + } + + parseProcesser() { + const requiredKeys = Array.from(this.validation?.required); + Object.entries(this.properties).map(([key, value]) => { + const isRequired: Boolean = requiredKeys.includes(key); + const multipleTypes: Object[] = value?.anyOf; + if (!isRequired) { + multipleTypes.map((row: any) => { + if (row.type !== "null") { + this.validated[key] = { + required: false, + fieldType: this.parseType(row.type), + }; + } + }); + } else { + this.validated[key] = { + required: true, + fieldType: this.parseType(value), + }; + } + }); + } + + parseType({ type }: any) { + switch (type) { + case "string": + return string; + case "number": + return number; + case "boolean": + return boolean; + case "array": + return array; + case "object": + return object; + default: + return string; + } + } +} + +export { HeadersAndValidations }; diff --git a/src/(apicalls)/validations/validations.tsx b/src/(apicalls)/validations/validations.tsx new file mode 100644 index 0000000..0c026c0 --- /dev/null +++ b/src/(apicalls)/validations/validations.tsx @@ -0,0 +1,59 @@ +"use server"; +import { fetchData, fetchDataWithToken } from "@/(apicalls)/api-fetcher"; +import { baseUrl, cookieObject, tokenSecret } from "@/(apicalls)/basics"; + +import { HeadersAndValidations } from "@/(apicalls)/validations/validationProcesser"; + +const headersAndValidationEndpoint = `${baseUrl}/validations/endpoint`; + +interface EndpointInterface { + endpoint: string; +} + +async function retrieveHeadersEndpoint({ endpoint }: EndpointInterface) { + console.log("endpoint", endpoint); + + const selectResponse: any = await fetchDataWithToken( + headersAndValidationEndpoint, + { + endpoint: endpoint, + }, + "POST", + false + ); + if (selectResponse.status === 200) { + return { + headers: selectResponse?.headers, + }; + } + return { headers: {} }; +} + +async function retrieveHeadersAndValidationByEndpoint({ + endpoint, +}: EndpointInterface) { + console.log("endpoint", endpoint); + const selectResponse: any = await fetchDataWithToken( + headersAndValidationEndpoint, + { + endpoint: endpoint, + }, + "POST", + false + ); + console.log("selectResponse", selectResponse); + if (selectResponse.status === 200) { + const responseParsed = new HeadersAndValidations(selectResponse); + console.log("responseParsed", responseParsed); + return { + status: selectResponse.status, + headers: responseParsed.headers, + validated: responseParsed.validated, + language: responseParsed.language, + message: selectResponse.message, + }; + } + return selectResponse; +} + +export { retrieveHeadersAndValidationByEndpoint, retrieveHeadersEndpoint }; diff --git a/src/app/build/page.tsx b/src/app/build/page.tsx index 5a0a315..32b5fe7 100644 --- a/src/app/build/page.tsx +++ b/src/app/build/page.tsx @@ -3,6 +3,7 @@ import React from "react"; const BuildPage: React.FC = async () => { + return (

Build Page

diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index a1a14b2..1a28dd7 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -16,6 +16,9 @@ const Dashboard: React.FC = async () => { } const eventsList = await retrieveAvailableEvents(); const availableMenu = retrieveAvailableCategories(eventsList || []); + + + return ( <> diff --git a/src/components/ContextComponents/Building/Build/Build.tsx b/src/components/ContextComponents/Building/Build/Build.tsx index e976151..8740888 100644 --- a/src/components/ContextComponents/Building/Build/Build.tsx +++ b/src/components/ContextComponents/Building/Build/Build.tsx @@ -10,6 +10,7 @@ import BuildUpdatePage from "@/components/ContextComponents/Building/Build/Build import { retrieveAvailableEvents } from "@/(apicalls)/cookies/token"; import { retrieveBuildList } from "@/(apicalls)/building/build"; +import { retrieveHeadersEndpoint } from "@/(apicalls)/validations/validations"; const Build: React.FC = () => { const [renderTable, setRenderTable] = React.useState(false); @@ -19,12 +20,20 @@ const Build: React.FC = () => { const [isFormEnabled, setIsFormEnabled] = React.useState(false); const [rowData, setRowData] = React.useState({}); const [formPage, setFormPage] = React.useState(); + const [createValidation, setCreateValidation] = React.useState({}); + const [updateValidation, setUpdateValidation] = React.useState({}); + const [deleteValidation, setDeleteValidation] = React.useState({}); + const [tableValidation, setTableValidation] = React.useState([]); + const [tableHeaders, setTableHeaders] = React.useState({}); const endpointNeeds = { table: { endpoint: "/building/build/list", + variableKey: "headers", + variableReact: setTableHeaders, component: renderTable ? ( @@ -35,6 +44,8 @@ const Build: React.FC = () => { }, update: { endpoint: "/building/build/create", + variableReact: setCreateValidation, + variableKey: "headers", component: renderUpdate ? ( { }, create: { endpoint: "/building/build/update/{build_uu_id}", + variableReact: setUpdateValidation, + variableKey: "headers", component: renderCreate ? ( { }, delete: { endpoint: "/building/build/delete", + variableKey: "headers", + variableReact: setDeleteValidation, component: renderDelete ? ( () => setIsFormEnabled(true)} /> ) : ( @@ -86,6 +101,15 @@ const Build: React.FC = () => { .then((data) => { for (const endpointNeed of Object.values(endpointNeeds)) { if (data?.availableEvents.includes(endpointNeed.endpoint)) { + if (endpointNeed.variableKey === "headers") { + retrieveHeadersEndpoint({ endpoint: endpointNeed.endpoint }) + .then((validator) => { + if (JSON.stringify(validator?.headers) !== "{}") { + setTableHeaders(validator?.headers); + } + }) + .catch((error) => {}); + } endpointNeed.isRender(true); } } diff --git a/src/components/ContextComponents/Commons/Table.tsx b/src/components/ContextComponents/Commons/Table.tsx index 66e2036..1f94463 100644 --- a/src/components/ContextComponents/Commons/Table.tsx +++ b/src/components/ContextComponents/Commons/Table.tsx @@ -15,6 +15,7 @@ import { interface TableProps { createTable: any; + headers: any; rowClickedFunction: React.Dispatch>; } @@ -22,32 +23,46 @@ const formSchema = z.object({ searchText: z.string().default(""), }); -const Table: React.FC = ({ createTable, rowClickedFunction }) => { +const Table: React.FC = ({ + createTable, + rowClickedFunction, + headers, +}) => { const [initalData, setInitalData] = React.useState([]); const [tabledata, settabledata] = React.useState([]); - const [headersList, setHeadersList] = React.useState([]); + const [headersList, setHeadersList] = React.useState([]); + + const incomingHeaders = Array.from(Object.values(headers)) || []; + const headersObject = headers || {}; + const form = useForm>({ resolver: zodResolver(formSchema), }); React.useEffect(() => { - createTable({}).then((res: Object) => { - const resData: any = res?.data || []; - settabledata(resData || []); - setInitalData(resData || []); - setHeadersList(getHeaders(resData)); - }); - }, []); - - function getHeaders(data: Array) { - let returnList: Array = []; - if (Array.from(data).length > 0) { - Object.entries(data[0]).map(([key, value]) => { - returnList.push(key); - }); + if (incomingHeaders.length !== 0) { + let headersNew: any = []; + createTable({}) + .then((res: Object) => { + const resData: any = res?.data || []; + if (resData?.length > 0) { + settabledata(resData || []); + setInitalData(resData || []); + for (const key in resData[0]) { + if (Object.keys(headersObject).includes(key)) { + headersNew.push(headers[key]); + } else { + console.log("key", key); + } + } + if (headersNew.length > 0) { + setHeadersList(headersNew); + } + } + }) + .catch((err: any) => {}); } - return returnList; - } + }, [headers]); function selectItem({ key }: { key: number }) { tabledata.map((item, index) => { diff --git a/src/components/Sidebar/SidebarItem.tsx b/src/components/Sidebar/SidebarItem.tsx index e97661d..cd1453f 100644 --- a/src/components/Sidebar/SidebarItem.tsx +++ b/src/components/Sidebar/SidebarItem.tsx @@ -5,7 +5,7 @@ import React from "react"; interface SidebarItemProps { item: any; pageName: any; - setPageName: any; + setPageName: React.Dispatch>; leftSideMenuSetter: React.Dispatch>>; }