Skip to content

feat: Add preliminary code for generating OAS #113

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 7, 2021
Merged

Conversation

soedirgo
Copy link
Member

@soedirgo soedirgo commented Jun 3, 2021

What kind of change does this PR introduce?

Feature.

What is the new behavior?

Adds preliminary code for generating OpenAPI spec.

  • Uses TypeBox to generate both JSON Schema & TypeScript types in one go—pretty handy!
  • Uses fastify-swagger to generate OAS (like in storage-api)
  • Preliminary support is for /schemas route only (all verbs)
  • Includes types for POST and PATCH so no need to chase postgres-meta source code function calls anymore :-)
  • Exporting docs is done by setting PG_META_EXPORT_DOCS to true (server doesn't start up with this option, this is for exporting docs only)
  • Publishes docs to gh-pages branch - @kiwicopple might need to change the GitHub Pages settings

Currently it exports openapi.json with the following contents:

{
  "openapi": "3.0.3",
  "info": {
    "title": "postgres-meta",
    "description": "A REST API to manage your Postgres database",
    "version": "0.0.0-automated"
  },
  "components": {
    "schemas": {}
  },
  "paths": {
    "*": {
      "options": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/health": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/config/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/config/version": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/columns/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/columns/{id}(\\d+\\.\\d+)": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "patch": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "delete": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/extensions/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/extensions/{name}": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "patch": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "delete": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/functions/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/policies/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/policies/{id}(\\d+)": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "patch": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "delete": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/publications/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/publications/{id}(\\d+)": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "patch": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "delete": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/query/": {
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/schemas/": {
      "get": {
        "parameters": [
          {
            "in": "query",
            "name": "include_system_schemas",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "pg",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "id": {
                        "type": "integer"
                      },
                      "name": {
                        "type": "string"
                      },
                      "owner": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id",
                      "name",
                      "owner"
                    ]
                  }
                }
              }
            }
          },
          "500": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      },
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "owner": {
                    "type": "string"
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        },
        "parameters": [
          {
            "in": "header",
            "name": "pg",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "owner"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/schemas/{id}(\\d+)": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "pattern": "\\d+",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "pg",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "owner"
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      },
      "patch": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "owner": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "pattern": "\\d+",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "pg",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "owner"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      },
      "delete": {
        "parameters": [
          {
            "in": "query",
            "name": "cascade",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "pattern": "\\d+",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "pg",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "name": {
                      "type": "string"
                    },
                    "owner": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name",
                    "owner"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Default Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/tables/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/tables/{id}(\\d+)": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "patch": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "delete": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/types/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/roles/": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "post": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    },
    "/roles/{id}(\\d+)": {
      "get": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "patch": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      },
      "delete": {
        "responses": {
          "200": {
            "description": "Default Response"
          }
        }
      }
    }
  },
  "servers": []
}

soedirgo added 3 commits June 3, 2021 17:55
Make it work on M1 (so tests are fast & db doesn't hang up intermittently)
* Uses @sinclair/typebox to generate both JSON Schema & TypeScript types
in one go--pretty handy

* Uses fastify-swagger to generate OAS (like in storage-api)

* Preliminary support is for /schemas only

* Includes types for POST and PATCH so no need to chase postgres-meta
source code function calls anymore :-)

* Exporting docs is done by setting PG_META_EXPORT_DOCS to
`true` (server doesn't start up with this option, this is for exporting
docs only)
@soedirgo soedirgo requested a review from kiwicopple June 3, 2021 10:42
@kiwicopple kiwicopple merged commit 3822753 into develop Jun 7, 2021
@github-actions
Copy link

🎉 This PR is included in version 0.18.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@soedirgo soedirgo deleted the feat/openapi branch June 21, 2021 06:47
avallete pushed a commit that referenced this pull request May 13, 2025
feat: Add preliminary code for generating OAS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants