@@ -409,14 +409,17 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
409409 private generateFilterParameters ( model : DataModel ) {
410410 const result : OAPI . ParameterObject [ ] = [ ] ;
411411
412+ const hasMultipleIds = model . fields . filter ( ( f ) => isIdField ( f ) ) . length > 1 ;
413+
412414 for ( const field of model . fields ) {
413415 if ( isForeignKeyField ( field ) ) {
414416 // no filtering with foreign keys because one can filter
415417 // directly on the relationship
416418 continue ;
417419 }
418420
419- if ( isIdField ( field ) ) {
421+ // For multiple ids, make each id field filterable like a regular field
422+ if ( isIdField ( field ) && ! hasMultipleIds ) {
420423 // id filter
421424 result . push ( this . makeFilterParameter ( field , 'id' , 'Id filter' ) ) ;
422425 continue ;
@@ -843,7 +846,9 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
843846 }
844847
845848 private generateModelEntity ( model : DataModel , mode : 'read' | 'create' | 'update' ) : OAPI . SchemaObject {
846- const fields = model . fields . filter ( ( f ) => ! isIdField ( f ) ) ;
849+ const idFields = model . fields . filter ( ( f ) => isIdField ( f ) ) ;
850+ // For compound ids, each component is also exposed as a separate field
851+ const fields = idFields . length > 1 ? model . fields : model . fields . filter ( ( f ) => ! isIdField ( f ) ) ;
847852
848853 const attributes : Record < string , OAPI . SchemaObject > = { } ;
849854 const relationships : Record < string , OAPI . ReferenceObject | OAPI . SchemaObject > = { } ;
@@ -869,6 +874,9 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
869874 ! ( isDataModel ( field . $resolvedType ?. decl ) && field . type . array )
870875 ) {
871876 required . push ( field . name ) ;
877+ } else if ( mode === 'read' ) {
878+ // Until we support sparse fieldsets, all fields are required for read operations
879+ required . push ( field . name ) ;
872880 }
873881 }
874882 }
@@ -886,8 +894,8 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
886894
887895 if ( mode === 'create' ) {
888896 // 'id' is required if there's no default value
889- const idField = model . fields . find ( ( f ) => isIdField ( f ) ) ;
890- if ( idField && ! hasAttribute ( idField , '@default' ) ) {
897+ const idFields = model . fields . filter ( ( f ) => isIdField ( f ) ) ;
898+ if ( idFields . length && idFields . every ( ( f ) => ! hasAttribute ( f , '@default' ) ) ) {
891899 properties = { id : { type : 'string' } , ...properties } ;
892900 toplevelRequired . unshift ( 'id' ) ;
893901 }
0 commit comments