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();
}