Sharkey/packages/backend/src/server/api/openapi/schemas.ts

91 lines
2.5 KiB
TypeScript
Raw Normal View History

/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
2023-03-10 14:22:37 +09:00
import type { Schema } from '@/misc/json-schema.js';
import { refs } from '@/misc/json-schema.js';
export function convertSchemaToOpenApiSchema(schema: Schema, type: 'param' | 'res', includeSelfRef: boolean): any {
fix(backend): 虚無ノヌトを投皿できる問題の修正ず `api.json` の OpenAPI Specification 3.1.0 ぞの察応 (#12969) * fix(backend): `text: null`だけのノヌトは投皿できないように * add test * Update CHANGELOG.md * chore: bump OpenAPI Specification from 3.0.0 to 3.1.0 * chore: テストがすでにコメントで蚘述されおいたのでそっちを䜿うこずにする * fix test * fix(backend): prohibit posting whitespace-only notes * Update CHANGELOG.md * fix(backend): `renoteId`たたは`fileIds``mediaIds`たたは`poll`が`null`でない堎合に、`text が空癜文字のみで構成されたリク゚ストになるこずを蚱可しお、結果は`text: null`を返すように * test(backend): 匕甚renoteで空癜文字のみで構成されたtextにするずレスポンスが`text: null`になるこずをチェックするテストを远加 * fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように * fix(misskey-js): OpenAPI 3.1に察応 * fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に察応 * fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に察応 * fix(ci): スキヌマ曞き換えの際のミスを修正 * Revert "fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように" This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b. * fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように * Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように" This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324. * fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を甚いるように * Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
// optional, nullable, refはスキヌマ定矩に含たれないので分離しおおく
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { optional, nullable, ref, selfRef, ...res }: any = schema;
if (schema.type === 'object' && schema.properties) {
fix(backend): 虚無ノヌトを投皿できる問題の修正ず `api.json` の OpenAPI Specification 3.1.0 ぞの察応 (#12969) * fix(backend): `text: null`だけのノヌトは投皿できないように * add test * Update CHANGELOG.md * chore: bump OpenAPI Specification from 3.0.0 to 3.1.0 * chore: テストがすでにコメントで蚘述されおいたのでそっちを䜿うこずにする * fix test * fix(backend): prohibit posting whitespace-only notes * Update CHANGELOG.md * fix(backend): `renoteId`たたは`fileIds``mediaIds`たたは`poll`が`null`でない堎合に、`text が空癜文字のみで構成されたリク゚ストになるこずを蚱可しお、結果は`text: null`を返すように * test(backend): 匕甚renoteで空癜文字のみで構成されたtextにするずレスポンスが`text: null`になるこずをチェックするテストを远加 * fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように * fix(misskey-js): OpenAPI 3.1に察応 * fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に察応 * fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に察応 * fix(ci): スキヌマ曞き換えの際のミスを修正 * Revert "fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように" This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b. * fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように * Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように" This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324. * fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を甚いるように * Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
if (type === 'res') {
const required = Object.entries(schema.properties).filter(([k, v]) => !v.optional).map(([k]) => k);
if (required.length > 0) {
// 空配列は蚱可されない
fix(backend): 虚無ノヌトを投皿できる問題の修正ず `api.json` の OpenAPI Specification 3.1.0 ぞの察応 (#12969) * fix(backend): `text: null`だけのノヌトは投皿できないように * add test * Update CHANGELOG.md * chore: bump OpenAPI Specification from 3.0.0 to 3.1.0 * chore: テストがすでにコメントで蚘述されおいたのでそっちを䜿うこずにする * fix test * fix(backend): prohibit posting whitespace-only notes * Update CHANGELOG.md * fix(backend): `renoteId`たたは`fileIds``mediaIds`たたは`poll`が`null`でない堎合に、`text が空癜文字のみで構成されたリク゚ストになるこずを蚱可しお、結果は`text: null`を返すように * test(backend): 匕甚renoteで空癜文字のみで構成されたtextにするずレスポンスが`text: null`になるこずをチェックするテストを远加 * fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように * fix(misskey-js): OpenAPI 3.1に察応 * fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に察応 * fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に察応 * fix(ci): スキヌマ曞き換えの際のミスを修正 * Revert "fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように" This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b. * fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように * Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように" This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324. * fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を甚いるように * Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
res.required = required;
}
}
for (const k of Object.keys(schema.properties)) {
res.properties[k] = convertSchemaToOpenApiSchema(schema.properties[k], type, includeSelfRef);
}
}
if (schema.type === 'array' && schema.items) {
res.items = convertSchemaToOpenApiSchema(schema.items, type, includeSelfRef);
}
fix(backend): 虚無ノヌトを投皿できる問題の修正ず `api.json` の OpenAPI Specification 3.1.0 ぞの察応 (#12969) * fix(backend): `text: null`だけのノヌトは投皿できないように * add test * Update CHANGELOG.md * chore: bump OpenAPI Specification from 3.0.0 to 3.1.0 * chore: テストがすでにコメントで蚘述されおいたのでそっちを䜿うこずにする * fix test * fix(backend): prohibit posting whitespace-only notes * Update CHANGELOG.md * fix(backend): `renoteId`たたは`fileIds``mediaIds`たたは`poll`が`null`でない堎合に、`text が空癜文字のみで構成されたリク゚ストになるこずを蚱可しお、結果は`text: null`を返すように * test(backend): 匕甚renoteで空癜文字のみで構成されたtextにするずレスポンスが`text: null`になるこずをチェックするテストを远加 * fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように * fix(misskey-js): OpenAPI 3.1に察応 * fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に察応 * fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に察応 * fix(ci): スキヌマ曞き換えの際のミスを修正 * Revert "fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように" This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b. * fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように * Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように" This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324. * fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を甚いるように * Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
for (const o of ['anyOf', 'oneOf', 'allOf'] as const) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
if (o in schema) res[o] = schema[o]!.map(schema => convertSchemaToOpenApiSchema(schema, type, includeSelfRef));
fix(backend): 虚無ノヌトを投皿できる問題の修正ず `api.json` の OpenAPI Specification 3.1.0 ぞの察応 (#12969) * fix(backend): `text: null`だけのノヌトは投皿できないように * add test * Update CHANGELOG.md * chore: bump OpenAPI Specification from 3.0.0 to 3.1.0 * chore: テストがすでにコメントで蚘述されおいたのでそっちを䜿うこずにする * fix test * fix(backend): prohibit posting whitespace-only notes * Update CHANGELOG.md * fix(backend): `renoteId`たたは`fileIds``mediaIds`たたは`poll`が`null`でない堎合に、`text が空癜文字のみで構成されたリク゚ストになるこずを蚱可しお、結果は`text: null`を返すように * test(backend): 匕甚renoteで空癜文字のみで構成されたtextにするずレスポンスが`text: null`になるこずをチェックするテストを远加 * fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように * fix(misskey-js): OpenAPI 3.1に察応 * fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に察応 * fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に察応 * fix(ci): スキヌマ曞き換えの際のミスを修正 * Revert "fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように" This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b. * fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように * Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように" This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324. * fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を甚いるように * Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
}
refactor: API゚ンドポむントファむルの定矩を良い感じにする (#8154) * Fix API Schema Error * Delete SimpleSchema/SimpleObj and Move schemas to dedicated files * Userのスキヌマを分割しおみる * define packMany type * add , * Ensure enum schema and Make "as const" put once * test? * Revert "test?" This reverts commit 97dc9bfa70851bfb7d1cf38e883f8df20fb78b79. * Revert "Fix API Schema Error" This reverts commit 21b6176d974ed8e3eb73723ad21a105c5d297323. * :v: * clean up * test? * wip * wip * better schema def * :v: * fix * add minLength property * wip * wip * wip * anyOf/oneOf/allOfに察応 ~ relation.ts * refactor! * Define MinimumSchema * wip * wip * anyOf/oneOf/allOfが動䜜するようにUnionSchemaTypeを修正 * anyOf/oneOf/allOfが動䜜するようにUnionSchemaTypeを修正 * Update packages/backend/src/misc/schema.ts Co-authored-by: Acid Chicken (硫酞鶏) <root@acid-chicken.com> * fix * array oneOfをより正確な型に * array oneOfをより正確な型に * wip * :v: * なんかもういろいろ * remove * very good schema * api schema * wip * refactor: awaitAllの型定矩を倉えおみる * fix * specify types in awaitAll * specify types in awaitAll * :v: * wip * ... * :v: * AllowDateはやめおおく * 䞍必芁なoptional: false, nullable: falseを廃止 * Packedが展開されないように * 続packed * wip * define note type * wip * UserDetailedをMeDetailedかUserDetailedNotMeかを区別できるように * wip * wip * wip specify user type of other schemas * ok * convertSchemaToOpenApiSchemaを改修 * convertSchemaToOpenApiSchemaを改修 * Fix * fix * :v: * wip * 分割代入ではなくallOfで定矩するように Co-authored-by: Acid Chicken (硫酞鶏) <root@acid-chicken.com>
2022-01-18 22:27:10 +09:00
if (type === 'res' && schema.ref && (!schema.selfRef || includeSelfRef)) {
2023-10-22 10:52:06 +09:00
const $ref = `#/components/schemas/${schema.ref}`;
if (schema.nullable || schema.optional) {
res.allOf = [{ $ref }];
} else {
res.$ref = $ref;
}
}
fix(backend): 虚無ノヌトを投皿できる問題の修正ず `api.json` の OpenAPI Specification 3.1.0 ぞの察応 (#12969) * fix(backend): `text: null`だけのノヌトは投皿できないように * add test * Update CHANGELOG.md * chore: bump OpenAPI Specification from 3.0.0 to 3.1.0 * chore: テストがすでにコメントで蚘述されおいたのでそっちを䜿うこずにする * fix test * fix(backend): prohibit posting whitespace-only notes * Update CHANGELOG.md * fix(backend): `renoteId`たたは`fileIds``mediaIds`たたは`poll`が`null`でない堎合に、`text が空癜文字のみで構成されたリク゚ストになるこずを蚱可しお、結果は`text: null`を返すように * test(backend): 匕甚renoteで空癜文字のみで構成されたtextにするずレスポンスが`text: null`になるこずをチェックするテストを远加 * fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように * fix(misskey-js): OpenAPI 3.1に察応 * fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に察応 * fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に察応 * fix(ci): スキヌマ曞き換えの際のミスを修正 * Revert "fix(frontend): `text`が`null`であっお`renoteId`ず`replyId`が`null`でないようなノヌトは匕甚リノヌトずしお衚瀺するように" This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b. * fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように * Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように" This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324. * fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を甚いるように * Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
if (schema.nullable) {
if (Array.isArray(schema.type) && !schema.type.includes('null')) {
res.type.push('null');
} else if (typeof schema.type === 'string') {
res.type = [res.type, 'null'];
}
}
return res;
}
export function getSchemas(includeSelfRef: boolean) {
return {
Error: {
type: 'object',
properties: {
error: {
type: 'object',
description: 'An error object.',
properties: {
code: {
type: 'string',
description: 'An error code. Unique within the endpoint.',
},
message: {
type: 'string',
description: 'An error message.',
},
id: {
type: 'string',
format: 'uuid',
description: 'An error ID. This ID is static.',
},
2021-12-09 23:58:30 +09:00
},
required: ['code', 'id', 'message'],
2019-02-24 04:08:08 +09:00
},
},
required: ['error'],
2019-02-24 04:08:08 +09:00
},
...Object.fromEntries(
Object.entries(refs).map(([key, schema]) => [key, convertSchemaToOpenApiSchema(schema, 'res', includeSelfRef)]),
),
};
}