Skip to content

Commit

Permalink
将sdk,api-file,sheet等模块的事件触发机制从手动发送修改为订阅orm触发
Browse files Browse the repository at this point in the history
  • Loading branch information
Val-istar-Guo committed Aug 14, 2024
1 parent 467124b commit d88f16b
Show file tree
Hide file tree
Showing 22 changed files with 303 additions and 49 deletions.
3 changes: 2 additions & 1 deletion app/backend/src/modules/api-file/api-file.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { ApiFile } from './entities/api-file.entity'
import { StorageModule } from '../storage/storage.module'
import { SheetVersion } from '../sheet-version/entities/sheet-version.entity'
import { SheetVersionModule } from '../sheet-version/sheet-version.module'
import { ApiFileSubscriber } from './api-file.subscriber'


@Module({
Expand All @@ -20,7 +21,7 @@ import { SheetVersionModule } from '../sheet-version/sheet-version.module'
SheetVersionModule,
],
controllers: [ApiFileController],
providers: [ApiFileService],
providers: [ApiFileService, ApiFileSubscriber],
exports: [ApiFileService],
})
export class ApiFileModule {}
13 changes: 0 additions & 13 deletions app/backend/src/modules/api-file/api-file.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import { Readable } from 'stream'
import { CacheService } from '../storage/cache.service'
import { Sheet } from '../sheet/entities/sheet.entity'
import { ApiFile } from './entities/api-file.entity'
import { ApiFileCreatedEvent } from './events/api-file-created.event'
import { ApiFileDeletedEvent } from './events/api-file-deleted.event'
import { QueryApiFilesDTO } from './dto/query-api-files.dto'
import { PathScurry } from 'path-scurry'
import { CreateApiFilesDTO } from './dto/create-api-files.dto'
Expand Down Expand Up @@ -144,13 +142,6 @@ export class ApiFileService {

await this.em.flush()

for (const apiFile of apiFiles) {
this.eventEmitter.emit(
'api-file.created',
new ApiFileCreatedEvent(apiFile)
)
}

this.eventEmitter.emit(
'sheet-version.bump',
new SheetVersionBumpEvent(newSheetVersion.id)
Expand Down Expand Up @@ -252,10 +243,6 @@ export class ApiFileService {
if (!apiFile) return

this.em.remove(apiFile)
this.eventEmitter.emit(
'api-file.deleted',
new ApiFileDeletedEvent(apiFile)
)

const filepath = await this.getFilepath(apiFile)
await this.storageService.removeFile(filepath)
Expand Down
18 changes: 17 additions & 1 deletion app/backend/src/modules/api-file/api-file.subscriber.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ import { CacheService } from './../storage/cache.service'
import { Injectable } from '@nestjs/common'
import * as fs from 'fs-extra'
import * as path from 'path'
import { EntityManager, EntityName, EventArgs, EventSubscriber, MikroORM } from '@mikro-orm/core'
import { EntityManager, EntityName, EventArgs, EventSubscriber, MikroORM, wrap } from '@mikro-orm/core'
import { ApiFileService } from './api-file.service'
import { ApiFile } from './entities/api-file.entity'
import { EventEmitter2 } from '@nestjs/event-emitter'
import { ApiFileCreatedEvent } from './events/api-file-created.event'

@Injectable()
export class ApiFileSubscriber implements EventSubscriber<ApiFile> {
constructor(
private readonly em: EntityManager,
private readonly orm: MikroORM,

private readonly eventEmitter: EventEmitter2,
private readonly apiFilerService: ApiFileService,
private readonly cacheService: CacheService,
) {
Expand All @@ -28,9 +31,22 @@ export class ApiFileSubscriber implements EventSubscriber<ApiFile> {
}
}

afterCreate(args: EventArgs<ApiFile>): void | Promise<void> {
this.eventEmitter.emit(
'api-file.created',
new ApiFileCreatedEvent(wrap(args.entity).serialize())
)
}


async afterDelete(args: EventArgs<ApiFile>): Promise<void> {
const entity = args.entity

this.eventEmitter.emit(
'api-file.deleted',
new ApiFileCreatedEvent(wrap(entity).serialize())
)

const filepath = await this.apiFilerService.getFilepath(entity)
const cacheFilepath = path.join(this.cacheService.directory, filepath)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { EntityDTO, Loaded } from '@mikro-orm/core'
import { ApiFile } from '../entities/api-file.entity'

export class ApiFileCreatedEvent {
constructor(
public apiFile: ApiFile
public apiFile: EntityDTO<Loaded<ApiFile>>
) {
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { EntityDTO, Loaded } from '@mikro-orm/core'
import { ApiFile } from '../entities/api-file.entity'


export class ApiFileDeletedEvent {
constructor(
public apiFile: ApiFile
public apiFile: EntityDTO<Loaded<ApiFile>>
) {
}
}
15 changes: 15 additions & 0 deletions app/backend/src/modules/plugin/constants/plugin-event-name.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,26 @@
* Opendoc 发出的事件
*/
export enum PluginEventName {
// Sheet创建成功
SHEET_CREATED = 'sheet-created',
// Sheet删除成功
SHEET_DELETED = 'sheet-deleted',
// Sheet发布新版本
SHEET_VERSION_BUMP = 'sheet-version-bump',

// Sdk创建成功
SDK_CREATED = 'sdk-created',
// Sdk更新成功
SDK_UPDATED = 'sdk-updated',
// Sdk删除成功
SDK_DELETED = 'sdk-deleted',

// 文件创建成功
API_FILE_CREATED = 'api-file-created',
// 文件更新成功
API_FILE_UPDATED = 'api-file-updated',
// 文件删除成功
API_FILE_DELETED = 'api-file-deleted',

// Opendoc 即将立即终止 Websocket 连接
TERMINATED = 'terminated',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Type } from 'class-transformer'
import { ValidateNested } from 'class-validator'
import { SdkDTO } from '~/modules/sdk/dto/sdk.dto'
import { ParsedVersionDTO } from '~/modules/sheet-version/dto/parsed-version.dto'
import { BasePluginEventMessageData } from './base-plugin-event-message-data.dto'


export class SdkDeletedPluginEventMessageData extends BasePluginEventMessageData {
@ValidateNested()
@Type(() => SdkDTO)
sdk!: SdkDTO

@ValidateNested()
@Type(() => ParsedVersionDTO)
version!: ParsedVersionDTO
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Type } from 'class-transformer'
import { ValidateNested } from 'class-validator'
import { SdkDTO } from '~/modules/sdk/dto/sdk.dto'
import { ParsedVersionDTO } from '~/modules/sheet-version/dto/parsed-version.dto'
import { BasePluginEventMessageData } from './base-plugin-event-message-data.dto'


export class SdkUpdatedPluginEventMessageData extends BasePluginEventMessageData {
@ValidateNested()
@Type(() => SdkDTO)
sdk!: SdkDTO

@ValidateNested()
@Type(() => ParsedVersionDTO)
version!: ParsedVersionDTO
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ApplicationDTO } from '~/modules/application/dto/application.dto'
import { SheetDTO } from '~/modules/sheet/dto/sheet.dto'
import { ValidateNested } from 'class-validator'
import { Type } from 'class-transformer'
import { BasePluginEventMessageData } from './base-plugin-event-message-data.dto'


export class SheetCreatedPluginEventMessageData extends BasePluginEventMessageData {
@ValidateNested()
@Type(() => ApplicationDTO)
application!: ApplicationDTO

@ValidateNested()
@Type(() => SheetDTO)
sheet!: SheetDTO
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ApplicationDTO } from '~/modules/application/dto/application.dto'
import { SheetDTO } from '~/modules/sheet/dto/sheet.dto'
import { ValidateNested } from 'class-validator'
import { Type } from 'class-transformer'
import { BasePluginEventMessageData } from './base-plugin-event-message-data.dto'


export class SheetDeletedPluginEventMessageData extends BasePluginEventMessageData {
@ValidateNested()
@Type(() => ApplicationDTO)
application!: ApplicationDTO

@ValidateNested()
@Type(() => SheetDTO)
sheet!: SheetDTO
}
85 changes: 84 additions & 1 deletion app/backend/src/modules/plugin/plugin.listener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ import { InjectRepository } from '@mikro-orm/nestjs'
import { SheetVersion } from '../sheet-version/entities/sheet-version.entity'
import { Sheet } from '../sheet/entities/sheet.entity'
import { Sdk } from '../sdk/entities/sdk.entity'
import { SheetCreatedEvent } from '../sheet/events/sheet-created.event'
import { SheetDeletedEvent } from '../sheet/events/sheet-deleted.event'
import { SdkDeletedEvent } from '../sdk/events/sdk-deleted.event'
import { SdkUpdatedEvent } from '../sdk/events/sdk-updated.event'


@Injectable()
Expand Down Expand Up @@ -75,7 +79,7 @@ export class PluginListener {
@OnEvent('sdk.created')
@CreateRequestContext()
async onSdkCreated(event: SdkCreatedEvent): Promise<void> {
const sdk = await this.sdkRepo.findOne(event.sdkId)
const sdk = await this.sdkRepo.findOne(event.sdk.id)
if (!sdk) {
this.logger.error('Cannot send sdk-created event to plugin: sdk not found')
return
Expand All @@ -93,4 +97,83 @@ export class PluginListener {
apiFilesRaw: apiFilesRaw.toString('base64'),
})
}

@OnEvent('sdk.updated')
@CreateRequestContext()
async onSdkUpdated(event: SdkUpdatedEvent): Promise<void> {
const sdk = await this.sdkRepo.findOne(event.sdk.id)
if (!sdk) {
this.logger.error('Cannot send sdk-updated event to plugin: sdk not found')
return
}

const parsedVersion = this.sheetVersionService.parse(sdk.version)

await this.pluginService.broadcast(PluginEventName.SDK_UPDATED, {
sdk: {
...wrap(sdk).serialize(),
version: parsedVersion,
},
version: parsedVersion,
})
}

@OnEvent('sdk.deleted')
@CreateRequestContext()
async onSdkDeleted(event: SdkDeletedEvent): Promise<void> {
const sdk = await this.sdkRepo.findOne(event.sdk.id)
if (!sdk) {
this.logger.error('Cannot send sdk-deleted event to plugin: sdk not found')
return
}
const parsedVersion = this.sheetVersionService.parse(sdk.version)

await this.pluginService.broadcast(PluginEventName.SDK_DELETED, {
sdk: {
...wrap(sdk).serialize(),
version: parsedVersion,
},
version: parsedVersion,
})
}

@OnEvent('sheet.created')
@CreateRequestContext()
async onSheetCreated(event: SheetCreatedEvent): Promise<void> {
const sheet = await this.sheetRepo.findOne(event.sheet.id)
if (!sheet) {
this.logger.error('Cannot send sheet-created event to plugin: sheet not found')
return
}
const application = await sheet.application.load()
if (!application) {
this.logger.error('Cannot send sheet-created event to plugin: application not found')
return
}

await this.pluginService.broadcast(PluginEventName.SHEET_CREATED, {
sheet: wrap(sheet).serialize(),
application: wrap(application).serialize(),
})
}

@OnEvent('sheet.deleted')
@CreateRequestContext()
async onSheetDeleted(event: SheetDeletedEvent): Promise<void> {
const sheet = await this.sheetRepo.findOne(event.sheet.id)
if (!sheet) {
this.logger.error('Cannot send sheet-deleted event to plugin: sheet not found')
return
}
const application = await sheet.application.load()
if (!application) {
this.logger.error('Cannot send sheet-deleted event to plugin: application not found')
return
}

await this.pluginService.broadcast(PluginEventName.SHEET_DELETED, {
sheet: wrap(sheet).serialize(),
application: wrap(application).serialize(),
})
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
import { PluginEventName } from '../constants/plugin-event-name'
import { BasePluginEventMessageData } from '../dto/plugin-event-message/base-plugin-event-message-data.dto'
import { SdkCreatedPluginEventMessageData } from '../dto/plugin-event-message/sdk-created-plugin-event-message-data.dto'
import { SdkDeletedPluginEventMessageData } from '../dto/plugin-event-message/sdk-deleted-plugin-event-message-data.dto'
import { SdkUpdatedPluginEventMessageData } from '../dto/plugin-event-message/sdk-updated-plugin-event-message-data.dto'
import { SheetCreatedPluginEventMessageData } from '../dto/plugin-event-message/sheet-created-plugin-event-message-data.dto'
import { SheetDeletedPluginEventMessageData } from '../dto/plugin-event-message/sheet-deleted-plugin-event-message-data.dto'
import { SheetVersionBumpPluginEventMessageData } from '../dto/plugin-event-message/sheet-version-bump-plugin-event-message-data.dto'


export interface PluginEventMessageDataMap extends Record<PluginEventName, BasePluginEventMessageData> {
[PluginEventName.SHEET_CREATED]: SheetCreatedPluginEventMessageData
[PluginEventName.SHEET_DELETED]: SheetDeletedPluginEventMessageData

[PluginEventName.SHEET_VERSION_BUMP]: SheetVersionBumpPluginEventMessageData

[PluginEventName.SDK_CREATED]: SdkCreatedPluginEventMessageData
[PluginEventName.SDK_UPDATED]: SdkUpdatedPluginEventMessageData
[PluginEventName.SDK_DELETED]: SdkDeletedPluginEventMessageData

[PluginEventName.API_FILE_CREATED]: BasePluginEventMessageData
[PluginEventName.API_FILE_UPDATED]: BasePluginEventMessageData
[PluginEventName.API_FILE_DELETED]: BasePluginEventMessageData

[PluginEventName.TERMINATED]: BasePluginEventMessageData
}
6 changes: 5 additions & 1 deletion app/backend/src/modules/sdk/events/sdk-created.event.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { EntityDTO, Loaded } from '@mikro-orm/core'
import { Sdk } from '../entities/sdk.entity'


export class SdkCreatedEvent {
constructor(
public sdkId: string
public sdk: EntityDTO<Loaded<Sdk>>,
) {
}
}
Expand Down
12 changes: 12 additions & 0 deletions app/backend/src/modules/sdk/events/sdk-deleted.event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { EntityDTO, Loaded } from '@mikro-orm/core'
import { Sdk } from '../entities/sdk.entity'


export class SdkDeletedEvent {
constructor(
public sdk: EntityDTO<Loaded<Sdk>>,
) {
}
}


3 changes: 2 additions & 1 deletion app/backend/src/modules/sdk/events/sdk-updated.event.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { EntityDTO, Loaded } from '@mikro-orm/core'
import { Sdk } from '../entities/sdk.entity'


export class SdkUpdatedEvent {
constructor(
public sdk: Sdk
public sdk: EntityDTO<Loaded<Sdk>>,
) {
}
}
Expand Down
Loading

0 comments on commit d88f16b

Please sign in to comment.