[messaging] add more details in exceptions (#4256)
[messaging] add more logs in exceptions
This commit is contained in:
@ -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 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user