Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(desktop): add disconnect properties table #1580

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/database/database.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import HistoryMessagePayloadEntity from './models/HistoryMessagePayloadEntity'
import HistoryConnectionEntity from './models/HistoryConnectionEntity'
import WillEntity from './models/WillEntity'
import CopilotEntity from './models/CopilotEntity'
import DisconnectPropertiesEntity from './models/DisconnectPropertiesEntity'
import { ConnectionOptions } from 'typeorm'
import { initTable1629476510574 } from './migration/1629476510574-initTable'
import { messages1630403733964 } from './migration/1630403733964-messages'
Expand Down Expand Up @@ -44,6 +45,7 @@ import { aiTables1701936842016 } from './migration/1701936842016-aiTables'
import { enableCopilot1703659148195 } from './migration/1703659148195-enableCopilot'
import { logLevel1704941582350 } from './migration/1704941582350-logLevel'
import { updatePayloadTypeToVarchar1630403733965 } from './migration/1705478422620-updatePayloadTypeToVarchar'
import { disconnectProperties1707032213387 } from './migration/1707032213387-disconnectProperties'

const STORE_PATH = getAppDataPath('MQTTX')
try {
Expand Down Expand Up @@ -94,6 +96,7 @@ const ORMConfig = {
enableCopilot1703659148195,
logLevel1704941582350,
updatePayloadTypeToVarchar1630403733965,
disconnectProperties1707032213387,
],
migrationsTableName: 'temp_migration_table',
entities: [
Expand All @@ -108,6 +111,7 @@ const ORMConfig = {
WillEntity,
HistoryConnectionEntity,
CopilotEntity,
DisconnectPropertiesEntity,
],
cli: {
migrationsDir: 'src/database/migration',
Expand Down
116 changes: 116 additions & 0 deletions src/database/migration/1707032213387-disconnectProperties.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import { MigrationInterface, QueryRunner } from 'typeorm'

export class disconnectProperties1707032213387 implements MigrationInterface {
name = 'disconnectProperties1707032213387'

public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
CREATE TABLE "temporary_historyMessagePayloadEntity" (
"id" uuid PRIMARY KEY NOT NULL,
"payload" varchar NOT NULL,
"payloadType" varchar NOT NULL DEFAULT ('JSON'),
"createAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)
)
`)
await queryRunner.query(`
INSERT INTO "temporary_historyMessagePayloadEntity"("id", "payload", "payloadType", "createAt")
SELECT "id",
"payload",
"payloadType",
"createAt"
FROM "historyMessagePayloadEntity"
`)
await queryRunner.query(`
DROP TABLE "historyMessagePayloadEntity"
`)
await queryRunner.query(`
ALTER TABLE "temporary_historyMessagePayloadEntity"
RENAME TO "historyMessagePayloadEntity"
`)
await queryRunner.query(`
CREATE TABLE "DisconnectPropertiesEntity" (
"id" varchar PRIMARY KEY NOT NULL,
"connectionId" varchar NOT NULL,
"sessionExpiryInterval" integer,
"reasonString" varchar,
"serverReference" varchar,
"userProperties" varchar
)
`)
await queryRunner.query(`
CREATE TABLE "temporary_historyMessagePayloadEntity" (
"id" varchar PRIMARY KEY NOT NULL,
"payload" varchar NOT NULL,
"payloadType" varchar NOT NULL DEFAULT ('JSON'),
"createAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)
)
`)
await queryRunner.query(`
INSERT INTO "temporary_historyMessagePayloadEntity"("id", "payload", "payloadType", "createAt")
SELECT "id",
"payload",
"payloadType",
"createAt"
FROM "historyMessagePayloadEntity"
`)
await queryRunner.query(`
DROP TABLE "historyMessagePayloadEntity"
`)
await queryRunner.query(`
ALTER TABLE "temporary_historyMessagePayloadEntity"
RENAME TO "historyMessagePayloadEntity"
`)
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TABLE "historyMessagePayloadEntity"
RENAME TO "temporary_historyMessagePayloadEntity"
`)
await queryRunner.query(`
CREATE TABLE "historyMessagePayloadEntity" (
"id" uuid PRIMARY KEY NOT NULL,
"payload" varchar NOT NULL,
"payloadType" varchar NOT NULL DEFAULT ('JSON'),
"createAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)
)
`)
await queryRunner.query(`
INSERT INTO "historyMessagePayloadEntity"("id", "payload", "payloadType", "createAt")
SELECT "id",
"payload",
"payloadType",
"createAt"
FROM "temporary_historyMessagePayloadEntity"
`)
await queryRunner.query(`
DROP TABLE "temporary_historyMessagePayloadEntity"
`)
await queryRunner.query(`
DROP TABLE "DisconnectPropertiesEntity"
`)
await queryRunner.query(`
ALTER TABLE "historyMessagePayloadEntity"
RENAME TO "temporary_historyMessagePayloadEntity"
`)
await queryRunner.query(`
CREATE TABLE "historyMessagePayloadEntity" (
"id" uuid PRIMARY KEY NOT NULL,
"payload" varchar NOT NULL,
"payloadType" varchar NOT NULL DEFAULT ('JSON'),
"createAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP)
)
`)
await queryRunner.query(`
INSERT INTO "historyMessagePayloadEntity"("id", "payload", "payloadType", "createAt")
SELECT "id",
"payload",
"payloadType",
"createAt"
FROM "temporary_historyMessagePayloadEntity"
`)
await queryRunner.query(`
DROP TABLE "temporary_historyMessagePayloadEntity"
`)
}
}
2 changes: 1 addition & 1 deletion src/database/models/CopilotEntity.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn } from 'typeorm'
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'

@Entity('CopilotEntity')
export default class CopilotEntity {
Expand Down
22 changes: 22 additions & 0 deletions src/database/models/DisconnectPropertiesEntity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'

@Entity('DisconnectPropertiesEntity')
export default class DisconnectPropertiesEntity {
@PrimaryGeneratedColumn('uuid')
id?: string

@Column({ type: 'varchar' })
connectionId?: string

@Column({ type: 'integer', nullable: true })
sessionExpiryInterval?: number

@Column({ type: 'varchar', nullable: true })
reasonString?: string

@Column({ type: 'varchar', nullable: true })
serverReference?: string

@Column({ type: 'varchar', nullable: true })
userProperties?: string // Assuming JSON string for simplicity
}
3 changes: 3 additions & 0 deletions src/database/services/ConnectionService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@ export const LessThanDate = (date: string | Date) => LessThan(DateUtils.mixedDat
@Service()
export default class ConnectionService {
constructor(
// @ts-ignore
@InjectRepository(ConnectionEntity)
private connectionRepository: Repository<ConnectionEntity>,
// @ts-ignore
@InjectRepository(HistoryConnectionEntity)
private historyConnectionRepository: Repository<HistoryConnectionEntity>,
// @ts-ignore
@InjectRepository(WillEntity)
private willRepository: Repository<WillEntity>,
) {}
Expand Down
69 changes: 69 additions & 0 deletions src/database/services/DisconnectPropertiesService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { Service } from 'typedi'
import { InjectRepository } from 'typeorm-typedi-extensions'
import DisconnectPropertiesEntity from '../models/DisconnectPropertiesEntity'
import { Repository } from 'typeorm'

@Service()
export default class DisconnectPropertiesService {
constructor(
// @ts-ignore
@InjectRepository(DisconnectPropertiesEntity)
private disconnectPropertiesRepository: Repository<DisconnectPropertiesEntity>,
) {}

private modelToEntity(model: DisconnectPropertiesModel): DisconnectPropertiesEntity {
const { id, connectionId, reasonString, serverReference, sessionExpiryInterval } = model
const entity: DisconnectPropertiesEntity = {
id,
connectionId,
reasonString,
serverReference,
sessionExpiryInterval,
}
if (model.userProperties) {
entity.userProperties = JSON.stringify(model.userProperties)
}
return entity
}

private entityToModel(entity: DisconnectPropertiesEntity): DisconnectPropertiesModel {
const { id, connectionId, reasonString, serverReference, sessionExpiryInterval } = entity
const model: DisconnectPropertiesModel = {
id,
connectionId,
reasonString,
serverReference,
sessionExpiryInterval,
}

if (entity.userProperties) {
model.userProperties = JSON.parse(entity.userProperties)
}
return model
}

public async create(disconnectPropertiesData: DisconnectPropertiesModel) {
const entityData = this.modelToEntity(disconnectPropertiesData)
const newDisconnectProperties = this.disconnectPropertiesRepository.create(entityData)
const savedEntity = await this.disconnectPropertiesRepository.save(newDisconnectProperties)
return this.entityToModel(savedEntity)
}

public async updateByConnectionId(connectionId: string, disconnectPropertiesData: DisconnectPropertiesModel) {
const entityData = this.modelToEntity(disconnectPropertiesData)
await this.disconnectPropertiesRepository.update({ connectionId: connectionId }, entityData)
const updatedEntity = await this.findByConnectionId(connectionId)
return updatedEntity
}

public async findByConnectionId(connectionId: string) {
const entity = await this.disconnectPropertiesRepository.findOne({
where: { connectionId: connectionId },
})
return entity ? this.entityToModel(entity) : null
}

public async deleteByConnectionId(connectionId: string) {
return await this.disconnectPropertiesRepository.delete({ connectionId: connectionId })
}
}
4 changes: 4 additions & 0 deletions src/database/useServices.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import HistoryMessagePayloadService from './services/HistoryMessagePayloaderServ
import MessageService from './services/MessageService'
import ScriptService from './services/ScriptService'
import CopilotService from './services/CopilotService'
import DisconnectPropertiesService from './services/DisconnectPropertiesService'

export default function useServices() {
const connectionService = Container.get(ConnectionService)
Expand All @@ -21,6 +22,8 @@ export default function useServices() {
const messageService = Container.get(MessageService)
const scriptService = Container.get(ScriptService)
const copilotService = Container.get(CopilotService)
const disconnectPropertiesService = Container.get(DisconnectPropertiesService)

return {
connectionService,
willService,
Expand All @@ -32,5 +35,6 @@ export default function useServices() {
messageService,
scriptService,
copilotService,
disconnectPropertiesService,
}
}
17 changes: 13 additions & 4 deletions src/types/global.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Vue from 'vue'
import { TranslateResult } from 'vue-i18n'
import { MqttClient } from 'mqtt'
import { MqttClient, UserProperties } from 'mqtt'

declare global {
type $TSFixed = any
Expand Down Expand Up @@ -223,7 +223,7 @@ declare global {
contentType?: string | null
responseTopic?: string | null
correlationData?: string | Buffer | null
userProperties?: { [key: string]: string | string[] } | null
userProperties?: UserProperties | null
}

interface WillModel {
Expand Down Expand Up @@ -274,7 +274,7 @@ declare global {
topicAliasMaximum?: number | null
requestResponseInformation?: boolean | null
requestProblemInformation?: boolean | null
userProperties?: { [key: string]: string | string[] } | null
userProperties?: UserProperties | null
authenticationMethod?: string | null
authenticationData?: Buffer | null
}
Expand All @@ -293,7 +293,7 @@ declare global {
topicAlias?: number | null
responseTopic?: string | null
correlationData?: string | Buffer | null
userProperties?: { [key: string]: string | string[] } | null
userProperties?: UserProperties | null
subscriptionIdentifier?: number | null
contentType?: string | null
}
Expand Down Expand Up @@ -398,4 +398,13 @@ declare global {
}

type LogLevel = 'debug' | 'info' | 'warn' | 'error'

interface DisconnectPropertiesModel {
id?: string
connectionId?: string
sessionExpiryInterval?: number
reasonString?: string
serverReference?: string
userProperties?: UserProperties
}
}