From fd98c18fc28b15718e2d663bcd074916e988770d Mon Sep 17 00:00:00 2001 From: Andy Yen <38731840+onlyjackfrost@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:52:36 +0800 Subject: [PATCH] add inprogress status when check deploy status (#87) --- .../server/repositories/deployLogRepository.ts | 17 +++++++++++++++++ .../apollo/server/resolvers/modelResolver.ts | 16 +++++++++++++--- wren-ui/src/apollo/server/schema.ts | 8 +++++++- .../src/apollo/server/services/deployService.ts | 17 +++++++++++++++-- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/wren-ui/src/apollo/server/repositories/deployLogRepository.ts b/wren-ui/src/apollo/server/repositories/deployLogRepository.ts index f8f017cdd..4c498bb72 100644 --- a/wren-ui/src/apollo/server/repositories/deployLogRepository.ts +++ b/wren-ui/src/apollo/server/repositories/deployLogRepository.ts @@ -11,12 +11,14 @@ export interface Deploy { } export enum DeployStatusEnum { + IN_PROGRESS = 'IN_PROGRESS', SUCCESS = 'SUCCESS', FAILED = 'FAILED', } export interface IDeployLogRepository extends IBasicRepository { findLastProjectDeployLog(projectId: number): Promise; + findInProgressProjectDeployLog(projectId: number): Promise; } export class DeployLogRepository @@ -38,4 +40,19 @@ export class DeployLogRepository .first(); return (res && this.transformFromDBData(res)) || null; } + + public async findInProgressProjectDeployLog(projectId: number) { + const res = await this.knex + .select('*') + .from(this.tableName) + .where( + this.transformToDBData({ + projectId, + status: DeployStatusEnum.IN_PROGRESS, + }), + ) + .orderBy('created_at', 'desc') + .first(); + return (res && this.transformFromDBData(res)) || null; + } } diff --git a/wren-ui/src/apollo/server/resolvers/modelResolver.ts b/wren-ui/src/apollo/server/resolvers/modelResolver.ts index 32c0021e9..63bc3cfd2 100644 --- a/wren-ui/src/apollo/server/resolvers/modelResolver.ts +++ b/wren-ui/src/apollo/server/resolvers/modelResolver.ts @@ -11,6 +11,12 @@ import { DeployResponse } from '../services/deployService'; const logger = getLogger('ModelResolver'); logger.level = 'debug'; +export enum SyncStatusEnum { + IN_PROGRESS = 'IN_PROGRESS', + SYNCRONIZED = 'SYNCRONIZED', + UNSYNCRONIZED = 'UNSYNCRONIZED', +} + export class ModelResolver { constructor() { this.listModels = this.listModels.bind(this); @@ -28,10 +34,14 @@ export class ModelResolver { const lastDeployHash = await ctx.deployService.getLastDeployment( project.id, ); - + const inProgressDeployment = + await ctx.deployService.getInProgressDeployment(project.id); + if (inProgressDeployment) { + return { status: SyncStatusEnum.IN_PROGRESS }; + } return currentHash == lastDeployHash - ? { isSyncronized: true } - : { isSyncronized: false }; + ? { status: SyncStatusEnum.SYNCRONIZED } + : { status: SyncStatusEnum.UNSYNCRONIZED }; } public async deploy( diff --git a/wren-ui/src/apollo/server/schema.ts b/wren-ui/src/apollo/server/schema.ts index 44ba0b93b..5e3e3e10b 100644 --- a/wren-ui/src/apollo/server/schema.ts +++ b/wren-ui/src/apollo/server/schema.ts @@ -14,6 +14,12 @@ export const typeDefs = gql` MUSIC } + enum SyncStatus { + IN_PROGRESS + SYNCRONIZED + UNSYNCRONIZED + } + type DataSource { type: DataSourceName! properties: JSON! @@ -204,7 +210,7 @@ export const typeDefs = gql` } type ModelSyncResponse { - isSyncronized: Boolean! + status: SyncStatus! } type Diagram { diff --git a/wren-ui/src/apollo/server/services/deployService.ts b/wren-ui/src/apollo/server/services/deployService.ts index 5c1d2313f..498ab7ded 100644 --- a/wren-ui/src/apollo/server/services/deployService.ts +++ b/wren-ui/src/apollo/server/services/deployService.ts @@ -30,6 +30,7 @@ export interface MDLSyncResponse { export interface IDeployService { deploy(manifest: Manifest, projectId: number): Promise; getLastDeployment(projectId: number): Promise; + getInProgressDeployment(projectId: number): Promise; createMDLHash(manifest: Manifest): string; } @@ -61,12 +62,19 @@ export class DeployService implements IDeployService { return lastDeploy.hash; } + public async getInProgressDeployment(projectId) { + return await this.deployLogRepository.findInProgressProjectDeployLog( + projectId, + ); + } + public async deploy(manifest, projectId) { // generate hash of manifest const hash = this.createMDLHash(manifest); logger.debug(`Deploying model, hash: ${hash}`); logger.debug(manifest); - // check if the model has been deployed + + // check if the model current deployment const lastDeploy = await this.deployLogRepository.findLastProjectDeployLog(projectId); if (lastDeploy && lastDeploy.hash === hash) { @@ -74,7 +82,12 @@ export class DeployService implements IDeployService { return { status: DeployStatusEnum.SUCCESS }; } - const deployData = { manifest, hash, projectId } as Deploy; + const deployData = { + manifest, + hash, + projectId, + status: DeployStatusEnum.IN_PROGRESS, + } as Deploy; const deploy = await this.deployLogRepository.createOne(deployData); // deploy to wren-engine & AI-service