[groupBy] Fix order by nested date field (#16135)

Fixes https://github.com/twentyhq/core-team-issues/issues/1935
This commit is contained in:
Marie
2025-11-28 09:02:06 +00:00
committed by GitHub
parent 1e98e4da4d
commit fd9ea2f5ee
5 changed files with 15 additions and 10 deletions
@@ -1,4 +1,3 @@
import { UserInputError } from 'apollo-server-core';
import { isObject } from 'class-validator';
import { type ObjectRecordOrderByForRelationField } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
@@ -8,6 +7,7 @@ import {
type GroupByRelationField,
} from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/types/group-by-field.types';
import { isGroupByRelationField } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/is-group-by-relation-field.util';
import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
@@ -1,4 +1,3 @@
import { UserInputError } from 'apollo-server-core';
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
@@ -11,6 +10,7 @@ import { type DateFieldGroupByDefinition } from 'src/engine/api/graphql/graphql-
import { type GroupByField } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/types/group-by-field.types';
import { isGroupByDateFieldDefinition } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/is-group-by-date-field-definition.util';
import { validateSingleKeyForGroupByOrThrow } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/validate-single-key-for-group-by-or-throw.util';
import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
@@ -30,12 +30,12 @@ export class ObjectMetadataOrderByBaseGenerator {
public generateFields({
fields,
logger,
orderByDateGranularity,
isForGroupBy,
context,
}: {
fields: FlatFieldMetadata[];
logger: Logger;
orderByDateGranularity?: boolean;
isForGroupBy?: boolean;
context?: SchemaGenerationContext;
}): GraphQLInputFieldConfigMap {
const allGeneratedFields: GraphQLInputFieldConfigMap = {};
@@ -59,6 +59,7 @@ export class ObjectMetadataOrderByBaseGenerator {
{
fieldMetadata,
typeOptions,
isForGroupBy,
context,
},
);
@@ -72,7 +73,7 @@ export class ObjectMetadataOrderByBaseGenerator {
generatedFields = this.generateAtomicFieldOrderByInputType({
fieldMetadata,
typeOptions,
orderByDateGranularity,
isForGroupBy,
logger,
});
}
@@ -117,15 +118,15 @@ export class ObjectMetadataOrderByBaseGenerator {
fieldMetadata,
typeOptions,
logger,
orderByDateGranularity,
isForGroupBy,
}: {
fieldMetadata: FlatFieldMetadata;
typeOptions: TypeOptions;
logger: Logger;
orderByDateGranularity?: boolean;
isForGroupBy?: boolean;
}) {
if (
orderByDateGranularity === true &&
isForGroupBy === true &&
(fieldMetadata.type === FieldMetadataType.DATE ||
fieldMetadata.type === FieldMetadataType.DATE_TIME)
) {
@@ -142,7 +142,7 @@ export class ObjectMetadataOrderByWithGroupByGqlInputTypeGenerator {
return this.objectMetadataOrderByBaseGenerator.generateFields({
fields,
logger: this.logger,
orderByDateGranularity: true,
isForGroupBy: true,
context,
});
}
@@ -118,12 +118,14 @@ export class RelationFieldMetadataGqlInputTypeGenerator {
public generateSimpleRelationFieldOrderByInputType({
fieldMetadata,
typeOptions,
isForGroupBy,
context,
}: {
fieldMetadata: FlatFieldMetadata<
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
>;
typeOptions: TypeOptions;
isForGroupBy?: boolean;
context?: SchemaGenerationContext;
}) {
if (fieldMetadata.settings?.relationType === RelationType.ONE_TO_MANY)
@@ -168,7 +170,9 @@ export class RelationFieldMetadataGqlInputTypeGenerator {
if (isDefined(targetObjectMetadata)) {
const targetOrderByInputTypeKey = computeObjectMetadataInputTypeKey(
targetObjectMetadata.nameSingular,
GqlInputTypeDefinitionKind.OrderBy,
isForGroupBy
? GqlInputTypeDefinitionKind.OrderByWithGroupBy
: GqlInputTypeDefinitionKind.OrderBy,
);
const targetOrderByInputType = this.gqlTypesStorage.getGqlTypeByKey(