[messaging] add more details in exceptions (#4256)

[messaging] add more logs in exceptions
This commit is contained in:
Weiko
2024-03-04 14:05:01 +01:00
committed by GitHub
parent f990b68f0e
commit 3c63584ef8
3 changed files with 75 additions and 57 deletions

View File

@ -12,7 +12,10 @@ export class DataSourceService {
private readonly dataSourceMetadataRepository: Repository<DataSourceEntity>, private readonly dataSourceMetadataRepository: Repository<DataSourceEntity>,
) {} ) {}
async createDataSourceMetadata(workspaceId: string, workspaceSchema: string) { async createDataSourceMetadata(
workspaceId: string,
workspaceSchema: string,
): Promise<DataSourceEntity> {
// TODO: Double check if this is the correct way to do this // TODO: Double check if this is the correct way to do this
const dataSource = await this.dataSourceMetadataRepository.findOne({ const dataSource = await this.dataSourceMetadataRepository.findOne({
where: { workspaceId }, where: { workspaceId },
@ -30,25 +33,29 @@ export class DataSourceService {
async getManyDataSourceMetadata( async getManyDataSourceMetadata(
options: FindManyOptions<DataSourceEntity> = {}, options: FindManyOptions<DataSourceEntity> = {},
) { ): Promise<DataSourceEntity[]> {
return this.dataSourceMetadataRepository.find(options); return this.dataSourceMetadataRepository.find(options);
} }
async getDataSourcesMetadataFromWorkspaceId(workspaceId: string) { async getDataSourcesMetadataFromWorkspaceId(
workspaceId: string,
): Promise<DataSourceEntity[]> {
return this.dataSourceMetadataRepository.find({ return this.dataSourceMetadataRepository.find({
where: { workspaceId }, where: { workspaceId },
order: { createdAt: 'DESC' }, order: { createdAt: 'DESC' },
}); });
} }
async getLastDataSourceMetadataFromWorkspaceIdOrFail(workspaceId: string) { async getLastDataSourceMetadataFromWorkspaceIdOrFail(
workspaceId: string,
): Promise<DataSourceEntity> {
return this.dataSourceMetadataRepository.findOneOrFail({ return this.dataSourceMetadataRepository.findOneOrFail({
where: { workspaceId }, where: { workspaceId },
order: { createdAt: 'DESC' }, order: { createdAt: 'DESC' },
}); });
} }
async delete(workspaceId: string) { async delete(workspaceId: string): Promise<void> {
await this.dataSourceMetadataRepository.delete({ workspaceId }); await this.dataSourceMetadataRepository.delete({ workspaceId });
} }
} }

View File

@ -124,54 +124,62 @@ export class MessageService {
): Promise<Map<string, string>> { ): Promise<Map<string, string>> {
const messageExternalIdsAndIdsMap = new Map<string, string>(); const messageExternalIdsAndIdsMap = new Map<string, string>();
for (const message of messages) { try {
await workspaceDataSource?.transaction(async (manager: EntityManager) => { for (const message of messages) {
const existingMessageChannelMessageAssociationsCount = await workspaceDataSource?.transaction(
await this.messageChannelMessageAssociationService.countByMessageExternalIdsAndMessageChannelId( async (manager: EntityManager) => {
[message.externalId], const existingMessageChannelMessageAssociationsCount =
gmailMessageChannelId, await this.messageChannelMessageAssociationService.countByMessageExternalIdsAndMessageChannelId(
workspaceId, [message.externalId],
manager, gmailMessageChannelId,
); workspaceId,
manager,
);
if (existingMessageChannelMessageAssociationsCount > 0) { if (existingMessageChannelMessageAssociationsCount > 0) {
return; return;
} }
const savedOrExistingMessageThreadId = const savedOrExistingMessageThreadId =
await this.messageThreadService.saveMessageThreadOrReturnExistingMessageThread( await this.messageThreadService.saveMessageThreadOrReturnExistingMessageThread(
message.messageThreadExternalId, message.messageThreadExternalId,
dataSourceMetadata, dataSourceMetadata,
workspaceId, workspaceId,
manager, manager,
); );
const savedOrExistingMessageId = const savedOrExistingMessageId =
await this.saveMessageOrReturnExistingMessage( await this.saveMessageOrReturnExistingMessage(
message, message,
savedOrExistingMessageThreadId, savedOrExistingMessageThreadId,
connectedAccount, connectedAccount,
dataSourceMetadata, dataSourceMetadata,
workspaceId, workspaceId,
manager, manager,
); );
messageExternalIdsAndIdsMap.set( messageExternalIdsAndIdsMap.set(
message.externalId, message.externalId,
savedOrExistingMessageId, savedOrExistingMessageId,
);
await manager.query(
`INSERT INTO ${dataSourceMetadata.schema}."messageChannelMessageAssociation" ("messageChannelId", "messageId", "messageExternalId", "messageThreadId", "messageThreadExternalId") VALUES ($1, $2, $3, $4, $5)`,
[
gmailMessageChannelId,
savedOrExistingMessageId,
message.externalId,
savedOrExistingMessageThreadId,
message.messageThreadExternalId,
],
);
},
); );
}
await manager.query( } catch (error) {
`INSERT INTO ${dataSourceMetadata.schema}."messageChannelMessageAssociation" ("messageChannelId", "messageId", "messageExternalId", "messageThreadId", "messageThreadExternalId") VALUES ($1, $2, $3, $4, $5)`, throw new Error(
[ `Error saving connected account ${connectedAccount.id} messages to workspace ${workspaceId}: ${error.message}`,
gmailMessageChannelId, );
savedOrExistingMessageId,
message.externalId,
savedOrExistingMessageThreadId,
message.messageThreadExternalId,
],
);
});
} }
return messageExternalIdsAndIdsMap; return messageExternalIdsAndIdsMap;

View File

@ -4,6 +4,7 @@ import { DataSource, EntityManager } from 'typeorm';
import { DataSourceService } from 'src/metadata/data-source/data-source.service'; import { DataSourceService } from 'src/metadata/data-source/data-source.service';
import { TypeORMService } from 'src/database/typeorm/typeorm.service'; import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { DataSourceEntity } from 'src/metadata/data-source/data-source.entity';
@Injectable() @Injectable()
export class WorkspaceDataSourceService { export class WorkspaceDataSourceService {
@ -30,7 +31,7 @@ export class WorkspaceDataSourceService {
public async connectedToWorkspaceDataSourceAndReturnMetadata( public async connectedToWorkspaceDataSourceAndReturnMetadata(
workspaceId: string, workspaceId: string,
) { ): Promise<{ dataSource: DataSource; dataSourceMetadata: DataSourceEntity }> {
const dataSourceMetadata = const dataSourceMetadata =
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail( await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
workspaceId, workspaceId,
@ -114,16 +115,18 @@ export class WorkspaceDataSourceService {
workspaceId: string, workspaceId: string,
transactionManager?: EntityManager, transactionManager?: EntityManager,
): Promise<any> { ): Promise<any> {
if (transactionManager) { try {
return await transactionManager.query(query, parameters); if (transactionManager) {
} return await transactionManager.query(query, parameters);
const workspaceDataSource = }
await this.connectToWorkspaceDataSource(workspaceId); const workspaceDataSource =
await this.connectToWorkspaceDataSource(workspaceId);
if (workspaceDataSource) {
return await workspaceDataSource.query(query, parameters); return await workspaceDataSource.query(query, parameters);
} catch (error) {
throw new Error(
`Error executing raw query for workspace ${workspaceId}: ${error.message}`,
);
} }
throw new Error('No data source found or transaction manager provided');
} }
} }