diff --git a/apps/client/src/App.tsx b/apps/client/src/App.tsx index cb117734..3995191d 100644 --- a/apps/client/src/App.tsx +++ b/apps/client/src/App.tsx @@ -34,7 +34,7 @@ import { useTrackOrigin } from "@/hooks/use-track-origin"; import SpacesPage from "@/pages/spaces/spaces.tsx"; import { MfaChallengePage } from "@/ee/mfa/pages/mfa-challenge-page"; import { MfaSetupRequiredPage } from "@/ee/mfa/pages/mfa-setup-required-page"; -import SpaceTrash from "@/pages/space/trash.tsx"; +import SpaceTrash from "@/pages/space/space-trash.tsx"; export default function App() { const { t } = useTranslation(); @@ -50,10 +50,7 @@ export default function App() { } /> } /> } /> - } - /> + } /> {!isCloud() && ( } /> diff --git a/apps/client/src/pages/space/trash.tsx b/apps/client/src/features/page/trash/components/trash.tsx similarity index 99% rename from apps/client/src/pages/space/trash.tsx rename to apps/client/src/features/page/trash/components/trash.tsx index 53ca04cd..9e4e4113 100644 --- a/apps/client/src/pages/space/trash.tsx +++ b/apps/client/src/features/page/trash/components/trash.tsx @@ -32,7 +32,7 @@ import { UserInfo } from "@/components/common/user-info.tsx"; import Paginate from "@/components/common/paginate.tsx"; import { usePaginateAndSearch } from "@/hooks/use-paginate-and-search"; -export default function SpaceTrash() { +export default function Trash() { const { t } = useTranslation(); const { spaceSlug } = useParams(); const { page, setPage } = usePaginateAndSearch(); diff --git a/apps/client/src/pages/space/space-trash.tsx b/apps/client/src/pages/space/space-trash.tsx new file mode 100644 index 00000000..64b4b259 --- /dev/null +++ b/apps/client/src/pages/space/space-trash.tsx @@ -0,0 +1,27 @@ +import Trash from "@/features/page/trash/components/trash.tsx"; +import { useParams } from "react-router-dom"; +import { useGetSpaceBySlugQuery } from "@/features/space/queries/space-query.ts"; +import { useSpaceAbility } from "@/features/space/permissions/use-space-ability.ts"; +import React from "react"; +import { + SpaceCaslAction, + SpaceCaslSubject, +} from "@/features/space/permissions/permissions.type.ts"; + +export default function SpaceTrash() { + const { spaceSlug } = useParams(); + const { data: space } = useGetSpaceBySlugQuery(spaceSlug); + + const spaceRules = space?.membership?.permissions; + const spaceAbility = useSpaceAbility(spaceRules); + + if (!space) { + return <>; + } + + if (spaceAbility.cannot(SpaceCaslAction.Manage, SpaceCaslSubject.Page)) { + return <>; + } + + return ; +} diff --git a/apps/server/src/core/page/dto/deleted-page.dto.ts b/apps/server/src/core/page/dto/deleted-page.dto.ts index d0264bb7..8c458cc4 100644 --- a/apps/server/src/core/page/dto/deleted-page.dto.ts +++ b/apps/server/src/core/page/dto/deleted-page.dto.ts @@ -1,7 +1,7 @@ -import { IsOptional, IsString } from 'class-validator'; +import { IsNotEmpty, IsString } from 'class-validator'; export class DeletedPageDto { - @IsOptional() + @IsNotEmpty() @IsString() spaceId: string; } \ No newline at end of file diff --git a/apps/server/src/core/page/page.controller.ts b/apps/server/src/core/page/page.controller.ts index c3d2e5c5..2f6dcf60 100644 --- a/apps/server/src/core/page/page.controller.ts +++ b/apps/server/src/core/page/page.controller.ts @@ -194,7 +194,7 @@ export class PageController { deletedPageDto.spaceId, ); - if (ability.cannot(SpaceCaslAction.Read, SpaceCaslSubject.Page)) { + if (ability.cannot(SpaceCaslAction.Manage, SpaceCaslSubject.Page)) { throw new ForbiddenException(); }