[permissions] Adapt field permissions to connect + createMany (#13655)
In this PR we adapt field permission to two things 1. Connect: the recent insertion of the connect feature introduces the possibility to have "connect" objects in typeORM's expressionMap's valueSet, where we previously only had column names (if i followed correctly). For instance for a person object that a N - 1 relationship to company, person will have both companyId and company as possible valueSet keys for the upsert. We need to reflect that in our `getColumnNameToFieldMetadataIdMap` util that returns a map containing every possible value we could encounter in valueSet. In an attempt to tie this to the schema generation where this is introduced, I created the shallow util extractGraphQLRelationFieldNames (probably ill-named - im willing to update the name if @etiennejouan has a better idea?) to remind us that these two are linked. 2. CreateMany: When calling query builders methods directly on custom object (like we do in graphql-create-many-resolver), we need to be careful to call them with a selection of readable fields. We had a debate on whether we should compute this selection containing all readable fields by default under the hood when no selected fields are indicated. I am still not 100% convinced as I think it should remain the caller's responsibility, but this case reminds us that it could easily be forgotten by developers - although it is all the more the case as we don't have seeds yet that help us realize that ([PR on the way](https://github.com/twentyhq/twenty/pull/13646)).
This commit is contained in:
+19
@@ -0,0 +1,19 @@
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
|
||||
export const extractGraphQLRelationFieldNames = (
|
||||
fieldMetadata: FieldMetadataEntity<
|
||||
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
|
||||
>,
|
||||
) => {
|
||||
const joinColumnName = fieldMetadata.settings?.joinColumnName;
|
||||
|
||||
if (!joinColumnName) {
|
||||
throw new Error('Join column name is not defined');
|
||||
}
|
||||
|
||||
const fieldMetadataName = fieldMetadata.name;
|
||||
|
||||
return { joinColumnName, fieldMetadataName };
|
||||
};
|
||||
+4
-6
@@ -13,6 +13,7 @@ import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfa
|
||||
import { InputTypeDefinitionKind } from 'src/engine/api/graphql/workspace-schema-builder/factories/input-type-definition.factory';
|
||||
import { ObjectTypeDefinitionKind } from 'src/engine/api/graphql/workspace-schema-builder/factories/object-type-definition.factory';
|
||||
import { formatRelationConnectInputTarget } from 'src/engine/api/graphql/workspace-schema-builder/factories/relation-connect-input-type-definition.factory';
|
||||
import { extractGraphQLRelationFieldNames } from 'src/engine/api/graphql/workspace-schema-builder/utils/extract-graphql-relation-field-names.util';
|
||||
import { isFieldMetadataRelationOrMorphRelation } from 'src/engine/api/graphql/workspace-schema-builder/utils/is-field-metadata-relation-or-morph-relation.utils';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
||||
@@ -172,11 +173,8 @@ const generateRelationField = <
|
||||
return relationField;
|
||||
}
|
||||
|
||||
const joinColumnName = fieldMetadata.settings?.joinColumnName;
|
||||
|
||||
if (!joinColumnName) {
|
||||
throw new Error('Join column name is not defined');
|
||||
}
|
||||
const { joinColumnName, fieldMetadataName } =
|
||||
extractGraphQLRelationFieldNames(fieldMetadata);
|
||||
|
||||
const target = getTarget(fieldMetadata);
|
||||
const typeFactoryOptions = getTypeFactoryOptions(fieldMetadata, kind);
|
||||
@@ -220,7 +218,7 @@ const generateRelationField = <
|
||||
}
|
||||
|
||||
// @ts-expect-error legacy noImplicitAny
|
||||
relationField[fieldMetadata.name] = {
|
||||
relationField[fieldMetadataName] = {
|
||||
type: type,
|
||||
description: fieldMetadata.description,
|
||||
};
|
||||
|
||||
+5
-1
@@ -5,7 +5,11 @@ import { isFieldMetadataEntityOfType } from 'src/engine/utils/is-field-metadata-
|
||||
|
||||
export const isFieldMetadataRelationOrMorphRelation = (
|
||||
fieldMetadata: FieldMetadataEntity<FieldMetadataType>,
|
||||
) => {
|
||||
): fieldMetadata is FieldMetadataEntity &
|
||||
(
|
||||
| FieldMetadataEntity<FieldMetadataType.RELATION>
|
||||
| FieldMetadataEntity<FieldMetadataType.MORPH_RELATION>
|
||||
) => {
|
||||
return (
|
||||
isFieldMetadataEntityOfType(fieldMetadata, FieldMetadataType.RELATION) ||
|
||||
isFieldMetadataEntityOfType(fieldMetadata, FieldMetadataType.MORPH_RELATION)
|
||||
|
||||
Reference in New Issue
Block a user