mirror of
https://github.com/docmost/docmost.git
synced 2026-05-07 06:23:06 +08:00
@@ -43,7 +43,7 @@ export class CommentController {
|
|||||||
@AuthWorkspace() workspace: Workspace,
|
@AuthWorkspace() workspace: Workspace,
|
||||||
) {
|
) {
|
||||||
const page = await this.pageRepo.findById(createCommentDto.pageId);
|
const page = await this.pageRepo.findById(createCommentDto.pageId);
|
||||||
if (!page) {
|
if (!page || page.deletedAt) {
|
||||||
throw new NotFoundException('Page not found');
|
throw new NotFoundException('Page not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,10 @@ export class CommentController {
|
|||||||
throw new NotFoundException('Comment not found');
|
throw new NotFoundException('Comment not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
const ability = await this.spaceAbility.createForUser(user, comment.spaceId);
|
const ability = await this.spaceAbility.createForUser(
|
||||||
|
user,
|
||||||
|
comment.spaceId,
|
||||||
|
);
|
||||||
if (ability.cannot(SpaceCaslAction.Read, SpaceCaslSubject.Page)) {
|
if (ability.cannot(SpaceCaslAction.Read, SpaceCaslSubject.Page)) {
|
||||||
throw new ForbiddenException();
|
throw new ForbiddenException();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ export class SearchService {
|
|||||||
.$if(Boolean(searchParams.creatorId), (qb) =>
|
.$if(Boolean(searchParams.creatorId), (qb) =>
|
||||||
qb.where('creatorId', '=', searchParams.creatorId),
|
qb.where('creatorId', '=', searchParams.creatorId),
|
||||||
)
|
)
|
||||||
|
.where('deletedAt', 'is', null)
|
||||||
.orderBy('rank', 'desc')
|
.orderBy('rank', 'desc')
|
||||||
.limit(searchParams.limit | 20)
|
.limit(searchParams.limit | 20)
|
||||||
.offset(searchParams.offset || 0);
|
.offset(searchParams.offset || 0);
|
||||||
@@ -191,6 +192,7 @@ export class SearchService {
|
|||||||
sql`LOWER(f_unaccent(${`%${query}%`}))`,
|
sql`LOWER(f_unaccent(${`%${query}%`}))`,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
.where('deletedAt', 'is', null)
|
||||||
.where('workspaceId', '=', workspaceId)
|
.where('workspaceId', '=', workspaceId)
|
||||||
.limit(limit);
|
.limit(limit);
|
||||||
|
|
||||||
|
|||||||
@@ -108,12 +108,12 @@ export class ShareService {
|
|||||||
includeCreator: true,
|
includeCreator: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
page.content = await this.updatePublicAttachments(page);
|
if (!page || page.deletedAt) {
|
||||||
|
|
||||||
if (!page) {
|
|
||||||
throw new NotFoundException('Shared page not found');
|
throw new NotFoundException('Shared page not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page.content = await this.updatePublicAttachments(page);
|
||||||
|
|
||||||
return { page, share };
|
return { page, share };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,6 +132,7 @@ export class ShareService {
|
|||||||
sql`0`.as('level'),
|
sql`0`.as('level'),
|
||||||
])
|
])
|
||||||
.where(isValidUUID(pageId) ? 'id' : 'slugId', '=', pageId)
|
.where(isValidUUID(pageId) ? 'id' : 'slugId', '=', pageId)
|
||||||
|
.where('deletedAt', 'is', null)
|
||||||
.unionAll((union) =>
|
.unionAll((union) =>
|
||||||
union
|
union
|
||||||
.selectFrom('pages as p')
|
.selectFrom('pages as p')
|
||||||
@@ -144,7 +145,8 @@ export class ShareService {
|
|||||||
// Increase the level by 1 for each ancestor.
|
// Increase the level by 1 for each ancestor.
|
||||||
sql`ph.level + 1`.as('level'),
|
sql`ph.level + 1`.as('level'),
|
||||||
])
|
])
|
||||||
.innerJoin('page_hierarchy as ph', 'ph.parentPageId', 'p.id'),
|
.innerJoin('page_hierarchy as ph', 'ph.parentPageId', 'p.id')
|
||||||
|
.where('p.deletedAt', 'is', null),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.selectFrom('page_hierarchy')
|
.selectFrom('page_hierarchy')
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { InjectKysely } from 'nestjs-kysely';
|
import { InjectKysely } from 'nestjs-kysely';
|
||||||
import { KyselyDB, KyselyTransaction } from '../../types/kysely.types';
|
import { KyselyDB, KyselyTransaction } from '../../types/kysely.types';
|
||||||
import { dbOrTx } from '../../utils';
|
import { dbOrTx, executeTx } from '../../utils';
|
||||||
import {
|
import {
|
||||||
InsertablePage,
|
InsertablePage,
|
||||||
Page,
|
Page,
|
||||||
@@ -183,14 +183,20 @@ export class PageRepo {
|
|||||||
|
|
||||||
const pageIds = descendants.map((d) => d.id);
|
const pageIds = descendants.map((d) => d.id);
|
||||||
|
|
||||||
await this.db
|
if (pageIds.length > 0) {
|
||||||
.updateTable('pages')
|
await executeTx(this.db, async (trx) => {
|
||||||
.set({
|
await trx
|
||||||
deletedById: deletedById,
|
.updateTable('pages')
|
||||||
deletedAt: currentDate,
|
.set({
|
||||||
})
|
deletedById: deletedById,
|
||||||
.where('id', 'in', pageIds)
|
deletedAt: currentDate,
|
||||||
.execute();
|
})
|
||||||
|
.where('id', 'in', pageIds)
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await trx.deleteFrom('shares').where('pageId', 'in', pageIds).execute();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async restorePage(pageId: string): Promise<void> {
|
async restorePage(pageId: string): Promise<void> {
|
||||||
|
|||||||
Reference in New Issue
Block a user