1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00

Server: Improve performance and reliability when adding an item

This commit is contained in:
Laurent Cozic 2023-06-16 18:56:58 +01:00
parent eda18c3860
commit 17888a2da0

View File

@ -537,10 +537,10 @@ export default class ItemModel extends BaseModel<Item> {
return this.itemToJoplinItem(raw);
}
public async saveFromRawContent(user: User, rawContentItems: SaveFromRawContentItem[] | SaveFromRawContentItem, options: ItemSaveOption = null): Promise<SaveFromRawContentResult> {
public async saveFromRawContent(user: User, rawContentItemOrItems: SaveFromRawContentItem[] | SaveFromRawContentItem, options: ItemSaveOption = null): Promise<SaveFromRawContentResult> {
options = options || {};
if (!Array.isArray(rawContentItems)) rawContentItems = [rawContentItems];
const rawContentItems = !Array.isArray(rawContentItemOrItems) ? [rawContentItemOrItems] : rawContentItemOrItems;
// In this function, first we process the input items, which may be
// serialized Joplin items or actual buffers (for resources) and convert
@ -555,7 +555,13 @@ export default class ItemModel extends BaseModel<Item> {
joplinItem?: any;
}
const existingItems = await this.loadByNames(user.id, rawContentItems.map(i => i.name));
interface ExistingItem {
id: Uuid;
name: string;
}
return this.withTransaction(async () => {
const existingItems = await this.loadByNames(user.id, rawContentItems.map(i => i.name), { fields: ['id', 'name'] }) as ExistingItem[];
const itemsToProcess: Record<string, ItemToProcess> = {};
for (const rawItem of rawContentItems) {
@ -621,7 +627,6 @@ export default class ItemModel extends BaseModel<Item> {
const output: SaveFromRawContentResult = {};
await this.withTransaction(async () => {
for (const name of Object.keys(itemsToProcess)) {
const o = itemsToProcess[name];
@ -690,9 +695,9 @@ export default class ItemModel extends BaseModel<Item> {
};
}
}
}, 'ItemModel::saveFromRawContent');
return output;
}, 'ItemModel::saveFromRawContent');
}
protected async validate(item: Item, options: ValidateOptions = {}): Promise<Item> {