[permissions] Deprecate ObjectsPermissionsDeprecated (2/3) (#14450)

Following https://github.com/twentyhq/twenty/pull/14306 , working on the
deprecation of objectRecordsPermissions + renaming of objectPermissions
-> objectsPermissions

In this PR
- Removal of objectRecordsPermissions (was not used in the FE any
longer)
- Addition of objectsPermissions, same as objectPermission but renamed.
objectPermission is no longer used in the FE.

Next step
- Remove unused objectPermissions
This commit is contained in:
Marie
2025-09-12 16:02:42 +02:00
committed by GitHub
parent 5b9cda3341
commit 3270c64a96
16 changed files with 34 additions and 95 deletions
File diff suppressed because one or more lines are too long
@@ -2504,13 +2504,6 @@ export enum PermissionFlagType {
WORKSPACE_MEMBERS = 'WORKSPACE_MEMBERS'
}
export enum PermissionsOnAllObjectRecords {
DESTROY_ALL_OBJECT_RECORDS = 'DESTROY_ALL_OBJECT_RECORDS',
READ_ALL_OBJECT_RECORDS = 'READ_ALL_OBJECT_RECORDS',
SOFT_DELETE_ALL_OBJECT_RECORDS = 'SOFT_DELETE_ALL_OBJECT_RECORDS',
UPDATE_ALL_OBJECT_RECORDS = 'UPDATE_ALL_OBJECT_RECORDS'
}
export type PlaceDetailsResultDto = {
__typename?: 'PlaceDetailsResultDto';
city?: Maybe<Scalars['String']>;
@@ -3639,8 +3632,7 @@ export type UserWorkspace = {
id: Scalars['UUID'];
locale: Scalars['String'];
objectPermissions?: Maybe<Array<ObjectPermission>>;
/** @deprecated Use objectPermissions instead */
objectRecordsPermissions?: Maybe<Array<PermissionsOnAllObjectRecords>>;
objectsPermissions?: Maybe<Array<ObjectPermission>>;
permissionFlags?: Maybe<Array<PermissionFlagType>>;
twoFactorAuthenticationMethodSummary?: Maybe<Array<TwoFactorAuthenticationMethodDto>>;
updatedAt: Scalars['DateTime'];
@@ -6,7 +6,7 @@ export type CurrentUserWorkspace = Pick<
UserWorkspace,
'permissionFlags' | 'twoFactorAuthenticationMethodSummary'
> & {
objectPermissions: Array<ObjectPermissions & { objectMetadataId: string }>;
objectsPermissions: Array<ObjectPermissions & { objectMetadataId: string }>;
};
export const currentUserWorkspaceState =
@@ -27,7 +27,7 @@ export const objectPermissionsFamilySelector = selectorFamily<
};
}
const objectPermissions = currentUserWorkspace?.objectPermissions?.find(
const objectPermissions = currentUserWorkspace?.objectsPermissions?.find(
(permission) => permission.objectMetadataId === objectMetadataItem.id,
);
@@ -1,5 +1,5 @@
import { gql } from '@apollo/client';
import { FieldMetadataType, PermissionsOnAllObjectRecords } from '~/generated/graphql';
import { FieldMetadataType } from '~/generated/graphql';
export const FIELD_METADATA_ID = '2c43466a-fe9e-4005-8d08-c5836067aa6c';
export const FIELD_RELATION_METADATA_ID =
@@ -167,12 +167,6 @@ export const responseData = {
workspaceMembers: [],
currentUserWorkspace: {
permissionFlags: ['DATA_MODEL'],
objectRecordsPermissions: [
PermissionsOnAllObjectRecords.READ_ALL_OBJECT_RECORDS,
PermissionsOnAllObjectRecords.UPDATE_ALL_OBJECT_RECORDS,
PermissionsOnAllObjectRecords.SOFT_DELETE_ALL_OBJECT_RECORDS,
PermissionsOnAllObjectRecords.DESTROY_ALL_OBJECT_RECORDS,
],
},
currentWorkspace: {
id: 'test-workspace-id',
@@ -49,7 +49,7 @@ export const useRefreshObjectMetadataItems = (
}
const objectPermissionsByObjectMetadataId =
currentUserWorkspace.objectPermissions.reduce(
currentUserWorkspace.objectsPermissions.reduce(
(acc, objectPermission) => {
acc[objectPermission.objectMetadataId] = objectPermission;
return acc;
@@ -13,15 +13,15 @@ type useObjectPermissionsReturnType = {
export const useObjectPermissions = (): useObjectPermissionsReturnType => {
const currentUserWorkspace = useRecoilValue(currentUserWorkspaceState);
const objectPermissions = currentUserWorkspace?.objectPermissions;
const objectsPermissions = currentUserWorkspace?.objectsPermissions;
if (!isDefined(objectPermissions)) {
if (!isDefined(objectsPermissions)) {
return {
objectPermissionsByObjectMetadataId: {},
};
}
const objectPermissionsByObjectMetadataId = objectPermissions?.reduce(
const objectPermissionsByObjectMetadataId = objectsPermissions?.reduce(
(
acc: Record<string, ObjectPermissions & { objectMetadataId: string }>,
objectPermission,
@@ -118,9 +118,9 @@ export const UserProviderEffect = () => {
if (isDefined(queryData.currentUser.currentUserWorkspace)) {
setCurrentUserWorkspace({
...queryData.currentUser.currentUserWorkspace,
objectPermissions:
objectsPermissions:
(queryData.currentUser.currentUserWorkspace
.objectPermissions as Array<
.objectsPermissions as Array<
ObjectPermissions & { objectMetadataId: string }
>) ?? [],
});
@@ -32,8 +32,7 @@ export const USER_QUERY_FRAGMENT = gql`
}
currentUserWorkspace {
permissionFlags
objectRecordsPermissions
objectPermissions {
objectsPermissions {
...ObjectPermissionFragment
}
twoFactorAuthenticationMethodSummary {
@@ -75,8 +75,8 @@ export const useLoadCurrentUser = () => {
if (isDefined(user.currentUserWorkspace)) {
setCurrentUserWorkspace({
...user.currentUserWorkspace,
objectPermissions:
(user.currentUserWorkspace.objectPermissions as Array<
objectsPermissions:
(user.currentUserWorkspace.objectsPermissions as Array<
ObjectPermissions & { objectMetadataId: string }
>) ?? [],
});
@@ -126,7 +126,7 @@ export const mockedUserData: MockedUser = {
currentWorkspace: mockCurrentWorkspace,
currentUserWorkspace: {
permissionFlags: [PermissionFlagType.WORKSPACE_MEMBERS],
objectPermissions: generatedMockObjectMetadataItems.map((item) => ({
objectsPermissions: generatedMockObjectMetadataItems.map((item) => ({
objectMetadataId: item.id,
canReadObjectRecords: true,
canUpdateObjectRecords: true,
@@ -150,7 +150,7 @@ export const mockedLimitedPermissionsUserData: MockedUser = {
...mockedUserData,
currentUserWorkspace: {
...mockedUserData.currentUserWorkspace,
objectPermissions: generatedMockObjectMetadataItems
objectsPermissions: generatedMockObjectMetadataItems
.filter(
(objectMetadata) =>
objectMetadata.nameSingular !== 'task' &&
@@ -102,15 +102,12 @@ export class UserWorkspace {
@Field(() => [PermissionFlagType], { nullable: true })
permissionFlags?: PermissionFlagType[];
@Field(() => [PermissionsOnAllObjectRecords], {
nullable: true,
deprecationReason: 'Use objectPermissions instead',
})
objectRecordsPermissions?: PermissionsOnAllObjectRecords[];
@Field(() => [ObjectPermissionDTO], { nullable: true })
objectPermissions?: ObjectPermissionDTO[];
@Field(() => [ObjectPermissionDTO], { nullable: true })
objectsPermissions?: ObjectPermissionDTO[];
@Field(() => [TwoFactorAuthenticationMethodSummaryDto], { nullable: true })
twoFactorAuthenticationMethodSummary?: TwoFactorAuthenticationMethodSummaryDto[];
}
@@ -1,7 +1,6 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { PermissionsOnAllObjectRecords } from 'twenty-shared/constants';
import { isDefined } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
@@ -82,37 +81,16 @@ export class PermissionsService {
workspaceId,
});
const objectPermissions = rolesPermissions[roleOfUserWorkspace.id] ?? {};
const objectsPermissions = rolesPermissions[roleOfUserWorkspace.id] ?? {};
const objectRecordsPermissions: UserWorkspacePermissions['objectRecordsPermissions'] =
{
[PermissionsOnAllObjectRecords.READ_ALL_OBJECT_RECORDS]:
roleOfUserWorkspace.canReadAllObjectRecords ?? false,
[PermissionsOnAllObjectRecords.UPDATE_ALL_OBJECT_RECORDS]:
roleOfUserWorkspace.canUpdateAllObjectRecords ?? false,
[PermissionsOnAllObjectRecords.SOFT_DELETE_ALL_OBJECT_RECORDS]:
roleOfUserWorkspace.canSoftDeleteAllObjectRecords ?? false,
[PermissionsOnAllObjectRecords.DESTROY_ALL_OBJECT_RECORDS]:
roleOfUserWorkspace.canDestroyAllObjectRecords ?? false,
};
return {
permissionFlags,
objectRecordsPermissions,
objectPermissions,
objectsPermissions,
};
}
public getDefaultUserWorkspacePermissions = () =>
({
objectRecordsPermissions: {
[PermissionsOnAllObjectRecords.READ_ALL_OBJECT_RECORDS]: false,
[PermissionsOnAllObjectRecords.UPDATE_ALL_OBJECT_RECORDS]: false,
[PermissionsOnAllObjectRecords.SOFT_DELETE_ALL_OBJECT_RECORDS]: false,
[PermissionsOnAllObjectRecords.DESTROY_ALL_OBJECT_RECORDS]: false,
},
permissionFlags: {
[PermissionFlagType.API_KEYS_AND_WEBHOOKS]: false,
[PermissionFlagType.WORKSPACE]: false,
@@ -126,7 +104,6 @@ export class PermissionsService {
[PermissionFlagType.IMPORT_CSV]: false,
[PermissionFlagType.EXPORT_CSV]: false,
},
objectPermissions: {},
objectsPermissions: {},
}) as const satisfies UserWorkspacePermissions;
@@ -1,14 +1,8 @@
import { type PermissionsOnAllObjectRecords } from 'twenty-shared/constants';
import {
type ObjectsPermissions,
type ObjectsPermissionsDeprecated,
} from 'twenty-shared/types';
import { type ObjectsPermissions } from 'twenty-shared/types';
import { type PermissionFlagType } from 'src/engine/metadata-modules/permissions/constants/permission-flag-type.constants';
export type UserWorkspacePermissions = {
permissionFlags: Record<PermissionFlagType, boolean>;
objectRecordsPermissions: Record<PermissionsOnAllObjectRecords, boolean>;
objectPermissions: ObjectsPermissionsDeprecated;
objectsPermissions: ObjectsPermissions; // replaces ObjectsPermissionsDeprecated - deprecation ongoing
objectsPermissions: ObjectsPermissions;
};
@@ -2,5 +2,5 @@ import { type UserWorkspace } from 'src/engine/core-modules/user-workspace/user-
export type UserWorkspacePermissionsDto = Pick<
UserWorkspace,
'objectPermissions' | 'permissionFlags' | 'objectRecordsPermissions'
'objectPermissions' | 'permissionFlags' | 'objectsPermissions'
>;
@@ -1,36 +1,31 @@
import { type PermissionsOnAllObjectRecords } from 'twenty-shared/constants';
import { type PermissionFlagType } from 'src/engine/metadata-modules/permissions/constants/permission-flag-type.constants';
import { type UserWorkspacePermissions } from 'src/engine/metadata-modules/permissions/types/user-workspace-permissions';
import { type UserWorkspacePermissionsDto } from 'src/engine/metadata-modules/role/dtos/user-workspace-permissions.dto';
export const fromUserWorkspacePermissionsToUserWorkspacePermissionsDto = ({
objectPermissions: rawObjectPermissions,
objectRecordsPermissions: rawObjectRecordsPermissions,
objectsPermissions: rawObjectsPermissions,
permissionFlags: rawSettingsPermissions,
}: UserWorkspacePermissions): UserWorkspacePermissionsDto => {
const objectPermissions = Object.entries(rawObjectPermissions).map(
const objectPermissions = Object.entries(rawObjectsPermissions).map(
([objectMetadataId, permissions]) => ({
objectMetadataId,
canReadObjectRecords: permissions.canRead,
canUpdateObjectRecords: permissions.canUpdate,
canSoftDeleteObjectRecords: permissions.canSoftDelete,
canDestroyObjectRecords: permissions.canDestroy,
canReadObjectRecords: permissions.canReadObjectRecords,
canUpdateObjectRecords: permissions.canUpdateObjectRecords,
canSoftDeleteObjectRecords: permissions.canSoftDeleteObjectRecords,
canDestroyObjectRecords: permissions.canDestroyObjectRecords,
restrictedFields: permissions.restrictedFields,
}),
);
const objectsPermissions = objectPermissions;
const permissionFlags = (
Object.keys(rawSettingsPermissions) as PermissionFlagType[]
).filter((feature) => rawSettingsPermissions[feature] === true);
const objectRecordsPermissions = (
Object.keys(rawObjectRecordsPermissions) as PermissionsOnAllObjectRecords[]
).filter((feature) => rawObjectRecordsPermissions[feature] === true);
return {
objectPermissions,
objectRecordsPermissions,
objectsPermissions,
permissionFlags,
};
};