Skip to content

Conversation

@guillim
Copy link
Contributor

@guillim guillim commented Nov 10, 2025

UpdateOne of a Relation that involves a CustomObject, because the nameSingular needs to be updated in the fieldMetadata

  • nameSingular and namePlural must be provided since they are necessary for morph name computation
  • label sync should be false

Interesting files to look at:

  • packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts

  • UPDATE => packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts ( also update relation indexes ) needs v2 refactor to handle field relation name update

  • CREATE => packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts ( handle morph instead of previous classic relation )

  • DELETE => DONE

@github-actions
Copy link
Contributor

github-actions bot commented Nov 10, 2025

🚀 Preview Environment Ready!

Your preview environment is available at: http://bore.pub:30737

This environment will automatically shut down when the PR is closed or after 5 hours.

@charlesBochet
Copy link
Member

Closing for now, let's re-open when ready :)

@guillim guillim self-assigned this Nov 12, 2025
@guillim guillim reopened this Nov 12, 2025
@guillim guillim marked this pull request as ready for review November 13, 2025 17:59
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Nov 13, 2025

Greptile Overview

Greptile Summary

This PR implements migration support for Custom Objects by enabling updates to morph relation field metadata when object names change.

Key changes:

  • Added name and settings to relation field properties comparison for proper change detection
  • Refactored renameRelatedMorphFieldOnObjectNamesUpdate to find all morph relation fields targeting the renamed object (previously only found fields on the renamed object itself)
  • Added validation to prevent field name conflicts when updating object names
  • Updated field name update logic in UpdateFieldActionHandlerService to handle morph/relation fields using join column names instead of field names directly
  • Added TODOs for future morph relation handling in object creation

Issues found:

  • Inconsistent error handling: uses CustomError instead of FieldMetadataException in validation (line 48 of rename-related-morph-field-on-object-names-update.util.ts)
  • Minor code style issues: missing spaces after if keywords and inconsistent indentation

The logic appears sound - the validation correctly checks for conflicts before applying changes, and the field renaming properly handles the database column names for relation fields.

Confidence Score: 3/5

  • This PR has solid logic but contains a critical inconsistency in error handling that should be fixed
  • Score reflects that the implementation logic is sound and handles edge cases (conflict validation, null checks), but uses inconsistent exception types (CustomError vs FieldMetadataException) which violates codebase patterns and could affect error handling consistency. The minor style issues (spacing, indentation) don't impact functionality but should be addressed for consistency.
  • The rename-related-morph-field-on-object-names-update.util.ts file requires attention to fix the exception handling inconsistency

Important Files Changed

File Analysis

Filename Score Overview
packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/handle-flat-object-metadata-update-side-effect.util.ts 4/5 Added validation to prevent field name conflicts when updating object names; includes new conflict detection logic
packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts 3/5 Refactored to find all morph relation fields targeting renamed object; uses CustomError for validation
packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/field/services/update-field-action-handler.service.ts 4/5 Updated field name rename logic to handle morph/relation fields by using join column names instead of direct field names

Sequence Diagram

sequenceDiagram
    participant Client
    participant UpdateObjectAPI
    participant HandleSideEffect
    participant RenameUtil
    participant ValidateConflict
    participant UpdateFieldHandler
    participant WorkspaceSchema

    Client->>UpdateObjectAPI: Update Custom Object (nameSingular/namePlural)
    UpdateObjectAPI->>HandleSideEffect: handleFlatObjectMetadataUpdateSideEffect()
    
    alt nameSingular or namePlural changed
        HandleSideEffect->>RenameUtil: renameRelatedMorphFieldOnObjectNamesUpdate()
        RenameUtil->>RenameUtil: Filter all morph relation fields targeting this object
        loop For each morph field
            RenameUtil->>RenameUtil: getMorphNameFromMorphFieldMetadataName()
            RenameUtil->>RenameUtil: Validate nameSingular/namePlural exist
            RenameUtil->>RenameUtil: computeMorphRelationFieldName()
            RenameUtil->>RenameUtil: computeMorphOrRelationFieldJoinColumnName()
        end
        RenameUtil-->>HandleSideEffect: Return updated field metadatas
        
        HandleSideEffect->>ValidateConflict: validateOtherFieldMetadataNamesConflict()
        loop For each updated field
            ValidateConflict->>ValidateConflict: Get target object from maps
            ValidateConflict->>ValidateConflict: Get all fields on target object
            ValidateConflict->>ValidateConflict: Check for name conflicts
            alt Conflict found
                ValidateConflict-->>HandleSideEffect: Throw FIELD_ALREADY_EXISTS
            end
        end
    end
    
    HandleSideEffect-->>UpdateObjectAPI: Return side effects
    
    alt Field name update needed
        UpdateObjectAPI->>UpdateFieldHandler: handleFieldNameUpdate()
        alt Morph/Relation field
            UpdateFieldHandler->>UpdateFieldHandler: Get joinColumnName from settings
            UpdateFieldHandler->>UpdateFieldHandler: computeMorphOrRelationFieldJoinColumnName()
        end
        UpdateFieldHandler->>WorkspaceSchema: renameColumn()
        WorkspaceSchema-->>UpdateFieldHandler: Column renamed
    end
    
    UpdateObjectAPI-->>Client: Update complete
Loading

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

7 files reviewed, 5 comments

Edit Code Review Agent Settings | Greptile

@guillim guillim changed the title migration for Custom Objects Update Name of relation fieldMetadata Nov 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants