From d0acde481281bb52cf7f6079a4dba0ca3903f03d Mon Sep 17 00:00:00 2001 From: aeolian <94939382+aeolianeth@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:03:55 +1000 Subject: [PATCH] support chain_id in db --- src/components/ProjectCard.tsx | 20 ++++++++++------- src/lib/api/supabase/projects/api.ts | 12 +++++----- src/lib/apollo/serverClient.ts | 9 ++++---- src/lib/apollo/subgraphUri.ts | 22 ++++++++++++++++--- src/locales/messages.pot | 3 +++ src/models/dbProject.ts | 1 + src/packages/v4/graphql/codegen.yml | 2 +- src/packages/v4/hooks/useV4ProjectRoute.ts | 11 ++++++++++ src/types/database.types.ts | 3 +++ src/utils/sgDbProjects.ts | 1 + .../20240913212505_project_pv_v4_drop.sql | 2 ++ 11 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 src/packages/v4/hooks/useV4ProjectRoute.ts create mode 100644 supabase/migrations/20240913212505_project_pv_v4_drop.sql diff --git a/src/components/ProjectCard.tsx b/src/components/ProjectCard.tsx index 259bfda4d9..5f96ca43ce 100644 --- a/src/components/ProjectCard.tsx +++ b/src/components/ProjectCard.tsx @@ -1,16 +1,16 @@ import * as constants from '@ethersproject/constants' import { BookmarkIcon as BookmarkIconSolid } from '@heroicons/react/24/solid' import { Skeleton } from 'antd' -import { PV_V2 } from 'constants/pv' +import { PV_V2, PV_V4 } from 'constants/pv' import { useProjectHandleText } from 'hooks/useProjectHandleText' -import Link from 'next/link' -import { isHardArchived } from 'utils/archived' -import { formatDate } from 'utils/format/formatDate' - import { useProjectMetadata } from 'hooks/useProjectMetadata' import { useSubtitle } from 'hooks/useSubtitle' import { SubgraphQueryProject } from 'models/subgraphProjects' +import Link from 'next/link' import { v2v3ProjectRoute } from 'packages/v2v3/utils/routes' +import { v4ProjectRoute } from 'packages/v4/utils/routes' +import { isHardArchived } from 'utils/archived' +import { formatDate } from 'utils/format/formatDate' import { ArchivedBadge } from './ArchivedBadge' import Loading from './Loading' import ProjectLogo from './ProjectLogo' @@ -29,12 +29,11 @@ export default function ProjectCard({ handle: project?.handle, projectId: project?.projectId, }) - const subtitle = useSubtitle(metadata) if (!project) return null - const { volume, pv, handle, projectId, createdAt } = project + const { volume, pv, handle, projectId, createdAt, chainId } = project const tags = metadata?.tags // If the total paid is greater than 0, but less than 10 ETH, show two decimal places. @@ -58,7 +57,12 @@ export default function ProjectCard({ : `/p/${handle}` const projectCardUrl = - pv === PV_V2 + pv === PV_V4 + ? v4ProjectRoute({ + projectId, + chainId, + }) + : pv === PV_V2 ? v2v3ProjectRoute({ projectId, handle, diff --git a/src/lib/api/supabase/projects/api.ts b/src/lib/api/supabase/projects/api.ts index 76deeece76..e0669a8c9c 100644 --- a/src/lib/api/supabase/projects/api.ts +++ b/src/lib/api/supabase/projects/api.ts @@ -9,7 +9,7 @@ import { } from 'generated/graphql' import { paginateDepleteQuery } from 'lib/apollo/paginateDepleteQuery' -import { serverClient, v4ServerClient } from 'lib/apollo/serverClient' +import { serverClient, v4SepoliaServerClient } from 'lib/apollo/serverClient' import { DBProject, DBProjectQueryOpts, SGSBCompareKey } from 'models/dbProject' import { Json } from 'models/json' import { NextApiRequest, NextApiResponse } from 'next' @@ -25,34 +25,36 @@ import { formatSGProjectForDB, parseDBProjectsRow, } from 'utils/sgDbProjects' +import { sepolia } from 'viem/chains' import { dbProjects } from '../clients' /** * Query all projects from subgraph using apollo serverClient which is safe to use in edge runtime. */ export async function queryAllSGProjectsForServer() { - const [res, resV4] = await Promise.all([ + const [res, resSepoliaV4] = await Promise.all([ paginateDepleteQuery({ client: serverClient, document: DbProjectsDocument, }), paginateDepleteQuery({ - client: v4ServerClient, + client: v4SepoliaServerClient, document: Dbv4ProjectsDocument, }), ]) // Response must be retyped with Json<>, because the serverClient does not perform the parsing expected by generated types const _res = res as unknown as Json>[] - const _resV4 = resV4.map(p => { + const _resSepoliaV4 = resSepoliaV4.map(p => { return { ...p, id: getSubgraphIdForProject(PV_V4, p.projectId), // Patch in the subgraph ID for V4 projects (to be consitent with legacy subgraph) pv: PV_V4, // Patch in the PV for V4 projects, metadataUri: p.metadata, + chainId: sepolia.id, } }) as unknown as Json>[] - return [..._res, ..._resV4].map(formatSGProjectForDB) + return [..._res, ..._resSepoliaV4].map(formatSGProjectForDB) } /** diff --git a/src/lib/apollo/serverClient.ts b/src/lib/apollo/serverClient.ts index 64617ecd3d..7cf67db4c4 100644 --- a/src/lib/apollo/serverClient.ts +++ b/src/lib/apollo/serverClient.ts @@ -1,10 +1,11 @@ import { ApolloClient, InMemoryCache } from '@apollo/client' +import { sepolia } from 'viem/chains' import { subgraphUri, v4SubgraphUri } from './subgraphUri' /** * Unlike `client`, `serverClient` is safe to use in the edge runtime. - * However, this client does not perform parsing on the response, + * However, this client does not perform parsing on the response, * meaning returned objects may not match the auto-generated types. */ const serverClient = new ApolloClient({ @@ -12,9 +13,9 @@ const serverClient = new ApolloClient({ cache: new InMemoryCache(), }) -const v4ServerClient = new ApolloClient({ - uri: v4SubgraphUri(), +const v4SepoliaServerClient = new ApolloClient({ + uri: v4SubgraphUri(sepolia.id), cache: new InMemoryCache(), }) -export { serverClient, v4ServerClient } +export { serverClient, v4SepoliaServerClient } diff --git a/src/lib/apollo/subgraphUri.ts b/src/lib/apollo/subgraphUri.ts index e5880aa384..5f22d28f13 100644 --- a/src/lib/apollo/subgraphUri.ts +++ b/src/lib/apollo/subgraphUri.ts @@ -1,4 +1,7 @@ +import { JBChainId } from 'juice-sdk-react' +import process from 'process' import { isBrowser } from 'utils/isBrowser' +import { sepolia } from 'viem/chains' export const subgraphUri = () => { let uri: string | undefined @@ -24,17 +27,30 @@ export const subgraphUri = () => { return url.href } -export const v4SubgraphUri = () => { +export const v4SubgraphUri = (chainId: JBChainId) => { let uri: string | undefined + + const env: { + [k in JBChainId]?: { + browser?: string + server?: string + } + } = { + [sepolia.id]: { + browser: process.env.NEXT_PUBLIC_V4_SEPOLIA_SUBGRAPH_URL, + server: process.env.V4_SEPOLIA_SUBGRAPH_URL, + }, + } as const + if (isBrowser()) { - uri = process.env.NEXT_PUBLIC_V4_SUBGRAPH_URL + uri = env?.[chainId]?.browser if (!uri) { throw new Error( 'NEXT_PUBLIC_V4_SUBGRAPH_URL environment variable not defined', ) } } else { - uri = process.env.V4_SUBGRAPH_URL + uri = env?.[chainId]?.server if (!uri) { throw new Error('V4_SUBGRAPH_URL environment variable not defined') } diff --git a/src/locales/messages.pot b/src/locales/messages.pot index 91a9ce5d62..a6d5c40ccf 100644 --- a/src/locales/messages.pot +++ b/src/locales/messages.pot @@ -3104,6 +3104,9 @@ msgstr "" msgid "Unwatch" msgstr "" +msgid "V4" +msgstr "" + msgid "Locked until <0>{value}" msgstr "" diff --git a/src/models/dbProject.ts b/src/models/dbProject.ts index 5deb193a58..4bdd1ecec9 100644 --- a/src/models/dbProject.ts +++ b/src/models/dbProject.ts @@ -36,6 +36,7 @@ export type DBProject = { projectId: number createdAt: number pv: PV + chainId: number handle: string | null metadataUri: string | null diff --git a/src/packages/v4/graphql/codegen.yml b/src/packages/v4/graphql/codegen.yml index 406a351c79..f2cd24e8f9 100644 --- a/src/packages/v4/graphql/codegen.yml +++ b/src/packages/v4/graphql/codegen.yml @@ -1,5 +1,5 @@ overwrite: true -schema: ${NEXT_PUBLIC_V4_SUBGRAPH_URL} +schema: ${NEXT_PUBLIC_V4_SEPOLIA_SUBGRAPH_URL} documents: 'src/packages/v4/graphql/queries/**/*.graphql' generates: src/packages/v4/graphql/client/: diff --git a/src/packages/v4/hooks/useV4ProjectRoute.ts b/src/packages/v4/hooks/useV4ProjectRoute.ts new file mode 100644 index 0000000000..1e032acb8b --- /dev/null +++ b/src/packages/v4/hooks/useV4ProjectRoute.ts @@ -0,0 +1,11 @@ +import { useChainId } from 'wagmi' +import { v4ProjectRoute } from '../utils/routes' + +export function useV4ProjectRoute(projectId: number) { + const chainId = useChainId() + + return v4ProjectRoute({ + chainId, + projectId, + }) +} diff --git a/src/types/database.types.ts b/src/types/database.types.ts index 66018c63de..8bb0c1630a 100644 --- a/src/types/database.types.ts +++ b/src/types/database.types.ts @@ -191,6 +191,7 @@ export type Database = { payments_count: number project_id: number pv: string + chain_id: number redeem_count: number redeem_volume: string redeem_voume_usd: string @@ -224,6 +225,7 @@ export type Database = { payments_count: number project_id: number pv: string + chain_id: number redeem_count: number redeem_volume: string redeem_voume_usd: string @@ -257,6 +259,7 @@ export type Database = { payments_count?: number project_id?: number pv?: string + chain_id?: number redeem_count?: number redeem_volume?: string redeem_voume_usd?: string diff --git a/src/utils/sgDbProjects.ts b/src/utils/sgDbProjects.ts index 53ed23dd82..a2a2a41cc5 100644 --- a/src/utils/sgDbProjects.ts +++ b/src/utils/sgDbProjects.ts @@ -122,6 +122,7 @@ export function formatDBProjectRow( payments_count: p.paymentsCount, project_id: p.projectId, pv: p.pv, + chain_id: p.chainId, redeem_count: p.redeemCount, redeem_volume: p.redeemVolume, redeem_voume_usd: p.redeemVolumeUSD, diff --git a/supabase/migrations/20240913212505_project_pv_v4_drop.sql b/supabase/migrations/20240913212505_project_pv_v4_drop.sql new file mode 100644 index 0000000000..1c76770b44 --- /dev/null +++ b/supabase/migrations/20240913212505_project_pv_v4_drop.sql @@ -0,0 +1,2 @@ +ALTER TABLE public.projects +add COLUMN "chain_id" int \ No newline at end of file