diff --git a/.eslintignore b/.eslintignore index de4d1f0..db4c6d9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,2 @@ dist -node_modules +node_modules \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 9bd9700..b703bec 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -42,9 +42,16 @@ module.exports = { env: { node: true, }, - rules: { - '@typescript-eslint/no-var-requires': 'off', + + rules: { '@typescript-eslint/no-var-requires': 'off' }, + }, + { + files: ['*src/apis/openapi.ts'], + env: { + node: true, }, + + rules: { '@typescript-eslint/no-explicit-any': 'off' }, }, ], reportUnusedDisableDirectives: true, diff --git a/package.json b/package.json index 3311cad..c9520cd 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,12 @@ "preview": "vite preview", "lint": "eslint --cache .", "format": "prettier --cache --write .", - "type-check": "vue-tsc --noEmit" + "type-check": "vue-tsc --noEmit", + "gen-api": "pnpm openapi-typescript https://raw.githubusercontent.com/traPtitech/booQ-v3/main/docs/openapi.yml --output src/apis/openapi.ts" }, "dependencies": { "@iconify/iconify": "^3.1.1", + "openapi-typescript-fetch": "^1.1.3", "pinia": "^2.1.7", "vue": "^3.4.19", "vue-router": "^4.2.5" @@ -27,6 +29,7 @@ "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-vue": "^9.21.1", + "openapi-typescript": "^6.7.4", "postcss": "^8.4.35", "postcss-normalize": "^10.0.1", "prettier": "^3.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7580c13..10d8b55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@iconify/iconify': specifier: ^3.1.1 version: 3.1.1 + openapi-typescript-fetch: + specifier: ^1.1.3 + version: 1.1.3 pinia: specifier: ^2.1.7 version: 2.1.7(typescript@5.3.3)(vue@3.4.19) @@ -49,6 +52,9 @@ devDependencies: eslint-plugin-vue: specifier: ^9.21.1 version: 9.21.1(eslint@8.56.0) + openapi-typescript: + specifier: ^6.7.4 + version: 6.7.4 postcss: specifier: ^8.4.35 version: 8.4.35 @@ -453,6 +459,14 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true + /@fastify/busboy@2.1.0: + resolution: + { + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + } + engines: { node: '>=14' } + dev: true + /@humanwhocodes/config-array@0.11.14: resolution: { @@ -1124,6 +1138,14 @@ packages: uri-js: 4.4.1 dev: true + /ansi-colors@4.1.3: + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } + dev: true + /ansi-regex@5.0.1: resolution: { @@ -2330,6 +2352,29 @@ packages: wrappy: 1.0.2 dev: true + /openapi-typescript-fetch@1.1.3: + resolution: + { + integrity: sha512-smLZPck4OkKMNExcw8jMgrMOGgVGx2N/s6DbKL2ftNl77g5HfoGpZGFy79RBzU/EkaO0OZpwBnslfdBfh7ZcWg==, + } + engines: { node: '>= 12.0.0', npm: '>= 7.0.0' } + dev: false + + /openapi-typescript@6.7.4: + resolution: + { + integrity: sha512-EZyeW9Wy7UDCKv0iYmKrq2pVZtquXiD/YHiUClAKqiMi42nodx/EQH11K6fLqjt1IZlJmVokrAsExsBMM2RROQ==, + } + hasBin: true + dependencies: + ansi-colors: 4.1.3 + fast-glob: 3.3.2 + js-yaml: 4.1.0 + supports-color: 9.4.0 + undici: 5.28.3 + yargs-parser: 21.1.1 + dev: true + /optionator@0.9.3: resolution: { @@ -2740,6 +2785,14 @@ packages: has-flag: 4.0.0 dev: true + /supports-color@9.4.0: + resolution: + { + integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==, + } + engines: { node: '>=12' } + dev: true + /text-table@0.2.0: resolution: { @@ -2816,6 +2869,16 @@ packages: } dev: true + /undici@5.28.3: + resolution: + { + integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==, + } + engines: { node: '>=14.0' } + dependencies: + '@fastify/busboy': 2.1.0 + dev: true + /universalify@2.0.1: resolution: { @@ -3056,6 +3119,14 @@ packages: } dev: true + /yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } + dev: true + /yocto-queue@0.1.0: resolution: { diff --git a/src/apis/client.ts b/src/apis/client.ts new file mode 100644 index 0000000..4ec32b5 --- /dev/null +++ b/src/apis/client.ts @@ -0,0 +1,102 @@ +import 'whatwg-fetch'; + +import { Fetcher } from 'openapi-typescript-fetch'; + +import type { paths, components } from './openapi'; + +// declare fetcher for paths +const fetcher = Fetcher.for(); + +fetcher.configure({ + baseUrl: '/api', + init: {}, + use: [], // middlewares +}); + +// create fetch operations +export const getItems = fetcher.path('/items').method('get').create(); + +export const getItem = fetcher.path('/items/{itemId}').method('get').create(); + +export const deleteItem = fetcher + .path('/items/{itemId}') + .method('delete') + .create(); + +export const editItem = fetcher + .path('/items/{itemId}') + .method('parameters') + .create(); + +export const postComment = fetcher + .path('/items/{itemId}/comments') + .method('parameters') + .create(); + +export const postItemOwners = fetcher + .path('/items/{itemId}/owners') + .method('post') + .create(); + +export const deleteItemOwners = fetcher + .path('/items/{itemId}/owners/{ownershipId}') + .method('parameters') + .create(); + +export const postBorrowEquipment = fetcher + .path('/items/{itemId}/borrowing/equipment') + .method('post') + .create(); + +export const postBorrowEquipmentReturn = fetcher + .path('/items/{itemId}/borrowing/equipment/return') + .method('post') + .create(); + +export const postBorrow = fetcher + .path('/items/{itemId}/owners/{ownershipId}/borrowings') + .method('post') + .create(); + +export const getBorrowingById = fetcher + .path('/items/{itemId}/owners/{ownershipId}/borrowings/{borrowingId}') + .method('get') + .create(); + +export const postBorrowReply = fetcher + .path('/items/{itemId}/owners/{ownershipId}/borrowings/{borrowingId}/reply') + .method('post') + .create(); + +export const postReturn = fetcher + .path('/items/{itemId}/owners/{ownershipId}/borrowings/{borrowingId}/return') + .method('post') + .create(); + +export const addLike = fetcher + .path('/items/{itemId}/likes') + .method('post') + .create(); + +export const postFile = fetcher.path('/files').method('post').create(); + +export const getFile = fetcher.path('/files/{fileId}').method('get').create(); + +export type itemPosted = components['schemas']['itemPosted']; +export type itemSummary = components['schemas']['itemSummary']; +export type comment = components['schemas']['comment']; +export type postComment = components['schemas']['postComment']; +export type transaction = components['schemas']['transaction']; +export type transactionEquipment = + components['schemas']['transactionEquipment']; +export type borrowRequest = components['schemas']['borrowRequest']; +export type borrowRequestEquipment = + components['schemas']['borrowRequestEquipment']; +export type borrowing = components['schemas']['borrowing']; +export type borrowReply = components['schemas']['itemPosted']; +export type borrowReturn = components['schemas']['borrowReturn']; +export type ownership = components['schemas']['ownership']; +export type postOwnership = components['schemas']['postOwnership']; +export type tag = components['schemas']['tag']; +export type owner = components['schemas']['owner']; +export type file = components['schemas']['file']; diff --git a/src/apis/openapi.ts b/src/apis/openapi.ts new file mode 100644 index 0000000..32b4729 --- /dev/null +++ b/src/apis/openapi.ts @@ -0,0 +1,1029 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +/** OneOf type helpers */ +type Without = { [P in Exclude]?: never }; +type XOR = T | U extends object + ? (Without & U) | (Without & T) + : T | U; +type OneOf = T extends [infer Only] + ? Only + : T extends [infer A, infer B, ...infer Rest] + ? OneOf<[XOR, ...Rest]> + : never; + +export interface paths { + '/items': { + /** 物品の一覧を取得します。 */ + get: operations['getItems']; + /** 物品を新しく登録します。 */ + post: operations['postItem']; + }; + '/items/{itemId}': { + /** 物品の詳細情報を取得します。 */ + get: operations['getItem']; + /** 物品を削除します。 */ + delete: operations['deleteItem']; + /** 物品の情報を変更します。 */ + patch: operations['editItem']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + }; + '/items/{itemId}/comments': { + /** コメントを新規作成します。 */ + post: operations['postComment']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + }; + '/items/{itemId}/owners': { + /** + * 物品の所有者を追加します。 + * @description 他者の所有権を操作する場合は権限が必要です。 + */ + post: operations['postItemOwners']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + }; + '/items/{itemId}/owners/{ownershipId}': { + /** + * 物品の所有者を削除します + * @description 他者の所有権を操作する場合は権限が必要です。 + */ + delete: operations['deleteItemOwners']; + /** + * 物品の所有者を編集します。(所有者と管理者のみ) + * @description 他者の所有権を操作する場合は権限が必要です。 + */ + patch: operations['editItemOwners']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + }; + }; + }; + '/items/{itemId}/borrowing/equipment': { + /** 備品を借ります。 */ + post: operations['postBorrowEquipment']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + }; + '/items/{itemId}/borrowing/equipment/return': { + /** 備品を返します。 */ + post: operations['postBorrowEquipmentReturn']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + }; + '/items/{itemId}/owners/{ownershipId}/borrowings': { + /** 個人所有物を「借りたい」と意見表明します。 */ + post: operations['postBorrow']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + }; + }; + }; + '/items/{itemId}/owners/{ownershipId}/borrowings/{borrowingId}': { + /** 個人所有物を借りたいという要望を取得します。 (○○日に借りたい、○○日に返す予定、など) */ + get: operations['getBorrowingById']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + borrowingId: components['parameters']['borrowingIdInPath']; + }; + }; + }; + '/items/{itemId}/owners/{ownershipId}/borrowings/{borrowingId}/reply': { + /** 個人所有物を○○日まで借りたいという要望に対して返答します。 */ + post: operations['postBorrowReply']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + borrowingId: components['parameters']['borrowingIdInPath']; + }; + }; + }; + '/items/{itemId}/owners/{ownershipId}/borrowings/{borrowingId}/return': { + /** 個人所有物を返します。 */ + post: operations['postReturn']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + borrowingId: components['parameters']['borrowingIdInPath']; + }; + }; + }; + '/items/{itemId}/likes': { + /** + * 物品にいいねをつけます。 + * @description すでにいいねしている状態の場合、エラー(400)を返します。 + */ + post: operations['addLike']; + /** + * 物品のいいねを取り消します。 + * @description すでに所有済み状態の場合、エラー(400)を返します。 + */ + delete: operations['removeLike']; + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + }; + '/files': { + /** 画像ファイルをアップロードします。 */ + post: operations['postFile']; + }; + '/files/{fileId}': { + /** 画像ファイルをダウンロードします。 */ + get: operations['getFile']; + parameters: { + path: { + fileId: components['parameters']['fileIdInPath']; + }; + }; + }; +} + +export type webhooks = Record; + +export interface components { + schemas: { + /** + * isBook + * @description アイテム種別 + * 0: 本でない + * 1: 本 + * @enum {integer} + */ + isBook: 0 | 1; + /** + * isEquipment + * @description アイテム種別 + * 0: 個人所有 + * 1: 備品 + * @enum {integer} + */ + isEquipment: 0 | 1; + itemPosted: { + /** @example 1 */ + id: number; + /** @example 小説 天気の子 */ + name: string; + /** @example 0 */ + isTrapItem: components['schemas']['isEquipment']; + /** @example 1 */ + isBook: components['schemas']['isBook']; + /** @example 100 */ + count?: number; + /** @example 9784041026403 */ + code?: string; + tags?: string[]; + /** @example 高校1年の夏、帆高(ほだか)は離島から家出し、東京にやってきた。連日降り続ける雨の中、雑踏ひしめく都会の片隅で、帆高は不思議な能力を持つ少女・陽菜(ひな)に出会う。「ねぇ、今から晴れるよ」。それは祈るだけで、空を晴れに出来る力だった――。天候の調和が狂っていく時代に、運命に翻弄される少年と少女が自らの生き方を「選択」する物語。長編アニメーション映画『天気の子』の、新海誠監督自身が執筆した原作小説。 */ + description: string; + /** + * @default + * @example https://cover.openbd.jp/9784041026403.jpg + */ + imgUrl: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + createdAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + updatedAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + deletedAt: string | null; + }; + item: components['schemas']['itemPosted'] & + ({ + tags: readonly components['schemas']['tag'][]; + comments: readonly components['schemas']['comment'][]; + } & OneOf< + [ + { + count: number; + countMax: number; + }, + { + ownerships: components['schemas']['ownership'][]; + }, + ] + >); + itemSummary: components['schemas']['item'] & { + /** @example 1 */ + likeCounts: number; + /** @example true */ + isLiked: boolean; + }; + itemDetail: components['schemas']['item'] & + ({ + likesByUsers?: readonly string[]; + } & OneOf< + [ + { + transactionsEquipment: components['schemas']['transactionEquipment'][]; + }, + { + transactions: components['schemas']['transaction'][]; + }, + ] + >); + comment: { + /** @example 1 */ + id: number; + /** @example 1 */ + itemId: number; + item: components['schemas']['itemSummary']; + /** @example s9 */ + userId: string; + /** @example 小説版は夏美の心理描写がよく描かれていて、映画版を補完するものになっている。あとがきと解説だけでも読む価値はあると思います。 */ + text: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + createdAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + updatedAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + deletedAt: string | null; + }; + postComment: { + /** @example 小説版は夏美の心理描写がよく描かれていて、映画版を補完するものになっている。あとがきと解説だけでも読む価値はあると思います。 */ + text: string; + }; + transaction: { + /** @example 1 */ + id: number; + /** @example 1 */ + ownershipId: number; + /** @example s9 */ + userId: string; + /** + * @description 0=リクエスト済み、1=貸し出し中、2=返却済み、3=貸し出し拒否 + * @example 1 + */ + status: number; + /** @example 読みたかったから。 */ + purpose?: string; + /** @example 2/17に部室でお貸しします */ + message: string; + /** @example ずっと読みたかったんですよね。ありがとう! */ + returnMessage: string; + /** + * Format: date + * @example 2024-02-16 + */ + due_date: string; + /** + * Format: date + * @example 2024-02-16 + */ + checkout_date: string; + /** + * Format: date + * @example 2024-02-16 + */ + return_date: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + createdAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + updatedAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + deletedAt: string | null; + }; + transactionEquipment: { + /** @example 1 */ + id: number; + /** @example 1 */ + itemId?: number; + /** @example s9 */ + userId: string; + /** + * @description 0=リクエスト済み、1=貸し出し中、2=返却済み、3=貸し出し拒否 + * @example 1 + */ + status: number; + /** @example 読みたかったから。 */ + purpose?: string; + /** + * Format: date + * @example 2024-02-16 + */ + due_date: string; + /** + * Format: date + * @example 2024-02-16 + */ + return_date: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + createdAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + updatedAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + deletedAt: string | null; + }; + borrowRequest: { + /** @example 読みたかったから。 */ + propose?: string; + /** + * Format: date + * @example 2024-02-16 + */ + dueDate: string; + /** @example true */ + borrowInClubRoom: boolean; + }; + borrowRequestEquipment: { + /** @example 読みたかったから。 */ + propose?: string; + /** @example 1 */ + count?: number; + /** + * Format: date + * @example 2024-02-16 + */ + dueDate: string; + /** @example true */ + borrowInClubRoom: boolean; + }; + borrowing: { + /** @example 1 */ + id: number; + /** @example 読みたかったから。 */ + propose?: string; + /** + * Format: date + * @example 2024-02-16 + */ + dueDate: string; + /** @example true */ + borrowInClubRoom: boolean; + }; + borrowReply: { + /** @example true */ + answer: boolean; + /** @example 2/20に部室に置きます */ + comment: string; + }; + borrowReturn: { + /** @example ありがとうございました。面白かったです */ + text: string; + }; + ownership: { + /** @example 1 */ + id: number; + /** @example 1 */ + itemId: number; + /** @example s9 */ + userId: string; + /** @example true */ + rentalable: boolean; + /** @example おもしろいのでぜひ読んでください */ + memo: string; + }; + postOwnership: { + /** @example s9 */ + userId: string; + /** @example true */ + rentalable: boolean; + /** @example 読んでください */ + memo: string; + }; + tag: { + /** @example 小説 */ + name: string; + }; + owner: { + /** @example 1 */ + id: number; + /** @example 1 */ + ownerId: number; + /** @example s9 */ + userId: string; + /** @example true */ + rentalable: boolean; + /** @example 1 */ + count: number; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + createdAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + updatedAt: string; + /** + * Format: date-time + * @example 2019-07-28T22:00:00Z + */ + deletedAt: string; + }; + file: { + /** + * @description ファイルID + * @example 1 + */ + id: number; + /** + * @description ファイルURL + * @example /api/files/1 + */ + url: string; + }; + }; + responses: never; + parameters: { + /** @description アイテムID */ + itemIdInPath: number; + /** @description 所有権ID */ + ownershipIdInPath: number; + /** @description 所有権ID */ + borrowingIdInPath: number; + /** @description ファイルID */ + fileIdInPath: number; + /** @description tagID */ + tagIdInPath: number; + }; + requestBodies: never; + headers: never; + pathItems: never; +} + +export type $defs = Record; + +export type external = Record; + +export interface operations { + /** 物品の一覧を取得します。 */ + getItems: { + parameters: { + query?: { + /** @description 指定したユーザーの所有する物品一覧を取得します。 */ + userId?: string; + /** @description 名称が部分一致する物品一覧を取得します。 */ + search?: string; + /** @description 指定したユーザーの借りている物品一覧を取得します。 */ + rental?: string; + /** @description 取得したい件数を指定します。リクエストした件数が全部の件数より多い場合は全部の一覧になります。 */ + limit?: number; + /** @description 取得したいデータの開始場所を指定します。リクエストした件数が全部の件数より多い場合は空の配列が返ってきます。 */ + offset?: number; + /** @description リクエストしたタグのついている物品一覧を取得します。 */ + tag?: string[]; + /** @description リクエストしたタグのついている物品一覧を除外します */ + 'tag-exclude'?: string[]; + /** @description 何の要素でソートするか */ + sortby?: string; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['itemSummary'][]; + }; + }; + /** @description リクエストが不正です */ + 400: { + content: never; + }; + }; + }; + /** 物品を新しく登録します。 */ + postItem: { + requestBody: { + content: { + 'application/json': components['schemas']['itemPosted'][]; + }; + }; + responses: { + /** @description Created */ + 201: { + content: { + 'application/json': components['schemas']['itemPosted']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description 権限がありません */ + 403: { + content: never; + }; + }; + }; + /** 物品の詳細情報を取得します。 */ + getItem: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['itemDetail']; + }; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 物品を削除します。 */ + deleteItem: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 物品の情報を変更します。 */ + editItem: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['itemPosted']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['item']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** コメントを新規作成します。 */ + postComment: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['postComment']; + }; + }; + responses: { + /** @description Created */ + 201: { + content: { + 'application/json': components['schemas']['comment']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** + * 物品の所有者を追加します。 + * @description 他者の所有権を操作する場合は権限が必要です。 + */ + postItemOwners: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['postOwnership']; + }; + }; + responses: { + /** @description Created */ + 201: { + content: { + 'application/json': components['schemas']['ownership']; + }; + }; + /** @description 権限がありません。 */ + 403: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** + * 物品の所有者を削除します + * @description 他者の所有権を操作する場合は権限が必要です。 + */ + deleteItemOwners: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: never; + }; + /** @description 権限がありません。 */ + 403: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** + * 物品の所有者を編集します。(所有者と管理者のみ) + * @description 他者の所有権を操作する場合は権限が必要です。 + */ + editItemOwners: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['postOwnership']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['ownership']; + }; + }; + /** @description 権限がありません。 */ + 403: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 備品を借ります。 */ + postBorrowEquipment: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['borrowRequestEquipment']; + }; + }; + responses: { + /** @description Created */ + 201: { + content: { + 'application/json': components['schemas']['borrowRequestEquipment']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 備品を返します。 */ + postBorrowEquipmentReturn: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['borrowReturn']; + }; + }; + responses: { + /** @description Created */ + 201: { + content: { + 'application/json': components['schemas']['borrowReturn']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 個人所有物を「借りたい」と意見表明します。 */ + postBorrow: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['borrowRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['borrowRequest']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 個人所有物を借りたいという要望を取得します。 (○○日に借りたい、○○日に返す予定、など) */ + getBorrowingById: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + borrowingId: components['parameters']['borrowingIdInPath']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['borrowing']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 個人所有物を○○日まで借りたいという要望に対して返答します。 */ + postBorrowReply: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + borrowingId: components['parameters']['borrowingIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['borrowReply']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'application/json': components['schemas']['borrowReply']; + }; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 個人所有物を返します。 */ + postReturn: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + ownershipId: components['parameters']['ownershipIdInPath']; + borrowingId: components['parameters']['borrowingIdInPath']; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['borrowReturn']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: never; + }; + /** @description リクエストボディが不正です。 */ + 400: { + content: never; + }; + /** @description アイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** + * 物品にいいねをつけます。 + * @description すでにいいねしている状態の場合、エラー(400)を返します。 + */ + addLike: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + responses: { + /** @description 正常にいいねしました */ + 201: { + content: never; + }; + /** @description 不正なリクエストです */ + 400: { + content: never; + }; + /** @description 指定されたアイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** + * 物品のいいねを取り消します。 + * @description すでに所有済み状態の場合、エラー(400)を返します。 + */ + removeLike: { + parameters: { + path: { + itemId: components['parameters']['itemIdInPath']; + }; + }; + responses: { + /** @description 正常に削除しました */ + 200: { + content: never; + }; + /** @description 不正なリクエストです */ + 400: { + content: never; + }; + /** @description 指定されたアイテムが存在しません */ + 404: { + content: never; + }; + }; + }; + /** 画像ファイルをアップロードします。 */ + postFile: { + requestBody: { + content: { + 'multipart/form-data': { + /** + * Format: binary + * @description 3MBまでのJPG, PNGファイル + */ + file?: string; + }; + }; + }; + responses: { + /** @description OK */ + 201: { + content: { + 'application/json': components['schemas']['file']; + }; + }; + /** @description 不正なリクエストです。 */ + 400: { + content: never; + }; + }; + }; + /** 画像ファイルをダウンロードします。 */ + getFile: { + parameters: { + path: { + fileId: components['parameters']['fileIdInPath']; + }; + }; + responses: { + /** @description OK */ + 200: { + content: { + 'image/jpeg': string; + }; + }; + /** @description ファイルが存在しません。 */ + 404: { + content: never; + }; + }; + }; +}