[NITPICK] From args list to record args RecordPositionFactory (#10215)

# Introduction
Just some nitpicking while debugging a bug that wasn't one
This commit is contained in:
Paul Rastoin
2025-02-14 15:43:09 +01:00
committed by GitHub
parent c624657b29
commit 968ad3bd31
5 changed files with 61 additions and 35 deletions

View File

@ -6,7 +6,10 @@ import { WorkspaceQueryRunnerOptions } from 'src/engine/api/graphql/workspace-qu
import { ResolverArgsType } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { QueryRunnerArgsFactory } from 'src/engine/api/graphql/workspace-query-runner/factories/query-runner-args.factory';
import { RecordPositionFactory } from 'src/engine/api/graphql/workspace-query-runner/factories/record-position.factory';
import {
RecordPositionFactory,
RecordPositionFactoryCreateArgs,
} from 'src/engine/api/graphql/workspace-query-runner/factories/record-position.factory';
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
describe('QueryRunnerArgsFactory', () => {
@ -104,12 +107,14 @@ describe('QueryRunnerArgsFactory', () => {
ResolverArgsType.CreateMany,
);
expect(recordPositionFactory.create).toHaveBeenCalledWith(
'last',
{ isCustom: true, nameSingular: 'testNumber' },
const expectedArgs: RecordPositionFactoryCreateArgs = {
value: 'last',
objectMetadata: { isCustom: true, nameSingular: 'testNumber' },
workspaceId,
0,
);
index: 0,
};
expect(recordPositionFactory.create).toHaveBeenCalledWith(expectedArgs);
expect(result).toEqual({
id: 'uuid',
data: [{ position: 2, testNumber: 1 }],
@ -128,12 +133,14 @@ describe('QueryRunnerArgsFactory', () => {
ResolverArgsType.CreateMany,
);
expect(recordPositionFactory.create).toHaveBeenCalledWith(
'first',
{ isCustom: true, nameSingular: 'testNumber' },
const expectedArgs: RecordPositionFactoryCreateArgs = {
value: 'first',
objectMetadata: { isCustom: true, nameSingular: 'testNumber' },
workspaceId,
0,
);
index: 0,
};
expect(recordPositionFactory.create).toHaveBeenCalledWith(expectedArgs);
expect(result).toEqual({
id: 'uuid',
data: [{ position: 2, testNumber: 1 }],

View File

@ -46,21 +46,33 @@ describe('RecordPositionFactory', () => {
it('should return the value when value is a number', async () => {
const value = 1;
const result = await factory.create(value, objectMetadata, workspaceId);
const result = await factory.create({
value,
objectMetadata,
workspaceId,
});
expect(result).toEqual(value);
});
it('should return the existing position -1 when value is first', async () => {
const value = 'first';
const result = await factory.create(value, objectMetadata, workspaceId);
const result = await factory.create({
value,
objectMetadata,
workspaceId,
});
expect(result).toEqual(0);
});
it('should return the existing position + 1 when value is last', async () => {
const value = 'last';
const result = await factory.create(value, objectMetadata, workspaceId);
const result = await factory.create({
value,
objectMetadata,
workspaceId,
});
expect(result).toEqual(2);
});

View File

@ -177,6 +177,7 @@ export class QueryRunnerArgsFactory {
return Promise.resolve({});
}
const workspaceId = options.authContext.workspace.id;
let isFieldPositionPresent = false;
const createArgByArgKeyPromises: Promise<[string, any]>[] = Object.entries(
@ -192,16 +193,16 @@ export class QueryRunnerArgsFactory {
case FieldMetadataType.POSITION: {
isFieldPositionPresent = true;
const newValue = await this.recordPositionFactory.create(
const newValue = await this.recordPositionFactory.create({
value,
{
workspaceId,
objectMetadata: {
isCustom: options.objectMetadataItemWithFieldMaps.isCustom,
nameSingular:
options.objectMetadataItemWithFieldMaps.nameSingular,
},
options.authContext.workspace.id,
argPositionBackfillInput.argIndex,
);
index: argPositionBackfillInput.argIndex,
});
return [key, newValue];
}
@ -248,16 +249,16 @@ export class QueryRunnerArgsFactory {
...newArgEntries,
[
'position',
await this.recordPositionFactory.create(
'first',
{
await this.recordPositionFactory.create({
value: 'first',
workspaceId,
objectMetadata: {
isCustom: options.objectMetadataItemWithFieldMaps.isCustom,
nameSingular:
options.objectMetadataItemWithFieldMaps.nameSingular,
},
options.authContext.workspace.id,
argPositionBackfillInput.argIndex,
),
index: argPositionBackfillInput.argIndex,
}),
],
]);
}

View File

@ -9,6 +9,12 @@ import {
} from 'src/engine/api/graphql/workspace-query-builder/factories/record-position-query.factory';
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
export type RecordPositionFactoryCreateArgs = {
value: number | 'first' | 'last';
objectMetadata: { isCustom: boolean; nameSingular: string };
workspaceId: string;
index?: number;
};
@Injectable()
export class RecordPositionFactory {
constructor(
@ -16,12 +22,12 @@ export class RecordPositionFactory {
private readonly recordPositionQueryFactory: RecordPositionQueryFactory,
) {}
async create(
value: number | 'first' | 'last',
objectMetadata: { isCustom: boolean; nameSingular: string },
workspaceId: string,
async create({
objectMetadata,
value,
workspaceId,
index = 0,
): Promise<number> {
}: RecordPositionFactoryCreateArgs): Promise<number> {
const dataSourceSchema =
this.workspaceDataSourceService.getSchemaName(workspaceId);

View File

@ -2,8 +2,8 @@ import { Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { isDefined } from 'class-validator';
import { Repository } from 'typeorm';
import { FieldMetadataType } from 'twenty-shared';
import { Repository } from 'typeorm';
import {
RecordPositionQueryFactory,
@ -73,14 +73,14 @@ export class RecordPositionBackfillService {
continue;
}
const position = await this.recordPositionFactory.create(
'last',
{
const position = await this.recordPositionFactory.create({
objectMetadata: {
isCustom: objectMetadata.isCustom,
nameSingular: objectMetadata.nameSingular,
},
value: 'last',
workspaceId,
);
});
for (
let recordIndex = 0;