Skip to content

feat: wire GraphQL and support module adapters to GormRegistry O(M+N) scaling#15786

Open
borinquenkid wants to merge 1 commit into
feat/gorm-registry-simplefrom
feat/gorm-registry-misc
Open

feat: wire GraphQL and support module adapters to GormRegistry O(M+N) scaling#15786
borinquenkid wants to merge 1 commit into
feat/gorm-registry-simplefrom
feat/gorm-registry-misc

Conversation

@borinquenkid

Copy link
Copy Markdown
Member

Summary

Wires the remaining adapters and support modules into the GormRegistry introduced in #15780.

Modules updated:

  • grails-data-graphql — registers GraphQL GORM APIs with the registry; adds GraphqlTenantContextProfilingSpec
  • grails-datamapping-async — async GORM operations wired through registry-based API resolution
  • grails-datamapping-rx — RxGORM static/instance APIs sourced from the registry
  • grails-views-gson — JSON views resolve GORM entity APIs via the registry
  • grails-scaffolding — scaffold data binding uses registry-based API lookup
  • grails-converters — JSON/XML converters resolve domain class APIs via the registry
  • grails-test-suite-uber — integration test NonDefaultDatasourceFlushSpec exercises the registry path across multiple datastores

Test plan

  • ./gradlew :grails-data-graphql:test passes
  • ./gradlew :grails-test-suite-uber:test passes

Stack

🤖 Generated with Claude Code

@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from d58178b to 4aab065 Compare June 27, 2026 17:37
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from 6f5c31f to 590e21c Compare June 27, 2026 17:37
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from 4aab065 to 9ad7741 Compare June 27, 2026 18:15
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from 590e21c to b97eaeb Compare June 27, 2026 18:15
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from 9ad7741 to ac65d23 Compare June 27, 2026 20:47
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from b97eaeb to 3cc9135 Compare June 27, 2026 20:47
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from ac65d23 to 4e92db6 Compare June 27, 2026 22:03
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from 3cc9135 to a884511 Compare June 27, 2026 22:04
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from 4e92db6 to c2534ca Compare June 27, 2026 22:23
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from a884511 to cba09b6 Compare June 27, 2026 22:23
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from c2534ca to 6227f96 Compare June 27, 2026 22:59
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from cba09b6 to d663ee9 Compare June 27, 2026 22:59
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from 6227f96 to bbfc639 Compare June 28, 2026 00:19
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from d663ee9 to 6d53d02 Compare June 28, 2026 00:19
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from bbfc639 to 4aa8561 Compare June 28, 2026 00:53
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from 6d53d02 to edbbbb4 Compare June 28, 2026 00:54
… scaling

Register GORM APIs with GormRegistry for GraphQL, async, RxGORM, JSON views,
scaffolding, and converters modules. Update grails-test-suite-uber integration
tests to exercise the registry-based API path across all datastores.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-simple branch from 4aa8561 to 7abbedc Compare June 28, 2026 01:36
@borinquenkid borinquenkid force-pushed the feat/gorm-registry-misc branch from edbbbb4 to 54d8eaa Compare June 28, 2026 01:36
@testlens-app

testlens-app Bot commented Jun 28, 2026

Copy link
Copy Markdown

🚨 TestLens detected 234 failed tests 🚨

Here is what you can do:

  1. Inspect the test failures carefully.
  2. If you are convinced that some of the tests are flaky, you can mute them below.
  3. Finally, trigger a rerun by checking the rerun checkbox.

Test Summary

CI / Build Grails-Core (macos-latest, 21) > :grails-data-graphql-core:test

Test Runs
CreateEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get invalid
EntityDataFetcherSpec
SingleEntityDataFetcherSpec
SoftDeleteEntityDataFetcherSpec
UpdateEntityDataFetcherSpec > test get
UpdateEntityDataFetcherSpec > test optimistic locking
UpdateEntityDataFetcherSpec > test optimistic locking with null version

CI / Build Grails-Core (macos-latest, 21) > :grails-data-simple:test

Test Runs
SimpleMapQuerySpec > test query isolation in DISCRIMINATOR mode

CI / Build Grails-Core (macos-latest, 21) > :grails-datamapping-core:test

Test Runs
GormEnhancerAllQualifiersSpec > registerEntity can resolve through injected registry without touching global singleton
GormEntityTransformSpec > test property/method missing
GormRegistrySpec > test withTenant and exists with multi-tenant entity in DISCRIMINATOR mode
TenantContextProfilingSpec > profile tenant wrapping overhead

CI / Build Grails-Core (macos-latest, 21) > :grails-fields:test (first 40 of 173)

Test Runs
AssociationTypeTemplatesSpec > property name trumps association type
AssociationTypeTemplatesSpec > resolves template for association type
AssociationTypeTemplatesSpec > theme: property name trumps association type
AssociationTypeTemplatesSpec > theme: resolves template for association type
DefaultInputRenderingPersistentSpec > a one-to-many property has a list of links instead of an input
DefaultInputRenderingPersistentSpec > an enum with a toString method uses name instead of toString for the keys
DefaultInputRenderingPersistentSpec > enum select has correct selected option
DefaultInputRenderingPersistentSpec > enum select should respect constraint inList > enum select should respect constraint inList [inListConstraint: [first, second], notAllowed: [third], #0]
DefaultInputRenderingPersistentSpec > enum select should respect constraint inList > enum select should respect constraint inList [inListConstraint: [first], notAllowed: [third, second], #1]
DefaultInputRenderingPersistentSpec > enum with toString select and #type value has correct selected option > enum with toString select and Enum value has correct selected option
DefaultInputRenderingPersistentSpec > enum with toString select and #type value has correct selected option > enum with toString select and String value has correct selected option
DefaultInputRenderingPersistentSpec > input for #{invalid ? 'an invalid' : 'a valid'} property #{invalid ? 'has' : 'does not have'} the invalid attribute > input for #{invalid ? 'an invalid' : 'a valid'} property #{invalid ? 'has' : 'does not have'} the invalid attribute
DefaultInputRenderingPersistentSpec > input for #{invalid ? 'an invalid' : 'a valid'} property #{invalid ? 'has' : 'does not have'} the invalid attribute > input for #{invalid ? 'an invalid' : 'a valid'} property #{invalid ? 'has' : 'does not have'} the invalid attribute
DefaultInputRenderingPersistentSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} many-to-one property #{required ? 'has' : 'does not have'} a no-selection option
DefaultInputRenderingPersistentSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} many-to-one property #{required ? 'has' : 'does not have'} a no-selection option
DefaultInputRenderingPersistentSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} one-to-one property #{required ? 'has' : 'does not have'} a no-selection option
DefaultInputRenderingPersistentSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option > input for #{required ? 'a required' : 'an optional'} one-to-one property #{required ? 'has' : 'does not have'} a no-selection option
DefaultInputRenderingPersistentSpec > input for a #description property does have `.id` at the end of the name > input for a many-to-one property does have `.id` at the end of the name
DefaultInputRenderingPersistentSpec > input for a #description property does have `.id` at the end of the name > input for a one-to-one property does have `.id` at the end of the name
DefaultInputRenderingPersistentSpec > input for a #description property doesn't have `.id` at the end of the name > input for a many-to-many property doesn't have `.id` at the end of the name
DefaultInputRenderingPersistentSpec > input for a #description property is a select > input for a many-to-many property is a select
DefaultInputRenderingPersistentSpec > input for a #description property is a select > input for a many-to-one property is a select
DefaultInputRenderingPersistentSpec > input for a #description property is a select > input for a one-to-one property is a select
DefaultInputRenderingPersistentSpec > input for a #description property is a select containing only entries specified in from parameter > input for a many-to-many property is a select containing only entries specified in from parameter
DefaultInputRenderingPersistentSpec > input for a #description property is a select containing only entries specified in from parameter > input for a many-to-one property is a select containing only entries specified in from parameter
DefaultInputRenderingPersistentSpec > input for a #description property is a select containing only entries specified in from parameter > input for a one-to-one property is a select containing only entries specified in from parameter
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a Calendar property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a Currency property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a Date property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a Date property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a Locale property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a Time property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected > input for a TimeZone property has the correct option(s) selected
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a Calendar property is a special select type
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a Currency property is a special select type
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a Date property is a special select type
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a Date property is a special select type
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a Locale property is a special select type
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a Time property is a special select type
DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type > input for a TimeZone property is a special select type

CI / Build Grails-Core (ubuntu-latest, 21) > :grails-data-graphql-core:test

Test Runs
CreateEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get invalid
EntityDataFetcherSpec
SingleEntityDataFetcherSpec
SoftDeleteEntityDataFetcherSpec
UpdateEntityDataFetcherSpec > test get
UpdateEntityDataFetcherSpec > test optimistic locking
UpdateEntityDataFetcherSpec > test optimistic locking with null version

CI / Build Grails-Core (ubuntu-latest, 21) > :grails-data-simple:test

Test Runs
SimpleMapQuerySpec > test query isolation in DISCRIMINATOR mode

CI / Build Grails-Core (ubuntu-latest, 25) > :grails-data-graphql-core:test

Test Runs
CreateEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get invalid
EntityDataFetcherSpec
SingleEntityDataFetcherSpec
SoftDeleteEntityDataFetcherSpec
UpdateEntityDataFetcherSpec > test get
UpdateEntityDataFetcherSpec > test optimistic locking
UpdateEntityDataFetcherSpec > test optimistic locking with null version

CI / Build Grails-Core (ubuntu-latest, 25) > :grails-data-simple:test

Test Runs
SimpleMapQuerySpec > test query isolation in DISCRIMINATOR mode

CI / Build Grails-Core (windows-latest, 25) > :grails-data-graphql-core:test

Test Runs
CreateEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get invalid
EntityDataFetcherSpec
SingleEntityDataFetcherSpec
SoftDeleteEntityDataFetcherSpec
UpdateEntityDataFetcherSpec > test get
UpdateEntityDataFetcherSpec > test optimistic locking
UpdateEntityDataFetcherSpec > test optimistic locking with null version

CI / Build Grails-Core Rerunning all Tasks (ubuntu-latest, 21) > :grails-data-graphql-core:test

Test Runs
CreateEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get invalid
EntityDataFetcherSpec
SingleEntityDataFetcherSpec
SoftDeleteEntityDataFetcherSpec
UpdateEntityDataFetcherSpec > test get
UpdateEntityDataFetcherSpec > test optimistic locking
UpdateEntityDataFetcherSpec > test optimistic locking with null version

SiteMesh 2 Compatibility / SiteMesh 2 Core Tests (Java 21) > :grails-data-graphql-core:test

Test Runs
CreateEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get
DeleteEntityDataFetcherSpec > test get invalid
EntityDataFetcherSpec
SingleEntityDataFetcherSpec
SoftDeleteEntityDataFetcherSpec
UpdateEntityDataFetcherSpec > test get
UpdateEntityDataFetcherSpec > test optimistic locking
UpdateEntityDataFetcherSpec > test optimistic locking with null version

🏷️ Commit: 54d8eaa
▶️ Tests: 9094 executed
⚪️ Checks: 41/41 completed

Test Failures (first 10 of 234)

AssociationTypeTemplatesSpec > property name trumps association type (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Author]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormStaticApi(GormEntity.groovy:1492)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.getGormPersistentEntity(GormEntity.groovy:456)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.addTo(GormEntity.groovy:368)
	at grails.plugin.formfields.AssociationTypeTemplatesSpec.setup(AssociationTypeTemplatesSpec.groovy:37)
AssociationTypeTemplatesSpec > resolves template for association type (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Author]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormStaticApi(GormEntity.groovy:1492)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.getGormPersistentEntity(GormEntity.groovy:456)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.addTo(GormEntity.groovy:368)
	at grails.plugin.formfields.AssociationTypeTemplatesSpec.setup(AssociationTypeTemplatesSpec.groovy:37)
AssociationTypeTemplatesSpec > theme: property name trumps association type (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Author]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormStaticApi(GormEntity.groovy:1492)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.getGormPersistentEntity(GormEntity.groovy:456)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.addTo(GormEntity.groovy:368)
	at grails.plugin.formfields.AssociationTypeTemplatesSpec.setup(AssociationTypeTemplatesSpec.groovy:37)
AssociationTypeTemplatesSpec > theme: resolves template for association type (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Author]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormStaticApi(GormEntity.groovy:1492)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.getGormPersistentEntity(GormEntity.groovy:456)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.addTo(GormEntity.groovy:368)
	at grails.plugin.formfields.AssociationTypeTemplatesSpec.setup(AssociationTypeTemplatesSpec.groovy:37)
CreateEntityDataFetcherSpec > test get (:grails-data-graphql-core:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.NullPointerException: Cannot invoke "org.grails.datastore.mapping.services.ServiceRegistry.getService(java.lang.Class)" because "datastore" is null
	at org.grails.gorm.graphql.fetcher.DefaultGormDataFetcher.withTransaction(DefaultGormDataFetcher.groovy:135)
	at org.grails.gorm.graphql.fetcher.impl.CreateEntityDataFetcher.get(CreateEntityDataFetcher.groovy:46)
	at org.grails.gorm.graphql.fetcher.impl.CreateEntityDataFetcherSpec.test get(CreateEntityDataFetcherSpec.groovy:42)
DefaultInputRenderingPersistentSpec > a one-to-many property has a list of links instead of an input (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Person]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:1482)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:169)
	at grails.plugin.formfields.DefaultInputRenderingPersistentSpec.setup(DefaultInputRenderingPersistentSpec.groovy:79)
DefaultInputRenderingPersistentSpec > an enum with a toString method uses name instead of toString for the keys (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Person]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:1482)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:169)
	at grails.plugin.formfields.DefaultInputRenderingPersistentSpec.setup(DefaultInputRenderingPersistentSpec.groovy:79)
DefaultInputRenderingPersistentSpec > enum select has correct selected option (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Person]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:1482)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:169)
	at grails.plugin.formfields.DefaultInputRenderingPersistentSpec.setup(DefaultInputRenderingPersistentSpec.groovy:79)
DefaultInputRenderingPersistentSpec > enum select should respect constraint inList > enum select should respect constraint inList [inListConstraint: [first, second], notAllowed: [third], #0] (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Person]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:1482)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:169)
	at grails.plugin.formfields.DefaultInputRenderingPersistentSpec.setup(DefaultInputRenderingPersistentSpec.groovy:79)
DefaultInputRenderingPersistentSpec > enum select should respect constraint inList > enum select should respect constraint inList [inListConstraint: [first], notAllowed: [third, second], #1] (:grails-fields:test in CI / Build Grails-Core (macos-latest, 21))
java.lang.IllegalStateException: No GORM implementation configured for class [grails.plugin.formfields.mock.Person]. Ensure GORM has been initialized correctly
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.currentGormInstanceApi(GormEntity.groovy:1482)
	at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:169)
	at grails.plugin.formfields.DefaultInputRenderingPersistentSpec.setup(DefaultInputRenderingPersistentSpec.groovy:79)

Muted Tests (first 20 of 234)

Select tests to mute in this pull request:

  • AssociationTypeTemplatesSpec > property name trumps association type
  • AssociationTypeTemplatesSpec > resolves template for association type
  • AssociationTypeTemplatesSpec > theme: property name trumps association type
  • AssociationTypeTemplatesSpec > theme: resolves template for association type
  • CreateEntityDataFetcherSpec > test get
  • DefaultInputRenderingPersistentSpec > a one-to-many property has a list of links instead of an input
  • DefaultInputRenderingPersistentSpec > an enum with a toString method uses name instead of toString for the keys
  • DefaultInputRenderingPersistentSpec > enum select has correct selected option
  • DefaultInputRenderingPersistentSpec > enum select should respect constraint inList
  • DefaultInputRenderingPersistentSpec > enum with toString select and #type value has correct selected option
  • DefaultInputRenderingPersistentSpec > input for #{invalid ? 'an invalid' : 'a valid'} property #{invalid ? 'has' : 'does not have'} the invalid attribute
  • DefaultInputRenderingPersistentSpec > input for #{required ? 'a required' : 'an optional'} #description property #{required ? 'has' : 'does not have'} a no-selection option
  • DefaultInputRenderingPersistentSpec > input for a #description property does have `.id` at the end of the name
  • DefaultInputRenderingPersistentSpec > input for a #description property doesn't have `.id` at the end of the name
  • DefaultInputRenderingPersistentSpec > input for a #description property is a select
  • DefaultInputRenderingPersistentSpec > input for a #description property is a select containing only entries specified in from parameter
  • DefaultInputRenderingPersistentSpec > input for a #type.simpleName property has the correct option(s) selected
  • DefaultInputRenderingPersistentSpec > input for a #type.simpleName property is a special select type
  • DefaultInputRenderingPersistentSpec > input for a #type.simpleName property matches '#outputPattern'
  • DefaultInputRenderingPersistentSpec > input for a #type.simpleName property with #constraints constraints matches #outputPattern

Reuse successful test results:

  • ♻️ Only rerun the tests that failed or were muted before

Click the checkbox to trigger a rerun:

  • Rerun jobs

Learn more about TestLens at testlens.app.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant