diff --git a/apps/web/Components/Layout/index.jsx b/apps/web/Components/Layout/index.jsx index 258e048..878781b 100644 --- a/apps/web/Components/Layout/index.jsx +++ b/apps/web/Components/Layout/index.jsx @@ -13,11 +13,11 @@ const Main = styled.main` } `; -export default function Layout({ children }) { +export default function Layout({ children, user }) { return ( <>
- + {user?.admin ? : false}
{children}
); diff --git a/apps/web/pages/_app.jsx b/apps/web/pages/_app.jsx index 8ea8ba3..c3abc74 100644 --- a/apps/web/pages/_app.jsx +++ b/apps/web/pages/_app.jsx @@ -54,7 +54,7 @@ function App({ Component, pageProps }) { > - + diff --git a/apps/web/pages/admin/cache.jsx b/apps/web/pages/admin/cache.jsx index c657ffb..919fdb6 100644 --- a/apps/web/pages/admin/cache.jsx +++ b/apps/web/pages/admin/cache.jsx @@ -1,11 +1,9 @@ import { getQueries } from '@/api/cache/query'; -import { getUser } from '@/api/user/query'; import initializeApollo from '@/apollo/client'; import * as Admin from '@/Components/Admin'; import { Error } from '@/Components/Common/Error'; -import { adminRoles } from '@/config/users'; -import * as CRMTypes from '@/graphql/crm.types'; import { getPageTitle } from '@/utils/page'; +import { makeGetUserType } from '@/utils/user'; import { dehydrate, QueryClient } from '@tanstack/react-query'; import Head from 'next/head'; @@ -31,30 +29,13 @@ export async function getServerSideProps({ req }) { const { cookie = '' } = req.headers; const queryClient = new QueryClient(); - - const user = await queryClient.fetchQuery(['user'], ({ signal }) => - getUser({ - headers: { - cookie, - }, - signal, - }) - ); - const apolloClient = initializeApollo(); + const getUserType = makeGetUserType({ apolloClient, queryClient }); try { - const { - data: { systemuser }, - } = await apolloClient.query({ - fetchPolicy: 'network-only', - query: CRMTypes.GetSystemUserDocument, - variables: { - domainname: user.domainName, - }, - }); + const user = await getUserType({ cookie }); - if (!systemuser?.roles?.some((x) => x?.name && adminRoles.includes(x.name))) { + if (!user.admin) { return { props: { initialQueryState: dehydrate(queryClient), @@ -73,6 +54,7 @@ export async function getServerSideProps({ req }) { initialApolloState: apolloClient.cache.extract(), initialQueryState: dehydrate(queryClient), statusCode: 200, + user, }, }; } catch (error) { diff --git a/apps/web/pages/index.jsx b/apps/web/pages/index.jsx index bf30e5a..737b129 100644 --- a/apps/web/pages/index.jsx +++ b/apps/web/pages/index.jsx @@ -1,11 +1,9 @@ -import { getUser } from '@/api/user/query'; import initializeApollo from '@/apollo/client'; import * as Calculation from '@/Components/Calculation'; import { Error } from '@/Components/Common/Error'; -import { defaultRoles } from '@/config/users'; -import * as CRMTypes from '@/graphql/crm.types'; import * as hooks from '@/process/hooks'; import { getPageTitle } from '@/utils/page'; +import { makeGetUserType } from '@/utils/user'; import { dehydrate, QueryClient } from '@tanstack/react-query'; import Head from 'next/head'; @@ -33,63 +31,42 @@ export default function Page(props) { return ; } -export const makeGetServerSideProps = ({ roles }) => - /** @type {import('next').GetServerSideProps} */ - ( - async function ({ req }) { - const { cookie = '' } = req.headers; +/** @type {import('next').GetServerSideProps} */ +export async function getServerSideProps({ req }) { + const { cookie = '' } = req.headers; - const queryClient = new QueryClient(); + const queryClient = new QueryClient(); + const apolloClient = initializeApollo(); + const getUserType = makeGetUserType({ apolloClient, queryClient }); - const user = await queryClient.fetchQuery(['user'], ({ signal }) => - getUser({ - headers: { - cookie, - }, - signal, - }) - ); + try { + const user = await getUserType({ cookie }); - const apolloClient = initializeApollo(); - - try { - const { - data: { systemuser }, - } = await apolloClient.query({ - fetchPolicy: 'network-only', - query: CRMTypes.GetSystemUserDocument, - variables: { - domainname: user.domainName, - }, - }); - - if (!systemuser?.roles?.some((x) => x?.name && roles.includes(x.name))) { - return { - props: { - initialQueryState: dehydrate(queryClient), - statusCode: 403, - }, - }; - } - - return { - props: { - calculation: {}, - initialApolloState: apolloClient.cache.extract(), - initialQueryState: dehydrate(queryClient), - statusCode: 200, - }, - }; - } catch (error) { - return { - props: { - error: JSON.stringify(error), - initialQueryState: dehydrate(queryClient), - statusCode: 500, - }, - }; - } + if (!user.default) { + return { + props: { + initialQueryState: dehydrate(queryClient), + statusCode: 403, + }, + }; } - ); -export const getServerSideProps = makeGetServerSideProps({ roles: defaultRoles }); + return { + props: { + calculation: {}, + initialApolloState: apolloClient.cache.extract(), + initialQueryState: dehydrate(queryClient), + statusCode: 200, + user, + }, + }; + } catch (error) { + return { + props: { + error: JSON.stringify(error), + initialQueryState: dehydrate(queryClient), + statusCode: 500, + }, + }; + } +} diff --git a/apps/web/pages/unlimited.jsx b/apps/web/pages/unlimited.jsx index dc0bbce..cce59d0 100644 --- a/apps/web/pages/unlimited.jsx +++ b/apps/web/pages/unlimited.jsx @@ -1,10 +1,11 @@ -import { makeGetServerSideProps } from '.'; +import initializeApollo from '@/apollo/client'; import * as Calculation from '@/Components/Calculation'; import { Error } from '@/Components/Common/Error'; -import { unlimitedRoles } from '@/config/users'; import * as hooks from '@/process/hooks'; import { useStore } from '@/stores/hooks'; import { getPageTitle } from '@/utils/page'; +import { makeGetUserType } from '@/utils/user'; +import { dehydrate, QueryClient } from '@tanstack/react-query'; import Head from 'next/head'; function Content() { @@ -35,6 +36,42 @@ export default function Page(props) { return ; } -export const getServerSideProps = makeGetServerSideProps({ - roles: unlimitedRoles, -}); +/** @type {import('next').GetServerSideProps} */ +export async function getServerSideProps({ req }) { + const { cookie = '' } = req.headers; + + const queryClient = new QueryClient(); + const apolloClient = initializeApollo(); + const getUserType = makeGetUserType({ apolloClient, queryClient }); + + try { + const user = await getUserType({ cookie }); + + if (!user.unlimited) { + return { + props: { + initialQueryState: dehydrate(queryClient), + statusCode: 403, + }, + }; + } + + return { + props: { + calculation: {}, + initialApolloState: apolloClient.cache.extract(), + initialQueryState: dehydrate(queryClient), + statusCode: 200, + user, + }, + }; + } catch (error) { + return { + props: { + error: JSON.stringify(error), + initialQueryState: dehydrate(queryClient), + statusCode: 500, + }, + }; + } +} diff --git a/apps/web/utils/user.ts b/apps/web/utils/user.ts new file mode 100644 index 0000000..ceaa552 --- /dev/null +++ b/apps/web/utils/user.ts @@ -0,0 +1,51 @@ +import { getUser } from '@/api/user/query'; +import { adminRoles, defaultRoles, unlimitedRoles } from '@/config/users'; +import * as CRMTypes from '@/graphql/crm.types'; +import type { ApolloClient, NormalizedCache } from '@apollo/client'; +import type { QueryClient } from '@tanstack/react-query'; +import { sift } from 'radash'; + +type GetUserTypeProps = { + cookie: string; +}; + +type UserType = { + admin: boolean; + default: boolean; + unlimited: boolean; +}; + +type MakeGetUserTypeProps = { + apolloClient: ApolloClient; + queryClient: QueryClient; +}; +export function makeGetUserType({ apolloClient, queryClient }: MakeGetUserTypeProps) { + return async function ({ cookie }: GetUserTypeProps): Promise { + const user = await queryClient.fetchQuery(['user'], ({ signal }) => + getUser({ + headers: { + cookie, + }, + signal, + }) + ); + + const { + data: { systemuser }, + } = await apolloClient.query({ + fetchPolicy: 'network-only', + query: CRMTypes.GetSystemUserDocument, + variables: { + domainname: user.domainName, + }, + }); + + const roles = systemuser?.roles ? sift(systemuser?.roles)?.map((x) => x?.name) : []; + + return { + admin: adminRoles.some((x) => roles?.includes(x)), + default: defaultRoles.some((x) => roles?.includes(x)), + unlimited: unlimitedRoles.some((x) => roles?.includes(x)), + }; + }; +}