chore: workspace page access control (#655)

* chore: workspace page access control

* chore: workspace pages access endpoint updated

---------

Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
This commit is contained in:
Bavisetti Narayan
2024-07-19 19:57:01 +05:30
committed by GitHub
parent 293e38d720
commit 4066fd515c
4 changed files with 43 additions and 2 deletions

View File

@@ -48,6 +48,16 @@ urlpatterns = [
),
name="workspace-page-archive-unarchive",
),
# private and public page
path(
"workspaces/<str:slug>/pages/<uuid:pk>/access/",
WorkspacePageViewSet.as_view(
{
"post": "access",
}
),
name="project-pages-access",
),
# lock and unlock
path(
"workspaces/<str:slug>/pages/<uuid:pk>/lock/",

View File

@@ -216,6 +216,29 @@ class WorkspacePageViewSet(BaseViewSet):
return Response(status=status.HTTP_204_NO_CONTENT)
@check_feature_flag(FeatureFlag.WORKSPACE_PAGES)
def access(self, request, slug, pk):
access = request.data.get("access", 0)
page = Page.objects.filter(
pk=pk, workspace__slug=slug
).first()
# Only update access if the page owner is the requesting user
if (
page.access != request.data.get("access", page.access)
and page.owned_by_id != request.user.id
):
return Response(
{
"error": "Access cannot be updated since this page is owned by someone else"
},
status=status.HTTP_400_BAD_REQUEST,
)
page.access = access
page.save()
return Response(status=status.HTTP_204_NO_CONTENT)
@check_feature_flag(FeatureFlag.WORKSPACE_PAGES)
def list(self, request, slug):
queryset = self.get_queryset()

View File

@@ -42,6 +42,14 @@ export class WorkspacePageService extends APIService {
});
}
async updateAccess(workspaceSlug: string, pageId: string, data: Partial<TPage>): Promise<void> {
return this.post(`/api/workspaces/${workspaceSlug}/pages/${pageId}/access/`, data)
.then((response) => response?.data)
.catch((error) => {
throw error?.response?.data;
});
}
async remove(workspaceSlug: string, pageId: string): Promise<void> {
return this.delete(`/api/workspaces/${workspaceSlug}/pages/${pageId}/`)
.then((response) => response?.data)

View File

@@ -369,7 +369,7 @@ export class WorkspacePageDetails implements IWorkspacePageDetails {
runInAction(() => (this.access = EPageAccess.PUBLIC));
try {
await this.pageService.update(workspaceSlug, this.id, {
await this.pageService.updateAccess(workspaceSlug, this.id, {
access: EPageAccess.PUBLIC,
});
} catch (error) {
@@ -391,7 +391,7 @@ export class WorkspacePageDetails implements IWorkspacePageDetails {
runInAction(() => (this.access = EPageAccess.PRIVATE));
try {
await this.pageService.update(workspaceSlug, this.id, {
await this.pageService.updateAccess(workspaceSlug, this.id, {
access: EPageAccess.PRIVATE,
});
} catch (error) {