forked from cerc-io/snowballtools-base
		
	Add script to publish dummy ApplicationDeploymentRecord (#72)
				
					
				
			* Add script to publish application deployment record * Refactor publish deploy records script * Assert if name doesn't exist in package.json * Disable import environment variables button --------- Co-authored-by: neeraj <neeraj.rtly@gmail.com>
This commit is contained in:
		
							parent
							
								
									d29b29f161
								
							
						
					
					
						commit
						b007286f4a
					
				| @ -37,6 +37,7 @@ | ||||
|     "format": "prettier --write .", | ||||
|     "format:check": "prettier --check .", | ||||
|     "registry:init": "DEBUG=snowball:* ts-node ./test/initialize-registry.ts", | ||||
|     "registry:publish-deploy-records": "DEBUG=snowball:* ts-node ./test/publish-deploy-records.ts", | ||||
|     "db:load:fixtures": "DEBUG=snowball:* ts-node ./test/initialize-db.ts", | ||||
|     "db:delete": "DEBUG=snowball:* ts-node ./test/delete-db.ts" | ||||
|   }, | ||||
|  | ||||
| @ -127,9 +127,7 @@ export class Database { | ||||
|   } | ||||
| 
 | ||||
|   async getDeploymentsByProjectId (projectId: string): Promise<Deployment[]> { | ||||
|     const deploymentRepository = this.dataSource.getRepository(Deployment); | ||||
| 
 | ||||
|     const deployments = await deploymentRepository.find({ | ||||
|     const deployments = await this.getDeployments({ | ||||
|       relations: { | ||||
|         project: true, | ||||
|         domain: true, | ||||
| @ -148,6 +146,13 @@ export class Database { | ||||
|     return deployments; | ||||
|   } | ||||
| 
 | ||||
|   async getDeployments (options: FindManyOptions<Deployment>): Promise<Deployment[]> { | ||||
|     const deploymentRepository = this.dataSource.getRepository(Deployment); | ||||
|     const deployments = await deploymentRepository.find(options); | ||||
| 
 | ||||
|     return deployments; | ||||
|   } | ||||
| 
 | ||||
|   async getDeployment (options: FindOneOptions<Deployment>): Promise<Deployment | null> { | ||||
|     const deploymentRepository = this.dataSource.getRepository(Deployment); | ||||
|     const deployment = await deploymentRepository.findOne(options); | ||||
| @ -166,12 +171,10 @@ export class Database { | ||||
|     const deploymentRepository = this.dataSource.getRepository(Deployment); | ||||
| 
 | ||||
|     const id = nanoid(); | ||||
|     const url = `${data.project!.name}-${id}.${PROJECT_DOMAIN}`; | ||||
| 
 | ||||
|     const updatedData = { | ||||
|       ...data, | ||||
|       id, | ||||
|       url | ||||
|       id | ||||
|     }; | ||||
|     const deployment = await deploymentRepository.save(updatedData); | ||||
| 
 | ||||
|  | ||||
| @ -28,7 +28,7 @@ export enum DeploymentStatus { | ||||
| export interface ApplicationRecord { | ||||
|   type: string; | ||||
|   version:string | ||||
|   name?: string | ||||
|   name: string | ||||
|   description?: string | ||||
|   homepage?: string | ||||
|   license?: string | ||||
| @ -65,8 +65,8 @@ export class Deployment { | ||||
|   @Column('varchar') | ||||
|     commitMessage!: string; | ||||
| 
 | ||||
|   @Column('varchar') | ||||
|     url!: string; | ||||
|   @Column('varchar', { nullable: true }) | ||||
|     url!: string | null; | ||||
| 
 | ||||
|   @Column('varchar') | ||||
|     registryRecordId!: string; | ||||
|  | ||||
| @ -36,6 +36,7 @@ export class Registry { | ||||
|     appType: string, | ||||
|     repoUrl: string | ||||
|   }): Promise<{registryRecordId: string, registryRecordData: ApplicationRecord}> { | ||||
|     assert(packageJSON.name, "name field doesn't exist in package.json"); | ||||
|     // Use laconic-sdk to publish record
 | ||||
|     // Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts/publish-app-record.sh
 | ||||
|     // Fetch previous records
 | ||||
| @ -58,7 +59,7 @@ export class Registry { | ||||
|       repository_ref: commitHash, | ||||
|       repository: [repoUrl], | ||||
|       app_type: appType, | ||||
|       ...(packageJSON.name && { name: packageJSON.name }), | ||||
|       name: packageJSON.name, | ||||
|       ...(packageJSON.description && { description: packageJSON.description }), | ||||
|       ...(packageJSON.homepage && { homepage: packageJSON.homepage }), | ||||
|       ...(packageJSON.license && { license: packageJSON.license }), | ||||
| @ -79,7 +80,7 @@ export class Registry { | ||||
|     log('Application record data:', applicationRecord); | ||||
| 
 | ||||
|     // TODO: Discuss computation of CRN
 | ||||
|     const crn = this.getCrn(packageJSON.name ?? ''); | ||||
|     const crn = this.getCrn(packageJSON.name); | ||||
|     log(`Setting name: ${crn} for record ID: ${result.data.id}`); | ||||
| 
 | ||||
|     await this.registry.setName({ cid: result.data.id, crn }, this.registryConfig.privateKey, this.registryConfig.fee); | ||||
|  | ||||
							
								
								
									
										14
									
								
								packages/backend/test/fixtures/deployments.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								packages/backend/test/fixtures/deployments.json
									
									
									
									
										vendored
									
									
								
							| @ -4,7 +4,7 @@ | ||||
|     "domainIndex":0, | ||||
|     "createdByIndex": 0, | ||||
|     "id":"ffhae3zq", | ||||
|     "status": "Building", | ||||
|     "status": "Ready", | ||||
|     "environment": "Production", | ||||
|     "isCurrent": true, | ||||
|     "registryRecordId": "qbafyrehvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi", | ||||
| @ -34,7 +34,7 @@ | ||||
|     "domainIndex":2, | ||||
|     "createdByIndex": 0, | ||||
|     "id":"qmgekyte", | ||||
|     "status": "Error", | ||||
|     "status": "Ready", | ||||
|     "environment": "Development", | ||||
|     "isCurrent": false, | ||||
|     "registryRecordId": "ebafyreihvzya6ovp4yfpkqnddkui2iw7t6bhwq74lbqs7bhobvmfhrowoi", | ||||
| @ -64,7 +64,7 @@ | ||||
|     "domainIndex":3, | ||||
|     "createdByIndex": 1, | ||||
|     "id":"eO8cckxk", | ||||
|     "status": "Building", | ||||
|     "status": "Ready", | ||||
|     "environment": "Production", | ||||
|     "isCurrent": true, | ||||
|     "registryRecordId": "tbafyreihvzya6ovp4yfpqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi", | ||||
| @ -94,7 +94,7 @@ | ||||
|     "domainIndex":5, | ||||
|     "createdByIndex": 1, | ||||
|     "id":"hwwr6sbx", | ||||
|     "status": "Error", | ||||
|     "status": "Ready", | ||||
|     "environment": "Development", | ||||
|     "isCurrent": false, | ||||
|     "registryRecordId": "ubafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvfhrowoi", | ||||
| @ -109,7 +109,7 @@ | ||||
|     "domainIndex":9, | ||||
|     "createdByIndex": 2, | ||||
|     "id":"ndxje48a", | ||||
|     "status": "Building", | ||||
|     "status": "Ready", | ||||
|     "environment": "Production", | ||||
|     "isCurrent": true, | ||||
|     "registryRecordId": "ibayreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowoi", | ||||
| @ -139,7 +139,7 @@ | ||||
|     "domainIndex":8, | ||||
|     "createdByIndex": 2, | ||||
|     "id":"b4bpthjr", | ||||
|     "status": "Error", | ||||
|     "status": "Ready", | ||||
|     "environment": "Development", | ||||
|     "isCurrent": false, | ||||
|     "registryRecordId": "pbafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowo", | ||||
| @ -154,7 +154,7 @@ | ||||
|     "domainIndex": 6, | ||||
|     "createdByIndex": 2, | ||||
|     "id":"b4bpthjr", | ||||
|     "status": "Building", | ||||
|     "status": "Ready", | ||||
|     "environment": "Production", | ||||
|     "isCurrent": true, | ||||
|     "registryRecordId": "pbafyreihvzya6ovp4yfpkqnddkui2iw7t6hbhwq74lbqs7bhobvmfhrowo", | ||||
|  | ||||
							
								
								
									
										77
									
								
								packages/backend/test/publish-deploy-records.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								packages/backend/test/publish-deploy-records.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| import debug from 'debug'; | ||||
| import { DataSource } from 'typeorm'; | ||||
| import path from 'path'; | ||||
| 
 | ||||
| import { Registry } from '@cerc-io/laconic-sdk'; | ||||
| 
 | ||||
| import { Config } from '../src/config'; | ||||
| import { DEFAULT_CONFIG_FILE_PATH, PROJECT_DOMAIN } from '../src/constants'; | ||||
| import { getConfig } from '../src/utils'; | ||||
| import { Deployment, DeploymentStatus } from '../src/entity/Deployment'; | ||||
| 
 | ||||
| const log = debug('snowball:publish-deploy-records'); | ||||
| 
 | ||||
| async function main () { | ||||
|   const { registryConfig, database } = await getConfig<Config>(DEFAULT_CONFIG_FILE_PATH); | ||||
| 
 | ||||
|   const registry = new Registry(registryConfig.gqlEndpoint, registryConfig.restEndpoint, registryConfig.chainId); | ||||
| 
 | ||||
|   const dataSource = new DataSource({ | ||||
|     type: 'better-sqlite3', | ||||
|     database: database.dbPath, | ||||
|     synchronize: true, | ||||
|     entities: [path.join(__dirname, '../src/entity/*')] | ||||
|   }); | ||||
| 
 | ||||
|   await dataSource.initialize(); | ||||
| 
 | ||||
|   const deploymentRepository = dataSource.getRepository(Deployment); | ||||
|   const deployments = await deploymentRepository.find({ | ||||
|     relations: { | ||||
|       project: true | ||||
|     }, | ||||
|     where: { | ||||
|       status: DeploymentStatus.Building | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
|   for await (const deployment of deployments) { | ||||
|     const url = `${deployment.project.name}-${deployment.id}.${PROJECT_DOMAIN}`; | ||||
| 
 | ||||
|     const applicationDeploymentRecord = { | ||||
|       type: 'ApplicationDeploymentRecord', | ||||
|       version: '0.0.1', | ||||
|       name: deployment.registryRecordData.name, | ||||
|       application: deployment.registryRecordId, | ||||
| 
 | ||||
|       // TODO: Create DNS record
 | ||||
|       dns: 'bafyreihlymqggsgqiqawvehkpr2imt4l3u6q7um7xzjrux5rhsvwnuyewm', | ||||
| 
 | ||||
|       // Using dummy values
 | ||||
|       meta: JSON.stringify({ | ||||
|         config: 'da39a3ee5e6b4b0d3255bfef95601890afd80709', | ||||
|         so: '66fcfa49a1664d4cb4ce4f72c1c0e151' | ||||
|       }), | ||||
| 
 | ||||
|       request: deployment.project.registryRecordId, | ||||
|       url | ||||
|     }; | ||||
| 
 | ||||
|     const result = await registry.setRecord( | ||||
|       { | ||||
|         privateKey: registryConfig.privateKey, | ||||
|         record: applicationDeploymentRecord, | ||||
|         bondId: registryConfig.bondId | ||||
|       }, | ||||
|       '', | ||||
|       registryConfig.fee | ||||
|     ); | ||||
| 
 | ||||
|     log('Application deployment record data:', applicationDeploymentRecord); | ||||
|     log(`Application deployment record published: ${result.data.id}`); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| main().catch((err) => { | ||||
|   log(err); | ||||
| }); | ||||
| @ -171,7 +171,8 @@ export const EnvironmentVariablesTabPanel = () => { | ||||
|                 > | ||||
|                   + Add variable | ||||
|                 </Button> | ||||
|                 <Button variant="outlined" size="sm"> | ||||
|                 {/* TODO: Implement import environment varible functionality */} | ||||
|                 <Button variant="outlined" size="sm" disabled> | ||||
|                   ^ Import .env | ||||
|                 </Button> | ||||
|               </div> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user