From 3d9aedeb7e830632f08ab784867a3add4b0b09a0 Mon Sep 17 00:00:00 2001 From: nabarun Date: Wed, 23 Oct 2024 15:36:19 +0000 Subject: [PATCH] List deployer LRNs in deployment configuration step (#11) Part of [Service provider auctions for web deployments](https://www.notion.so/Service-provider-auctions-for-web-deployments-104a6b22d47280dbad51d28aa3a91d75) - Fix request Id being set to `null` while fetching build logs - Populate deployer LRNs dropdown with LRNs fetched from registry in configure delpoyment step ![image](/attachments/ff421bdf-6e0b-443e-9dc8-455bde481b4f) ![image](/attachments/87c9bce3-3743-4f4a-a997-a02a3504e61e) ![image](/attachments/dd442fe6-ad30-4723-a2bb-0723ad3eb3c9) ![image](/attachments/37f0da01-671f-4e3a-92e4-b34e25566a0d) Co-authored-by: IshaVenikar Co-authored-by: Neeraj Reviewed-on: https://git.vdb.to/cerc-io/snowballtools-base/pulls/11 --- packages/backend/src/database.ts | 20 +-- packages/backend/src/entity/Deployer.ts | 4 +- packages/backend/src/entity/Deployment.ts | 2 +- packages/backend/src/index.ts | 2 +- packages/backend/src/registry.ts | 1 + packages/backend/src/resolvers.ts | 4 + packages/backend/src/schema.gql | 3 +- packages/backend/src/service.ts | 116 +++++++++--------- .../backend/test/publish-deploy-records.ts | 4 +- .../Dialog/DeleteDeploymentDialog.tsx | 40 ++++++ .../components/projects/create/Configure.tsx | 86 +++++++------ .../deployments/DeploymentDetailsCard.tsx | 12 +- .../project/deployments/DeploymentMenu.tsx | 25 ++-- .../project/overview/Activity/AuctionCard.tsx | 73 +++++++---- packages/gql-client/src/client.ts | 8 ++ packages/gql-client/src/queries.ts | 26 ++-- packages/gql-client/src/types.ts | 8 +- 17 files changed, 273 insertions(+), 161 deletions(-) create mode 100644 packages/frontend/src/components/projects/Dialog/DeleteDeploymentDialog.tsx diff --git a/packages/backend/src/database.ts b/packages/backend/src/database.ts index 7bcd77bc..8bf75d32 100644 --- a/packages/backend/src/database.ts +++ b/packages/backend/src/database.ts @@ -34,9 +34,8 @@ const nanoid = customAlphabet(lowercase + numbers, 8); // TODO: Fix order of methods export class Database { private dataSource: DataSource; - private projectDomain: string; - constructor({ dbPath }: DatabaseConfig, { projectDomain }: MiscConfig) { + constructor({ dbPath }: DatabaseConfig) { this.dataSource = new DataSource({ type: 'better-sqlite3', database: dbPath, @@ -44,8 +43,6 @@ export class Database { synchronize: true, logging: false }); - - this.projectDomain = projectDomain; } async init(): Promise { @@ -491,13 +488,13 @@ export class Database { return projectRepository.save(newProject); } - async saveProject (project: Project): Promise { + async saveProject(project: Project): Promise { const projectRepository = this.dataSource.getRepository(Project); return projectRepository.save(project); } - async updateProjectById ( + async updateProjectById( projectId: string, data: DeepPartial ): Promise { @@ -583,17 +580,22 @@ export class Database { return domains; } - async addDeployer (data: DeepPartial): Promise { + async addDeployer(data: DeepPartial): Promise { const deployerRepository = this.dataSource.getRepository(Deployer); const newDomain = await deployerRepository.save(data); return newDomain; } - async getDeployerById (deployerId: string): Promise { + async getDeployers(): Promise { const deployerRepository = this.dataSource.getRepository(Deployer); + const deployers = await deployerRepository.find(); + return deployers; + } - const deployer = await deployerRepository.findOne({ where: { deployerId } }); + async getDeployerByLRN(deployerLrn: string): Promise { + const deployerRepository = this.dataSource.getRepository(Deployer); + const deployer = await deployerRepository.findOne({ where: { deployerLrn } }); return deployer; } diff --git a/packages/backend/src/entity/Deployer.ts b/packages/backend/src/entity/Deployer.ts index bdb920e3..854ab1dd 100644 --- a/packages/backend/src/entity/Deployer.ts +++ b/packages/backend/src/entity/Deployer.ts @@ -4,10 +4,10 @@ import { Project } from './Project'; @Entity() export class Deployer { @PrimaryColumn('varchar') - deployerId!: string; + deployerLrn!: string; @Column('varchar') - deployerLrn!: string; + deployerId!: string; @Column('varchar') deployerApiUrl!: string; diff --git a/packages/backend/src/entity/Deployment.ts b/packages/backend/src/entity/Deployment.ts index 21bfb4e4..5efb28b4 100644 --- a/packages/backend/src/entity/Deployment.ts +++ b/packages/backend/src/entity/Deployment.ts @@ -129,7 +129,7 @@ export class Deployment { applicationDeploymentRemovalRecordData!: AppDeploymentRemovalRecordAttributes | null; @ManyToOne(() => Deployer) - @JoinColumn({ name: 'deployerId' }) + @JoinColumn({ name: 'deployerLrn' }) deployer!: Deployer; @Column({ diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index c6f0b3c6..629bd6e7 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -25,7 +25,7 @@ export const main = async (): Promise => { clientSecret: gitHub.oAuth.clientSecret, }); - const db = new Database(database, misc); + const db = new Database(database); await db.init(); const registry = new Registry(registryConfig); diff --git a/packages/backend/src/registry.ts b/packages/backend/src/registry.ts index f4df1353..9371baaa 100644 --- a/packages/backend/src/registry.ts +++ b/packages/backend/src/registry.ts @@ -283,6 +283,7 @@ export class Registry { this.registryConfig.privateKey, fee ); + log(`Application deployment request record published: ${result.id}`); log('Application deployment request data:', applicationDeploymentRequest); diff --git a/packages/backend/src/resolvers.ts b/packages/backend/src/resolvers.ts index 067a9f72..b4c2c01c 100644 --- a/packages/backend/src/resolvers.ts +++ b/packages/backend/src/resolvers.ts @@ -76,6 +76,10 @@ export const createResolvers = async (service: Service): Promise => { ) => { return service.getAuctionData(auctionId); }, + + deployers: async (_: any, __: any, context: any) => { + return service.getDeployers(); + }, }, // TODO: Return error in GQL response diff --git a/packages/backend/src/schema.gql b/packages/backend/src/schema.gql index 4a63e584..5cead09e 100644 --- a/packages/backend/src/schema.gql +++ b/packages/backend/src/schema.gql @@ -134,8 +134,8 @@ type EnvironmentVariable { } type Deployer { - deployerId: String! deployerLrn: String! + deployerId: String! deployerApiUrl: String! createdAt: String! updatedAt: String! @@ -257,6 +257,7 @@ type Query { searchProjects(searchText: String!): [Project!] getAuctionData(auctionId: String!): Auction! domains(projectId: String!, filter: FilterDomainsInput): [Domain] + deployers: [Deployer] } type Mutation { diff --git a/packages/backend/src/service.ts b/packages/backend/src/service.ts index 318e0c9b..bcd7e4b8 100644 --- a/packages/backend/src/service.ts +++ b/packages/backend/src/service.ts @@ -21,6 +21,7 @@ import { AppDeploymentRecord, AppDeploymentRemovalRecord, AuctionParams, + DeployerRecord, EnvironmentVariables, GitPushEventPayload, } from './types'; @@ -309,35 +310,13 @@ export class Service { if (!deployerRecords) { log(`No winning deployer for auction ${project!.auctionId}`); } else { - const deployerIds = []; - - for (const record of deployerRecords) { - const deployerId = record.id; - const deployerLrn = record.names[0]; - - deployerIds.push(deployerId); - - const deployerApiUrl = record.attributes.apiUrl; - const baseDomain = deployerApiUrl.substring(deployerApiUrl.indexOf('.') + 1); - - const deployerData = { - deployerId, - deployerLrn, - deployerApiUrl, - baseDomain - }; - - // Store the deployer in the DB - const deployer = await this.db.addDeployer(deployerData); - + const deployers = await this.saveDeployersByDeployerRecords(deployerRecords); + for (const deployer of deployers) { + log(`Creating deployment for deployer ${deployer.deployerLrn}`); + await this.createDeploymentFromAuction(project, deployer); // Update project with deployer await this.updateProjectWithDeployer(project.id, deployer); } - - for (const deployer of deployerIds) { - log(`Creating deployment for deployer LRN ${deployer}`); - await this.createDeploymentFromAuction(project, deployer); - } } } @@ -644,12 +623,12 @@ export class Service { let deployer; if (deployerLrn) { - deployer = await this.createDeployerFromLRN(deployerLrn); + deployer = await this.db.getDeployerByLRN(deployerLrn); } else { deployer = data.deployer; } - const newDeployment = await this.createDeploymentFromData(userId, data, deployer!.deployerId!, applicationRecordId, applicationRecordData); + const newDeployment = await this.createDeploymentFromData(userId, data, deployer!.deployerLrn!, applicationRecordId, applicationRecordData); const { repo, repoUrl } = await getRepoDetails(octokit, data.project.repository, data.commitHash); const environmentVariablesObj = await this.getEnvVariables(data.project!.id!); @@ -687,7 +666,7 @@ export class Service { async createDeploymentFromAuction( project: DeepPartial, - deployerId: string + deployer: Deployer ): Promise { const octokit = await this.getOctokit(project.ownerId!); const [owner, repo] = project.repository!.split('/'); @@ -713,7 +692,6 @@ export class Service { const applicationRecordId = record.id; const applicationRecordData = record.attributes; - const deployer = await this.db.getDeployerById(deployerId); const deployerLrn = deployer!.deployerLrn // Create deployment with prod branch and latest commit @@ -726,7 +704,7 @@ export class Service { commitMessage: latestCommit.commit.message, }; - const newDeployment = await this.createDeploymentFromData(project.ownerId!, deploymentData, deployerId, applicationRecordId, applicationRecordData); + const newDeployment = await this.createDeploymentFromData(project.ownerId!, deploymentData, deployerLrn, applicationRecordId, applicationRecordData); const environmentVariablesObj = await this.getEnvVariables(project!.id!); // To set project DNS @@ -767,7 +745,7 @@ export class Service { async createDeploymentFromData( userId: string, data: DeepPartial, - deployerId: string, + deployerLrn: string, applicationRecordId: string, applicationRecordData: ApplicationRecord, ): Promise { @@ -785,7 +763,7 @@ export class Service { id: userId, }), deployer: Object.assign(new Deployer(), { - deployerId, + deployerLrn, }), }); @@ -794,30 +772,6 @@ export class Service { return newDeployment; } - async createDeployerFromLRN(deployerLrn: string): Promise { - const records = await this.laconicRegistry.getRecordsByName(deployerLrn); - - if (records.length === 0) { - log('No records found for deployer LRN:', deployerLrn); - return null; - } - - const deployerId = records[0].id; - const deployerApiUrl = records[0].attributes.apiUrl; - const baseDomain = deployerApiUrl.substring(deployerApiUrl.indexOf('.') + 1); - - const deployerData = { - deployerId, - deployerLrn, - deployerApiUrl, - baseDomain - }; - - const deployer = await this.db.addDeployer(deployerData); - - return deployer; - } - async updateProjectWithDeployer( projectId: string, deployer: Deployer @@ -1089,7 +1043,7 @@ export class Service { let newDeployment: Deployment; if (oldDeployment.project.auctionId) { - newDeployment = await this.createDeploymentFromAuction(oldDeployment.project, oldDeployment.deployer.deployerId); + newDeployment = await this.createDeploymentFromAuction(oldDeployment.project, oldDeployment.deployer); } else { newDeployment = await this.createDeployment(user.id, octokit, { @@ -1369,4 +1323,50 @@ export class Service { return false; } + + async getDeployers(): Promise { + const dbDeployers = await this.db.getDeployers(); + + if (dbDeployers.length > 0) { + // Call asynchronously to fetch the records from the registry and update the DB + this.updateDeployersFromRegistry(); + return dbDeployers; + } else { + // Fetch from the registry and populate empty DB + return await this.updateDeployersFromRegistry(); + } + } + + async updateDeployersFromRegistry(): Promise { + const deployerRecords = await this.laconicRegistry.getDeployerRecordsByFilter({}); + await this.saveDeployersByDeployerRecords(deployerRecords); + + return await this.db.getDeployers(); + } + + async saveDeployersByDeployerRecords(deployerRecords: DeployerRecord[]): Promise { + const deployers: Deployer[] = []; + + for (const record of deployerRecords) { + if (record.names.length > 0) { + const deployerId = record.id; + const deployerLrn = record.names[0]; + const deployerApiUrl = record.attributes.apiUrl; + const baseDomain = deployerApiUrl.substring(deployerApiUrl.indexOf('.') + 1); + + const deployerData = { + deployerLrn, + deployerId, + deployerApiUrl, + baseDomain + }; + + // TODO: Update deployers table in a separate job + const deployer = await this.db.addDeployer(deployerData); + deployers.push(deployer); + } + } + + return deployers; + } } diff --git a/packages/backend/test/publish-deploy-records.ts b/packages/backend/test/publish-deploy-records.ts index cb40e032..26e0823a 100644 --- a/packages/backend/test/publish-deploy-records.ts +++ b/packages/backend/test/publish-deploy-records.ts @@ -38,7 +38,7 @@ async function main() { }); for await (const deployment of deployments) { - const url = `https://${deployment.project.name}-${deployment.id}.${misc.projectDomain}`; + const url = `https://${(deployment.project.name).toLowerCase()}-${deployment.id}.${deployment.deployer.baseDomain}`; const applicationDeploymentRecord = { type: 'ApplicationDeploymentRecord', @@ -73,7 +73,7 @@ async function main() { // Remove deployment for project subdomain if deployment is for production environment if (deployment.environment === Environment.Production) { - applicationDeploymentRecord.url = `https://${deployment.project.name}.${deployment.baseDomain}`; + applicationDeploymentRecord.url = `https://${deployment.project.name}.${deployment.deployer.baseDomain}`; await registry.setRecord( { diff --git a/packages/frontend/src/components/projects/Dialog/DeleteDeploymentDialog.tsx b/packages/frontend/src/components/projects/Dialog/DeleteDeploymentDialog.tsx new file mode 100644 index 00000000..cc10f77a --- /dev/null +++ b/packages/frontend/src/components/projects/Dialog/DeleteDeploymentDialog.tsx @@ -0,0 +1,40 @@ +import ConfirmDialog, { + ConfirmDialogProps, +} from 'components/shared/ConfirmDialog'; +import { ArrowRightCircleFilledIcon, LoadingIcon } from 'components/shared/CustomIcon'; + +interface DeleteDeploymentDialogProps extends ConfirmDialogProps { + isConfirmButtonLoading?: boolean; +} + +export const DeleteDeploymentDialog = ({ + open, + handleCancel, + handleConfirm, + isConfirmButtonLoading, + ...props +}: DeleteDeploymentDialogProps) => { + return ( + + ) : ( + + ), + }} + > +

+ Once deleted, the deployment will not be accessible. +

+
+ ); +}; diff --git a/packages/frontend/src/components/projects/create/Configure.tsx b/packages/frontend/src/components/projects/create/Configure.tsx index d1380f64..9e6a45a7 100644 --- a/packages/frontend/src/components/projects/create/Configure.tsx +++ b/packages/frontend/src/components/projects/create/Configure.tsx @@ -1,9 +1,11 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useState, useEffect } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { FormProvider, FieldValues } from 'react-hook-form'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { useMediaQuery } from 'usehooks-ts'; -import { AddEnvironmentVariableInput, AuctionParams } from 'gql-client'; +import { AddEnvironmentVariableInput, AuctionParams, Deployer } from 'gql-client'; + +import { Select, MenuItem, FormControl, FormHelperText } from '@mui/material'; import { ArrowRightCircleFilledIcon, @@ -11,7 +13,6 @@ import { } from 'components/shared/CustomIcon'; import { Heading } from '../../shared/Heading'; import { Button } from '../../shared/Button'; -import { Select, SelectOption } from 'components/shared/Select'; import { Input } from 'components/shared/Input'; import { useToast } from 'components/shared/Toast'; import { useGQLClient } from '../../../context/GQLClientContext'; @@ -30,6 +31,8 @@ type ConfigureFormValues = ConfigureDeploymentFormValues & const Configure = () => { const [isLoading, setIsLoading] = useState(false); + const [deployers, setDeployers] = useState([]); + const [searchParams] = useSearchParams(); const templateId = searchParams.get('templateId'); const queryParams = new URLSearchParams(location.search); @@ -48,7 +51,7 @@ const Configure = () => { const client = useGQLClient(); const methods = useForm({ - defaultValues: { option: 'LRN' }, + defaultValues: { option: 'Auction' }, }); const selectedOption = methods.watch('option'); @@ -153,24 +156,33 @@ const Configure = () => { if (templateId) { createFormData.option === 'Auction' ? navigate( - `/${orgSlug}/projects/create/success/${projectId}?isAuction=true`, - ) + `/${orgSlug}/projects/create/success/${projectId}?isAuction=true`, + ) : navigate( - `/${orgSlug}/projects/create/template/deploy?projectId=${projectId}&templateId=${templateId}`, - ); + `/${orgSlug}/projects/create/template/deploy?projectId=${projectId}&templateId=${templateId}`, + ); } else { createFormData.option === 'Auction' ? navigate( - `/${orgSlug}/projects/create/success/${projectId}?isAuction=true`, - ) + `/${orgSlug}/projects/create/success/${projectId}?isAuction=true`, + ) : navigate( - `/${orgSlug}/projects/create/deploy?projectId=${projectId}`, - ); + `/${orgSlug}/projects/create/deploy?projectId=${projectId}`, + ); } }, [client, createProject, dismiss, toast], ); + const fetchDeployers = useCallback(async () => { + const res = await client.getDeployers() + setDeployers(res.deployers) + }, [client]) + + useEffect(() => { + fetchDeployers() + }, []) + return (
@@ -195,24 +207,14 @@ const Configure = () => { control={methods.control} render={({ field: { value, onChange } }) => ( )} />
@@ -225,15 +227,29 @@ const Configure = () => { > The app will be deployed by the configured deployer - - Enter LRN for deployer - ( - + render={({ field: { value, onChange }, fieldState }) => ( + + + Select deployer LRN + + + {fieldState.error && {fieldState.error.message}} + )} />
diff --git a/packages/frontend/src/components/projects/project/deployments/DeploymentDetailsCard.tsx b/packages/frontend/src/components/projects/project/deployments/DeploymentDetailsCard.tsx index b8abe55b..fa6142e9 100644 --- a/packages/frontend/src/components/projects/project/deployments/DeploymentDetailsCard.tsx +++ b/packages/frontend/src/components/projects/project/deployments/DeploymentDetailsCard.tsx @@ -91,7 +91,7 @@ const DeploymentDetailsCard = ({ } }; - const fetchDeploymentLogs = useCallback(async () => { + const fetchDeploymentLogs = async () => { let url = `${deployment.deployer.deployerApiUrl}/log/${deployment.applicationDeploymentRequestId}`; const res = await fetch(url, { cache: 'no-store' }); handleOpenDialog(); @@ -99,11 +99,7 @@ const DeploymentDetailsCard = ({ const logs = await res.text(); setDeploymentLogs(logs); } - }, [ - deployment.deployer.deployerApiUrl, - deployment.applicationDeploymentRequestId, - handleOpenDialog, - ]); + }; const renderDeploymentStatus = useCallback( (className?: string) => { @@ -189,8 +185,8 @@ const DeploymentDetailsCard = ({ type="orange" initials={getInitials(deployment.createdBy.name ?? '')} className="lg:size-5 2xl:size-6" - // TODO: Add avatarUrl - // imageSrc={deployment.createdBy.avatarUrl} + // TODO: Add avatarUrl + // imageSrc={deployment.createdBy.avatarUrl} > { deployment: Deployment; @@ -46,6 +47,8 @@ export const DeploymentMenu = ({ const [changeToProduction, setChangeToProduction] = useState(false); const [redeployToProduction, setRedeployToProduction] = useState(false); + const [deleteDeploymentDialog, setDeleteDeploymentDialog] = useState(false); + const [isConfirmDeleteLoading, setIsConfirmDeleteLoading] = useState(false); const [rollbackDeployment, setRollbackDeployment] = useState(false); const [assignDomainDialog, setAssignDomainDialog] = useState(false); const [isConfirmButtonLoading, setConfirmButtonLoadingLoading] = @@ -116,14 +119,11 @@ export const DeploymentMenu = ({ }; const deleteDeployment = async () => { - toast({ - id: 'deleting_deployment', - title: 'Deleting deployment....', - variant: 'success', - onDismiss: dismiss, - }); - const isDeleted = await client.deleteDeployment(deployment.id); + + setIsConfirmDeleteLoading(false); + setDeleteDeploymentDialog((preVal) => !preVal); + if (isDeleted) { await onUpdate(); toast({ @@ -212,7 +212,7 @@ export const DeploymentMenu = ({ deleteDeployment()} + onClick={() => setDeleteDeploymentDialog((preVal) => !preVal)} > Delete deployment @@ -265,6 +265,15 @@ export const DeploymentMenu = ({ open={assignDomainDialog} handleOpen={() => setAssignDomainDialog(!assignDomainDialog)} /> + { + setIsConfirmDeleteLoading(true); + await deleteDeployment(); + }} + handleCancel={() => setDeleteDeploymentDialog((preVal) => !preVal)} + isConfirmButtonLoading={isConfirmDeleteLoading} + /> ); }; diff --git a/packages/frontend/src/components/projects/project/overview/Activity/AuctionCard.tsx b/packages/frontend/src/components/projects/project/overview/Activity/AuctionCard.tsx index 3a15caf0..cbf725f8 100644 --- a/packages/frontend/src/components/projects/project/overview/Activity/AuctionCard.tsx +++ b/packages/frontend/src/components/projects/project/overview/Activity/AuctionCard.tsx @@ -17,6 +17,16 @@ import { Button, Heading, Tag } from 'components/shared'; const WAIT_DURATION = 5000; +const DIALOG_STYLE = { + backgroundColor: 'rgba(0,0,0, .9)', + padding: '2em', + borderRadius: '0.5em', + marginLeft: '0.5em', + marginRight: '0.5em', + color: 'gray', + fontSize: 'small', +}; + export const AuctionCard = ({ project }: { project: Project }) => { const [auctionStatus, setAuctionStatus] = useState(''); const [deployers, setDeployers] = useState([]); @@ -86,13 +96,6 @@ export const AuctionCard = ({ project }: { project: Project }) => { -
- - Auction Status - -
{renderAuctionStatus()}
-
-
Auction Id @@ -102,29 +105,47 @@ export const AuctionCard = ({ project }: { project: Project }) => {
- {deployers?.length > 0 && ( -
- - Deployer LRNs - - {deployers.map((deployer, index) => ( -

- {'\u2022'} {deployer.deployerLrn} -

- ))} -
- )}
- Deployer Funds Status + Auction Status -
- - {fundsStatus ? 'RELEASED' : 'LOCKED'} - -
+
{renderAuctionStatus()}
+ + {auctionStatus === 'completed' && ( + <> + {deployers?.length > 0 ? ( +
+ + Deployer LRNs + + {deployers.map((deployer, index) => ( +

+ {'\u2022'} {deployer.deployerLrn} +

+ ))} + +
+ + Deployer Funds Status + +
+ + {fundsStatus ? 'RELEASED' : 'LOCKED'} + +
+
+
+ ) : ( +
+ + No winning deployers + +
+ )} + + )} { maxWidth="md" > Auction Details - + {auctionDetails && (
{JSON.stringify(auctionDetails, null, 2)}
)} diff --git a/packages/gql-client/src/client.ts b/packages/gql-client/src/client.ts index 0e0eff9f..87e4bc80 100644 --- a/packages/gql-client/src/client.ts +++ b/packages/gql-client/src/client.ts @@ -424,4 +424,12 @@ export class GQLClient { return data.getAuctionData; } + + async getDeployers(): Promise { + const { data } = await this.client.query({ + query: queries.getDeployers, + }); + + return data; + } } diff --git a/packages/gql-client/src/queries.ts b/packages/gql-client/src/queries.ts index 0d2ad0f9..a1ac2af2 100644 --- a/packages/gql-client/src/queries.ts +++ b/packages/gql-client/src/queries.ts @@ -25,9 +25,9 @@ query ($projectId: String!) { prodBranch auctionId deployers { - deployerApiUrl - deployerId deployerLrn + deployerId + deployerApiUrl } fundsReleased framework @@ -81,9 +81,9 @@ query ($organizationSlug: String!) { framework auctionId deployers { - deployerApiUrl - deployerId deployerLrn + deployerId + deployerApiUrl } fundsReleased prodBranch @@ -145,9 +145,9 @@ query ($projectId: String!) { commitMessage url deployer { + deployerLrn deployerId - deployerLrn, - deployerApiUrl, + deployerApiUrl } environment isCurrent @@ -208,9 +208,9 @@ query ($searchText: String!) { framework auctionId deployers { - deployerApiUrl - deployerId deployerLrn + deployerId + deployerApiUrl } fundsReleased prodBranch @@ -307,3 +307,13 @@ query ($auctionId: String!) { } } `; + +export const getDeployers = gql` +query { + deployers { + deployerLrn + deployerId + deployerApiUrl + } +} +`; diff --git a/packages/gql-client/src/types.ts b/packages/gql-client/src/types.ts index 74cf17b1..c06d9d4e 100644 --- a/packages/gql-client/src/types.ts +++ b/packages/gql-client/src/types.ts @@ -117,9 +117,9 @@ export type Deployment = { }; export type Deployer = { - deployerApiUrl: string; - deployerId: string; deployerLrn: string; + deployerId: string; + deployerApiUrl: string; } export type OrganizationMember = { @@ -233,6 +233,10 @@ export type GetDomainsResponse = { domains: Domain[]; }; +export type GetDeployersResponse = { + deployers: Deployer[]; +}; + export type SearchProjectsResponse = { searchProjects: Project[]; };