diff --git a/apps/server/src/core/page/services/page.service.ts b/apps/server/src/core/page/services/page.service.ts index 387abc5cc..b70c54449 100644 --- a/apps/server/src/core/page/services/page.service.ts +++ b/apps/server/src/core/page/services/page.service.ts @@ -175,44 +175,7 @@ export class PageService { } async nextPagePosition(spaceId: string, parentPageId?: string) { - let pagePosition: string; - - const lastPageQuery = this.db - .selectFrom('pages') - .select(['position']) - .where('spaceId', '=', spaceId) - .where('deletedAt', 'is', null) - .orderBy('position', (ob) => ob.collate('C').desc()) - .limit(1); - - if (parentPageId) { - // check for children of this page - const lastPage = await lastPageQuery - .where('parentPageId', '=', parentPageId) - .executeTakeFirst(); - - if (!lastPage) { - pagePosition = generateJitteredKeyBetween(null, null); - } else { - // if there is an existing page, we should get a position below it - pagePosition = generateJitteredKeyBetween(lastPage.position, null); - } - } else { - // for root page - const lastPage = await lastPageQuery - .where('parentPageId', 'is', null) - .executeTakeFirst(); - - // if no existing page, make this the first - if (!lastPage) { - pagePosition = generateJitteredKeyBetween(null, null); // we expect "a0" - } else { - // if there is an existing page, we should get a position below it - pagePosition = generateJitteredKeyBetween(lastPage.position, null); - } - } - - return pagePosition; + return this.pageRepo.nextPagePosition(spaceId, parentPageId); } async update( diff --git a/apps/server/src/database/repos/page/page.repo.ts b/apps/server/src/database/repos/page/page.repo.ts index 9eb9f3a50..9713bda35 100644 --- a/apps/server/src/database/repos/page/page.repo.ts +++ b/apps/server/src/database/repos/page/page.repo.ts @@ -16,6 +16,7 @@ import { jsonArrayFrom, jsonObjectFrom } from 'kysely/helpers/postgres'; import { SpaceMemberRepo } from '@docmost/db/repos/space/space-member.repo'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { EventName } from '../../../common/events/event.contants'; +import { generateJitteredKeyBetween } from 'fractional-indexing-jittered'; @Injectable() export class PageRepo { @@ -605,4 +606,27 @@ export class PageRepo { .execute() ); } + + async nextPagePosition( + spaceId: string, + parentPageId?: string, + ): Promise { + const lastPageQuery = this.db + .selectFrom('pages') + .select(['position']) + .where('spaceId', '=', spaceId) + .where('deletedAt', 'is', null) + .orderBy('position', (ob) => ob.collate('C').desc()) + .limit(1); + + const lastPage = parentPageId + ? await lastPageQuery + .where('parentPageId', '=', parentPageId) + .executeTakeFirst() + : await lastPageQuery + .where('parentPageId', 'is', null) + .executeTakeFirst(); + + return generateJitteredKeyBetween(lastPage?.position ?? null, null); + } }