Skip to content

morph relation : renaming an object #13404

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 25, 2025
Merged

morph relation : renaming an object #13404

merged 7 commits into from
Jul 25, 2025

Conversation

guillim
Copy link
Contributor

@guillim guillim commented Jul 24, 2025

Why

If we have a Morph Relation, like :
Opportunity <-> Company & People

Let's say it's a MANY_TO_ONE on Opportunity side

Then we have two joinColumnNames looking like

  • ownerPersonId
  • ownerCompanyId

Let's say someone renames the obejct Person (assume we can even though standard obejcts cannot be renames per say at the moment in the API)

We need to update the joinColumnName and create the associated migrations

@guillim guillim self-assigned this Jul 24, 2025
@guillim guillim enabled auto-merge (squash) July 24, 2025 09:59
@guillim guillim disabled auto-merge July 24, 2025 09:59
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.

Greptile Summary

This PR implements support for renaming objects that participate in morph relations. In Twenty's system, morph relations enable polymorphic associations where a field can reference multiple object types (e.g., Opportunity -> Company OR Person). When such objects are renamed, the join column names in the database must be updated accordingly.

The implementation adds four key components:

  1. New exception handling: Adds INVALID_ORM_OUTPUT to ObjectMetadataExceptionCode for handling ORM operation errors during complex metadata operations

  2. Morph relation field discovery: Introduces findTargetMorphRelationFieldMetadatas method to identify morph relation fields that target a specific object being renamed

  3. Join column name updates: Implements updateMorphRelationsJoinColumnName method that updates join column names for MANY_TO_ONE morph relations, with proper type validation and database persistence

  4. Database migration generation: Adds updateMorphRelationMigrations method that creates ALTER migrations to rename join columns while preserving data integrity

The solution integrates into the existing object renaming workflow in object-metadata.service.ts, following the same pattern used for regular relation updates. When an object like 'Person' is renamed to 'Individual', join columns like 'ownerPersonId' are automatically updated to 'ownerIndividualId' across all morph relations, ensuring referential integrity is maintained.

Confidence score: 3/5

  • This change involves complex metadata operations with potential for data corruption if migration logic is incorrect
  • The implementation uses sequential database operations in loops which could impact performance and introduce race conditions
  • The findTargetMorphRelationFieldMetadatas method loads full relations which may cause performance issues in workspaces with many morph relations
  • Files need more attention: object-metadata-field-relation.service.ts (performance concerns with nested loops and sequential saves), object-metadata-migration.service.ts (migration correctness validation needed)

4 files reviewed, 2 comments

Edit Code Review Bot Settings | Greptile

Comment on lines +383 to +385
`Settings for morph relation field should be defined ${morphRelationFieldMetadata.fieldMetadata.name}`,
ObjectMetadataExceptionCode.INVALID_ORM_OUTPUT,
);
Copy link
Contributor

Choose a reason for hiding this comment

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

style: Error message includes technical implementation details like 'Settings' and field metadata concepts that users wouldn't understand

Comment on lines +492 to +493
const morphRelationFieldMetadataToUpdateWithNewJoinColumnName = [];

Copy link
Contributor

Choose a reason for hiding this comment

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

style: Consider using a more descriptive variable name like updatedMorphRelations instead of abbreviating to avoid confusion

Copy link
Contributor

github-actions bot commented Jul 24, 2025

🚀 Preview Environment Ready!

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

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

},
});

if (!this.validateFieldMetadataTypeIsMorphRelation(fieldMetadatas)) {
Copy link
Contributor

Choose a reason for hiding this comment

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

I think you have created this type validator util in deleted morph field PR, no ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

there was this one for both relation and morph relation but not exaclty the same though
areFieldMetadatasTypeRelationOrMorphRelation

you think i should refactor those util into one ?

@guillim guillim requested a review from etiennejouan July 25, 2025 14:13
@twentyhq twentyhq deleted a comment from github-actions bot Jul 25, 2025
Copy link
Contributor

📊 API Changes Report

REST Metadata API Analysis Error

⚠️ Error occurred while analyzing REST Metadata API changes

Error Output

[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/WebhookForResponse
java.lang.RuntimeException: Could not find /components/schemas/WebhookForResponse in contents of #/components/schemas/WebhookForResponse
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:867)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponse(OpenAPI31Traverser.java:299)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponses(OpenAPI31Traverser.java:270)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:237)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:394)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/Webhook
java.lang.RuntimeException: Could not find /components/schemas/Webhook in contents of #/components/schemas/Webhook
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:424)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/WebhookForUpdate
java.lang.RuntimeException: Could not find /components/schemas/WebhookForUpdate in contents of #/components/schemas/WebhookForUpdate
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:409)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/ApikeyForResponse
java.lang.RuntimeException: Could not find /components/schemas/ApikeyForResponse in contents of #/components/schemas/ApikeyForResponse
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:867)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponse(OpenAPI31Traverser.java:299)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponses(OpenAPI31Traverser.java:270)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:237)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:394)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/Apikey
java.lang.RuntimeException: Could not find /components/schemas/Apikey in contents of #/components/schemas/Apikey
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:424)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/ApikeyForUpdate
java.lang.RuntimeException: Could not find /components/schemas/ApikeyForUpdate in contents of #/components/schemas/ApikeyForUpdate
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:409)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/WebhookForResponse
java.lang.RuntimeException: Could not find /components/schemas/WebhookForResponse in contents of #/components/schemas/WebhookForResponse
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:867)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponse(OpenAPI31Traverser.java:299)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponses(OpenAPI31Traverser.java:270)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:237)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:394)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/Webhook
java.lang.RuntimeException: Could not find /components/schemas/Webhook in contents of #/components/schemas/Webhook
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:424)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/WebhookForUpdate
java.lang.RuntimeException: Could not find /components/schemas/WebhookForUpdate in contents of #/components/schemas/WebhookForUpdate
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:409)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/ApikeyForResponse
java.lang.RuntimeException: Could not find /components/schemas/ApikeyForResponse in contents of #/components/schemas/ApikeyForResponse
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:867)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchemaMap(OpenAPI31Traverser.java:960)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:811)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponse(OpenAPI31Traverser.java:299)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseResponses(OpenAPI31Traverser.java:270)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:237)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:394)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/Apikey
java.lang.RuntimeException: Could not find /components/schemas/Apikey in contents of #/components/schemas/Apikey
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:424)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)
[main] ERROR i.s.v.p.reference.ReferenceVisitor - Error resolving schema #/components/schemas/ApikeyForUpdate
java.lang.RuntimeException: Could not find /components/schemas/ApikeyForUpdate in contents of #/components/schemas/ApikeyForUpdate
	at io.swagger.v3.parser.reference.ReferenceVisitor.resolveSchemaRef(ReferenceVisitor.java:253)
	at io.swagger.v3.parser.reference.ReferenceVisitor.visitSchema(ReferenceVisitor.java:141)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseSchema(OpenAPI31Traverser.java:801)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMediaType(OpenAPI31Traverser.java:603)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseRequestBody(OpenAPI31Traverser.java:346)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOperation(OpenAPI31Traverser.java:229)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePathItem(OpenAPI31Traverser.java:409)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseMap(OpenAPI31Traverser.java:947)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traversePaths(OpenAPI31Traverser.java:197)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverseOpenApi(OpenAPI31Traverser.java:124)
	at io.swagger.v3.parser.reference.OpenAPI31Traverser.traverse(OpenAPI31Traverser.java:65)
	at io.swagger.v3.parser.reference.OpenAPIDereferencer31.dereference(OpenAPIDereferencer31.java:74)
	at io.swagger.v3.parser.OpenAPIV3Parser.resolve(OpenAPIV3Parser.java:227)
	at io.swagger.v3.parser.OpenAPIV3Parser.readContents(OpenAPIV3Parser.java:183)
	at io.swagger.v3.parser.OpenAPIV3Parser.readLocation(OpenAPIV3Parser.java:97)
	at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
	at org.openapitools.openapidiff.core.OpenApiCompare.readLocation(OpenApiCompare.java:181)
	at org.openapitools.openapidiff.core.OpenApiCompare.fromLocations(OpenApiCompare.java:142)
	at org.openapitools.openapidiff.cli.Main.main(Main.java:233)

⚠️ Please review these API changes carefully before merging.

Copy link
Contributor

@etiennejouan etiennejouan left a comment

Choose a reason for hiding this comment

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

LGTM !

@guillim guillim merged commit 8ea816b into main Jul 25, 2025
42 checks passed
@guillim guillim deleted the morph-object-rename branch July 25, 2025 14:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: 🔦 In QA
Development

Successfully merging this pull request may close these issues.

2 participants