1
0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2024-12-29 15:11:58 +00:00

Add generated openapi docs to website (#1067)

* Add generated openapi docs to website

* Uppercase API link in navbar

* fix(docs): open api empty summary (#1069)

* feat(docs): Use /docs/api path for swagger docs

* Sync api version to be the same as the server

* Update version

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
This commit is contained in:
bo0tzz 2022-12-08 04:57:34 +01:00 committed by GitHub
parent 1adf8ff6b6
commit a97b761eda
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 2787 additions and 37 deletions

View file

@ -30,8 +30,8 @@ const config = {
presets: [ presets: [
[ [
"classic", "docusaurus-preset-openapi",
/** @type {import('@docusaurus/preset-classic').Options} */ /** @type {import('docusaurus-preset-openapi').Options} */
({ ({
docs: { docs: {
showLastUpdateAuthor: true, showLastUpdateAuthor: true,
@ -42,6 +42,10 @@ const config = {
// Remove this to remove the "edit this page" links. // Remove this to remove the "edit this page" links.
editUrl: "https://github.com/immich-app/immich/tree/main/docs/", editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
}, },
api: {
path: "../server/immich-openapi-specs.json",
routeBasePath: "/docs/api"
},
// blog: { // blog: {
// showReadingTime: true, // showReadingTime: true,
// editUrl: "https://github.com/immich-app/immich/tree/main/docs/", // editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
@ -80,6 +84,11 @@ const config = {
position: "right", position: "right",
label: "Documentation", label: "Documentation",
}, },
{
to: "/docs/api",
position: "right",
label: "API"
},
{ to: "/blog", label: "Blog", position: "right" }, { to: "/blog", label: "Blog", position: "right" },
{ {
href: "https://github.com/immich-app/immich", href: "https://github.com/immich-app/immich",

2742
docs/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -19,9 +19,11 @@
"@docusaurus/preset-classic": "2.1.0", "@docusaurus/preset-classic": "2.1.0",
"@mdx-js/react": "^1.6.22", "@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"docusaurus-preset-openapi": "^0.6.3",
"prism-react-renderer": "^1.3.5", "prism-react-renderer": "^1.3.5",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2" "react-dom": "^17.0.2",
"url": "^0.11.0"
}, },
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "2.1.0", "@docusaurus/module-type-aliases": "2.1.0",

Binary file not shown.

Binary file not shown.

View file

@ -9,6 +9,7 @@ import { AppModule } from './app.module';
import { serverVersion } from './constants/server_version.constant'; import { serverVersion } from './constants/server_version.constant';
import { RedisIoAdapter } from './middlewares/redis-io.adapter.middleware'; import { RedisIoAdapter } from './middlewares/redis-io.adapter.middleware';
import { json } from 'body-parser'; import { json } from 'body-parser';
import { patchOpenAPI } from './utils/patch-open-api.util';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule); const app = await NestFactory.create<NestExpressApplication>(AppModule);
@ -26,7 +27,7 @@ async function bootstrap() {
const config = new DocumentBuilder() const config = new DocumentBuilder()
.setTitle('Immich') .setTitle('Immich')
.setDescription('Immich API') .setDescription('Immich API')
.setVersion('1.17.0') .setVersion(`${serverVersion.major}.${serverVersion.minor}.${serverVersion.patch}`)
.addBearerAuth({ .addBearerAuth({
type: 'http', type: 'http',
scheme: 'Bearer', scheme: 'Bearer',
@ -55,7 +56,7 @@ async function bootstrap() {
if (process.env.NODE_ENV == 'development') { if (process.env.NODE_ENV == 'development') {
// Generate API Documentation only in development mode // Generate API Documentation only in development mode
const outputPath = path.resolve(process.cwd(), 'immich-openapi-specs.json'); const outputPath = path.resolve(process.cwd(), 'immich-openapi-specs.json');
writeFileSync(outputPath, JSON.stringify(apiDocument, null, 2), { encoding: 'utf8' }); writeFileSync(outputPath, JSON.stringify(patchOpenAPI(apiDocument), null, 2), { encoding: 'utf8' });
Logger.log( Logger.log(
`Running Immich Server in DEVELOPMENT environment - version ${serverVersion.major}.${serverVersion.minor}.${serverVersion.patch}`, `Running Immich Server in DEVELOPMENT environment - version ${serverVersion.major}.${serverVersion.minor}.${serverVersion.patch}`,
'ImmichServer', 'ImmichServer',

View file

@ -0,0 +1,28 @@
import { OpenAPIObject } from '@nestjs/swagger';
export function patchOpenAPI(document: OpenAPIObject) {
for (const path of Object.values(document.paths)) {
const operations = {
get: path.get,
put: path.put,
post: path.post,
delete: path.delete,
options: path.options,
head: path.head,
patch: path.patch,
trace: path.trace,
};
for (const operation of Object.values(operations)) {
if (!operation) {
continue;
}
if (operation.summary === '') {
delete operation.summary;
}
}
}
return document;
}

View file

@ -733,7 +733,6 @@
"/asset": { "/asset": {
"get": { "get": {
"operationId": "getAllAssets", "operationId": "getAllAssets",
"summary": "",
"description": "Get all AssetEntity belong to the user", "description": "Get all AssetEntity belong to the user",
"parameters": [ "parameters": [
{ {
@ -850,7 +849,6 @@
"/asset/{deviceId}": { "/asset/{deviceId}": {
"get": { "get": {
"operationId": "getUserAssetsByDeviceId", "operationId": "getUserAssetsByDeviceId",
"summary": "",
"description": "Get all asset of a device that are in the database, ID only.", "description": "Get all asset of a device that are in the database, ID only.",
"parameters": [ "parameters": [
{ {
@ -890,7 +888,6 @@
"/asset/assetById/{assetId}": { "/asset/assetById/{assetId}": {
"get": { "get": {
"operationId": "getAssetById", "operationId": "getAssetById",
"summary": "",
"description": "Get a single asset's information", "description": "Get a single asset's information",
"parameters": [ "parameters": [
{ {
@ -927,7 +924,6 @@
"/asset/{assetId}": { "/asset/{assetId}": {
"put": { "put": {
"operationId": "updateAsset", "operationId": "updateAsset",
"summary": "",
"description": "Update an asset", "description": "Update an asset",
"parameters": [ "parameters": [
{ {
@ -974,7 +970,6 @@
"/asset/check": { "/asset/check": {
"post": { "post": {
"operationId": "checkDuplicateAsset", "operationId": "checkDuplicateAsset",
"summary": "",
"description": "Check duplicated asset before uploading - for Web upload used", "description": "Check duplicated asset before uploading - for Web upload used",
"parameters": [], "parameters": [],
"requestBody": { "requestBody": {
@ -1012,7 +1007,6 @@
"/asset/exist": { "/asset/exist": {
"post": { "post": {
"operationId": "checkExistingAssets", "operationId": "checkExistingAssets",
"summary": "",
"description": "Checks if multiple assets exist on the server and returns all existing - used by background backup", "description": "Checks if multiple assets exist on the server and returns all existing - used by background backup",
"parameters": [], "parameters": [],
"requestBody": { "requestBody": {
@ -2108,7 +2102,7 @@
"info": { "info": {
"title": "Immich", "title": "Immich",
"description": "Immich API", "description": "Immich API",
"version": "1.17.0", "version": "1.37.0",
"contact": {} "contact": {}
}, },
"tags": [], "tags": [],

View file

@ -2685,7 +2685,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
return { return {
/** /**
* Check duplicated asset before uploading - for Web upload used * Check duplicated asset before uploading - for Web upload used
* @summary
* @param {CheckDuplicateAssetDto} checkDuplicateAssetDto * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -2725,7 +2724,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
}, },
/** /**
* Checks if multiple assets exist on the server and returns all existing - used by background backup * Checks if multiple assets exist on the server and returns all existing - used by background backup
* @summary
* @param {CheckExistingAssetsDto} checkExistingAssetsDto * @param {CheckExistingAssetsDto} checkExistingAssetsDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -2889,7 +2887,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
}, },
/** /**
* Get all AssetEntity belong to the user * Get all AssetEntity belong to the user
* @summary
* @param {string} [ifNoneMatch] ETag of data already cached on the client * @param {string} [ifNoneMatch] ETag of data already cached on the client
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -2928,7 +2925,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
}, },
/** /**
* Get a single asset\'s information * Get a single asset\'s information
* @summary
* @param {string} assetId * @param {string} assetId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3218,7 +3214,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
}, },
/** /**
* Get all asset of a device that are in the database, ID only. * Get all asset of a device that are in the database, ID only.
* @summary
* @param {string} deviceId * @param {string} deviceId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3342,7 +3337,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
}, },
/** /**
* Update an asset * Update an asset
* @summary
* @param {string} assetId * @param {string} assetId
* @param {UpdateAssetDto} updateAssetDto * @param {UpdateAssetDto} updateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
@ -3440,7 +3434,6 @@ export const AssetApiFp = function(configuration?: Configuration) {
return { return {
/** /**
* Check duplicated asset before uploading - for Web upload used * Check duplicated asset before uploading - for Web upload used
* @summary
* @param {CheckDuplicateAssetDto} checkDuplicateAssetDto * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3451,7 +3444,6 @@ export const AssetApiFp = function(configuration?: Configuration) {
}, },
/** /**
* Checks if multiple assets exist on the server and returns all existing - used by background backup * Checks if multiple assets exist on the server and returns all existing - used by background backup
* @summary
* @param {CheckExistingAssetsDto} checkExistingAssetsDto * @param {CheckExistingAssetsDto} checkExistingAssetsDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3494,7 +3486,6 @@ export const AssetApiFp = function(configuration?: Configuration) {
}, },
/** /**
* Get all AssetEntity belong to the user * Get all AssetEntity belong to the user
* @summary
* @param {string} [ifNoneMatch] ETag of data already cached on the client * @param {string} [ifNoneMatch] ETag of data already cached on the client
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3505,7 +3496,6 @@ export const AssetApiFp = function(configuration?: Configuration) {
}, },
/** /**
* Get a single asset\'s information * Get a single asset\'s information
* @summary
* @param {string} assetId * @param {string} assetId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3583,7 +3573,6 @@ export const AssetApiFp = function(configuration?: Configuration) {
}, },
/** /**
* Get all asset of a device that are in the database, ID only. * Get all asset of a device that are in the database, ID only.
* @summary
* @param {string} deviceId * @param {string} deviceId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3616,7 +3605,6 @@ export const AssetApiFp = function(configuration?: Configuration) {
}, },
/** /**
* Update an asset * Update an asset
* @summary
* @param {string} assetId * @param {string} assetId
* @param {UpdateAssetDto} updateAssetDto * @param {UpdateAssetDto} updateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
@ -3648,7 +3636,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
return { return {
/** /**
* Check duplicated asset before uploading - for Web upload used * Check duplicated asset before uploading - for Web upload used
* @summary
* @param {CheckDuplicateAssetDto} checkDuplicateAssetDto * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3658,7 +3645,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
}, },
/** /**
* Checks if multiple assets exist on the server and returns all existing - used by background backup * Checks if multiple assets exist on the server and returns all existing - used by background backup
* @summary
* @param {CheckExistingAssetsDto} checkExistingAssetsDto * @param {CheckExistingAssetsDto} checkExistingAssetsDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3697,7 +3683,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
}, },
/** /**
* Get all AssetEntity belong to the user * Get all AssetEntity belong to the user
* @summary
* @param {string} [ifNoneMatch] ETag of data already cached on the client * @param {string} [ifNoneMatch] ETag of data already cached on the client
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3707,7 +3692,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
}, },
/** /**
* Get a single asset\'s information * Get a single asset\'s information
* @summary
* @param {string} assetId * @param {string} assetId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3777,7 +3761,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
}, },
/** /**
* Get all asset of a device that are in the database, ID only. * Get all asset of a device that are in the database, ID only.
* @summary
* @param {string} deviceId * @param {string} deviceId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3807,7 +3790,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
}, },
/** /**
* Update an asset * Update an asset
* @summary
* @param {string} assetId * @param {string} assetId
* @param {UpdateAssetDto} updateAssetDto * @param {UpdateAssetDto} updateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
@ -3837,7 +3819,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
export class AssetApi extends BaseAPI { export class AssetApi extends BaseAPI {
/** /**
* Check duplicated asset before uploading - for Web upload used * Check duplicated asset before uploading - for Web upload used
* @summary
* @param {CheckDuplicateAssetDto} checkDuplicateAssetDto * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3849,7 +3830,6 @@ export class AssetApi extends BaseAPI {
/** /**
* Checks if multiple assets exist on the server and returns all existing - used by background backup * Checks if multiple assets exist on the server and returns all existing - used by background backup
* @summary
* @param {CheckExistingAssetsDto} checkExistingAssetsDto * @param {CheckExistingAssetsDto} checkExistingAssetsDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3896,7 +3876,6 @@ export class AssetApi extends BaseAPI {
/** /**
* Get all AssetEntity belong to the user * Get all AssetEntity belong to the user
* @summary
* @param {string} [ifNoneMatch] ETag of data already cached on the client * @param {string} [ifNoneMatch] ETag of data already cached on the client
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3908,7 +3887,6 @@ export class AssetApi extends BaseAPI {
/** /**
* Get a single asset\'s information * Get a single asset\'s information
* @summary
* @param {string} assetId * @param {string} assetId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -3994,7 +3972,6 @@ export class AssetApi extends BaseAPI {
/** /**
* Get all asset of a device that are in the database, ID only. * Get all asset of a device that are in the database, ID only.
* @summary
* @param {string} deviceId * @param {string} deviceId
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
@ -4030,7 +4007,6 @@ export class AssetApi extends BaseAPI {
/** /**
* Update an asset * Update an asset
* @summary
* @param {string} assetId * @param {string} assetId
* @param {UpdateAssetDto} updateAssetDto * @param {UpdateAssetDto} updateAssetDto
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.