From 9a225c07c31670b7aaf43bf9e867f03424604d88 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 23 May 2026 03:05:05 +0100 Subject: [PATCH] feat(page): add canPageBeUnfurled predicate for Slack link previews --- .../src/database/repos/page/page.repo.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/apps/server/src/database/repos/page/page.repo.ts b/apps/server/src/database/repos/page/page.repo.ts index 259e1bd33..641b34d1c 100644 --- a/apps/server/src/database/repos/page/page.repo.ts +++ b/apps/server/src/database/repos/page/page.repo.ts @@ -423,6 +423,34 @@ export class PageRepo { }); } + async canPageBeUnfurled(pageId: string, workspaceId: string): Promise { + const result = await this.db + .selectFrom('pages') + .innerJoin('spaces', 'spaces.id', 'pages.spaceId') + .innerJoin('groups', (join) => + join + .onRef('groups.workspaceId', '=', 'spaces.workspaceId') + .on('groups.isDefault', '=', true) + .on('groups.deletedAt', 'is', null), + ) + .innerJoin('spaceMembers', (join) => + join + .onRef('spaceMembers.spaceId', '=', 'spaces.id') + .onRef('spaceMembers.groupId', '=', 'groups.id'), + ) + .leftJoin('pageAccess', 'pageAccess.pageId', 'pages.id') + .leftJoin('pagePermissions', 'pagePermissions.pageAccessId', 'pageAccess.id') + .select(['pages.id']) + .where('pages.id', '=', pageId) + .where('pages.workspaceId', '=', workspaceId) + .where('pages.deletedAt', 'is', null) + .where('pagePermissions.id', 'is', null) + .limit(1) + .executeTakeFirst(); + + return !!result; + } + withSpace(eb: ExpressionBuilder) { return jsonObjectFrom( eb