feat(oas) - accurate model OAS representation - F to O (#3210)

### Scope

Models F to O

### What

Refactor OAS for models to accurately represent their shape in API responses.

### Why

About 33% of model fields are not accurately represented in the OAS. Most of the issues are:
- fields that can not be omitted in the response are not declared as `required`
- fields that could return `null` as their value are not declared as `nullable: true`

When using a code generator, these OAS issues would lead to inaccurate response shapes in the generated client.

### How

#### nullable
Fields meeting at least one of the following condition will be represented as `nullable: true` in OAS:
* The field is decorated with `@Column({ nullable: true })`
* The field is decorated with `@OneToOne`, `@ManyToOne`
* The field is decorated with `@DeleteDateColumn`

#### optional
Fields meeting at least one of the following conditions will never be listed as `required` in OAS and will be considered optional and could be omitted in the response:
* The field is decorated with `@OneToOne`, `@ManyToOne`, `@OneToMany`, `@ManyToMany`
* The field is decorated with `@FeatureFlagColumn`
* The field is decorated with `@Column({select: false})`
* The field is representing dynamic values not persisted in the database

Fields not meeting any of the conditions above will be declared as `required` and are expected to be present in the response.

### Test
* Ran OAS validator.
* Ran docs build script.

Expect OAS changes to be reflected in the API documentation.
This commit is contained in:
Patrick
2023-02-09 15:03:11 +00:00
committed by GitHub
parent d859ccf551
commit 507ad00bec
20 changed files with 596 additions and 370 deletions
+21 -11
View File
@@ -47,47 +47,57 @@ export class Note extends SoftDeletableEntity {
* description: "Notes are elements which we can use in association with different resources to allow users to describe additional information in relation to these."
* type: object
* required:
* - value
* - resource_type
* - author_id
* - created_at
* - deleted_at
* - id
* - metadata
* - resource_id
* - resource_type
* - updated_at
* - value
* properties:
* id:
* type: string
* description: The note's ID
* type: string
* example: note_01G8TM8ENBMC7R90XRR1G6H26Q
* resource_type:
* description: "The type of resource that the Note refers to."
* description: The type of resource that the Note refers to.
* type: string
* example: order
* resource_id:
* description: "The ID of the resource that the Note refers to."
* description: The ID of the resource that the Note refers to.
* type: string
* example: order_01G8TJSYT9M6AVS5N4EMNFS1EK
* value:
* description: "The contents of the note."
* description: The contents of the note.
* type: string
* example: This order must be fulfilled on Monday
* author_id:
* type: string
* description: The ID of the author (user)
* nullable: true
* type: string
* example: usr_01G1G5V26F5TB3GPAPNJ8X1S3V
* author:
* description: Available if the relation `author` is expanded.
* nullable: true
* $ref: "#/components/schemas/User"
* created_at:
* description: The date with timezone at which the resource was created.
* type: string
* description: "The date with timezone at which the resource was created."
* format: date-time
* updated_at:
* description: The date with timezone at which the resource was updated.
* type: string
* description: "The date with timezone at which the resource was updated."
* format: date-time
* deleted_at:
* description: The date with timezone at which the resource was deleted.
* nullable: true
* type: string
* description: "The date with timezone at which the resource was deleted."
* format: date-time
* metadata:
* type: object
* description: An optional key-value map with additional details
* nullable: true
* type: object
* example: {car: "white"}
*/