From 0f928e479cbd81b17710da5dad14a092f23cdf0d Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 24 Mar 2023 04:16:58 +1100 Subject: [PATCH] Work towards fixing openapi spec --- assets/openapi.json | Bin 234568 -> 240160 bytes assets/schemas.json | Bin 1177730 -> 1426718 bytes scripts/openapi.js | 16 +++++----- scripts/schema.js | 34 ++++++++++++++++++---- src/api/routes/gateway/bot.ts | 11 ------- src/api/routes/gateway/index.ts | 4 --- src/api/routes/users/#id/profile.ts | 9 ------ src/api/routes/users/#id/relationships.ts | 10 ------- src/util/entities/User.ts | 2 +- src/util/schemas/GatewayBotResponse.ts | 10 +++++++ src/util/schemas/GatewayResponse.ts | 3 ++ src/util/schemas/UserProfileResponse.ts | 8 +++++ src/util/schemas/UserRelationsResponse.ts | 9 ++++++ src/util/schemas/index.ts | 4 +++ 14 files changed, 72 insertions(+), 48 deletions(-) create mode 100644 src/util/schemas/GatewayBotResponse.ts create mode 100644 src/util/schemas/GatewayResponse.ts create mode 100644 src/util/schemas/UserProfileResponse.ts create mode 100644 src/util/schemas/UserRelationsResponse.ts diff --git a/assets/openapi.json b/assets/openapi.json index 92847d12297164b1376f108345d4851aa451cbf7..069eacedaad4c5477b7c1188eb27cc7ea4dcc2ee 100644 GIT binary patch delta 4907 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 delta 721 zcmbQ&72fpGeZ!}U>H9AWgiT*Qn^khNb<0A3Fn2T0{l^g2c6lpCHUI7MQy9zrr}uj@ zMQuOzj`6ksb|BNle>zY&bo-~pOlSP2zu(Lpwf)myre^^VCQlSIr~h`K=&4YUK*ILV zA}sF$Avy$#SelX{%!3bDHU&VKi)>icpbEavU=;|Me&3%hal6wO*24kYflRi5?fX}; zef66TBxAO}VqxcsfiSgl*bhd76o+k>zRZ5w55g4FkLW)YcgkRc#8eZxdXx#G`r{H;)bY>wu?90U>Fx|9DCG-R%c3iw5WA~|e(NR_}uzwN*jwE*hfK0U!1(C`5= zIkv}k2wsF57W+u>DU?}gBlH5woW&w?$`@kA ({ name: x })); specification.components = specification.components || {}; - specification.components.securitySchemes = { - bearer: { - type: "http", - scheme: "bearer", - description: "Bearer/Bot prefixes are not required.", + specification.components.securitySchemes = [ + { + bearer: { + type: "http", + scheme: "bearer", + description: "Bearer/Bot prefixes are not required.", + }, }, - }; + ]; routes.forEach((route, pathAndMethod) => { const [p, method] = pathAndMethod.split("|"); @@ -109,7 +111,7 @@ function apiRoutes() { return x.test(path); }) ) { - obj.security = [{ bearer: true }]; + obj.security = [{ bearer: [] }]; } if (route.body) { diff --git a/scripts/schema.js b/scripts/schema.js index be1a7a3f..bd0f73d3 100644 --- a/scripts/schema.js +++ b/scripts/schema.js @@ -91,9 +91,9 @@ function main() { if (!part) continue; // this is a hack. want some want to check if its a @column, instead - if (part.properties) - Object.keys(part.properties) - .filter((key) => + if (part.properties) { + for (let key in part.properties) { + if ( [ // BaseClass methods "toJSON", @@ -104,9 +104,31 @@ function main() { "recover", "reload", "assign", - ].includes(key), - ) - .forEach((key) => delete part.properties[key]); + ].includes(key) + ) { + delete part.properties[key]; + continue; + } + + if (part.properties[key].anyOf) { + const nullIndex = part.properties[key].anyOf.findIndex( + (x) => x.type == "null", + ); + if (nullIndex != -1) { + part.properties[key].nullable = true; + part.properties[key].anyOf.splice(nullIndex, 1); + + if (part.properties[key].anyOf.length == 1) { + Object.assign( + part.properties[key], + part.properties[key].anyOf[0], + ); + delete part.properties[key].anyOf; + } + } + } + } + } definitions = { ...definitions, [name]: { ...part } }; } diff --git a/src/api/routes/gateway/bot.ts b/src/api/routes/gateway/bot.ts index 070debe3..02049b19 100644 --- a/src/api/routes/gateway/bot.ts +++ b/src/api/routes/gateway/bot.ts @@ -22,17 +22,6 @@ import { route, RouteOptions } from "@fosscord/api"; const router = Router(); -export interface GatewayBotResponse { - url: string; - shards: number; - session_start_limit: { - total: number; - remaining: number; - reset_after: number; - max_concurrency: number; - }; -} - const options: RouteOptions = { test: { response: { diff --git a/src/api/routes/gateway/index.ts b/src/api/routes/gateway/index.ts index e6fcf5e3..f5ed4c1f 100644 --- a/src/api/routes/gateway/index.ts +++ b/src/api/routes/gateway/index.ts @@ -22,10 +22,6 @@ import { route, RouteOptions } from "@fosscord/api"; const router = Router(); -export interface GatewayResponse { - url: string; -} - const options: RouteOptions = { test: { response: { diff --git a/src/api/routes/users/#id/profile.ts b/src/api/routes/users/#id/profile.ts index dbf95a52..92b4a0fc 100644 --- a/src/api/routes/users/#id/profile.ts +++ b/src/api/routes/users/#id/profile.ts @@ -18,9 +18,7 @@ import { Router, Request, Response } from "express"; import { - PublicConnectedAccount, User, - UserPublic, Member, UserProfileModifySchema, handleFile, @@ -32,13 +30,6 @@ import { route } from "@fosscord/api"; const router: Router = Router(); -export interface UserProfileResponse { - user: UserPublic; - connected_accounts: PublicConnectedAccount; - premium_guild_since?: Date; - premium_since?: Date; -} - router.get( "/", route({ test: { response: { body: "UserProfileResponse" } } }), diff --git a/src/api/routes/users/#id/relationships.ts b/src/api/routes/users/#id/relationships.ts index e915e3ff..04a407b7 100644 --- a/src/api/routes/users/#id/relationships.ts +++ b/src/api/routes/users/#id/relationships.ts @@ -22,16 +22,6 @@ import { route } from "@fosscord/api"; const router: Router = Router(); -export interface UserRelationsResponse { - object: { - id?: string; - username?: string; - avatar?: string; - discriminator?: string; - public_flags?: number; - }; -} - router.get( "/", route({ test: { response: { body: "UserRelationsResponse" } } }), diff --git a/src/util/entities/User.ts b/src/util/entities/User.ts index f99a85e7..8dfb0254 100644 --- a/src/util/entities/User.ts +++ b/src/util/entities/User.ts @@ -111,7 +111,7 @@ export class User extends BaseClass { banner?: string; // hash of the user banner @Column({ nullable: true, type: "simple-array" }) - theme_colors?: number[]; // TODO: Separate `User` and `UserProfile` models + theme_colors?: [number, number]; // TODO: Separate `User` and `UserProfile` models @Column({ nullable: true }) pronouns?: string; diff --git a/src/util/schemas/GatewayBotResponse.ts b/src/util/schemas/GatewayBotResponse.ts new file mode 100644 index 00000000..30f1f57f --- /dev/null +++ b/src/util/schemas/GatewayBotResponse.ts @@ -0,0 +1,10 @@ +export interface GatewayBotResponse { + url: string; + shards: number; + session_start_limit: { + total: number; + remaining: number; + reset_after: number; + max_concurrency: number; + }; +} diff --git a/src/util/schemas/GatewayResponse.ts b/src/util/schemas/GatewayResponse.ts new file mode 100644 index 00000000..e909f7bd --- /dev/null +++ b/src/util/schemas/GatewayResponse.ts @@ -0,0 +1,3 @@ +export interface GatewayResponse { + url: string; +} diff --git a/src/util/schemas/UserProfileResponse.ts b/src/util/schemas/UserProfileResponse.ts new file mode 100644 index 00000000..467d787f --- /dev/null +++ b/src/util/schemas/UserProfileResponse.ts @@ -0,0 +1,8 @@ +import { PublicConnectedAccount, UserPublic } from ".."; + +export interface UserProfileResponse { + user: UserPublic; + connected_accounts: PublicConnectedAccount; + premium_guild_since?: Date; + premium_since?: Date; +} diff --git a/src/util/schemas/UserRelationsResponse.ts b/src/util/schemas/UserRelationsResponse.ts new file mode 100644 index 00000000..1ec15eca --- /dev/null +++ b/src/util/schemas/UserRelationsResponse.ts @@ -0,0 +1,9 @@ +export interface UserRelationsResponse { + object: { + id?: string; + username?: string; + avatar?: string; + discriminator?: string; + public_flags?: number; + }; +} diff --git a/src/util/schemas/index.ts b/src/util/schemas/index.ts index 44909a3a..150a2dea 100644 --- a/src/util/schemas/index.ts +++ b/src/util/schemas/index.ts @@ -76,3 +76,7 @@ export * from "./VoiceVideoSchema"; export * from "./WebAuthnSchema"; export * from "./WebhookCreateSchema"; export * from "./WidgetModifySchema"; +export * from "./UserRelationsResponse"; +export * from "./GatewayResponse"; +export * from "./GatewayBotResponse"; +export * from "./UserProfileResponse";