6cf5bd2ed4
Now that all existing and new workspaces have the following syncStage: - CALENDAR_EVENT_LIST_FETCH_PENDING - MESSAGE_LIST_FETCH_PENDING We can fully deprecate the old FULL_CALENDAR_EVENT_LIST_FETCH_PENDING and PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING (full vs partial is now directly inferred from the presence of a cursor)
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
import { InjectRepository } from '@nestjs/typeorm';
|
|
|
|
import { Command } from 'nest-commander';
|
|
import { Repository } from 'typeorm';
|
|
|
|
import {
|
|
ActiveOrSuspendedWorkspacesMigrationCommandRunner,
|
|
type RunOnWorkspaceArgs,
|
|
} from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner';
|
|
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
|
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
|
|
import { AccountsToReconnectService } from 'src/modules/connected-account/services/accounts-to-reconnect.service';
|
|
import {
|
|
MessageChannelSyncStage,
|
|
MessageChannelSyncStatus,
|
|
MessageChannelWorkspaceEntity,
|
|
} from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity';
|
|
|
|
@Command({
|
|
name: 'messaging:relaunch-failed-message-channels',
|
|
description: 'Relaunch failed message channels',
|
|
})
|
|
export class MessagingRelaunchFailedMessageChannelsCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner {
|
|
constructor(
|
|
@InjectRepository(WorkspaceEntity)
|
|
protected readonly workspaceRepository: Repository<WorkspaceEntity>,
|
|
protected readonly twentyORMGlobalManager: TwentyORMGlobalManager,
|
|
protected readonly accountsToReconnectService: AccountsToReconnectService,
|
|
) {
|
|
super(workspaceRepository, twentyORMGlobalManager);
|
|
}
|
|
|
|
override async runOnWorkspace({
|
|
workspaceId,
|
|
options,
|
|
}: RunOnWorkspaceArgs): Promise<void> {
|
|
try {
|
|
const messageChannelRepository =
|
|
await this.twentyORMGlobalManager.getRepositoryForWorkspace<MessageChannelWorkspaceEntity>(
|
|
workspaceId,
|
|
'messageChannel',
|
|
{ shouldBypassPermissionChecks: true },
|
|
);
|
|
|
|
const failedMessageChannels = await messageChannelRepository.find({
|
|
where: {
|
|
syncStage: MessageChannelSyncStage.FAILED,
|
|
},
|
|
relations: {
|
|
connectedAccount: {
|
|
accountOwner: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
if (!options.dryRun && failedMessageChannels.length > 0) {
|
|
await messageChannelRepository.update(
|
|
failedMessageChannels.map(({ id }) => id),
|
|
{
|
|
syncStage: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING,
|
|
syncStatus: MessageChannelSyncStatus.ACTIVE,
|
|
},
|
|
);
|
|
|
|
for (const failedMessageChannel of failedMessageChannels) {
|
|
await this.accountsToReconnectService.removeAccountToReconnect(
|
|
failedMessageChannel.connectedAccount.accountOwner.userId,
|
|
failedMessageChannel.connectedAccountId,
|
|
workspaceId,
|
|
);
|
|
}
|
|
}
|
|
|
|
this.logger.log(
|
|
`${options.dryRun ? ' (DRY RUN) ' : ''}Relaunched ${failedMessageChannels.length} failed message channels`,
|
|
);
|
|
} catch (error) {
|
|
this.logger.error(
|
|
'Error while relaunching failed message channels',
|
|
error,
|
|
);
|
|
}
|
|
}
|
|
}
|