From c49c6e4f0b689daebf53caa764443e9d6099fa5f Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Thu, 22 Dec 2022 16:35:25 +0800 Subject: [PATCH 1/2] improve(desktop): improve update connection logic --- src/database/services/ConnectionService.ts | 29 ++++---- src/database/services/WillService.ts | 84 ++++++++++++++++++++++ src/database/useServices.ts | 3 + src/views/connections/ConnectionForm.vue | 2 +- src/views/connections/ConnectionInfo.vue | 5 +- 5 files changed, 101 insertions(+), 22 deletions(-) create mode 100644 src/database/services/WillService.ts diff --git a/src/database/services/ConnectionService.ts b/src/database/services/ConnectionService.ts index a839b98ca..407801bfc 100644 --- a/src/database/services/ConnectionService.ts +++ b/src/database/services/ConnectionService.ts @@ -9,6 +9,7 @@ import HistoryConnectionEntity from '@/database/models/HistoryConnectionEntity' import { Repository, MoreThan, LessThan } from 'typeorm' import { DateUtils } from 'typeorm/util/DateUtils' import time, { sqliteDateFormat } from '@/utils/time' +import useServices from '@/database/useServices' export const MoreThanDate = (date: string | Date) => MoreThan(DateUtils.mixedDateToUtcDatetimeString(date)) export const LessThanDate = (date: string | Date) => LessThan(DateUtils.mixedDateToUtcDatetimeString(date)) @@ -70,7 +71,7 @@ export default class ConnectionService { } as ConnectionModel } - public static modelToEntity(data: ConnectionModel): ConnectionEntity { + public static modelToEntity(data: Partial): Partial { if (data.properties) { const { sessionExpiryInterval, @@ -86,8 +87,9 @@ export default class ConnectionService { if (data.properties.userProperties) { userProperties = JSON.stringify(data.properties.userProperties) } + const { properties, ...rest } = data return { - ...data, + ...rest, sessionExpiryInterval, receiveMaximum, maximumPacketSize, @@ -261,22 +263,15 @@ export default class ConnectionService { return ConnectionService.entityToModel(saved) } - public async update(id: string, data: ConnectionModel): Promise { - const res: ConnectionEntity | undefined = await this.connectionRepository - .createQueryBuilder('cn') - .where('cn.id = :id', { id }) - .getOne() - if (!res) { - return - } - // safe it's same data struct in single connection table - const merged: ConnectionEntity = _.merge(res, ConnectionService.modelToEntity(data)) - const query: ConnectionEntity | undefined = await this.connectionRepository.save({ - ...merged, - id, + public async update(id: string, data: ConnectionModel) { + const { willService } = useServices() + const { messages, subscriptions, will, ...rest } = data + await this.connectionRepository.update(id, { + ...ConnectionService.modelToEntity(rest), updateAt: time.getNowDate(), - } as ConnectionEntity) - return query as ConnectionModel + }) + will && (await willService.save(will)) + return await this.get(id) } public async import(data: ConnectionModel[]): Promise { diff --git a/src/database/services/WillService.ts b/src/database/services/WillService.ts new file mode 100644 index 000000000..312625f1e --- /dev/null +++ b/src/database/services/WillService.ts @@ -0,0 +1,84 @@ +import { Service } from 'typedi' +import { InjectRepository } from 'typeorm-typedi-extensions' +import WillEntity from '../models/WillEntity' +import { Repository } from 'typeorm' + +@Service() +export default class WillService { + constructor( + @InjectRepository(WillEntity) + private willRepository: Repository, + ) {} + + public static modelToEntity(model: WillModel): WillEntity { + const { + id, + properties = { + contentType: '', + }, + lastWillPayload = '', + lastWillTopic = '', + lastWillQos = 0, + lastWillRetain = false, + } = model + const data = { + lastWillPayload, + lastWillTopic, + lastWillQos, + lastWillRetain, + willDelayInterval: properties.willDelayInterval, + payloadFormatIndicator: properties.payloadFormatIndicator, + messageExpiryInterval: properties.messageExpiryInterval, + contentType: properties.contentType, + responseTopic: properties.responseTopic, + correlationData: properties.correlationData?.toString(), + } + if (id) { + return { ...data, id } + } + return { ...data } + } + + public static entityToModel(entity: WillEntity): WillModel { + const { + id, + lastWillTopic, + lastWillPayload, + lastWillQos, + lastWillRetain, + willDelayInterval, + payloadFormatIndicator, + messageExpiryInterval, + contentType, + responseTopic, + correlationData, + userProperties, + } = entity + return { + id: id, + lastWillTopic: lastWillTopic, + lastWillPayload: lastWillPayload, + lastWillQos: lastWillQos, + lastWillRetain: lastWillRetain, + properties: { + willDelayInterval: willDelayInterval, + payloadFormatIndicator: payloadFormatIndicator, + messageExpiryInterval: messageExpiryInterval, + contentType: contentType, + responseTopic: responseTopic, + correlationData: correlationData, + userProperties: userProperties ? JSON.parse(userProperties) : undefined, + }, + } + } + + public async get(id: string) { + const query = await this.willRepository.findOne(id) + return query && WillService.entityToModel(query) + } + + public async save(will: WillModel) { + const entity = WillService.modelToEntity(will) + return await this.willRepository.save(entity) + } +} diff --git a/src/database/useServices.ts b/src/database/useServices.ts index e7644350d..7d0a83db6 100644 --- a/src/database/useServices.ts +++ b/src/database/useServices.ts @@ -1,5 +1,6 @@ import { Container } from 'typedi' import ConnectionService from './services/ConnectionService' +import WillService from './services/WillService' import SettingService from './services/SettingService' import CollectionService from './services/CollectionService' import SubscriptionService from './services/SubscriptionService' @@ -10,6 +11,7 @@ import ScriptService from './services/ScriptService' export default function useServices() { const connectionService = Container.get(ConnectionService) + const willService = Container.get(WillService) const settingService = Container.get(SettingService) const collectionService = Container.get(CollectionService) const subscriptionService = Container.get(SubscriptionService) @@ -19,6 +21,7 @@ export default function useServices() { const scriptService = Container.get(ScriptService) return { connectionService, + willService, settingService, collectionService, subscriptionService, diff --git a/src/views/connections/ConnectionForm.vue b/src/views/connections/ConnectionForm.vue index 99570264a..7cbac177e 100644 --- a/src/views/connections/ConnectionForm.vue +++ b/src/views/connections/ConnectionForm.vue @@ -678,7 +678,7 @@ export default class ConnectionForm extends Vue { } else { // update a exisit connection if (data.id) { - res = await connectionService.updateWithCascade(data.id, { + res = await connectionService.update(data.id, { ...data, updateAt: time.getNowDate(), }) diff --git a/src/views/connections/ConnectionInfo.vue b/src/views/connections/ConnectionInfo.vue index 1a09e14f6..826c09e77 100644 --- a/src/views/connections/ConnectionInfo.vue +++ b/src/views/connections/ConnectionInfo.vue @@ -190,10 +190,7 @@ export default class ConnectionInfo extends Vue { } const { connectionService } = useServices() if (this.connection.id) { - const res: ConnectionModel | undefined = await connectionService.updateWithCascade( - this.connection.id, - this.connection, - ) + const res: ConnectionModel | undefined = await connectionService.update(this.connection.id, this.connection) if (res) { this.$emit('handleConnect', this.connection) } From 53527ca0a15271841b9c3b21f327f7db0f79da46 Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Thu, 22 Dec 2022 18:04:30 +0800 Subject: [PATCH 2/2] fix(desktop): fix connections list not refresh --- src/views/connections/ConnectionInfo.vue | 2 +- src/views/connections/ConnectionsList.vue | 10 ++-------- src/views/connections/index.vue | 10 +++++++--- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/views/connections/ConnectionInfo.vue b/src/views/connections/ConnectionInfo.vue index 826c09e77..6c73706a6 100644 --- a/src/views/connections/ConnectionInfo.vue +++ b/src/views/connections/ConnectionInfo.vue @@ -190,7 +190,7 @@ export default class ConnectionInfo extends Vue { } const { connectionService } = useServices() if (this.connection.id) { - const res: ConnectionModel | undefined = await connectionService.update(this.connection.id, this.connection) + const res = await connectionService.update(this.connection.id, this.connection) if (res) { this.$emit('handleConnect', this.connection) } diff --git a/src/views/connections/ConnectionsList.vue b/src/views/connections/ConnectionsList.vue index 1293f047a..5cf49e592 100644 --- a/src/views/connections/ConnectionsList.vue +++ b/src/views/connections/ConnectionsList.vue @@ -136,7 +136,7 @@