Skip to content

Commit a2c78a1

Browse files
thomassnielsenymc9
andauthored
OpenApi @@id support (#1757)
Co-authored-by: Yiming <[email protected]>
1 parent 2a8f4df commit a2c78a1

File tree

4 files changed

+1752
-452
lines changed

4 files changed

+1752
-452
lines changed

packages/plugins/openapi/src/rest-generator.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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> = {};
@@ -886,8 +891,8 @@ export class RESTfulOpenAPIGenerator extends OpenAPIGeneratorBase {
886891

887892
if (mode === 'create') {
888893
// 'id' is required if there's no default value
889-
const idField = model.fields.find((f) => isIdField(f));
890-
if (idField && !hasAttribute(idField, '@default')) {
894+
const idFields = model.fields.filter((f) => isIdField(f));
895+
if (idFields.length && idFields.every((f) => !hasAttribute(f, '@default'))) {
891896
properties = { id: { type: 'string' }, ...properties };
892897
toplevelRequired.unshift('id');
893898
}

0 commit comments

Comments
 (0)