Closed
Description
Allow Controller methods implementing PATCH operation to describe their input data as "a model with all properties optional". This story requires #2629 and #2631 to be implemented first.
To emit schema with optional model properties, we should add a new schema-generation option called partial
.
export interface JsonSchemaOptions {
/// Make all properties optional
partial?: boolean;
}
An example showing a controller method accepting a partial model instance:
class TodoListController {
// ...
@patch('/todo-lists/{id}', {
responses: {
// left out for brevity
},
})
async updateById(
@param.path.number('id') id: number,
@requestBody({
content: {
'application/json': {
schema: getModelSchemaRef(TodoList, {partial: true}),
/***** ^^^ THIS IS IMPORTANT - OPENAPI SCHEMA ^^^ ****/
},
},
})
obj: Partial<TodoList>,
/***** ^^^ THIS IS IMPORTANT - TYPESCRIPT TYPE ^^^ ****/
): Promise<void> {
await this.todoListRepository.updateById(id, obj);
}
}
See 887ae84 for a spike showing proposed implementation details.
Acceptance criteria
- Implementation including test coverage - see Emit schema with all model properties optional + allow partial updates via PATCH #3199
- API documentation - see Emit schema with all model properties optional + allow partial updates via PATCH #3199
-
PATCH
endpoints in all example applications are updated to leveragapartial
option and usePartial<MyModel>
as the type of the controller method argument accepting model data - see Emit schema with all model properties optional + allow partial updates via PATCH #3199 - CLI templates are updated accordingly - see Emit schema with all model properties optional + allow partial updates via PATCH #3199
- Review Partial update (PATCH) over REST #1722 and OpenAPI decorator does not properly generate schemas of type
Partial
#1179, either close them as fixed or post a comment explaining what's remaining to be done.