From b0d3c0593a20b885248507fce06002b51dd3d50d Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Tue, 4 Feb 2025 16:01:28 +0530 Subject: [PATCH 1/5] Enable add domain button for auctions --- .../org-slug/projects/id/settings/Domains.tsx | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/packages/frontend/src/pages/org-slug/projects/id/settings/Domains.tsx b/packages/frontend/src/pages/org-slug/projects/id/settings/Domains.tsx index 01e98c6c..0de97ac0 100644 --- a/packages/frontend/src/pages/org-slug/projects/id/settings/Domains.tsx +++ b/packages/frontend/src/pages/org-slug/projects/id/settings/Domains.tsx @@ -60,39 +60,31 @@ const Domains = () => { return ( } - size="md" - > - Add domain - - ), - })} + button={ + + } > - {project.auctionId ? ( -

- Custom domains not supported for auction driven deployments. -

- ) : ( - domains.map((domain) => { - return ( - - ); - }) - )} + {domains.map((domain) => { + return ( + + ); + })}
); }; -- 2.45.2 From 93b74074a3da08b6151d75f38a14b8134f2b62ab Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Tue, 4 Feb 2025 16:20:27 +0530 Subject: [PATCH 2/5] Handle auction deployment when changing to production --- packages/backend/src/service.ts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/service.ts b/packages/backend/src/service.ts index 0321df01..207aabfe 100644 --- a/packages/backend/src/service.ts +++ b/packages/backend/src/service.ts @@ -644,15 +644,20 @@ export class Service { const octokit = await this.getOctokit(user.id); - const newDeployment = await this.createDeployment(user.id, octokit, { - project: oldDeployment.project, - branch: oldDeployment.branch, - environment: Environment.Production, - commitHash: oldDeployment.commitHash, - commitMessage: oldDeployment.commitMessage, - deployer: oldDeployment.deployer - }); + let newDeployment: Deployment; + if (oldDeployment.project.auctionId) { + newDeployment = await this.createDeploymentFromAuction(oldDeployment.project, oldDeployment.deployer); + } else { + newDeployment = await this.createDeployment(user.id, octokit, { + project: oldDeployment.project, + branch: oldDeployment.branch, + environment: Environment.Production, + commitHash: oldDeployment.commitHash, + commitMessage: oldDeployment.commitMessage, + deployer: oldDeployment.deployer + }); + } return newDeployment; } -- 2.45.2 From 13cc0f8b9bc193e169bb5af79c0c732f7e0e9465 Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Wed, 5 Feb 2025 12:51:23 +0530 Subject: [PATCH 3/5] Add UI to show multiple domains --- packages/backend/src/schema.gql | 1 + .../projects/project/settings/DomainCard.tsx | 107 ++++++++++----- .../frontend/src/pages/components/modals.tsx | 2 + .../id/settings/domains/add/Config.tsx | 126 +++++++++++------- .../frontend/src/stories/MockStoriesData.ts | 2 + packages/gql-client/src/queries.ts | 8 ++ packages/gql-client/src/types.ts | 1 + 7 files changed, 171 insertions(+), 76 deletions(-) diff --git a/packages/backend/src/schema.gql b/packages/backend/src/schema.gql index 400e36ef..1404adef 100644 --- a/packages/backend/src/schema.gql +++ b/packages/backend/src/schema.gql @@ -111,6 +111,7 @@ type Deployment { isCurrent: Boolean! baseDomain: String status: DeploymentStatus! + dnsRecordData: DNSRecordAttributes createdAt: String! updatedAt: String! createdBy: User! diff --git a/packages/frontend/src/components/projects/project/settings/DomainCard.tsx b/packages/frontend/src/components/projects/project/settings/DomainCard.tsx index 2fe0b05d..8b32eeca 100644 --- a/packages/frontend/src/components/projects/project/settings/DomainCard.tsx +++ b/packages/frontend/src/components/projects/project/settings/DomainCard.tsx @@ -8,13 +8,14 @@ import { MenuList, MenuItem, Card, + Tooltip, } from '@snowballtools/material-tailwind-react-fork'; import EditDomainDialog from './EditDomainDialog'; import { useGQLClient } from 'context/GQLClientContext'; import { DeleteDomainDialog } from 'components/projects/Dialog/DeleteDomainDialog'; import { useToast } from 'components/shared/Toast'; -import { GearIcon } from 'components/shared/CustomIcon'; +import { GearIcon, InfoRoundFilledIcon } from 'components/shared/CustomIcon'; import { Heading } from 'components/shared/Heading'; import { Button } from 'components/shared/Button'; import { useParams } from 'react-router-dom'; @@ -44,7 +45,6 @@ interface DomainCardProps { onUpdate: () => Promise; } - const DomainCard = ({ domains, domain, @@ -56,7 +56,9 @@ const DomainCard = ({ const { id } = useParams(); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [editDialogOpen, setEditDialogOpen] = useState(false); - const [dnsRecord, setDnsRecord] = useState(null); + const [dnsRecordsWithLRN, setDnsRecordsWithLRN] = useState< + { dnsRecord: DNSRecordAttributes; deployerLRN: string }[] + >([]); // const [refreshStatus, SetRefreshStatus] = useState(RefreshStatus.IDLE); const client = useGQLClient(); @@ -94,9 +96,26 @@ const DomainCard = ({ return; } - const dnsRecordResponse = await client.getLatestDNSRecordByProjectId(id); + const dnsRecordResponse = await client.getProject(id); - setDnsRecord(dnsRecordResponse.latestDNSRecord); + if (!dnsRecordResponse.project) { + return; + } + + const tempDNSRecords: { + dnsRecord: DNSRecordAttributes; + deployerLRN: string; + }[] = []; + for (const deployment of dnsRecordResponse.project.deployments) { + if (deployment.dnsRecordData.value) { + tempDNSRecords.push({ + dnsRecord: deployment.dnsRecordData, + deployerLRN: deployment.deployer.deployerLrn, + }); + } + } + + setDnsRecordsWithLRN(tempDNSRecords); }; fetchDNSData(); @@ -182,11 +201,16 @@ const DomainCard = ({ Production {domain.status === DomainStatus.Pending && ( - {/* {refreshStatus === RefreshStatus.IDLE ? ( */} - - ^ Add these records to your domain {/* and refresh to check */} - - {/* ) : refreshStatus === RefreshStatus.CHECKING ? ( + {dnsRecordsWithLRN.length ? ( + <> + {/* {refreshStatus === RefreshStatus.IDLE ? ( */} + +

+ ^ Add these records to your domain{' '} + {/* and refresh to check */} +

+
+ {/* ) : refreshStatus === RefreshStatus.CHECKING ? ( ^ Checking records for {domain.name} @@ -199,26 +223,49 @@ const DomainCard = ({ )} */} - - - - - - - - - - {dnsRecord ? ( - - - - - - ) : ( -

DNS record data not available

- )} - -
TypeNameValue
{dnsRecord.resourceType}@{dnsRecord.value ?? 'Not Configured'}
+ + + + + + + + + + {dnsRecordsWithLRN.map((record) => { + return ( + <> + + + +

+ Service Provider: +

+

+ {record.deployerLRN} +

+ + } + > +
+ + + + + + + + ); + })} +
TypeNameValue
+ + {record.dnsRecord.resourceType}@{record.dnsRecord.value}
+ + ) : ( +

DNS record data not available

+ )}
)} diff --git a/packages/frontend/src/pages/components/modals.tsx b/packages/frontend/src/pages/components/modals.tsx index 2b291a9f..39e18dc4 100644 --- a/packages/frontend/src/pages/components/modals.tsx +++ b/packages/frontend/src/pages/components/modals.tsx @@ -13,6 +13,7 @@ import { AppDeploymentRecordAttributes, Deployment, DeploymentStatus, + DNSRecordAttributes, Domain, DomainStatus, Environment, @@ -50,6 +51,7 @@ const deployment: Deployment = { applicationDeploymentRequestId: 'bafyreiaycvq6imoppnpwdve4smj6t6ql5svt5zl3x6rimu4qwyzgjorize', applicationDeploymentRecordData: {} as AppDeploymentRecordAttributes, + dnsRecordData: {} as DNSRecordAttributes, }; const domains: Domain[] = [ diff --git a/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx b/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx index b56fae5b..e8e28b7c 100644 --- a/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx +++ b/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx @@ -18,7 +18,9 @@ const Config = () => { const primaryDomainName = searchParams.get('name'); const { toast, dismiss } = useToast(); - const [dnsRecord, setDnsRecord] = useState(null); + const [dnsRecordsWithLRN, setDnsRecordsWithLRN] = useState< + { dnsRecord: DNSRecordAttributes; deployerLRN: string }[] + >([]); const handleSubmitDomain = async () => { if (primaryDomainName === null) { @@ -75,68 +77,100 @@ const Config = () => { return; } - const dnsRecordResponse = await client.getLatestDNSRecordByProjectId(id); + const dnsRecordResponse = await client.getProject(id); - setDnsRecord(dnsRecordResponse.latestDNSRecord); + if (!dnsRecordResponse.project) { + return; + } + + const tempDNSRecords: { + dnsRecord: DNSRecordAttributes; + deployerLRN: string; + }[] = []; + for (const deployment of dnsRecordResponse.project.deployments) { + if (deployment.dnsRecordData.value) { + tempDNSRecords.push({ + dnsRecord: deployment.dnsRecordData, + deployerLRN: deployment.deployer.deployerLrn, + }); + } + } + + setDnsRecordsWithLRN(tempDNSRecords); + + // console.log('DNS RECORD', dnsRecordResponse) + + // setDnsRecord({} as DNSRecordAttributes); }; fetchDNSData(); }, [id, client]); // TODO: Figure out DNS Provider if possible and update appropriatly + // TODO: Handle case where dnsRecords only have one entry and IP address for that record is not availble return ( - {dnsRecord ? ( + {dnsRecordsWithLRN.length ? ( <>

Add the following records to your domain.

- - - - - Type - Host - Value - - - - - - - {dnsRecord.resourceType} - - @ - -

- {dnsRecord.value ?? 'Not available'} -

-
-
-
-
- - {dnsRecord?.value && ( - - )} - + {dnsRecordsWithLRN.map((record) => { + if (record.dnsRecord.value) { + return ( + <> +
+

Service Provider:

+

+ {record.deployerLRN} +

+
+ + + + Type + Host + Value + + + + + + {record.dnsRecord.resourceType} + + @ + +

{record.dnsRecord.value}

+
+
+
+
+ + ); + } + })} ) : (

DNS record data not available

)} + {dnsRecordsWithLRN.length && ( + + )} + + ;
); }; diff --git a/packages/frontend/src/stories/MockStoriesData.ts b/packages/frontend/src/stories/MockStoriesData.ts index 97f63a14..5cee191e 100644 --- a/packages/frontend/src/stories/MockStoriesData.ts +++ b/packages/frontend/src/stories/MockStoriesData.ts @@ -13,6 +13,7 @@ import { Environment, Permission, AppDeploymentRecordAttributes, + DNSRecordAttributes, } from 'gql-client'; export const user: User = { @@ -112,6 +113,7 @@ export const deployment0: Deployment = { applicationDeploymentRequestId: 'bafyreiaycvq6imoppnpwdve4smj6t6ql5svt5zl3x6rimu4qwyzgjorize', applicationDeploymentRecordData: {} as AppDeploymentRecordAttributes, + dnsRecordData: {} as DNSRecordAttributes, }; export const project: Project = { diff --git a/packages/gql-client/src/queries.ts b/packages/gql-client/src/queries.ts index 2af5a1e3..0459b3c4 100644 --- a/packages/gql-client/src/queries.ts +++ b/packages/gql-client/src/queries.ts @@ -62,11 +62,19 @@ query ($projectId: String!) { } deployer { baseDomain + deployerLrn } createdBy { id name } + dnsRecordData { + name + value + request + resourceType + version + } } } } diff --git a/packages/gql-client/src/types.ts b/packages/gql-client/src/types.ts index 2370b414..12aa63a1 100644 --- a/packages/gql-client/src/types.ts +++ b/packages/gql-client/src/types.ts @@ -112,6 +112,7 @@ export type Deployment = { createdBy: User; createdAt: string; updatedAt: string; + dnsRecordData: DNSRecordAttributes; applicationDeploymentRequestId: string; }; -- 2.45.2 From 285d0e86bf7b0022a1d5f524998c47cd313435ad Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Wed, 5 Feb 2025 16:02:47 +0530 Subject: [PATCH 4/5] Add custom domain support for auctions flow --- packages/backend/src/resolvers.ts | 5 +++-- packages/backend/src/service.ts | 4 ++++ .../projects/project/deployments/DeploymentMenu.tsx | 1 + packages/gql-client/src/client.ts | 4 +++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/resolvers.ts b/packages/backend/src/resolvers.ts index d9f9128d..401f3c67 100644 --- a/packages/backend/src/resolvers.ts +++ b/packages/backend/src/resolvers.ts @@ -345,10 +345,11 @@ export const createResolvers = async (service: Service): Promise => { { projectId, deploymentId, - }: { deploymentId: string; projectId: string }, + deployerId, + }: { deploymentId: string; projectId: string, deployerId: string }, ) => { try { - return await service.rollbackDeployment(projectId, deploymentId); + return await service.rollbackDeployment(projectId, deploymentId, deployerId); } catch (err) { log(err); return false; diff --git a/packages/backend/src/service.ts b/packages/backend/src/service.ts index 207aabfe..4ae6a5b8 100644 --- a/packages/backend/src/service.ts +++ b/packages/backend/src/service.ts @@ -1193,6 +1193,7 @@ export class Service { async rollbackDeployment( projectId: string, deploymentId: string, + deployerId: string, ): Promise { // TODO: Implement transactions const oldCurrentDeployment = await this.db.getDeployment({ @@ -1204,6 +1205,9 @@ export class Service { project: { id: projectId, }, + deployer: { + deployerId + }, isCurrent: true, isCanonical: false, }, diff --git a/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx b/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx index cb87aa98..fad462ee 100644 --- a/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx +++ b/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx @@ -99,6 +99,7 @@ export const DeploymentMenu = ({ const isRollbacked = await client.rollbackDeployment( project.id, deployment.id, + deployment.deployer.deployerId ); if (isRollbacked.rollbackDeployment) { await onUpdate(); diff --git a/packages/gql-client/src/client.ts b/packages/gql-client/src/client.ts index 49ddbb60..7d272670 100644 --- a/packages/gql-client/src/client.ts +++ b/packages/gql-client/src/client.ts @@ -337,13 +337,15 @@ export class GQLClient { async rollbackDeployment( projectId: string, - deploymentId: string + deploymentId: string, + deployerId: string, ): Promise { const { data } = await this.client.mutate({ mutation: mutations.rollbackDeployment, variables: { projectId, deploymentId, + deployerId, }, }); -- 2.45.2 From d93afb564b513471414e37fe76049f40a2d6e3af Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Fri, 7 Feb 2025 10:31:51 +0530 Subject: [PATCH 5/5] Use deployer LRN instead of ID in rollback deployment --- packages/backend/src/resolvers.ts | 6 +++--- packages/backend/src/service.ts | 4 ++-- .../projects/project/deployments/DeploymentMenu.tsx | 2 +- .../org-slug/projects/id/settings/domains/add/Config.tsx | 6 ------ packages/gql-client/src/client.ts | 4 ++-- packages/gql-client/src/mutations.ts | 4 ++-- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/packages/backend/src/resolvers.ts b/packages/backend/src/resolvers.ts index 401f3c67..c07723cc 100644 --- a/packages/backend/src/resolvers.ts +++ b/packages/backend/src/resolvers.ts @@ -345,11 +345,11 @@ export const createResolvers = async (service: Service): Promise => { { projectId, deploymentId, - deployerId, - }: { deploymentId: string; projectId: string, deployerId: string }, + deployerLrn, + }: { deploymentId: string; projectId: string, deployerLrn: string }, ) => { try { - return await service.rollbackDeployment(projectId, deploymentId, deployerId); + return await service.rollbackDeployment(projectId, deploymentId, deployerLrn); } catch (err) { log(err); return false; diff --git a/packages/backend/src/service.ts b/packages/backend/src/service.ts index 4ae6a5b8..7667164a 100644 --- a/packages/backend/src/service.ts +++ b/packages/backend/src/service.ts @@ -1193,7 +1193,7 @@ export class Service { async rollbackDeployment( projectId: string, deploymentId: string, - deployerId: string, + deployerLrn: string, ): Promise { // TODO: Implement transactions const oldCurrentDeployment = await this.db.getDeployment({ @@ -1206,7 +1206,7 @@ export class Service { id: projectId, }, deployer: { - deployerId + deployerLrn }, isCurrent: true, isCanonical: false, diff --git a/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx b/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx index fad462ee..5f2428b5 100644 --- a/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx +++ b/packages/frontend/src/components/projects/project/deployments/DeploymentMenu.tsx @@ -99,7 +99,7 @@ export const DeploymentMenu = ({ const isRollbacked = await client.rollbackDeployment( project.id, deployment.id, - deployment.deployer.deployerId + deployment.deployer.deployerLrn ); if (isRollbacked.rollbackDeployment) { await onUpdate(); diff --git a/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx b/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx index e8e28b7c..75895268 100644 --- a/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx +++ b/packages/frontend/src/pages/org-slug/projects/id/settings/domains/add/Config.tsx @@ -97,17 +97,12 @@ const Config = () => { } setDnsRecordsWithLRN(tempDNSRecords); - - // console.log('DNS RECORD', dnsRecordResponse) - - // setDnsRecord({} as DNSRecordAttributes); }; fetchDNSData(); }, [id, client]); // TODO: Figure out DNS Provider if possible and update appropriatly - // TODO: Handle case where dnsRecords only have one entry and IP address for that record is not availble return ( {dnsRecordsWithLRN.length ? ( @@ -170,7 +165,6 @@ const Config = () => { > FINISH - ; ); }; diff --git a/packages/gql-client/src/client.ts b/packages/gql-client/src/client.ts index 7d272670..7ba014cf 100644 --- a/packages/gql-client/src/client.ts +++ b/packages/gql-client/src/client.ts @@ -338,14 +338,14 @@ export class GQLClient { async rollbackDeployment( projectId: string, deploymentId: string, - deployerId: string, + deployerLrn: string, ): Promise { const { data } = await this.client.mutate({ mutation: mutations.rollbackDeployment, variables: { projectId, deploymentId, - deployerId, + deployerLrn, }, }); diff --git a/packages/gql-client/src/mutations.ts b/packages/gql-client/src/mutations.ts index 876e5611..d87c0f00 100644 --- a/packages/gql-client/src/mutations.ts +++ b/packages/gql-client/src/mutations.ts @@ -95,8 +95,8 @@ export const deleteDomain = gql` `; export const rollbackDeployment = gql` - mutation ($projectId: String!, $deploymentId: String!) { - rollbackDeployment(projectId: $projectId, deploymentId: $deploymentId) + mutation ($projectId: String!, $deployerLrn: String!) { + rollbackDeployment(projectId: $projectId, deployerLrn: $deployerLrn) } `; -- 2.45.2