@@ -409,14 +409,17 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
409
409
private generateFilterParameters ( model : DataModel ) {
410
410
const result : OAPI . ParameterObject [ ] = [ ] ;
411
411
412
+ const hasMultipleIds = model . fields . filter ( ( f ) => isIdField ( f ) ) . length > 1 ;
413
+
412
414
for ( const field of model . fields ) {
413
415
if ( isForeignKeyField ( field ) ) {
414
416
// no filtering with foreign keys because one can filter
415
417
// directly on the relationship
416
418
continue ;
417
419
}
418
420
419
- if ( isIdField ( field ) ) {
421
+ // For multiple ids, make each id field filterable like a regular field
422
+ if ( isIdField ( field ) && ! hasMultipleIds ) {
420
423
// id filter
421
424
result . push ( this . makeFilterParameter ( field , 'id' , 'Id filter' ) ) ;
422
425
continue ;
@@ -843,7 +846,9 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
843
846
}
844
847
845
848
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 ) ) ;
847
852
848
853
const attributes : Record < string , OAPI . SchemaObject > = { } ;
849
854
const relationships : Record < string , OAPI . ReferenceObject | OAPI . SchemaObject > = { } ;
@@ -869,6 +874,9 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
869
874
! ( isDataModel ( field . $resolvedType ?. decl ) && field . type . array )
870
875
) {
871
876
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 ) ;
872
880
}
873
881
}
874
882
}
@@ -886,8 +894,8 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
886
894
887
895
if ( mode === 'create' ) {
888
896
// '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' ) ) ) {
891
899
properties = { id : { type : 'string' } , ...properties } ;
892
900
toplevelRequired . unshift ( 'id' ) ;
893
901
}
0 commit comments