From 33a3f725ad96b819b7c9db8a2a4f408899d75e3f Mon Sep 17 00:00:00 2001 From: Ranne <56647156+otomad@users.noreply.github.com> Date: Tue, 26 Sep 2023 21:16:22 +0800 Subject: [PATCH 01/10] Update license --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fd302759..7e401d16 100755 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ # 项目代号 「Cerasus[第13都市](https://zh.moegirl.org.cn/zh-hans/DARLING_in_the_FRANXX#cite_ref-10:~:text=%E7%AC%AC13%E9%83%BD%E5%B8%82%EF%BC%88Plantation%EF%BC%89%5B9%5D%E2%80%9C%E6%A8%B1%EF%BC%88Cerasus%EF%BC%89%E2%80%9D)」 ![State](https://img.shields.io/badge/STATE-ALPHA-red?style=flat-square) ![Tag](https://img.shields.io/badge/TAG-0.0.0-orange?style=flat-square) -![License](https://img.shields.io/badge/LICENSE-BSD%202‐Clause-green?style=flat-square) +![License](https://img.shields.io/badge/LICENSE-BSD%203‐Clause-green?style=flat-square) ![Commit Activity](https://img.shields.io/github/commit-activity/y/KIRAKIRA-DOUGA/KIRAKIRA-Cerasus?style=flat-square) 前端 From 7e72aa646e240897941e9bb9e630012f515a6048 Mon Sep 17 00:00:00 2001 From: Ranne <56647156+otomad@users.noreply.github.com> Date: Tue, 26 Sep 2023 21:16:42 +0800 Subject: [PATCH 02/10] Update license --- README_en-US.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_en-US.md b/README_en-US.md index b5bc393d..e2989eb5 100755 --- a/README_en-US.md +++ b/README_en-US.md @@ -3,7 +3,7 @@ # Project Code Name 「Cerasus[Plantation](https://zh.moegirl.org.cn/zh-hans/DARLING_in_the_FRANXX#cite_ref-10:~:text=%E7%AC%AC13%E9%83%BD%E5%B8%82%EF%BC%88Plantation%EF%BC%89%5B9%5D%E2%80%9C%E6%A8%B1%EF%BC%88Cerasus%EF%BC%89%E2%80%9D)」 ![State](https://img.shields.io/badge/STATE-ALPHA-red?style=flat-square) ![Tag](https://img.shields.io/badge/TAG-0.0.0-orange?style=flat-square) -![License](https://img.shields.io/badge/LICENSE-BSD%202‐Clause-green?style=flat-square) +![License](https://img.shields.io/badge/LICENSE-BSD%203‐Clause-green?style=flat-square) ![Commit Activity](https://img.shields.io/github/commit-activity/y/KIRAKIRA-DOUGA/KIRAKIRA-Cerasus?style=flat-square) Front-end From 8808fa5038927c812f1e0aec899e5fa233ca3835 Mon Sep 17 00:00:00 2001 From: Ranne <56647156+otomad@users.noreply.github.com> Date: Tue, 26 Sep 2023 21:17:00 +0800 Subject: [PATCH 03/10] Update license --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d44c2805..5d9fde33 100755 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ ], "github": "https://github.com/KIRAKIRA-DOUGA/KIRAKIRA-Cerasus", "bugs": "https://github.com/KIRAKIRA-DOUGA/KIRAKIRA-Cerasus/issues", - "license": "BSD 2-Clause", + "license": "BSD 3-Clause", "author": "KIRAKIRA Project Team", "scripts": { "build": "nuxt build && nuxt start", From bbe657e7e07d9bad53a7cf0ffc941ed45abd5420 Mon Sep 17 00:00:00 2001 From: Aira Sakuranomiya Date: Tue, 26 Sep 2023 23:54:12 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=B7=B2=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=9A=84=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/settings/about.vue | 1 - public/static/images/avatars/Otoman.png | Bin 159629 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100755 public/static/images/avatars/Otoman.png diff --git a/pages/settings/about.vue b/pages/settings/about.vue index 70c485fc..1dca1cc3 100755 --- a/pages/settings/about.vue +++ b/pages/settings/about.vue @@ -16,7 +16,6 @@ { name: "维他柠檬茶", job: [t.about.staff.frontend], uid: NaN, avatar: avatar("VTchara.webp") }, { name: "Sidd", job: [t.about.staff.frontend], uid: NaN, avatar: avatar("sidd.jpg") }, { name: "鸣", job: [t.about.staff.frontend], uid: NaN, avatar: avatar("Mingeax.jpg") }, - { name: "OtoMAN", job: [t.about.staff.backend], uid: NaN, avatar: avatar("Otoman.png") }, { name: "冲锋的小卡卡", job: [t.about.staff.backend], uid: NaN, avatar: avatar("ZERO_TWO.jpg") }, { name: "琪露诺瓦露", job: [t.about.staff.translator(t.language.ja)], uid: NaN, avatar: avatar("Cirnoire.png") }, { name: "韩琦Mica", job: [t.about.staff.translator(t.language.zht)], uid: NaN, avatar: avatar("HanceyMica.png") }, diff --git a/public/static/images/avatars/Otoman.png b/public/static/images/avatars/Otoman.png deleted file mode 100755 index 6349131bc0d198a66ba89098871f9d4558479a37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159629 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 Date: Wed, 27 Sep 2023 08:31:06 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=B7=B2=E9=80=80?= =?UTF-8?q?=E5=87=BA=E5=BC=80=E5=8F=91=E7=BB=84=E7=9A=84=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/settings/about.vue | 1 - public/static/images/avatars/sidd.jpg | Bin 30146 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 public/static/images/avatars/sidd.jpg diff --git a/pages/settings/about.vue b/pages/settings/about.vue index 1dca1cc3..c70c558f 100755 --- a/pages/settings/about.vue +++ b/pages/settings/about.vue @@ -14,7 +14,6 @@ { name: "艾了个拉", job: [t.about.staff.webmistress, t.about.staff.designer], uid: NaN, avatar: avatar("aira.webp") }, { name: "兰音", job: [t.about.staff.frontend, t.about.staff.designer], uid: NaN, avatar: avatar("nucleic_acid_testing.jpg") }, { name: "维他柠檬茶", job: [t.about.staff.frontend], uid: NaN, avatar: avatar("VTchara.webp") }, - { name: "Sidd", job: [t.about.staff.frontend], uid: NaN, avatar: avatar("sidd.jpg") }, { name: "鸣", job: [t.about.staff.frontend], uid: NaN, avatar: avatar("Mingeax.jpg") }, { name: "冲锋的小卡卡", job: [t.about.staff.backend], uid: NaN, avatar: avatar("ZERO_TWO.jpg") }, { name: "琪露诺瓦露", job: [t.about.staff.translator(t.language.ja)], uid: NaN, avatar: avatar("Cirnoire.png") }, diff --git a/public/static/images/avatars/sidd.jpg b/public/static/images/avatars/sidd.jpg deleted file mode 100644 index e545bd7253d282c10b6a40391c65d3b9adc94cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30146 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 From 89b0c2cf6bd76de95281481b49600d4bbfd41e9d Mon Sep 17 00:00:00 2001 From: Aira Sakuranomiya Date: Wed, 27 Sep 2023 09:02:22 +0800 Subject: [PATCH 06/10] Remove deprecated backend --- components/UploadEditor.vue | 2 +- composables/api.ts | 19 - locales/English.ts | 2 +- locales/Indonesian.ts | 2 +- locales/Japanese.ts | 2 +- locales/Korean.ts | 2 +- locales/SChinese.ts | 2 +- locales/TChinese.ts | 2 +- locales/Vietnamese.ts | 2 +- nuxt.config.ts | 9 +- package.json | 5 +- packages/kirakira-backend/.gitignore | 1 - .../.openapi-generator-ignore | 23 - .../kirakira-backend/.openapi-generator/FILES | 31 - .../.openapi-generator/VERSION | 1 - packages/kirakira-backend/DefaultApi.md | 1120 ------------- packages/kirakira-backend/README.md | 80 - packages/kirakira-backend/apis/DefaultApi.ts | 1412 ----------------- packages/kirakira-backend/apis/baseapi.ts | 37 - packages/kirakira-backend/apis/exception.ts | 15 - packages/kirakira-backend/auth/auth.ts | 51 - packages/kirakira-backend/configuration.ts | 82 - packages/kirakira-backend/git_push.sh | 51 - packages/kirakira-backend/http/http.ts | 232 --- .../kirakira-backend/http/isomorphic-fetch.ts | 88 - packages/kirakira-backend/index.ts | 12 - packages/kirakira-backend/middleware.ts | 66 - .../models/Categories200ResponseInner.ts | 42 - .../models/Comments200ResponseInner.ts | 91 -- .../models/GetDanmaku200ResponseInner.ts | 84 - .../models/ObjectSerializer.ts | 250 --- .../models/Users200Response.ts | 93 -- .../models/Users200ResponseVideosInner.ts | 77 - .../models/VideoDetail200Response.ts | 140 -- .../models/VideoDetail200ResponseDetails.ts | 119 -- ...eoDetail200ResponseVideoRecommendations.ts | 49 - .../models/Videos200Response.ts | 73 - .../Videos200ResponseCategoriesInner.ts | 42 - .../models/Videos200ResponsePaginationData.ts | 42 - .../models/Videos200ResponseVideosInner.ts | 84 - packages/kirakira-backend/models/all.ts | 8 - packages/kirakira-backend/package.json | 40 - packages/kirakira-backend/rxjsStub.ts | 27 - packages/kirakira-backend/servers.ts | 57 - packages/kirakira-backend/tsconfig.json | 30 - .../kirakira-backend/types/ObjectParamAPI.ts | 484 ------ .../kirakira-backend/types/ObservableAPI.ts | 490 ------ packages/kirakira-backend/types/PromiseAPI.ts | 224 --- packages/kirakira-backend/util.ts | 37 - pages/category.vue | 12 +- pages/home.vue | 38 +- pages/search.vue | 20 +- vercel.json | 12 +- 53 files changed, 19 insertions(+), 5997 deletions(-) delete mode 100755 composables/api.ts delete mode 100755 packages/kirakira-backend/.gitignore delete mode 100755 packages/kirakira-backend/.openapi-generator-ignore delete mode 100755 packages/kirakira-backend/.openapi-generator/FILES delete mode 100755 packages/kirakira-backend/.openapi-generator/VERSION delete mode 100755 packages/kirakira-backend/DefaultApi.md delete mode 100755 packages/kirakira-backend/README.md delete mode 100755 packages/kirakira-backend/apis/DefaultApi.ts delete mode 100755 packages/kirakira-backend/apis/baseapi.ts delete mode 100755 packages/kirakira-backend/apis/exception.ts delete mode 100755 packages/kirakira-backend/auth/auth.ts delete mode 100755 packages/kirakira-backend/configuration.ts delete mode 100755 packages/kirakira-backend/git_push.sh delete mode 100755 packages/kirakira-backend/http/http.ts delete mode 100755 packages/kirakira-backend/http/isomorphic-fetch.ts delete mode 100755 packages/kirakira-backend/index.ts delete mode 100755 packages/kirakira-backend/middleware.ts delete mode 100755 packages/kirakira-backend/models/Categories200ResponseInner.ts delete mode 100755 packages/kirakira-backend/models/Comments200ResponseInner.ts delete mode 100644 packages/kirakira-backend/models/GetDanmaku200ResponseInner.ts delete mode 100755 packages/kirakira-backend/models/ObjectSerializer.ts delete mode 100755 packages/kirakira-backend/models/Users200Response.ts delete mode 100755 packages/kirakira-backend/models/Users200ResponseVideosInner.ts delete mode 100755 packages/kirakira-backend/models/VideoDetail200Response.ts delete mode 100755 packages/kirakira-backend/models/VideoDetail200ResponseDetails.ts delete mode 100755 packages/kirakira-backend/models/VideoDetail200ResponseVideoRecommendations.ts delete mode 100755 packages/kirakira-backend/models/Videos200Response.ts delete mode 100755 packages/kirakira-backend/models/Videos200ResponseCategoriesInner.ts delete mode 100755 packages/kirakira-backend/models/Videos200ResponsePaginationData.ts delete mode 100755 packages/kirakira-backend/models/Videos200ResponseVideosInner.ts delete mode 100755 packages/kirakira-backend/models/all.ts delete mode 100755 packages/kirakira-backend/package.json delete mode 100755 packages/kirakira-backend/rxjsStub.ts delete mode 100755 packages/kirakira-backend/servers.ts delete mode 100755 packages/kirakira-backend/tsconfig.json delete mode 100755 packages/kirakira-backend/types/ObjectParamAPI.ts delete mode 100755 packages/kirakira-backend/types/ObservableAPI.ts delete mode 100755 packages/kirakira-backend/types/PromiseAPI.ts delete mode 100755 packages/kirakira-backend/util.ts diff --git a/components/UploadEditor.vue b/components/UploadEditor.vue index c9fa7d8f..35788112 100755 --- a/components/UploadEditor.vue +++ b/components/UploadEditor.vue @@ -172,7 +172,7 @@ {{ t.category.tech }} {{ t.category.design }} {{ t.category.game }} - {{ t.category.other }} + {{ t.category.misc }} diff --git a/composables/api.ts b/composables/api.ts deleted file mode 100755 index e156799c..00000000 --- a/composables/api.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as api from "kirakira-backend"; - -/** - * convenience singleton for the OpenAPI SDK. - * @returns DefaultAPI. - */ -export function useApi() { - const host = getHost(); - - const configParams = { - baseServer: api.getServers(host)[0], - }; - - api.changeFetch(useFetch); - - const config = api.createConfiguration(configParams); - - return new api.DefaultApi(config); -} diff --git a/locales/English.ts b/locales/English.ts index 05584eb0..71ac8b9d 100755 --- a/locales/English.ts +++ b/locales/English.ts @@ -13,7 +13,7 @@ const English: LocaleIdentifiers = { tech: "Tech", design: "Design", game: "Game", - other: "Other", + misc: "Misc", }, content: "Content", search: "Search", diff --git a/locales/Indonesian.ts b/locales/Indonesian.ts index b4738d76..c7ce5b9a 100644 --- a/locales/Indonesian.ts +++ b/locales/Indonesian.ts @@ -13,7 +13,7 @@ const Indonesian: LocaleIdentifiers = { tech: "Tech", design: "Desain", game: "Game", - other: "Lainnya", + misc: "Lainnya", // NEW }, content: "Konten", search: "Cari", diff --git a/locales/Japanese.ts b/locales/Japanese.ts index b4f46a88..605c1978 100755 --- a/locales/Japanese.ts +++ b/locales/Japanese.ts @@ -13,7 +13,7 @@ const Japanese: LocaleIdentifiers = { tech: "技術", design: "デザイン", game: "ゲーム", - other: "総合", + misc: "総合", }, content: "コンテンツ", search: "検索", diff --git a/locales/Korean.ts b/locales/Korean.ts index 4f10c234..72031328 100644 --- a/locales/Korean.ts +++ b/locales/Korean.ts @@ -13,7 +13,7 @@ const Korean: LocaleIdentifiers = { tech: "Tech", design: "Design", game: "Game", - other: "Other", + misc: "Misc", }, content: "Content", search: "Search", diff --git a/locales/SChinese.ts b/locales/SChinese.ts index d14bbdb2..eb067c01 100755 --- a/locales/SChinese.ts +++ b/locales/SChinese.ts @@ -11,7 +11,7 @@ const SChinese = { tech: "科技", design: "设计", game: "游戏", - other: "综合", + misc: "综合", }, content: "内容", search: "搜索", diff --git a/locales/TChinese.ts b/locales/TChinese.ts index a83cb652..a31a2d23 100644 --- a/locales/TChinese.ts +++ b/locales/TChinese.ts @@ -13,7 +13,7 @@ const TChinese: LocaleIdentifiers = { tech: "科技", design: "設計", game: "遊戲", - other: "綜合", + misc: "綜合", }, content: "內容", search: "搜索", diff --git a/locales/Vietnamese.ts b/locales/Vietnamese.ts index fb7e066d..60d8da4a 100644 --- a/locales/Vietnamese.ts +++ b/locales/Vietnamese.ts @@ -13,7 +13,7 @@ const Vietnamese: LocaleIdentifiers = { tech: "Công nghệ", design: "Thiết kế", game: "Trò chơi", - other: "Khác", + misc: "Khác", // NEW }, content: "Nội dung", search: "Tìm kiếm", diff --git a/nuxt.config.ts b/nuxt.config.ts index 3a2b97fd..afd8cbcc 100755 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,5 +1,6 @@ // https://v3.nuxtjs.org/api/configuration/nuxt.config +import pomsky from "@pomsky-lang/unplugin"; import defineAlias from "./helpers/alias"; import styleResources from "./helpers/style-resources"; import cssDoodleLoader from "./plugins/vite/css-doodle"; @@ -7,7 +8,6 @@ import docsLoader from "./plugins/vite/docs"; import vitePluginScssVariables from "./plugins/vite/scss-variables"; import scssVariablesLoader from "./plugins/vite/scss-variables-loader"; import { environment } from "./utils/environment"; -import pomsky from "@pomsky-lang/unplugin"; /* import vueNestedSFC from "vite-plugin-vue-nested-sfc"; import CopyPlugin from "copy-webpack-plugin"; const wasmFile = resolve("node_modules/mediainfo.js/dist/MediaInfoModule.wasm"); */ @@ -124,13 +124,6 @@ export default defineNuxtConfig({ }, }, nitro: { - devProxy: { - "/api": { - target: "https://kirakira.dev/api", - prependPath: true, - changeOrigin: true, - }, - }, compressPublicAssets: { brotli: true, }, diff --git a/package.json b/package.json index 5d9fde33..440c64c7 100755 --- a/package.json +++ b/package.json @@ -13,8 +13,7 @@ "homepageFallback": [ "https://cerasus.kirakira.moe/", "https://kira.calibur.tv/", - "https://kirakira-cerasus.vercel.app/", - "https://kirakira.dev/" + "https://kirakira-cerasus.vercel.app/" ], "github": "https://github.com/KIRAKIRA-DOUGA/KIRAKIRA-Cerasus", "bugs": "https://github.com/KIRAKIRA-DOUGA/KIRAKIRA-Cerasus/issues", @@ -109,8 +108,6 @@ "dashjs": "^4.7.1", "gsap": "^3.11.4", "js-confetti": "^0.11.0", - "kirakira-backend": "file:packages/kirakira-backend", - "kirakirabackend": "file:packages/kirakira-backend", "lottie-web": "^5.12.2", "mediainfo.js": "^0.1.9", "mitt": "^3.0.0", diff --git a/packages/kirakira-backend/.gitignore b/packages/kirakira-backend/.gitignore deleted file mode 100755 index 1521c8b7..00000000 --- a/packages/kirakira-backend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/packages/kirakira-backend/.openapi-generator-ignore b/packages/kirakira-backend/.openapi-generator-ignore deleted file mode 100755 index 7484ee59..00000000 --- a/packages/kirakira-backend/.openapi-generator-ignore +++ /dev/null @@ -1,23 +0,0 @@ -# OpenAPI Generator Ignore -# Generated by openapi-generator https://github.com/openapitools/openapi-generator - -# Use this file to prevent files from being overwritten by the generator. -# The patterns follow closely to .gitignore or .dockerignore. - -# As an example, the C# client generator defines ApiClient.cs. -# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: -#ApiClient.cs - -# You can match any string of characters against a directory, file or extension with a single asterisk (*): -#foo/*/qux -# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux - -# You can recursively match patterns against a directory, file or extension with a double asterisk (**): -#foo/**/qux -# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux - -# You can also negate patterns with an exclamation (!). -# For example, you can ignore all files in a docs folder with the file extension .md: -#docs/*.md -# Then explicitly reverse the ignore rule for a single file: -#!docs/README.md diff --git a/packages/kirakira-backend/.openapi-generator/FILES b/packages/kirakira-backend/.openapi-generator/FILES deleted file mode 100755 index 03db1458..00000000 --- a/packages/kirakira-backend/.openapi-generator/FILES +++ /dev/null @@ -1,31 +0,0 @@ -.gitignore -DefaultApi.md -README.md -apis/DefaultApi.ts -apis/baseapi.ts -apis/exception.ts -auth/auth.ts -configuration.ts -git_push.sh -http/http.ts -http/isomorphic-fetch.ts -index.ts -middleware.ts -models/Comments200ResponseInner.ts -models/GetDanmaku200ResponseInner.ts -models/ObjectSerializer.ts -models/Users200Response.ts -models/VideoDetail200Response.ts -models/Videos200Response.ts -models/Videos200ResponseCategoriesInner.ts -models/Videos200ResponsePaginationData.ts -models/Videos200ResponseVideosInner.ts -models/all.ts -package.json -rxjsStub.ts -servers.ts -tsconfig.json -types/ObjectParamAPI.ts -types/ObservableAPI.ts -types/PromiseAPI.ts -util.ts diff --git a/packages/kirakira-backend/.openapi-generator/VERSION b/packages/kirakira-backend/.openapi-generator/VERSION deleted file mode 100755 index 757e6740..00000000 --- a/packages/kirakira-backend/.openapi-generator/VERSION +++ /dev/null @@ -1 +0,0 @@ -7.0.0-SNAPSHOT \ No newline at end of file diff --git a/packages/kirakira-backend/DefaultApi.md b/packages/kirakira-backend/DefaultApi.md deleted file mode 100755 index 56432e0d..00000000 --- a/packages/kirakira-backend/DefaultApi.md +++ /dev/null @@ -1,1120 +0,0 @@ -# .DefaultApi - -All URIs are relative to *https://localhost:3000/api* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**comment**](DefaultApi.md#comment) | **POST** /comment | Comment on a video -[**comments**](DefaultApi.md#comments) | **GET** /comments/{id} | Get comments for video ID -[**createDanmaku**](DefaultApi.md#createDanmaku) | **POST** /danmaku | Create new danmaku -[**deleteComment**](DefaultApi.md#deleteComment) | **POST** /delete_comment | Delete a comment -[**follow**](DefaultApi.md#follow) | **POST** /follow/{id} | Upvote a video -[**followFeed**](DefaultApi.md#followFeed) | **GET** /follow-feed | Upvote a video -[**getDanmaku**](DefaultApi.md#getDanmaku) | **GET** /danmaku/{id} | Get danmaku for video -[**login**](DefaultApi.md#login) | **POST** /login | Log the user in -[**logout**](DefaultApi.md#logout) | **GET** /logout | Log user out -[**recommendations**](DefaultApi.md#recommendations) | **GET** /recommendations/{id} | Get list of videos -[**register**](DefaultApi.md#register) | **POST** /register | Register user -[**resetPassword**](DefaultApi.md#resetPassword) | **POST** /reset_password | Reset password -[**updateProfile**](DefaultApi.md#updateProfile) | **POST** /update-profile | Update user\'s profile -[**upload**](DefaultApi.md#upload) | **POST** /upload | Upload a new video -[**upvote**](DefaultApi.md#upvote) | **GET** /upvote/{id} | Get user video data -[**upvoteVideo**](DefaultApi.md#upvoteVideo) | **POST** /upvotevideo/{id} | Upvote a video -[**users**](DefaultApi.md#users) | **GET** /users/{id} | Get user video data -[**videoDetail**](DefaultApi.md#videoDetail) | **GET** /videos/{id} | Get list of videos -[**videos**](DefaultApi.md#videos) | **GET** /videos | Get list of videos - - -# **comment** -> void comment() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiCommentRequest = { - // number | parent comment ID - parent: 1, - // string | comment message - content: 'YQ==', - // number | comment\'s video ID - videoIDf: 1, -}; - -apiInstance.comment(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **parent** | [**number**] | parent comment ID | defaults to undefined - **content** | [**string**] | comment message | defaults to undefined - **videoIDf** | [**number**] | comment\'s video ID | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Comment success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **comments** -> Array comments() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiCommentsRequest = { - // number | video ID - id: 1, -}; - -apiInstance.comments(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | video ID | defaults to undefined - - -### Return type - -**Array** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | get video details for a specific video | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **createDanmaku** -> void createDanmaku() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiCreateDanmakuRequest = { - // number | video ID for danmaku - videoID: 1, - // string | timestamp for danmaku - timestamp: "timestamp_example", - // string | message - message: 'YQ==', - // string | type of comment - type: "Type_example", - // string | comment color - color: "Color_example", - // string | comment font size - fontSize: "FontSize_example", -}; - -apiInstance.createDanmaku(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **videoID** | [**number**] | video ID for danmaku | defaults to undefined - **timestamp** | [**string**] | timestamp for danmaku | defaults to undefined - **message** | [**string**] | message | defaults to undefined - **type** | [**string**] | type of comment | defaults to undefined - **color** | [**string**] | comment color | defaults to undefined - **fontSize** | [**string**] | comment font size | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Danmaku creation success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **deleteComment** -> void deleteComment() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiDeleteCommentRequest = { - // number | comment ID - id: 1, -}; - -apiInstance.deleteComment(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | comment ID | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Comment deleted | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **follow** -> void follow() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiFollowRequest = { - // number | user ID - id: 1, -}; - -apiInstance.follow(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | user ID | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Follow success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **followFeed** -> Array followFeed() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:any = {}; - -apiInstance.followFeed(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters -This endpoint does not need any parameter. - - -### Return type - -**Array** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | list of follow feed videos | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **getDanmaku** -> Array getDanmaku() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiGetDanmakuRequest = { - // number | video ID - id: 1, -}; - -apiInstance.getDanmaku(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | video ID | defaults to undefined - - -### Return type - -**Array** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | list of danmaku | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **login** -> void login() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiLoginRequest = { - // string | search string - username: "username_example", - // string | sort category - password: "password_example", -}; - -apiInstance.login(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **username** | [**string**] | search string | defaults to undefined - **password** | [**string**] | sort category | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Login success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **logout** -> void logout() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:any = {}; - -apiInstance.logout(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters -This endpoint does not need any parameter. - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Logout successful | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **recommendations** -> Array recommendations() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiRecommendationsRequest = { - // number | video ID - id: 1, -}; - -apiInstance.recommendations(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | video ID | defaults to undefined - - -### Return type - -**Array** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | list of video recommendations | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **register** -> void register() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiRegisterRequest = { - // string | username to register - username: "username_example", - // string | sort category - password: "password_example", - // string | sort category - email: "email_example", -}; - -apiInstance.register(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **username** | [**string**] | username to register | defaults to undefined - **password** | [**string**] | sort category | defaults to undefined - **email** | [**string**] | sort category | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | registration succeeded | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **resetPassword** -> void resetPassword() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiResetPasswordRequest = { - // string | old password - oldpassword: "oldpassword_example", - // string | new password - newpassword: "newpassword_example", -}; - -apiInstance.resetPassword(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **oldpassword** | [**string**] | old password | defaults to undefined - **newpassword** | [**string**] | new password | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Password changed | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **updateProfile** -> void updateProfile() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiUpdateProfileRequest = { - // string | new username - username: 'YQ==', - // string | new gender - gender: 'YQ==', - // string | new birthdate - birthdate: "birthdate_example", - // string | new bio - bio: 'YQ==', -}; - -apiInstance.updateProfile(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **username** | [**string**] | new username | defaults to undefined - **gender** | [**string**] | new gender | defaults to undefined - **birthdate** | [**string**] | new birthdate | defaults to undefined - **bio** | [**string**] | new bio | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Update profile success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **upload** -> void upload() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiUploadRequest = { - // Array | list of video tags - tags: [ - "tags_example", - ], - // string | video title - title: "title_example", - // string | video description - description: "description_example", - // string | category - category: "category_example", - // Array (optional) - filename: [ - { data: Buffer.from(fs.readFileSync('/path/to/file', 'utf-8')), name: '/path/to/file' }, - ], -}; - -apiInstance.upload(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **tags** | **Array<string>** | list of video tags | defaults to undefined - **title** | [**string**] | video title | defaults to undefined - **description** | [**string**] | video description | defaults to undefined - **category** | [**string**] | category | defaults to undefined - **filename** | **Array<HttpFile>** | | (optional) defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: multipart/form-data - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Logout successful | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **upvote** -> void upvote() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiUpvoteRequest = { - // number | comment ID - id: 1, - // number | upvote score - score: 3.14, -}; - -apiInstance.upvote(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | comment ID | defaults to undefined - **score** | [**number**] | upvote score | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Upvote success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **upvoteVideo** -> void upvoteVideo() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiUpvoteVideoRequest = { - // number | video ID - id: 1, - // number | upvote score - score: 1, -}; - -apiInstance.upvoteVideo(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | video ID | defaults to undefined - **score** | [**number**] | upvote score | defaults to undefined - - -### Return type - -**void** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Upvote success | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **users** -> Users200Response users() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiUsersRequest = { - // number | user ID - id: 1, -}; - -apiInstance.users(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | user ID | defaults to undefined - - -### Return type - -**Users200Response** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | get video details for a specific video | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **videoDetail** -> VideoDetail200Response videoDetail() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiVideoDetailRequest = { - // number | video ID - id: 3.14, -}; - -apiInstance.videoDetail(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **id** | [**number**] | video ID | defaults to undefined - - -### Return type - -**VideoDetail200Response** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | get video details for a specific video | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - -# **videos** -> Videos200Response videos() - - -### Example - - -```typescript -import { } from ''; -import * as fs from 'fs'; - -const configuration = .createConfiguration(); -const apiInstance = new .DefaultApi(configuration); - -let body:.DefaultApiVideosRequest = { - // string | search string (optional) - search: 'YQ==', - // string | sort category (optional) - sortCategory: "sortCategory_example", - // string | sort category (optional) - order: "order_example", - // string | sort category (optional) - unapproved: "unapproved_example", - // number | page number (optional) - pageNumber: 1, - // string | category (optional) - category: 'YQ==', -}; - -apiInstance.videos(body).then((data:any) => { - console.log('API called successfully. Returned data: ' + data); -}).catch((error:any) => console.error(error)); -``` - - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **search** | [**string**] | search string | (optional) defaults to undefined - **sortCategory** | [**string**] | sort category | (optional) defaults to undefined - **order** | [**string**] | sort category | (optional) defaults to undefined - **unapproved** | [**string**] | sort category | (optional) defaults to undefined - **pageNumber** | [**number**] | page number | (optional) defaults to undefined - **category** | [**string**] | category | (optional) defaults to undefined - - -### Return type - -**Videos200Response** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - - -### HTTP response details -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | list of videos and pagination data | - | -**0** | Unexpected error | - | - -[[Back to top]](#) [[Back to API list]](README.md#documentation-for-api-endpoints) [[Back to Model list]](README.md#documentation-for-models) [[Back to README]](README.md) - - diff --git a/packages/kirakira-backend/README.md b/packages/kirakira-backend/README.md deleted file mode 100755 index e61033ba..00000000 --- a/packages/kirakira-backend/README.md +++ /dev/null @@ -1,80 +0,0 @@ -## kirakirabackend@0.0.1 - -This generator creates TypeScript/JavaScript client that utilizes fetch-api. - -### Building - -To build and compile the typescript sources to javascript use: -``` -npm install -npm run build -``` - -### Publishing - -First build the package then run ```npm publish``` - -### Consuming - -Navigate to the folder of your consuming project and run one of the following commands. - -_published:_ - -``` -npm install kirakirabackend@0.0.1 --save -``` - -_unPublished (not recommended):_ - -``` -npm install PATH_TO_GENERATED_PACKAGE --save -``` - -### Usage - -Below code snippet shows exemplary usage of the configuration and the API based -on the typical `PetStore` example used for OpenAPI. - -``` -import * as your_api from 'your_api_package' - -// Covers all auth methods included in your OpenAPI yaml definition -const authConfig: your_api.AuthMethodsConfiguration = { - "api_key": "YOUR_API_KEY" -} - -// Implements a simple middleware to modify requests before (`pre`) they are sent -// and after (`post`) they have been received -class Test implements your_api.Middleware { - pre(context: your_api.RequestContext): Promise { - // Modify context here and return - return Promise.resolve(context); - } - - post(context: your_api.ResponseContext): Promise { - return Promise.resolve(context); - } - -} - -// Create configuration parameter object -const configurationParameters = { - httpApi: new your_api.JQueryHttpLibrary(), // Can also be ignored - default is usually fine - baseServer: your_api.servers[0], // First server is default - authMethods: authConfig, // No auth is default - promiseMiddleware: [new Test()], -} - -// Convert to actual configuration -const config = your_api.createConfiguration(configurationParameters); - -// Use configuration with your_api -const api = new your_api.PetApi(config); -your_api.Pet p = new your_api.Pet(); -p.name = "My new pet"; -p.photoUrls = []; -p.tags = []; -p.status = "available"; -Promise createdPet = api.addPet(p); - -``` diff --git a/packages/kirakira-backend/apis/DefaultApi.ts b/packages/kirakira-backend/apis/DefaultApi.ts deleted file mode 100755 index 916545de..00000000 --- a/packages/kirakira-backend/apis/DefaultApi.ts +++ /dev/null @@ -1,1412 +0,0 @@ -// TODO: better import syntax? -import {BaseAPIRequestFactory, RequiredError, COLLECTION_FORMATS} from './baseapi'; -import {Configuration} from '../configuration'; -import {RequestContext, HttpMethod, ResponseContext, HttpFile} from '../http/http'; -import {ObjectSerializer} from '../models/ObjectSerializer'; -import {ApiException} from './exception'; -import {canConsumeForm, isCodeInRange} from '../util'; -import {SecurityAuthentication} from '../auth/auth'; - - -import { Comments200ResponseInner } from '../models/Comments200ResponseInner'; -import { GetDanmaku200ResponseInner } from '../models/GetDanmaku200ResponseInner'; -import { Users200Response } from '../models/Users200Response'; -import { VideoDetail200Response } from '../models/VideoDetail200Response'; -import { Videos200Response } from '../models/Videos200Response'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; - -/** - * no description - */ -export class DefaultApiRequestFactory extends BaseAPIRequestFactory { - - /** - * Comment on a video - * @param parent parent comment ID - * @param content comment message - * @param videoIDf comment\'s video ID - */ - public async comment(parent: number, content: string, videoIDf: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'parent' is not null or undefined - if (parent === null || parent === undefined) { - throw new RequiredError("DefaultApi", "comment", "parent"); - } - - - // verify required parameter 'content' is not null or undefined - if (content === null || content === undefined) { - throw new RequiredError("DefaultApi", "comment", "content"); - } - - - // verify required parameter 'videoIDf' is not null or undefined - if (videoIDf === null || videoIDf === undefined) { - throw new RequiredError("DefaultApi", "comment", "videoIDf"); - } - - - // Path Params - const localVarPath = '/comment'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("parent", ObjectSerializer.serialize(parent, "number", "")); - - // Header Params - requestContext.setHeaderParam("content", ObjectSerializer.serialize(content, "string", "byte")); - - // Header Params - requestContext.setHeaderParam("videoIDf", ObjectSerializer.serialize(videoIDf, "number", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get comments for video ID - * @param id video ID - */ - public async comments(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "comments", "id"); - } - - - // Path Params - const localVarPath = '/comments/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Create new danmaku - * @param videoID video ID for danmaku - * @param timestamp timestamp for danmaku - * @param message message - * @param type type of comment - * @param color comment color - * @param fontSize comment font size - */ - public async createDanmaku(videoID: number, timestamp: string, message: string, type: string, color: string, fontSize: string, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'videoID' is not null or undefined - if (videoID === null || videoID === undefined) { - throw new RequiredError("DefaultApi", "createDanmaku", "videoID"); - } - - - // verify required parameter 'timestamp' is not null or undefined - if (timestamp === null || timestamp === undefined) { - throw new RequiredError("DefaultApi", "createDanmaku", "timestamp"); - } - - - // verify required parameter 'message' is not null or undefined - if (message === null || message === undefined) { - throw new RequiredError("DefaultApi", "createDanmaku", "message"); - } - - - // verify required parameter 'type' is not null or undefined - if (type === null || type === undefined) { - throw new RequiredError("DefaultApi", "createDanmaku", "type"); - } - - - // verify required parameter 'color' is not null or undefined - if (color === null || color === undefined) { - throw new RequiredError("DefaultApi", "createDanmaku", "color"); - } - - - // verify required parameter 'fontSize' is not null or undefined - if (fontSize === null || fontSize === undefined) { - throw new RequiredError("DefaultApi", "createDanmaku", "fontSize"); - } - - - // Path Params - const localVarPath = '/danmaku'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("VideoID", ObjectSerializer.serialize(videoID, "number", "")); - - // Header Params - requestContext.setHeaderParam("timestamp", ObjectSerializer.serialize(timestamp, "string", "")); - - // Header Params - requestContext.setHeaderParam("message", ObjectSerializer.serialize(message, "string", "byte")); - - // Header Params - requestContext.setHeaderParam("Type", ObjectSerializer.serialize(type, "string", "")); - - // Header Params - requestContext.setHeaderParam("Color", ObjectSerializer.serialize(color, "string", "")); - - // Header Params - requestContext.setHeaderParam("FontSize", ObjectSerializer.serialize(fontSize, "string", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Delete a comment - * @param id comment ID - */ - public async deleteComment(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "deleteComment", "id"); - } - - - // Path Params - const localVarPath = '/delete_comment'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("id", ObjectSerializer.serialize(id, "number", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Upvote a video - * @param id user ID - */ - public async follow(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "follow", "id"); - } - - - // Path Params - const localVarPath = '/follow/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Upvote a video - */ - public async followFeed(_options?: Configuration): Promise { - let _config = _options || this.configuration; - - // Path Params - const localVarPath = '/follow-feed'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get danmaku for video - * @param id video ID - */ - public async getDanmaku(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "getDanmaku", "id"); - } - - - // Path Params - const localVarPath = '/danmaku/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Log the user in - * @param username search string - * @param password sort category - */ - public async login(username: string, password: string, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'username' is not null or undefined - if (username === null || username === undefined) { - throw new RequiredError("DefaultApi", "login", "username"); - } - - - // verify required parameter 'password' is not null or undefined - if (password === null || password === undefined) { - throw new RequiredError("DefaultApi", "login", "password"); - } - - - // Path Params - const localVarPath = '/login'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("username", ObjectSerializer.serialize(username, "string", "")); - - // Header Params - requestContext.setHeaderParam("password", ObjectSerializer.serialize(password, "string", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Log user out - */ - public async logout(_options?: Configuration): Promise { - let _config = _options || this.configuration; - - // Path Params - const localVarPath = '/logout'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get list of videos - * @param id video ID - */ - public async recommendations(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "recommendations", "id"); - } - - - // Path Params - const localVarPath = '/recommendations/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Register user - * @param username username to register - * @param password sort category - * @param email sort category - */ - public async register(username: string, password: string, email: string, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'username' is not null or undefined - if (username === null || username === undefined) { - throw new RequiredError("DefaultApi", "register", "username"); - } - - - // verify required parameter 'password' is not null or undefined - if (password === null || password === undefined) { - throw new RequiredError("DefaultApi", "register", "password"); - } - - - // verify required parameter 'email' is not null or undefined - if (email === null || email === undefined) { - throw new RequiredError("DefaultApi", "register", "email"); - } - - - // Path Params - const localVarPath = '/register'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("username", ObjectSerializer.serialize(username, "string", "")); - - // Header Params - requestContext.setHeaderParam("password", ObjectSerializer.serialize(password, "string", "")); - - // Header Params - requestContext.setHeaderParam("email", ObjectSerializer.serialize(email, "string", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Reset password - * @param oldpassword old password - * @param newpassword new password - */ - public async resetPassword(oldpassword: string, newpassword: string, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'oldpassword' is not null or undefined - if (oldpassword === null || oldpassword === undefined) { - throw new RequiredError("DefaultApi", "resetPassword", "oldpassword"); - } - - - // verify required parameter 'newpassword' is not null or undefined - if (newpassword === null || newpassword === undefined) { - throw new RequiredError("DefaultApi", "resetPassword", "newpassword"); - } - - - // Path Params - const localVarPath = '/reset_password'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("oldpassword", ObjectSerializer.serialize(oldpassword, "string", "")); - - // Header Params - requestContext.setHeaderParam("newpassword", ObjectSerializer.serialize(newpassword, "string", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Update user\'s profile - * @param username new username - * @param gender new gender - * @param birthdate new birthdate - * @param bio new bio - */ - public async updateProfile(username: string, gender: string, birthdate: string, bio: string, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'username' is not null or undefined - if (username === null || username === undefined) { - throw new RequiredError("DefaultApi", "updateProfile", "username"); - } - - - // verify required parameter 'gender' is not null or undefined - if (gender === null || gender === undefined) { - throw new RequiredError("DefaultApi", "updateProfile", "gender"); - } - - - // verify required parameter 'birthdate' is not null or undefined - if (birthdate === null || birthdate === undefined) { - throw new RequiredError("DefaultApi", "updateProfile", "birthdate"); - } - - - // verify required parameter 'bio' is not null or undefined - if (bio === null || bio === undefined) { - throw new RequiredError("DefaultApi", "updateProfile", "bio"); - } - - - // Path Params - const localVarPath = '/update-profile'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("username", ObjectSerializer.serialize(username, "string", "byte")); - - // Header Params - requestContext.setHeaderParam("gender", ObjectSerializer.serialize(gender, "string", "byte")); - - // Header Params - requestContext.setHeaderParam("birthdate", ObjectSerializer.serialize(birthdate, "string", "")); - - // Header Params - requestContext.setHeaderParam("bio", ObjectSerializer.serialize(bio, "string", "byte")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Upload a new video - * @param tags list of video tags - * @param title video title - * @param description video description - * @param category category - * @param filename - */ - public async upload(tags: Array, title: string, description: string, category: string, filename?: Array, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'tags' is not null or undefined - if (tags === null || tags === undefined) { - throw new RequiredError("DefaultApi", "upload", "tags"); - } - - - // verify required parameter 'title' is not null or undefined - if (title === null || title === undefined) { - throw new RequiredError("DefaultApi", "upload", "title"); - } - - - // verify required parameter 'description' is not null or undefined - if (description === null || description === undefined) { - throw new RequiredError("DefaultApi", "upload", "description"); - } - - - // verify required parameter 'category' is not null or undefined - if (category === null || category === undefined) { - throw new RequiredError("DefaultApi", "upload", "category"); - } - - - - // Path Params - const localVarPath = '/upload'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("tags", ObjectSerializer.serialize(tags, "Array", "")); - - // Header Params - requestContext.setHeaderParam("title", ObjectSerializer.serialize(title, "string", "")); - - // Header Params - requestContext.setHeaderParam("description", ObjectSerializer.serialize(description, "string", "")); - - // Header Params - requestContext.setHeaderParam("category", ObjectSerializer.serialize(category, "string", "")); - - // Form Params - const useForm = canConsumeForm([ - 'multipart/form-data', - ]); - - let localVarFormParams - if (useForm) { - localVarFormParams = new FormData(); - } else { - localVarFormParams = new URLSearchParams(); - } - - if (filename) { - // TODO: replace .append with .set - localVarFormParams.append('filename', filename.join(COLLECTION_FORMATS["csv"])); - } - - requestContext.setBody(localVarFormParams); - - if(!useForm) { - const contentType = ObjectSerializer.getPreferredMediaType([ - "multipart/form-data" - ]); - requestContext.setHeaderParam("Content-Type", contentType); - } - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get user video data - * @param id comment ID - * @param score upvote score - */ - public async upvote(id: number, score: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "upvote", "id"); - } - - - // verify required parameter 'score' is not null or undefined - if (score === null || score === undefined) { - throw new RequiredError("DefaultApi", "upvote", "score"); - } - - - // Path Params - const localVarPath = '/upvote/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("score", ObjectSerializer.serialize(score, "number", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Upvote a video - * @param id video ID - * @param score upvote score - */ - public async upvoteVideo(id: number, score: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "upvoteVideo", "id"); - } - - - // verify required parameter 'score' is not null or undefined - if (score === null || score === undefined) { - throw new RequiredError("DefaultApi", "upvoteVideo", "score"); - } - - - // Path Params - const localVarPath = '/upvotevideo/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.POST); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("score", ObjectSerializer.serialize(score, "number", "")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get user video data - * @param id user ID - */ - public async users(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "users", "id"); - } - - - // Path Params - const localVarPath = '/users/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get list of videos - * @param id video ID - */ - public async videoDetail(id: number, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - // verify required parameter 'id' is not null or undefined - if (id === null || id === undefined) { - throw new RequiredError("DefaultApi", "videoDetail", "id"); - } - - - // Path Params - const localVarPath = '/videos/{id}' - .replace('{' + 'id' + '}', encodeURIComponent(String(id))); - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - - /** - * Get list of videos - * @param search search string - * @param sortCategory sort category - * @param order sort category - * @param unapproved sort category - * @param pageNumber page number - * @param category category - */ - public async videos(search?: string, sortCategory?: string, order?: string, unapproved?: string, pageNumber?: number, category?: string, _options?: Configuration): Promise { - let _config = _options || this.configuration; - - - - - - - - // Path Params - const localVarPath = '/videos'; - - // Make Request Context - const requestContext = _config.baseServer.makeRequestContext(localVarPath, HttpMethod.GET); - requestContext.setHeaderParam("Accept", "application/json, */*;q=0.8") - - // Header Params - requestContext.setHeaderParam("search", ObjectSerializer.serialize(search, "string", "byte")); - - // Header Params - requestContext.setHeaderParam("sortCategory", ObjectSerializer.serialize(sortCategory, "string", "")); - - // Header Params - requestContext.setHeaderParam("order", ObjectSerializer.serialize(order, "string", "")); - - // Header Params - requestContext.setHeaderParam("unapproved", ObjectSerializer.serialize(unapproved, "string", "")); - - // Header Params - requestContext.setHeaderParam("pageNumber", ObjectSerializer.serialize(pageNumber, "number", "")); - - // Header Params - requestContext.setHeaderParam("category", ObjectSerializer.serialize(category, "string", "byte")); - - - - const defaultAuth: SecurityAuthentication | undefined = _options?.authMethods?.default || this.configuration?.authMethods?.default - if (defaultAuth?.applySecurityAuthentication) { - await defaultAuth?.applySecurityAuthentication(requestContext); - } - - return requestContext; - } - -} - -export class DefaultApiResponseProcessor { - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to comment - * @throws ApiException if the response code was not in [200, 299] - */ - public async comment(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to comments - * @throws ApiException if the response code was not in [200, 299] - */ - public async comments(response: ResponseContext): Promise > { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to createDanmaku - * @throws ApiException if the response code was not in [200, 299] - */ - public async createDanmaku(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to deleteComment - * @throws ApiException if the response code was not in [200, 299] - */ - public async deleteComment(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to follow - * @throws ApiException if the response code was not in [200, 299] - */ - public async follow(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to followFeed - * @throws ApiException if the response code was not in [200, 299] - */ - public async followFeed(response: ResponseContext): Promise > { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to getDanmaku - * @throws ApiException if the response code was not in [200, 299] - */ - public async getDanmaku(response: ResponseContext): Promise > { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to login - * @throws ApiException if the response code was not in [200, 299] - */ - public async login(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to logout - * @throws ApiException if the response code was not in [200, 299] - */ - public async logout(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to recommendations - * @throws ApiException if the response code was not in [200, 299] - */ - public async recommendations(response: ResponseContext): Promise > { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: Array = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Array", "" - ) as Array; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to register - * @throws ApiException if the response code was not in [200, 299] - */ - public async register(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to resetPassword - * @throws ApiException if the response code was not in [200, 299] - */ - public async resetPassword(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to updateProfile - * @throws ApiException if the response code was not in [200, 299] - */ - public async updateProfile(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to upload - * @throws ApiException if the response code was not in [200, 299] - */ - public async upload(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to upvote - * @throws ApiException if the response code was not in [200, 299] - */ - public async upvote(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to upvoteVideo - * @throws ApiException if the response code was not in [200, 299] - */ - public async upvoteVideo(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - return; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: void = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "void", "" - ) as void; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to users - * @throws ApiException if the response code was not in [200, 299] - */ - public async users(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: Users200Response = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Users200Response", "" - ) as Users200Response; - return body; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: Users200Response = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Users200Response", "" - ) as Users200Response; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to videoDetail - * @throws ApiException if the response code was not in [200, 299] - */ - public async videoDetail(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: VideoDetail200Response = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "VideoDetail200Response", "" - ) as VideoDetail200Response; - return body; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: VideoDetail200Response = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "VideoDetail200Response", "" - ) as VideoDetail200Response; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - - /** - * Unwraps the actual response sent by the server from the response context and deserializes the response content - * to the expected objects - * - * @params response Response returned by the server for a request to videos - * @throws ApiException if the response code was not in [200, 299] - */ - public async videos(response: ResponseContext): Promise { - const contentType = ObjectSerializer.normalizeMediaType(response.headers["content-type"]); - if (isCodeInRange("200", response.httpStatusCode)) { - const body: Videos200Response = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Videos200Response", "" - ) as Videos200Response; - return body; - } - if (isCodeInRange("0", response.httpStatusCode)) { - throw new ApiException(response.httpStatusCode, "Unexpected error", undefined, response.headers); - } - - // Work around for missing responses in specification, e.g. for petstore.yaml - if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { - const body: Videos200Response = ObjectSerializer.deserialize( - ObjectSerializer.parse(await response.body.text(), contentType), - "Videos200Response", "" - ) as Videos200Response; - return body; - } - - throw new ApiException(response.httpStatusCode, "Unknown API Status Code!", await response.getBodyAsAny(), response.headers); - } - -} diff --git a/packages/kirakira-backend/apis/baseapi.ts b/packages/kirakira-backend/apis/baseapi.ts deleted file mode 100755 index ce1e2dbc..00000000 --- a/packages/kirakira-backend/apis/baseapi.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Configuration } from '../configuration' - -/** - * - * @export - */ -export const COLLECTION_FORMATS = { - csv: ",", - ssv: " ", - tsv: "\t", - pipes: "|", -}; - - -/** - * - * @export - * @class BaseAPI - */ -export class BaseAPIRequestFactory { - - constructor(protected configuration: Configuration) { - } -}; - -/** - * - * @export - * @class RequiredError - * @extends {Error} - */ -export class RequiredError extends Error { - name: "RequiredError" = "RequiredError"; - constructor(public api: string, public method: string, public field: string) { - super("Required parameter " + field + " was null or undefined when calling " + api + "." + method + "."); - } -} diff --git a/packages/kirakira-backend/apis/exception.ts b/packages/kirakira-backend/apis/exception.ts deleted file mode 100755 index 9365d33a..00000000 --- a/packages/kirakira-backend/apis/exception.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Represents an error caused by an api call i.e. it has attributes for a HTTP status code - * and the returned body object. - * - * Example - * API returns a ErrorMessageObject whenever HTTP status code is not in [200, 299] - * => ApiException(404, someErrorMessageObject) - * - */ -export class ApiException extends Error { - public constructor(public code: number, message: string, public body: T, public headers: { [key: string]: string; }) { - super("HTTP-Code: " + code + "\nMessage: " + message + "\nBody: " + JSON.stringify(body) + "\nHeaders: " + - JSON.stringify(headers)) - } -} diff --git a/packages/kirakira-backend/auth/auth.ts b/packages/kirakira-backend/auth/auth.ts deleted file mode 100755 index be50274b..00000000 --- a/packages/kirakira-backend/auth/auth.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { RequestContext } from "../http/http"; - -/** - * Interface authentication schemes. - */ -export interface SecurityAuthentication { - /* - * @return returns the name of the security authentication as specified in OAI - */ - getName(): string; - - /** - * Applies the authentication scheme to the request context - * - * @params context the request context which should use this authentication scheme - */ - applySecurityAuthentication(context: RequestContext): void | Promise; -} - -export interface TokenProvider { - getToken(): Promise | string; -} - - -export type AuthMethods = { - "default"?: SecurityAuthentication, -} - -export type ApiKeyConfiguration = string; -export type HttpBasicConfiguration = { "username": string, "password": string }; -export type HttpBearerConfiguration = { tokenProvider: TokenProvider }; -export type OAuth2Configuration = { accessToken: string }; - -export type AuthMethodsConfiguration = { - "default"?: SecurityAuthentication, -} - -/** - * Creates the authentication methods from a swagger description. - * - */ -export function configureAuthMethods(config: AuthMethodsConfiguration | undefined): AuthMethods { - let authMethods: AuthMethods = {} - - if (!config) { - return authMethods; - } - authMethods["default"] = config["default"] - - return authMethods; -} \ No newline at end of file diff --git a/packages/kirakira-backend/configuration.ts b/packages/kirakira-backend/configuration.ts deleted file mode 100755 index dc0e5982..00000000 --- a/packages/kirakira-backend/configuration.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { HttpLibrary } from "./http/http"; -import { Middleware, PromiseMiddleware, PromiseMiddlewareWrapper } from "./middleware"; -import { IsomorphicFetchHttpLibrary as DefaultHttpLibrary } from "./http/isomorphic-fetch"; -import { BaseServerConfiguration } from "./servers"; -import { configureAuthMethods, AuthMethods, AuthMethodsConfiguration } from "./auth/auth"; - -export interface Configuration { - readonly baseServer: BaseServerConfiguration; - readonly httpApi: HttpLibrary; - readonly middleware: Middleware[]; - readonly authMethods: AuthMethods; -} - -/** - * Interface with which a configuration object can be configured. - */ -export interface ConfigurationParameters { - /** - * Default server to use - a list of available servers (according to the - * OpenAPI yaml definition) is included in the `servers` const in `./servers`. You can also - * create your own server with the `ServerConfiguration` class from the same - * file. - */ - baseServer?: BaseServerConfiguration; - /** - * HTTP library to use e.g. IsomorphicFetch. This can usually be skipped as - * all generators come with a default library. - * If available, additional libraries can be imported from `./http/*` - */ - httpApi?: HttpLibrary; - - /** - * The middlewares which will be applied to requests and responses. You can - * add any number of middleware components to modify requests before they - * are sent or before they are deserialized by implementing the `Middleware` - * interface defined in `./middleware` - */ - middleware?: Middleware[]; - /** - * Configures middleware functions that return promises instead of - * Observables (which are used by `middleware`). Otherwise allows for the - * same functionality as `middleware`, i.e., modifying requests before they - * are sent and before they are deserialized. - */ - promiseMiddleware?: PromiseMiddleware[]; - /** - * Configuration for the available authentication methods (e.g., api keys) - * according to the OpenAPI yaml definition. For the definition, please refer to - * `./auth/auth` - */ - authMethods?: AuthMethodsConfiguration -} - -/** - * Provide your `ConfigurationParameters` to this function to get a `Configuration` - * object that can be used to configure your APIs (in the constructor or - * for each request individually). - * - * If a property is not included in conf, a default is used: - * - baseServer: server1 - * - httpApi: IsomorphicFetchHttpLibrary - * - middleware: [] - * - promiseMiddleware: [] - * - authMethods: {} - * - * @param conf partial configuration - */ -export function createConfiguration(conf: ConfigurationParameters = {}): Configuration { - if (!conf.baseServer) throw new ReferenceError("No base server"); - const configuration: Configuration = { - baseServer: conf.baseServer, - httpApi: conf.httpApi || new DefaultHttpLibrary(), - middleware: conf.middleware || [], - authMethods: configureAuthMethods(conf.authMethods) - }; - if (conf.promiseMiddleware) { - conf.promiseMiddleware.forEach( - m => configuration.middleware.push(new PromiseMiddlewareWrapper(m)) - ); - } - return configuration; -} diff --git a/packages/kirakira-backend/git_push.sh b/packages/kirakira-backend/git_push.sh deleted file mode 100755 index b2530297..00000000 --- a/packages/kirakira-backend/git_push.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ -# -# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" - -git_user_id=$1 -git_repo_id=$2 -release_note=$3 - -if [ "$git_user_id" = "" ]; then - git_user_id="GIT_USER_ID" - echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" -fi - -if [ "$git_repo_id" = "" ]; then - git_repo_id="GIT_REPO_ID" - echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" -fi - -if [ "$release_note" = "" ]; then - release_note="Minor update" - echo "[INFO] No command line input provided. Set \$release_note to $release_note" -fi - -# Initialize the local directory as a Git repository -git init - -# Adds the files in the local repository and stages them for commit. -git add . - -# Commits the tracked changes and prepares them to be pushed to a remote repository. -git commit -m "$release_note" - -# Sets the new remote -git_remote=$(git remote) -if [ "$git_remote" = "" ]; then # git remote not defined - - if [ "$GIT_TOKEN" = "" ]; then - echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git - else - git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@github.com/${git_user_id}/${git_repo_id}.git - fi - -fi - -git pull origin master - -# Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git" -git push origin master 2>&1 | grep -v 'To https' diff --git a/packages/kirakira-backend/http/http.ts b/packages/kirakira-backend/http/http.ts deleted file mode 100755 index 5ec4785e..00000000 --- a/packages/kirakira-backend/http/http.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { Observable, from } from '../rxjsStub'; - -export * from './isomorphic-fetch'; - -/** - * Represents an HTTP method. - */ -export enum HttpMethod { - GET = "GET", - HEAD = "HEAD", - POST = "POST", - PUT = "PUT", - DELETE = "DELETE", - CONNECT = "CONNECT", - OPTIONS = "OPTIONS", - TRACE = "TRACE", - PATCH = "PATCH" -} - -/** - * Represents an HTTP file which will be transferred from or to a server. - */ -export type HttpFile = Blob & { readonly name: string }; - -export class HttpException extends Error { - public constructor(msg: string) { - super(msg); - } -} - -/** - * Represents the body of an outgoing HTTP request. - */ -export type RequestBody = undefined | string | FormData | URLSearchParams; - -/** - * Represents an HTTP request context - */ -export class RequestContext { - private headers: { [key: string]: string } = {}; - private body: RequestBody = undefined; - private url: URL; - - /** - * Creates the request context using a http method and request resource url - * - * @param url url of the requested resource - * @param httpMethod http method - */ - public constructor(url: string, private httpMethod: HttpMethod) { - this.url = new URL(url); - } - - /* - * Returns the url set in the constructor including the query string - * - */ - public getUrl(): string { - return this.url.toString().endsWith("/") ? - this.url.toString().slice(0, -1) - : this.url.toString(); - } - - /** - * Replaces the url set in the constructor with this url. - * - */ - public setUrl(url: string) { - this.url = new URL(url); - } - - /** - * Sets the body of the http request either as a string or FormData - * - * Note that setting a body on a HTTP GET, HEAD, DELETE, CONNECT or TRACE - * request is discouraged. - * https://httpwg.org/http-core/draft-ietf-httpbis-semantics-latest.html#rfc.section.7.3.1 - * - * @param body the body of the request - */ - public setBody(body: RequestBody) { - this.body = body; - } - - public getHttpMethod(): HttpMethod { - return this.httpMethod; - } - - public getHeaders(): { [key: string]: string } { - return this.headers; - } - - public getBody(): RequestBody { - return this.body; - } - - public setQueryParam(name: string, value: string) { - this.url.searchParams.set(name, value); - } - - /** - * Sets a cookie with the name and value. NO check for duplicate cookies is performed - * - */ - public addCookie(name: string, value: string): void { - if (!this.headers["Cookie"]) { - this.headers["Cookie"] = ""; - } - this.headers["Cookie"] += name + "=" + value + "; "; - } - - public setHeaderParam(key: string, value: string): void { - this.headers[key] = value; - } -} - -export interface ResponseBody { - text(): Promise; - binary(): Promise; -} - -/** - * Helper class to generate a `ResponseBody` from binary data - */ -export class SelfDecodingBody implements ResponseBody { - constructor(private dataSource: Promise) {} - - binary(): Promise { - return this.dataSource; - } - - async text(): Promise { - const data: Blob = await this.dataSource; - // @ts-ignore - if (data.text) { - // @ts-ignore - return data.text(); - } - - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.addEventListener("load", () => resolve(reader.result as string)); - reader.addEventListener("error", () => reject(reader.error)); - reader.readAsText(data); - }); - } -} - -export class ResponseContext { - public constructor( - public httpStatusCode: number, - public headers: { [key: string]: string }, - public body: ResponseBody - ) {} - - /** - * Parse header value in the form `value; param1="value1"` - * - * E.g. for Content-Type or Content-Disposition - * Parameter names are converted to lower case - * The first parameter is returned with the key `""` - */ - public getParsedHeader(headerName: string): { [parameter: string]: string } { - const result: { [parameter: string]: string } = {}; - if (!this.headers[headerName]) { - return result; - } - - const parameters = this.headers[headerName].split(";"); - for (const parameter of parameters) { - let [key, value] = parameter.split("=", 2); - key = key.toLowerCase().trim(); - if (value === undefined) { - result[""] = key; - } else { - value = value.trim(); - if (value.startsWith('"') && value.endsWith('"')) { - value = value.substring(1, value.length - 1); - } - result[key] = value; - } - } - return result; - } - - public async getBodyAsFile(): Promise { - const data = await this.body.binary(); - const fileName = this.getParsedHeader("content-disposition")["filename"] || ""; - const contentType = this.headers["content-type"] || ""; - try { - return new File([data], fileName, { type: contentType }); - } catch (error) { - /** Fallback for when the File constructor is not available */ - return Object.assign(data, { - name: fileName, - type: contentType - }); - } - } - - /** - * Use a heuristic to get a body of unknown data structure. - * Return as string if possible, otherwise as binary. - */ - public getBodyAsAny(): Promise { - try { - return this.body.text(); - } catch {} - - try { - return this.body.binary(); - } catch {} - - return Promise.resolve(undefined); - } -} - -export interface HttpLibrary { - send(request: RequestContext): Observable; -} - -export interface PromiseHttpLibrary { - send(request: RequestContext): Promise; -} - -export function wrapHttpLibrary(promiseHttpLibrary: PromiseHttpLibrary): HttpLibrary { - return { - send(request: RequestContext): Observable { - return from(promiseHttpLibrary.send(request)); - } - } -} diff --git a/packages/kirakira-backend/http/isomorphic-fetch.ts b/packages/kirakira-backend/http/isomorphic-fetch.ts deleted file mode 100755 index b6d41788..00000000 --- a/packages/kirakira-backend/http/isomorphic-fetch.ts +++ /dev/null @@ -1,88 +0,0 @@ -import "whatwg-fetch"; -import { Observable, from } from "../rxjsStub"; -import { HttpLibrary, RequestContext, ResponseContext } from "./http"; - - -export var fetch: any; - -export function changeFetch(f: any) { - fetch = f; -} - -export class IsomorphicFetchHttpLibrary implements HttpLibrary { - - public send(request: RequestContext): Observable { - const method = request.getHttpMethod().toString(); - const body = request.getBody(); - const url = request.getUrl(); - const headers: { [name: string]: string } = {}; - headers["content-type"] = "application/json"; - var status = 200; - const resultPromise = fetch(url, { - method, - body, - headers: request.getHeaders(), - credentials: "same-origin", - async onResponse ({ request, response, options }) { - response.headers.forEach((value, key) => { - headers[key] = value; - }); - status = response.status; - - }, - }).then((data: any) => { - const body = { - text: async () => JSON.stringify(data.data._value), - binary: async () => { - return new Blob([JSON.stringify(data.data._value)], { - type: "application/json", - }); - }, - }; - - return new ResponseContext(status, headers, body); - }); - - - // const myPromise = new Promise(async (resolve, reject) => { - // console.log("PROMISE"); - // var r = fetch(url, { - // method, - // body, - // headers: request.getHeaders(), - // credentials: "same-origin", - // async onResponse ({ request, response, options }) { - // console.log("OnResponse"); - // // (screaming) - // console.log(await response.text()); - // resolve(response); - // }, - // async OnErrorResponse({ request, response, options }) { - // // (screaming) - // console.log("ERROR"); - // reject(response); - // }, - // }).catch((error: any) => console.error(error)); - - // }).then(async (response: any) => { - // const status = response.status; - - // const t = await response.text(); - // console.log(t); - - - // const body = { - // text: () => t, - // binary: async () => { - // return new Blob([JSON.stringify(JSON.parse(t), null, 2)], { - // type: "application/json", - // }) - // } - // }; - - // return new ResponseContext(status, headers, body); - // }).catch((error: any) => console.error(error)); - - return from>(resultPromise); - } -} diff --git a/packages/kirakira-backend/index.ts b/packages/kirakira-backend/index.ts deleted file mode 100755 index 89069bd1..00000000 --- a/packages/kirakira-backend/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from "./http/http"; -export * from "./auth/auth"; -export * from "./models/all"; -export { createConfiguration } from "./configuration" -export { Configuration } from "./configuration" -export * from "./apis/exception"; -export * from "./servers"; -export { RequiredError } from "./apis/baseapi"; - -export { PromiseMiddleware as Middleware } from './middleware'; -export { PromiseDefaultApi as DefaultApi } from './types/PromiseAPI'; - diff --git a/packages/kirakira-backend/middleware.ts b/packages/kirakira-backend/middleware.ts deleted file mode 100755 index 524f93f0..00000000 --- a/packages/kirakira-backend/middleware.ts +++ /dev/null @@ -1,66 +0,0 @@ -import {RequestContext, ResponseContext} from './http/http'; -import { Observable, from } from './rxjsStub'; - -/** - * Defines the contract for a middleware intercepting requests before - * they are sent (but after the RequestContext was created) - * and before the ResponseContext is unwrapped. - * - */ -export interface Middleware { - /** - * Modifies the request before the request is sent. - * - * @param context RequestContext of a request which is about to be sent to the server - * @returns an observable of the updated request context - * - */ - pre(context: RequestContext): Observable; - /** - * Modifies the returned response before it is deserialized. - * - * @param context ResponseContext of a sent request - * @returns an observable of the modified response context - */ - post(context: ResponseContext): Observable; -} - -export class PromiseMiddlewareWrapper implements Middleware { - - public constructor(private middleware: PromiseMiddleware) { - - } - - pre(context: RequestContext): Observable { - return from(this.middleware.pre(context)); - } - - post(context: ResponseContext): Observable { - return from(this.middleware.post(context)); - } - -} - -/** - * Defines the contract for a middleware intercepting requests before - * they are sent (but after the RequestContext was created) - * and before the ResponseContext is unwrapped. - * - */ -export interface PromiseMiddleware { - /** - * Modifies the request before the request is sent. - * - * @param context RequestContext of a request which is about to be sent to the server - * @returns an observable of the updated request context - * - */ - pre(context: RequestContext): Promise; - /** - * Modifies the returned response before it is deserialized. - * - * @param context ResponseContext of a sent request - * @returns an observable of the modified response context - */ - post(context: ResponseContext): Promise; -} diff --git a/packages/kirakira-backend/models/Categories200ResponseInner.ts b/packages/kirakira-backend/models/Categories200ResponseInner.ts deleted file mode 100755 index 78f77029..00000000 --- a/packages/kirakira-backend/models/Categories200ResponseInner.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class Categories200ResponseInner { - 'name'?: string; - 'cardinality'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "name", - "baseName": "Name", - "type": "string", - "format": "" - }, - { - "name": "cardinality", - "baseName": "Cardinality", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Categories200ResponseInner.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/Comments200ResponseInner.ts b/packages/kirakira-backend/models/Comments200ResponseInner.ts deleted file mode 100755 index cd468071..00000000 --- a/packages/kirakira-backend/models/Comments200ResponseInner.ts +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class Comments200ResponseInner { - 'id'?: number; - 'created'?: string; - 'content'?: string; - 'fullname'?: string; - 'profilePictureUrl'?: string; - 'upvoteCount'?: number; - 'userHasUpvoted'?: boolean; - 'userHasDownvoted'?: boolean; - 'authoredByCurrentUser'?: boolean; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "id", - "baseName": "id", - "type": "number", - "format": "" - }, - { - "name": "created", - "baseName": "created", - "type": "string", - "format": "" - }, - { - "name": "content", - "baseName": "content", - "type": "string", - "format": "" - }, - { - "name": "fullname", - "baseName": "fullname", - "type": "string", - "format": "" - }, - { - "name": "profilePictureUrl", - "baseName": "profile_picture_url", - "type": "string", - "format": "" - }, - { - "name": "upvoteCount", - "baseName": "upvote_count", - "type": "number", - "format": "" - }, - { - "name": "userHasUpvoted", - "baseName": "user_has_upvoted", - "type": "boolean", - "format": "" - }, - { - "name": "userHasDownvoted", - "baseName": "user_has_downvoted", - "type": "boolean", - "format": "" - }, - { - "name": "authoredByCurrentUser", - "baseName": "authored_by_current_user", - "type": "boolean", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Comments200ResponseInner.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/GetDanmaku200ResponseInner.ts b/packages/kirakira-backend/models/GetDanmaku200ResponseInner.ts deleted file mode 100644 index fd1f5aff..00000000 --- a/packages/kirakira-backend/models/GetDanmaku200ResponseInner.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class GetDanmaku200ResponseInner { - 'ID'?: number; - 'timestamp'?: string; - 'message'?: string; - 'authorID'?: number; - 'type'?: string; - 'color'?: string; - 'creationDate'?: string; - 'fontSize'?: string; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "ID", - "baseName": "ID", - "type": "number", - "format": "" - }, - { - "name": "timestamp", - "baseName": "Timestamp", - "type": "string", - "format": "" - }, - { - "name": "message", - "baseName": "Message", - "type": "string", - "format": "" - }, - { - "name": "authorID", - "baseName": "AuthorID", - "type": "number", - "format": "" - }, - { - "name": "type", - "baseName": "Type", - "type": "string", - "format": "" - }, - { - "name": "color", - "baseName": "Color", - "type": "string", - "format": "" - }, - { - "name": "creationDate", - "baseName": "CreationDate", - "type": "string", - "format": "" - }, - { - "name": "fontSize", - "baseName": "FontSize", - "type": "string", - "format": "" - } ]; - - static getAttributeTypeMap() { - return GetDanmaku200ResponseInner.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/ObjectSerializer.ts b/packages/kirakira-backend/models/ObjectSerializer.ts deleted file mode 100755 index 27244f5a..00000000 --- a/packages/kirakira-backend/models/ObjectSerializer.ts +++ /dev/null @@ -1,250 +0,0 @@ -export * from '../models/Comments200ResponseInner'; -export * from '../models/GetDanmaku200ResponseInner'; -export * from '../models/Users200Response'; -export * from '../models/VideoDetail200Response'; -export * from '../models/Videos200Response'; -export * from '../models/Videos200ResponseCategoriesInner'; -export * from '../models/Videos200ResponsePaginationData'; -export * from '../models/Videos200ResponseVideosInner'; - -import { Comments200ResponseInner } from '../models/Comments200ResponseInner'; -import { GetDanmaku200ResponseInner } from '../models/GetDanmaku200ResponseInner'; -import { Users200Response } from '../models/Users200Response'; -import { VideoDetail200Response } from '../models/VideoDetail200Response'; -import { Videos200Response } from '../models/Videos200Response'; -import { Videos200ResponseCategoriesInner } from '../models/Videos200ResponseCategoriesInner'; -import { Videos200ResponsePaginationData } from '../models/Videos200ResponsePaginationData'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; - -/* tslint:disable:no-unused-variable */ -let primitives = [ - "string", - "boolean", - "double", - "integer", - "long", - "float", - "number", - "any" - ]; - -const supportedMediaTypes: { [mediaType: string]: number } = { - "application/json": Infinity, - "application/octet-stream": 0, - "application/x-www-form-urlencoded": 0 -} - - -let enumsMap: Set = new Set([ -]); - -let typeMap: {[index: string]: any} = { - "Comments200ResponseInner": Comments200ResponseInner, - "GetDanmaku200ResponseInner": GetDanmaku200ResponseInner, - "Users200Response": Users200Response, - "VideoDetail200Response": VideoDetail200Response, - "Videos200Response": Videos200Response, - "Videos200ResponseCategoriesInner": Videos200ResponseCategoriesInner, - "Videos200ResponsePaginationData": Videos200ResponsePaginationData, - "Videos200ResponseVideosInner": Videos200ResponseVideosInner, -} - -export class ObjectSerializer { - public static findCorrectType(data: any, expectedType: string) { - if (data == undefined) { - return expectedType; - } else if (primitives.indexOf(expectedType.toLowerCase()) !== -1) { - return expectedType; - } else if (expectedType === "Date") { - return expectedType; - } else { - if (enumsMap.has(expectedType)) { - return expectedType; - } - - if (!typeMap[expectedType]) { - return expectedType; // w/e we don't know the type - } - - // Check the discriminator - let discriminatorProperty = typeMap[expectedType].discriminator; - if (discriminatorProperty == null) { - return expectedType; // the type does not have a discriminator. use it. - } else { - if (data[discriminatorProperty]) { - var discriminatorType = data[discriminatorProperty]; - if(typeMap[discriminatorType]){ - return discriminatorType; // use the type given in the discriminator - } else { - return expectedType; // discriminator did not map to a type - } - } else { - return expectedType; // discriminator was not present (or an empty string) - } - } - } - } - - public static serialize(data: any, type: string, format: string) { - if (data == undefined) { - return data; - } else if (primitives.indexOf(type.toLowerCase()) !== -1) { - return data; - } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6 - let subType: string = type.replace("Array<", ""); // Array => Type> - subType = subType.substring(0, subType.length - 1); // Type> => Type - let transformedData: any[] = []; - for (let date of data) { - transformedData.push(ObjectSerializer.serialize(date, subType, format)); - } - return transformedData; - } else if (type === "Date") { - if (format == "date") { - let month = data.getMonth()+1 - month = month < 10 ? "0" + month.toString() : month.toString() - let day = data.getDate(); - day = day < 10 ? "0" + day.toString() : day.toString(); - - return data.getFullYear() + "-" + month + "-" + day; - } else { - return data.toISOString(); - } - } else { - if (enumsMap.has(type)) { - return data; - } - if (!typeMap[type]) { // in case we dont know the type - return data; - } - - // Get the actual type of this object - type = this.findCorrectType(data, type); - - // get the map for the correct type. - let attributeTypes = typeMap[type].getAttributeTypeMap(); - let instance: {[index: string]: any} = {}; - for (let attributeType of attributeTypes) { - instance[attributeType.baseName] = ObjectSerializer.serialize(data[attributeType.name], attributeType.type, attributeType.format); - } - return instance; - } - } - - public static deserialize(data: any, type: string, format: string) { - // polymorphism may change the actual type. - type = ObjectSerializer.findCorrectType(data, type); - if (data == undefined) { - return data; - } else if (primitives.indexOf(type.toLowerCase()) !== -1) { - return data; - } else if (type.lastIndexOf("Array<", 0) === 0) { // string.startsWith pre es6 - let subType: string = type.replace("Array<", ""); // Array => Type> - subType = subType.substring(0, subType.length - 1); // Type> => Type - let transformedData: any[] = []; - for (let date of data) { - transformedData.push(ObjectSerializer.deserialize(date, subType, format)); - } - return transformedData; - } else if (type === "Date") { - return new Date(data); - } else { - if (enumsMap.has(type)) {// is Enum - return data; - } - - if (!typeMap[type]) { // dont know the type - return data; - } - let instance = new typeMap[type](); - let attributeTypes = typeMap[type].getAttributeTypeMap(); - for (let attributeType of attributeTypes) { - let value = ObjectSerializer.deserialize(data[attributeType.baseName], attributeType.type, attributeType.format); - if (value !== undefined) { - instance[attributeType.name] = value; - } - } - return instance; - } - } - - - /** - * Normalize media type - * - * We currently do not handle any media types attributes, i.e. anything - * after a semicolon. All content is assumed to be UTF-8 compatible. - */ - public static normalizeMediaType(mediaType: string | undefined): string | undefined { - if (mediaType === undefined) { - return undefined; - } - return mediaType.split(";")[0].trim().toLowerCase(); - } - - /** - * From a list of possible media types, choose the one we can handle best. - * - * The order of the given media types does not have any impact on the choice - * made. - */ - public static getPreferredMediaType(mediaTypes: Array): string { - /** According to OAS 3 we should default to json */ - if (mediaTypes.length === 0) { - return "application/json"; - } - - const normalMediaTypes = mediaTypes.map(this.normalizeMediaType); - let selectedMediaType: string | undefined = undefined; - let selectedRank: number = -Infinity; - for (const mediaType of normalMediaTypes) { - if (supportedMediaTypes[mediaType!] > selectedRank) { - selectedMediaType = mediaType; - selectedRank = supportedMediaTypes[mediaType!]; - } - } - - if (selectedMediaType === undefined) { - throw new Error("None of the given media types are supported: " + mediaTypes.join(", ")); - } - - return selectedMediaType!; - } - - /** - * Convert data to a string according the given media type - */ - public static stringify(data: any, mediaType: string): string { - if (mediaType === "text/plain") { - return String(data); - } - - if (mediaType === "application/json") { - return JSON.stringify(data); - } - - throw new Error("The mediaType " + mediaType + " is not supported by ObjectSerializer.stringify."); - } - - /** - * Parse data from a string according to the given media type - */ - public static parse(rawData: string, mediaType: string | undefined) { - if (mediaType === undefined) { - throw new Error("Cannot parse content. No Content-Type defined."); - } - - if (mediaType === "text/plain") { - return rawData; - } - - if (mediaType === "application/json") { - return JSON.parse(rawData); - } - - if (mediaType === "text/html") { - return rawData; - } - - throw new Error("The mediaType " + mediaType + " is not supported by ObjectSerializer.parse."); - } -} diff --git a/packages/kirakira-backend/models/Users200Response.ts b/packages/kirakira-backend/models/Users200Response.ts deleted file mode 100755 index 54d34014..00000000 --- a/packages/kirakira-backend/models/Users200Response.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { Videos200ResponsePaginationData } from '../models/Videos200ResponsePaginationData'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; -import { HttpFile } from '../http/http'; - -export class Users200Response { - 'paginationData'?: Videos200ResponsePaginationData; - 'userID'?: number; - 'username'?: string; - 'profilePictureURL'?: string; - 'bio'?: string; - 'birthdate'?: string; - 'gender'?: string; - 'joinDate'?: string; - 'videos'?: Array; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "paginationData", - "baseName": "PaginationData", - "type": "Videos200ResponsePaginationData", - "format": "" - }, - { - "name": "userID", - "baseName": "UserID", - "type": "number", - "format": "" - }, - { - "name": "username", - "baseName": "Username", - "type": "string", - "format": "" - }, - { - "name": "profilePictureURL", - "baseName": "ProfilePictureURL", - "type": "string", - "format": "" - }, - { - "name": "bio", - "baseName": "Bio", - "type": "string", - "format": "" - }, - { - "name": "birthdate", - "baseName": "Birthdate", - "type": "string", - "format": "" - }, - { - "name": "gender", - "baseName": "Gender", - "type": "string", - "format": "" - }, - { - "name": "joinDate", - "baseName": "JoinDate", - "type": "string", - "format": "" - }, - { - "name": "videos", - "baseName": "Videos", - "type": "Array", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Users200Response.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/Users200ResponseVideosInner.ts b/packages/kirakira-backend/models/Users200ResponseVideosInner.ts deleted file mode 100755 index 6821b670..00000000 --- a/packages/kirakira-backend/models/Users200ResponseVideosInner.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class Users200ResponseVideosInner { - 'title'?: string; - 'videoID'?: number; - 'views'?: number; - 'authorID'?: number; - 'authorName'?: string; - 'thumbnailLoc'?: string; - 'rating'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "title", - "baseName": "Title", - "type": "string", - "format": "" - }, - { - "name": "videoID", - "baseName": "VideoID", - "type": "number", - "format": "" - }, - { - "name": "views", - "baseName": "Views", - "type": "number", - "format": "" - }, - { - "name": "authorID", - "baseName": "AuthorID", - "type": "number", - "format": "" - }, - { - "name": "authorName", - "baseName": "AuthorName", - "type": "string", - "format": "" - }, - { - "name": "thumbnailLoc", - "baseName": "ThumbnailLoc", - "type": "string", - "format": "" - }, - { - "name": "rating", - "baseName": "Rating", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Users200ResponseVideosInner.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/VideoDetail200Response.ts b/packages/kirakira-backend/models/VideoDetail200Response.ts deleted file mode 100755 index 38be66ac..00000000 --- a/packages/kirakira-backend/models/VideoDetail200Response.ts +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class VideoDetail200Response { - 'title'?: string; - 'mPDLoc'?: string; - 'views'?: number; - 'rating'?: number; - 'videoID'?: number; - 'authorID'?: number; - 'username'?: string; - 'userDescription'?: string; - 'videoDescription'?: string; - 'userSubscribers'?: number; - 'profilePicture'?: string; - 'uploadDate'?: string; - 'comments'?: any; - 'thumbnail'?: string; - 'tags'?: Array; - 'videoDuration'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "title", - "baseName": "Title", - "type": "string", - "format": "" - }, - { - "name": "mPDLoc", - "baseName": "MPDLoc", - "type": "string", - "format": "" - }, - { - "name": "views", - "baseName": "Views", - "type": "number", - "format": "" - }, - { - "name": "rating", - "baseName": "Rating", - "type": "number", - "format": "" - }, - { - "name": "videoID", - "baseName": "VideoID", - "type": "number", - "format": "" - }, - { - "name": "authorID", - "baseName": "AuthorID", - "type": "number", - "format": "" - }, - { - "name": "username", - "baseName": "Username", - "type": "string", - "format": "" - }, - { - "name": "userDescription", - "baseName": "UserDescription", - "type": "string", - "format": "" - }, - { - "name": "videoDescription", - "baseName": "VideoDescription", - "type": "string", - "format": "" - }, - { - "name": "userSubscribers", - "baseName": "UserSubscribers", - "type": "number", - "format": "" - }, - { - "name": "profilePicture", - "baseName": "ProfilePicture", - "type": "string", - "format": "" - }, - { - "name": "uploadDate", - "baseName": "UploadDate", - "type": "string", - "format": "" - }, - { - "name": "comments", - "baseName": "Comments", - "type": "any", - "format": "" - }, - { - "name": "thumbnail", - "baseName": "Thumbnail", - "type": "string", - "format": "" - }, - { - "name": "tags", - "baseName": "Tags", - "type": "Array", - "format": "" - }, - { - "name": "videoDuration", - "baseName": "VideoDuration", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return VideoDetail200Response.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/VideoDetail200ResponseDetails.ts b/packages/kirakira-backend/models/VideoDetail200ResponseDetails.ts deleted file mode 100755 index 4631efae..00000000 --- a/packages/kirakira-backend/models/VideoDetail200ResponseDetails.ts +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class VideoDetail200ResponseDetails { - 'title'?: string; - 'mPDLoc'?: string; - 'views'?: number; - 'rating'?: number; - 'videoID'?: number; - 'authorID'?: number; - 'username'?: string; - 'userDescription'?: string; - 'videoDescription'?: string; - 'userSubscribers'?: number; - 'profilePicture'?: string; - 'uploadDate'?: string; - 'comments'?: any; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "title", - "baseName": "Title", - "type": "string", - "format": "" - }, - { - "name": "mPDLoc", - "baseName": "MPDLoc", - "type": "string", - "format": "" - }, - { - "name": "views", - "baseName": "Views", - "type": "number", - "format": "" - }, - { - "name": "rating", - "baseName": "Rating", - "type": "number", - "format": "" - }, - { - "name": "videoID", - "baseName": "VideoID", - "type": "number", - "format": "" - }, - { - "name": "authorID", - "baseName": "AuthorID", - "type": "number", - "format": "" - }, - { - "name": "username", - "baseName": "Username", - "type": "string", - "format": "" - }, - { - "name": "userDescription", - "baseName": "UserDescription", - "type": "string", - "format": "" - }, - { - "name": "videoDescription", - "baseName": "VideoDescription", - "type": "string", - "format": "" - }, - { - "name": "userSubscribers", - "baseName": "UserSubscribers", - "type": "number", - "format": "" - }, - { - "name": "profilePicture", - "baseName": "ProfilePicture", - "type": "string", - "format": "" - }, - { - "name": "uploadDate", - "baseName": "UploadDate", - "type": "string", - "format": "" - }, - { - "name": "comments", - "baseName": "Comments", - "type": "any", - "format": "" - } ]; - - static getAttributeTypeMap() { - return VideoDetail200ResponseDetails.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/VideoDetail200ResponseVideoRecommendations.ts b/packages/kirakira-backend/models/VideoDetail200ResponseVideoRecommendations.ts deleted file mode 100755 index e785ea0d..00000000 --- a/packages/kirakira-backend/models/VideoDetail200ResponseVideoRecommendations.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class VideoDetail200ResponseVideoRecommendations { - 'title'?: string; - 'thumbnailLoc'?: string; - 'videoID'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "title", - "baseName": "Title", - "type": "string", - "format": "" - }, - { - "name": "thumbnailLoc", - "baseName": "ThumbnailLoc", - "type": "string", - "format": "" - }, - { - "name": "videoID", - "baseName": "VideoID", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return VideoDetail200ResponseVideoRecommendations.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/Videos200Response.ts b/packages/kirakira-backend/models/Videos200Response.ts deleted file mode 100755 index be6dfe6b..00000000 --- a/packages/kirakira-backend/models/Videos200Response.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { Videos200ResponseCategoriesInner } from '../models/Videos200ResponseCategoriesInner'; -import { Videos200ResponsePaginationData } from '../models/Videos200ResponsePaginationData'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; -import { HttpFile } from '../http/http'; - -export class Videos200Response { - 'paginationData'?: Videos200ResponsePaginationData; - 'userID'?: number; - 'username'?: string; - 'profilePictureURL'?: string; - 'videos'?: Array; - 'categories'?: Array; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "paginationData", - "baseName": "PaginationData", - "type": "Videos200ResponsePaginationData", - "format": "" - }, - { - "name": "userID", - "baseName": "UserID", - "type": "number", - "format": "" - }, - { - "name": "username", - "baseName": "Username", - "type": "string", - "format": "" - }, - { - "name": "profilePictureURL", - "baseName": "ProfilePictureURL", - "type": "string", - "format": "" - }, - { - "name": "videos", - "baseName": "Videos", - "type": "Array", - "format": "" - }, - { - "name": "categories", - "baseName": "Categories", - "type": "Array", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Videos200Response.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/Videos200ResponseCategoriesInner.ts b/packages/kirakira-backend/models/Videos200ResponseCategoriesInner.ts deleted file mode 100755 index 0cb64a22..00000000 --- a/packages/kirakira-backend/models/Videos200ResponseCategoriesInner.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class Videos200ResponseCategoriesInner { - 'name'?: string; - 'cardinality'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "name", - "baseName": "Name", - "type": "string", - "format": "" - }, - { - "name": "cardinality", - "baseName": "Cardinality", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Videos200ResponseCategoriesInner.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/Videos200ResponsePaginationData.ts b/packages/kirakira-backend/models/Videos200ResponsePaginationData.ts deleted file mode 100755 index d7fdaf93..00000000 --- a/packages/kirakira-backend/models/Videos200ResponsePaginationData.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class Videos200ResponsePaginationData { - 'numberOfItems'?: number; - 'currentPage'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "numberOfItems", - "baseName": "NumberOfItems", - "type": "number", - "format": "" - }, - { - "name": "currentPage", - "baseName": "CurrentPage", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Videos200ResponsePaginationData.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/Videos200ResponseVideosInner.ts b/packages/kirakira-backend/models/Videos200ResponseVideosInner.ts deleted file mode 100755 index ce46b20f..00000000 --- a/packages/kirakira-backend/models/Videos200ResponseVideosInner.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Kirakira Backend API - * The API for Kirakira - * - * OpenAPI spec version: 0.0.1 - * Contact: horahora1567@gmail.com - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { HttpFile } from '../http/http'; - -export class Videos200ResponseVideosInner { - 'title'?: string; - 'videoID'?: number; - 'views'?: number; - 'authorID'?: number; - 'authorName'?: string; - 'thumbnailLoc'?: string; - 'rating'?: number; - 'videoDuration'?: number; - - static readonly discriminator: string | undefined = undefined; - - static readonly attributeTypeMap: Array<{name: string, baseName: string, type: string, format: string}> = [ - { - "name": "title", - "baseName": "Title", - "type": "string", - "format": "" - }, - { - "name": "videoID", - "baseName": "VideoID", - "type": "number", - "format": "" - }, - { - "name": "views", - "baseName": "Views", - "type": "number", - "format": "" - }, - { - "name": "authorID", - "baseName": "AuthorID", - "type": "number", - "format": "" - }, - { - "name": "authorName", - "baseName": "AuthorName", - "type": "string", - "format": "" - }, - { - "name": "thumbnailLoc", - "baseName": "ThumbnailLoc", - "type": "string", - "format": "" - }, - { - "name": "rating", - "baseName": "Rating", - "type": "number", - "format": "" - }, - { - "name": "videoDuration", - "baseName": "VideoDuration", - "type": "number", - "format": "" - } ]; - - static getAttributeTypeMap() { - return Videos200ResponseVideosInner.attributeTypeMap; - } - - public constructor() { - } -} - diff --git a/packages/kirakira-backend/models/all.ts b/packages/kirakira-backend/models/all.ts deleted file mode 100755 index 42c719cd..00000000 --- a/packages/kirakira-backend/models/all.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from '../models/Comments200ResponseInner' -export * from '../models/GetDanmaku200ResponseInner' -export * from '../models/Users200Response' -export * from '../models/VideoDetail200Response' -export * from '../models/Videos200Response' -export * from '../models/Videos200ResponseCategoriesInner' -export * from '../models/Videos200ResponsePaginationData' -export * from '../models/Videos200ResponseVideosInner' diff --git a/packages/kirakira-backend/package.json b/packages/kirakira-backend/package.json deleted file mode 100755 index e26f5374..00000000 --- a/packages/kirakira-backend/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "kirakirabackend", - "version": "0.0.1", - "description": "OpenAPI client for kirakirabackend", - "author": "OpenAPI-Generator Contributors", - "repository": { - "type": "git", - "url": "https://github.com/GIT_USER_ID/GIT_REPO_ID.git" - }, - "keywords": [ - "fetch", - "typescript", - "openapi-client", - "openapi-generator" - ], - "license": "Unlicense", - "main": "./dist/index.js", - "type": "module", - "module": "./dist/index.js", - "exports": { - ".": { - "import": "./dist/index.js", - "types": "./dist/index.d.js" - } - }, - "typings": "./dist/index.d.ts", - "scripts": { - "build": "tsc", - "prepare": "npm run build" - }, - "dependencies": { - "whatwg-fetch": "^3.0.0", - "es6-promise": "^4.2.4", - "url-parse": "^1.4.3" - }, - "devDependencies": { - "typescript": "^4.0", - "@types/url-parse": "1.4.4" - } -} diff --git a/packages/kirakira-backend/rxjsStub.ts b/packages/kirakira-backend/rxjsStub.ts deleted file mode 100755 index 4c73715a..00000000 --- a/packages/kirakira-backend/rxjsStub.ts +++ /dev/null @@ -1,27 +0,0 @@ -export class Observable { - constructor(private promise: Promise) {} - - toPromise() { - return this.promise; - } - - pipe(callback: (value: T) => S | Promise): Observable { - return new Observable(this.promise.then(callback)); - } -} - -export function from(promise: Promise) { - return new Observable(promise); -} - -export function of(value: T) { - return new Observable(Promise.resolve(value)); -} - -export function mergeMap(callback: (value: T) => Observable) { - return (value: T) => callback(value).toPromise(); -} - -export function map(callback: any) { - return callback; -} diff --git a/packages/kirakira-backend/servers.ts b/packages/kirakira-backend/servers.ts deleted file mode 100755 index 1a11ff87..00000000 --- a/packages/kirakira-backend/servers.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { HttpMethod, RequestContext } from "./http/http"; - -export interface BaseServerConfiguration { - makeRequestContext(endpoint: string, httpMethod: HttpMethod): RequestContext; -} - -/** - * - * Represents the configuration of a server including its - * url template and variable configuration based on the url. - * - */ -export class ServerConfiguration implements BaseServerConfiguration { - public constructor(private url: string, private variableConfiguration: T) { } - - /** - * Sets the value of the variables of this server. Variables are included in - * the `url` of this ServerConfiguration in the form `{variableName}` - * - * @param variableConfiguration a partial variable configuration for the - * variables contained in the url - */ - public setVariables(variableConfiguration: Partial) { - Object.assign(this.variableConfiguration, variableConfiguration); - } - - public getConfiguration(): T { - return this.variableConfiguration; - } - - private getUrl() { - let replacedUrl = this.url; - for (const key in this.variableConfiguration) { - const re = new RegExp("{" + key + "}", "g"); - replacedUrl = replacedUrl.replace(re, this.variableConfiguration[key]); - } - return replacedUrl; - } - - /** - * Creates a new request context for this server using the url with variables - * replaced with their respective values and the endpoint of the request appended. - * - * @param endpoint the endpoint to be queried on the server - * @param httpMethod httpMethod to be used - * - */ - public makeRequestContext(endpoint: string, httpMethod: HttpMethod): RequestContext { - return new RequestContext(this.getUrl() + endpoint, httpMethod); - } -} - -export function getServers(siteUrl: string) { - const server1 = new ServerConfiguration<{}>(`https://${siteUrl}/api`, {}); - const servers = [server1]; - return servers; -} diff --git a/packages/kirakira-backend/tsconfig.json b/packages/kirakira-backend/tsconfig.json deleted file mode 100755 index 47330387..00000000 --- a/packages/kirakira-backend/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - /* Basic Options */ - "target": "es6", - "esModuleInterop": true, - "moduleResolution": "node", - "declaration": true, - "noImplicitAny": false, - - /* Additional Checks */ - "noUnusedLocals": false, /* Report errors on unused locals. */ // TODO: reenable (unused imports!) - "noUnusedParameters": false, /* Report errors on unused parameters. */ // TODO: set to true again - "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - "removeComments": true, - "sourceMap": true, - "outDir": "./dist", - "noLib": false, - "lib": [ "es6", "dom" ], - }, - "exclude": [ - "dist", - "node_modules" - ], - "filesGlob": [ - "./**/*.ts", - ] -} diff --git a/packages/kirakira-backend/types/ObjectParamAPI.ts b/packages/kirakira-backend/types/ObjectParamAPI.ts deleted file mode 100755 index 8afde77a..00000000 --- a/packages/kirakira-backend/types/ObjectParamAPI.ts +++ /dev/null @@ -1,484 +0,0 @@ -import { ResponseContext, RequestContext, HttpFile } from '../http/http'; -import { Configuration} from '../configuration' - -import { Comments200ResponseInner } from '../models/Comments200ResponseInner'; -import { GetDanmaku200ResponseInner } from '../models/GetDanmaku200ResponseInner'; -import { Users200Response } from '../models/Users200Response'; -import { VideoDetail200Response } from '../models/VideoDetail200Response'; -import { Videos200Response } from '../models/Videos200Response'; -import { Videos200ResponseCategoriesInner } from '../models/Videos200ResponseCategoriesInner'; -import { Videos200ResponsePaginationData } from '../models/Videos200ResponsePaginationData'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; - -import { ObservableDefaultApi } from "./ObservableAPI"; -import { DefaultApiRequestFactory, DefaultApiResponseProcessor} from "../apis/DefaultApi"; - -export interface DefaultApiCommentRequest { - /** - * parent comment ID - * @type number - * @memberof DefaultApicomment - */ - parent: number - /** - * comment message - * @type string - * @memberof DefaultApicomment - */ - content: string - /** - * comment\'s video ID - * @type number - * @memberof DefaultApicomment - */ - videoIDf: number -} - -export interface DefaultApiCommentsRequest { - /** - * video ID - * @type number - * @memberof DefaultApicomments - */ - id: number -} - -export interface DefaultApiCreateDanmakuRequest { - /** - * video ID for danmaku - * @type number - * @memberof DefaultApicreateDanmaku - */ - videoID: number - /** - * timestamp for danmaku - * @type string - * @memberof DefaultApicreateDanmaku - */ - timestamp: string - /** - * message - * @type string - * @memberof DefaultApicreateDanmaku - */ - message: string - /** - * type of comment - * @type string - * @memberof DefaultApicreateDanmaku - */ - type: string - /** - * comment color - * @type string - * @memberof DefaultApicreateDanmaku - */ - color: string - /** - * comment font size - * @type string - * @memberof DefaultApicreateDanmaku - */ - fontSize: string -} - -export interface DefaultApiDeleteCommentRequest { - /** - * comment ID - * @type number - * @memberof DefaultApideleteComment - */ - id: number -} - -export interface DefaultApiFollowRequest { - /** - * user ID - * @type number - * @memberof DefaultApifollow - */ - id: number -} - -export interface DefaultApiFollowFeedRequest { -} - -export interface DefaultApiGetDanmakuRequest { - /** - * video ID - * @type number - * @memberof DefaultApigetDanmaku - */ - id: number -} - -export interface DefaultApiLoginRequest { - /** - * search string - * @type string - * @memberof DefaultApilogin - */ - username: string - /** - * sort category - * @type string - * @memberof DefaultApilogin - */ - password: string -} - -export interface DefaultApiLogoutRequest { -} - -export interface DefaultApiRecommendationsRequest { - /** - * video ID - * @type number - * @memberof DefaultApirecommendations - */ - id: number -} - -export interface DefaultApiRegisterRequest { - /** - * username to register - * @type string - * @memberof DefaultApiregister - */ - username: string - /** - * sort category - * @type string - * @memberof DefaultApiregister - */ - password: string - /** - * sort category - * @type string - * @memberof DefaultApiregister - */ - email: string -} - -export interface DefaultApiResetPasswordRequest { - /** - * old password - * @type string - * @memberof DefaultApiresetPassword - */ - oldpassword: string - /** - * new password - * @type string - * @memberof DefaultApiresetPassword - */ - newpassword: string -} - -export interface DefaultApiUpdateProfileRequest { - /** - * new username - * @type string - * @memberof DefaultApiupdateProfile - */ - username: string - /** - * new gender - * @type string - * @memberof DefaultApiupdateProfile - */ - gender: string - /** - * new birthdate - * @type string - * @memberof DefaultApiupdateProfile - */ - birthdate: string - /** - * new bio - * @type string - * @memberof DefaultApiupdateProfile - */ - bio: string -} - -export interface DefaultApiUploadRequest { - /** - * list of video tags - * @type Array<string> - * @memberof DefaultApiupload - */ - tags: Array - /** - * video title - * @type string - * @memberof DefaultApiupload - */ - title: string - /** - * video description - * @type string - * @memberof DefaultApiupload - */ - description: string - /** - * category - * @type string - * @memberof DefaultApiupload - */ - category: string - /** - * - * @type Array<HttpFile> - * @memberof DefaultApiupload - */ - filename?: Array -} - -export interface DefaultApiUpvoteRequest { - /** - * comment ID - * @type number - * @memberof DefaultApiupvote - */ - id: number - /** - * upvote score - * @type number - * @memberof DefaultApiupvote - */ - score: number -} - -export interface DefaultApiUpvoteVideoRequest { - /** - * video ID - * @type number - * @memberof DefaultApiupvoteVideo - */ - id: number - /** - * upvote score - * @type number - * @memberof DefaultApiupvoteVideo - */ - score: number -} - -export interface DefaultApiUsersRequest { - /** - * user ID - * @type number - * @memberof DefaultApiusers - */ - id: number -} - -export interface DefaultApiVideoDetailRequest { - /** - * video ID - * @type number - * @memberof DefaultApivideoDetail - */ - id: number -} - -export interface DefaultApiVideosRequest { - /** - * search string - * @type string - * @memberof DefaultApivideos - */ - search?: string - /** - * sort category - * @type string - * @memberof DefaultApivideos - */ - sortCategory?: string - /** - * sort category - * @type string - * @memberof DefaultApivideos - */ - order?: string - /** - * sort category - * @type string - * @memberof DefaultApivideos - */ - unapproved?: string - /** - * page number - * @type number - * @memberof DefaultApivideos - */ - pageNumber?: number - /** - * category - * @type string - * @memberof DefaultApivideos - */ - category?: string -} - -export class ObjectDefaultApi { - private api: ObservableDefaultApi - - public constructor(configuration: Configuration, requestFactory?: DefaultApiRequestFactory, responseProcessor?: DefaultApiResponseProcessor) { - this.api = new ObservableDefaultApi(configuration, requestFactory, responseProcessor); - } - - /** - * Comment on a video - * @param param the request object - */ - public comment(param: DefaultApiCommentRequest, options?: Configuration): Promise { - return this.api.comment(param.parent, param.content, param.videoIDf, options).toPromise(); - } - - /** - * Get comments for video ID - * @param param the request object - */ - public comments(param: DefaultApiCommentsRequest, options?: Configuration): Promise> { - return this.api.comments(param.id, options).toPromise(); - } - - /** - * Create new danmaku - * @param param the request object - */ - public createDanmaku(param: DefaultApiCreateDanmakuRequest, options?: Configuration): Promise { - return this.api.createDanmaku(param.videoID, param.timestamp, param.message, param.type, param.color, param.fontSize, options).toPromise(); - } - - /** - * Delete a comment - * @param param the request object - */ - public deleteComment(param: DefaultApiDeleteCommentRequest, options?: Configuration): Promise { - return this.api.deleteComment(param.id, options).toPromise(); - } - - /** - * Upvote a video - * @param param the request object - */ - public follow(param: DefaultApiFollowRequest, options?: Configuration): Promise { - return this.api.follow(param.id, options).toPromise(); - } - - /** - * Upvote a video - * @param param the request object - */ - public followFeed(param: DefaultApiFollowFeedRequest = {}, options?: Configuration): Promise> { - return this.api.followFeed( options).toPromise(); - } - - /** - * Get danmaku for video - * @param param the request object - */ - public getDanmaku(param: DefaultApiGetDanmakuRequest, options?: Configuration): Promise> { - return this.api.getDanmaku(param.id, options).toPromise(); - } - - /** - * Log the user in - * @param param the request object - */ - public login(param: DefaultApiLoginRequest, options?: Configuration): Promise { - return this.api.login(param.username, param.password, options).toPromise(); - } - - /** - * Log user out - * @param param the request object - */ - public logout(param: DefaultApiLogoutRequest = {}, options?: Configuration): Promise { - return this.api.logout( options).toPromise(); - } - - /** - * Get list of videos - * @param param the request object - */ - public recommendations(param: DefaultApiRecommendationsRequest, options?: Configuration): Promise> { - return this.api.recommendations(param.id, options).toPromise(); - } - - /** - * Register user - * @param param the request object - */ - public register(param: DefaultApiRegisterRequest, options?: Configuration): Promise { - return this.api.register(param.username, param.password, param.email, options).toPromise(); - } - - /** - * Reset password - * @param param the request object - */ - public resetPassword(param: DefaultApiResetPasswordRequest, options?: Configuration): Promise { - return this.api.resetPassword(param.oldpassword, param.newpassword, options).toPromise(); - } - - /** - * Update user\'s profile - * @param param the request object - */ - public updateProfile(param: DefaultApiUpdateProfileRequest, options?: Configuration): Promise { - return this.api.updateProfile(param.username, param.gender, param.birthdate, param.bio, options).toPromise(); - } - - /** - * Upload a new video - * @param param the request object - */ - public upload(param: DefaultApiUploadRequest, options?: Configuration): Promise { - return this.api.upload(param.tags, param.title, param.description, param.category, param.filename, options).toPromise(); - } - - /** - * Get user video data - * @param param the request object - */ - public upvote(param: DefaultApiUpvoteRequest, options?: Configuration): Promise { - return this.api.upvote(param.id, param.score, options).toPromise(); - } - - /** - * Upvote a video - * @param param the request object - */ - public upvoteVideo(param: DefaultApiUpvoteVideoRequest, options?: Configuration): Promise { - return this.api.upvoteVideo(param.id, param.score, options).toPromise(); - } - - /** - * Get user video data - * @param param the request object - */ - public users(param: DefaultApiUsersRequest, options?: Configuration): Promise { - return this.api.users(param.id, options).toPromise(); - } - - /** - * Get list of videos - * @param param the request object - */ - public videoDetail(param: DefaultApiVideoDetailRequest, options?: Configuration): Promise { - return this.api.videoDetail(param.id, options).toPromise(); - } - - /** - * Get list of videos - * @param param the request object - */ - public videos(param: DefaultApiVideosRequest = {}, options?: Configuration): Promise { - return this.api.videos(param.search, param.sortCategory, param.order, param.unapproved, param.pageNumber, param.category, options).toPromise(); - } - -} diff --git a/packages/kirakira-backend/types/ObservableAPI.ts b/packages/kirakira-backend/types/ObservableAPI.ts deleted file mode 100755 index 98352dcb..00000000 --- a/packages/kirakira-backend/types/ObservableAPI.ts +++ /dev/null @@ -1,490 +0,0 @@ -import { ResponseContext, RequestContext, HttpFile } from '../http/http'; -import { Configuration} from '../configuration' -import { Observable, of, from } from '../rxjsStub'; -import {mergeMap, map} from '../rxjsStub'; -import { Comments200ResponseInner } from '../models/Comments200ResponseInner'; -import { GetDanmaku200ResponseInner } from '../models/GetDanmaku200ResponseInner'; -import { Users200Response } from '../models/Users200Response'; -import { VideoDetail200Response } from '../models/VideoDetail200Response'; -import { Videos200Response } from '../models/Videos200Response'; -import { Videos200ResponseCategoriesInner } from '../models/Videos200ResponseCategoriesInner'; -import { Videos200ResponsePaginationData } from '../models/Videos200ResponsePaginationData'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; - -import { DefaultApiRequestFactory, DefaultApiResponseProcessor} from "../apis/DefaultApi"; -export class ObservableDefaultApi { - private requestFactory: DefaultApiRequestFactory; - private responseProcessor: DefaultApiResponseProcessor; - private configuration: Configuration; - - public constructor( - configuration: Configuration, - requestFactory?: DefaultApiRequestFactory, - responseProcessor?: DefaultApiResponseProcessor - ) { - this.configuration = configuration; - this.requestFactory = requestFactory || new DefaultApiRequestFactory(configuration); - this.responseProcessor = responseProcessor || new DefaultApiResponseProcessor(); - } - - /** - * Comment on a video - * @param parent parent comment ID - * @param content comment message - * @param videoIDf comment\'s video ID - */ - public comment(parent: number, content: string, videoIDf: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.comment(parent, content, videoIDf, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.comment(rsp))); - })); - } - - /** - * Get comments for video ID - * @param id video ID - */ - public comments(id: number, _options?: Configuration): Observable> { - const requestContextPromise = this.requestFactory.comments(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.comments(rsp))); - })); - } - - /** - * Create new danmaku - * @param videoID video ID for danmaku - * @param timestamp timestamp for danmaku - * @param message message - * @param type type of comment - * @param color comment color - * @param fontSize comment font size - */ - public createDanmaku(videoID: number, timestamp: string, message: string, type: string, color: string, fontSize: string, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.createDanmaku(videoID, timestamp, message, type, color, fontSize, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.createDanmaku(rsp))); - })); - } - - /** - * Delete a comment - * @param id comment ID - */ - public deleteComment(id: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.deleteComment(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.deleteComment(rsp))); - })); - } - - /** - * Upvote a video - * @param id user ID - */ - public follow(id: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.follow(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.follow(rsp))); - })); - } - - /** - * Upvote a video - */ - public followFeed(_options?: Configuration): Observable> { - const requestContextPromise = this.requestFactory.followFeed(_options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.followFeed(rsp))); - })); - } - - /** - * Get danmaku for video - * @param id video ID - */ - public getDanmaku(id: number, _options?: Configuration): Observable> { - const requestContextPromise = this.requestFactory.getDanmaku(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.getDanmaku(rsp))); - })); - } - - /** - * Log the user in - * @param username search string - * @param password sort category - */ - public login(username: string, password: string, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.login(username, password, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.login(rsp))); - })); - } - - /** - * Log user out - */ - public logout(_options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.logout(_options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.logout(rsp))); - })); - } - - /** - * Get list of videos - * @param id video ID - */ - public recommendations(id: number, _options?: Configuration): Observable> { - const requestContextPromise = this.requestFactory.recommendations(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.recommendations(rsp))); - })); - } - - /** - * Register user - * @param username username to register - * @param password sort category - * @param email sort category - */ - public register(username: string, password: string, email: string, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.register(username, password, email, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.register(rsp))); - })); - } - - /** - * Reset password - * @param oldpassword old password - * @param newpassword new password - */ - public resetPassword(oldpassword: string, newpassword: string, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.resetPassword(oldpassword, newpassword, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.resetPassword(rsp))); - })); - } - - /** - * Update user\'s profile - * @param username new username - * @param gender new gender - * @param birthdate new birthdate - * @param bio new bio - */ - public updateProfile(username: string, gender: string, birthdate: string, bio: string, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.updateProfile(username, gender, birthdate, bio, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.updateProfile(rsp))); - })); - } - - /** - * Upload a new video - * @param tags list of video tags - * @param title video title - * @param description video description - * @param category category - * @param filename - */ - public upload(tags: Array, title: string, description: string, category: string, filename?: Array, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.upload(tags, title, description, category, filename, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.upload(rsp))); - })); - } - - /** - * Get user video data - * @param id comment ID - * @param score upvote score - */ - public upvote(id: number, score: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.upvote(id, score, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.upvote(rsp))); - })); - } - - /** - * Upvote a video - * @param id video ID - * @param score upvote score - */ - public upvoteVideo(id: number, score: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.upvoteVideo(id, score, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.upvoteVideo(rsp))); - })); - } - - /** - * Get user video data - * @param id user ID - */ - public users(id: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.users(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.users(rsp))); - })); - } - - /** - * Get list of videos - * @param id video ID - */ - public videoDetail(id: number, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.videoDetail(id, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.videoDetail(rsp))); - })); - } - - /** - * Get list of videos - * @param search search string - * @param sortCategory sort category - * @param order sort category - * @param unapproved sort category - * @param pageNumber page number - * @param category category - */ - public videos(search?: string, sortCategory?: string, order?: string, unapproved?: string, pageNumber?: number, category?: string, _options?: Configuration): Observable { - const requestContextPromise = this.requestFactory.videos(search, sortCategory, order, unapproved, pageNumber, category, _options); - - // build promise chain - let middlewarePreObservable = from(requestContextPromise); - for (let middleware of this.configuration.middleware) { - middlewarePreObservable = middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => middleware.pre(ctx))); - } - - return middlewarePreObservable.pipe(mergeMap((ctx: RequestContext) => this.configuration.httpApi.send(ctx))). - pipe(mergeMap((response: ResponseContext) => { - let middlewarePostObservable = of(response); - for (let middleware of this.configuration.middleware) { - middlewarePostObservable = middlewarePostObservable.pipe(mergeMap((rsp: ResponseContext) => middleware.post(rsp))); - } - return middlewarePostObservable.pipe(map((rsp: ResponseContext) => this.responseProcessor.videos(rsp))); - })); - } - -} diff --git a/packages/kirakira-backend/types/PromiseAPI.ts b/packages/kirakira-backend/types/PromiseAPI.ts deleted file mode 100755 index fb87e04b..00000000 --- a/packages/kirakira-backend/types/PromiseAPI.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { ResponseContext, RequestContext, HttpFile } from '../http/http'; -import { Configuration} from '../configuration' - -import { Comments200ResponseInner } from '../models/Comments200ResponseInner'; -import { GetDanmaku200ResponseInner } from '../models/GetDanmaku200ResponseInner'; -import { Users200Response } from '../models/Users200Response'; -import { VideoDetail200Response } from '../models/VideoDetail200Response'; -import { Videos200Response } from '../models/Videos200Response'; -import { Videos200ResponseCategoriesInner } from '../models/Videos200ResponseCategoriesInner'; -import { Videos200ResponsePaginationData } from '../models/Videos200ResponsePaginationData'; -import { Videos200ResponseVideosInner } from '../models/Videos200ResponseVideosInner'; -import { ObservableDefaultApi } from './ObservableAPI'; - -import { DefaultApiRequestFactory, DefaultApiResponseProcessor} from "../apis/DefaultApi"; -export class PromiseDefaultApi { - private api: ObservableDefaultApi - - public constructor( - configuration: Configuration, - requestFactory?: DefaultApiRequestFactory, - responseProcessor?: DefaultApiResponseProcessor - ) { - this.api = new ObservableDefaultApi(configuration, requestFactory, responseProcessor); - } - - /** - * Comment on a video - * @param parent parent comment ID - * @param content comment message - * @param videoIDf comment\'s video ID - */ - public comment(parent: number, content: string, videoIDf: number, _options?: Configuration): Promise { - const result = this.api.comment(parent, content, videoIDf, _options); - return result.toPromise(); - } - - /** - * Get comments for video ID - * @param id video ID - */ - public comments(id: number, _options?: Configuration): Promise> { - const result = this.api.comments(id, _options); - return result.toPromise(); - } - - /** - * Create new danmaku - * @param videoID video ID for danmaku - * @param timestamp timestamp for danmaku - * @param message message - * @param type type of comment - * @param color comment color - * @param fontSize comment font size - */ - public createDanmaku(videoID: number, timestamp: string, message: string, type: string, color: string, fontSize: string, _options?: Configuration): Promise { - const result = this.api.createDanmaku(videoID, timestamp, message, type, color, fontSize, _options); - return result.toPromise(); - } - - /** - * Delete a comment - * @param id comment ID - */ - public deleteComment(id: number, _options?: Configuration): Promise { - const result = this.api.deleteComment(id, _options); - return result.toPromise(); - } - - /** - * Upvote a video - * @param id user ID - */ - public follow(id: number, _options?: Configuration): Promise { - const result = this.api.follow(id, _options); - return result.toPromise(); - } - - /** - * Upvote a video - */ - public followFeed(_options?: Configuration): Promise> { - const result = this.api.followFeed(_options); - return result.toPromise(); - } - - /** - * Get danmaku for video - * @param id video ID - */ - public getDanmaku(id: number, _options?: Configuration): Promise> { - const result = this.api.getDanmaku(id, _options); - return result.toPromise(); - } - - /** - * Log the user in - * @param username search string - * @param password sort category - */ - public login(username: string, password: string, _options?: Configuration): Promise { - const result = this.api.login(username, password, _options); - return result.toPromise(); - } - - /** - * Log user out - */ - public logout(_options?: Configuration): Promise { - const result = this.api.logout(_options); - return result.toPromise(); - } - - /** - * Get list of videos - * @param id video ID - */ - public recommendations(id: number, _options?: Configuration): Promise> { - const result = this.api.recommendations(id, _options); - return result.toPromise(); - } - - /** - * Register user - * @param username username to register - * @param password sort category - * @param email sort category - */ - public register(username: string, password: string, email: string, _options?: Configuration): Promise { - const result = this.api.register(username, password, email, _options); - return result.toPromise(); - } - - /** - * Reset password - * @param oldpassword old password - * @param newpassword new password - */ - public resetPassword(oldpassword: string, newpassword: string, _options?: Configuration): Promise { - const result = this.api.resetPassword(oldpassword, newpassword, _options); - return result.toPromise(); - } - - /** - * Update user\'s profile - * @param username new username - * @param gender new gender - * @param birthdate new birthdate - * @param bio new bio - */ - public updateProfile(username: string, gender: string, birthdate: string, bio: string, _options?: Configuration): Promise { - const result = this.api.updateProfile(username, gender, birthdate, bio, _options); - return result.toPromise(); - } - - /** - * Upload a new video - * @param tags list of video tags - * @param title video title - * @param description video description - * @param category category - * @param filename - */ - public upload(tags: Array, title: string, description: string, category: string, filename?: Array, _options?: Configuration): Promise { - const result = this.api.upload(tags, title, description, category, filename, _options); - return result.toPromise(); - } - - /** - * Get user video data - * @param id comment ID - * @param score upvote score - */ - public upvote(id: number, score: number, _options?: Configuration): Promise { - const result = this.api.upvote(id, score, _options); - return result.toPromise(); - } - - /** - * Upvote a video - * @param id video ID - * @param score upvote score - */ - public upvoteVideo(id: number, score: number, _options?: Configuration): Promise { - const result = this.api.upvoteVideo(id, score, _options); - return result.toPromise(); - } - - /** - * Get user video data - * @param id user ID - */ - public users(id: number, _options?: Configuration): Promise { - const result = this.api.users(id, _options); - return result.toPromise(); - } - - /** - * Get list of videos - * @param id video ID - */ - public videoDetail(id: number, _options?: Configuration): Promise { - const result = this.api.videoDetail(id, _options); - return result.toPromise(); - } - - /** - * Get list of videos - * @param search search string - * @param sortCategory sort category - * @param order sort category - * @param unapproved sort category - * @param pageNumber page number - * @param category category - */ - public videos(search?: string, sortCategory?: string, order?: string, unapproved?: string, pageNumber?: number, category?: string, _options?: Configuration): Promise { - const result = this.api.videos(search, sortCategory, order, unapproved, pageNumber, category, _options); - return result.toPromise(); - } - - -} - - - diff --git a/packages/kirakira-backend/util.ts b/packages/kirakira-backend/util.ts deleted file mode 100755 index 96ea3dfd..00000000 --- a/packages/kirakira-backend/util.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Returns if a specific http code is in a given code range - * where the code range is defined as a combination of digits - * and "X" (the letter X) with a length of 3 - * - * @param codeRange string with length 3 consisting of digits and "X" (the letter X) - * @param code the http status code to be checked against the code range - */ -export function isCodeInRange(codeRange: string, code: number): boolean { - // This is how the default value is encoded in OAG - if (codeRange === "0") { - return true; - } - if (codeRange == code.toString()) { - return true; - } else { - const codeString = code.toString(); - if (codeString.length != codeRange.length) { - return false; - } - for (let i = 0; i < codeString.length; i++) { - if (codeRange.charAt(i) != "X" && codeRange.charAt(i) != codeString.charAt(i)) { - return false; - } - } - return true; - } -} - -/** -* Returns if it can consume form -* -* @param consumes array -*/ -export function canConsumeForm(contentTypes: string[]): boolean { - return contentTypes.indexOf('multipart/form-data') !== -1 -} diff --git a/pages/category.vue b/pages/category.vue index deca3379..4570208b 100644 --- a/pages/category.vue +++ b/pages/category.vue @@ -1,5 +1,5 @@