1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-09 20:22:47 +01:00

generate open api schema based on body and db entities

This commit is contained in:
Flam3rboy 2021-09-01 23:33:14 +02:00
parent b5456f10cc
commit 1a76c663d2
10 changed files with 1853 additions and 768 deletions

1625
api/assets/openapi.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,136 +0,0 @@
openapi: 3.0.3
info:
title: Fosscord
version: '9'
license:
name: GNU AGPLv3
url: https://www.gnu.org/licenses/agpl.txt
x-last-modified: 1625409195984
x-logo:
url: ''
servers:
- url: https://api.fosscord.com
description: ''
x-last-modified: 1625407844365
paths:
/users/:id:
summary: get user
description: test
get:
tags: []
responses:
'200':
$ref: '#/components/responses/User'
x-last-modified: 1625409722629
parameters:
- name: id
in: path
required: true
deprecated: false
x-last-modified: 1625409813480
x-last-modified: 1625409704895
components:
schemas:
User:
type: object
properties:
avatar:
type: string
example:
- d83f330fc30367f859bc6ee358b14319
bot:
type: boolean
example:
- false
desktop:
type: boolean
example:
- false
discriminator:
type: string
example:
- '0001'
email:
type: string
example:
- example@example.org
flags:
type: string
example:
- '0'
id:
type: string
example:
- '732645009894277321'
mfa_enabled:
type: boolean
example:
- false
mobile:
type: boolean
example:
- false
nsfw_allowed:
type: boolean
example:
- true
premium:
type: boolean
example:
- false
premium_type:
type: number
example:
- 0
public_flags:
type: string
example:
- '0'
username:
type: string
example:
- Example
verified:
type: boolean
example:
- true
example:
avatar: d83f330fc30367f859bc6ee358b14319
bot: false
desktop: false
discriminator: '0001'
email: example@example.org
flags: '0'
id: '732645009894277321'
mfa_enabled: false
mobile: false
nsfw_allowed: true
premium: false
premium_type: 0
public_flags: '0'
username: Example
verified: true
x-last-modified: 1625409630283
required: []
description: test
securitySchemes:
JWTAuth:
scheme: bearer
bearerFormat: JWT
type: http
description: |-
Example:
> Authorization: Bot <token>
x-last-modified: 1625407825787
headers: {}
responses:
User:
content:
application/json:
schema:
$ref: '#/components/schemas/User'
x-last-modified: 1625409578903
parameters: {}
security:
- JWTAuth: []
tags: []

View File

@ -1,526 +0,0 @@
swagger: "2.0"
info:
description: "Fosscord backend api docs"
version: "1.0.0"
title: "Fosscord Backend API"
termsOfService: "https://github.com/fosscord/fosscord/blob/master/LICENSE"
license:
name: "AGPL 3.0"
url: "https://www.gnu.org/licenses/agpl-3.0.html"
host: "dev.fosscord.com"
basePath: "/api/v9"
tags:
- name: "Audit Log"
description: "Guild Audit Log resource"
externalDocs:
description: "Find out more"
url: "https://discord.com/developers/docs/resources/audit-log"
- name: "Channel"
description: "Channel resource"
externalDocs:
description: "Find out more"
url: "https://discord.com/developers/docs/resources/channel"
schemes:
- "https"
- "http"
paths:
/guilds/{guildId}/audit-logs:
get:
summary: "Returns an audit log object for the guild. Requires the 'VIEW_AUDIT_LOG' permission."
tags:
- Audit Log
parameters:
- $ref: "#/definitionsParam/guildId"
- name: user_id
in: query
type: string
description: "Type of snowflake - Filter the log for actions made by a user"
- name: action_type
in: query
type: integer
description: "The type of audit log event"
- name: before
in: query
type: string
description: "Type of snowflake - Filter the log before a certain entry id"
- name: limit
in: query
type: integer
description: "How many entries are returned (default 50, minimum 1, maximum 100)"
responses:
'200':
description: "Audit Log Object"
schema:
$ref: "#/definitions/Audit%20Log"
/channels/{channelId}:
get:
summary: "Get a channel by ID. Returns a channel object. If the channel is a thread, a thread member object is included in the returned result."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
responses:
'200':
description: "Channel Object"
schema:
$ref: "#/definitions/Channel"
patch:
summary: "Update a channel's settings. Returns a channel on success, and a 400 BAD REQUEST on invalid parameters. All JSON parameters are optional."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- name: body (Group DM)
in: body
description: "The request body when modifying Group DM channels - Fires a Channel Update Gateway event."
schema:
type: object
properties:
name:
type: string
description: "1-100 character channel name"
icon:
type: string
format: byte
description: "base64 encoded icon"
- name: body (Guild channel)
in: body
description: "Requires the MANAGE_CHANNELS permission for the guild. Fires a Channel Update Gateway event. If modifying a category, individual Channel Update events will fire for each child channel that also changes. If modifying permission overwrites, the MANAGE_ROLES permission is required. Only permissions your bot has in the guild or channel can be allowed/denied (unless your bot has a MANAGE_ROLES overwrite in the channel)."
schema:
type: object
properties:
name:
type: string
description: "1-100 character channel name"
type:
type: integer
description: "The type of channel; only conversion between text and news is supported and only in guilds with the \"NEWS\" feature"
position:
type: integer
default: null
description: "The position of the channel in the left-hand listing"
topic:
type: string
default: null
description: "0-1024 character channel topic"
nsfw:
type: boolean
default: null
description: "Whether the channel is nsfw"
rate_limit_per_user:
type: integer
default: null
description: "Amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission manage_messages or manage_channel, are unaffected"
bitrate:
type: integer
default: null
description: "The bitrate (in bits) of the voice channel; 8000 to 96000 (128000 for VIP servers)"
user_limit:
type: integer
default: null
description: "The user limit of the voice channel; 0 refers to no limit, 1 to 99 refers to a user limit"
permission_overwrites:
type: array
items:
$ref: "#/definitions/Overwrite"
default: null
description: "Channel or category-specific permissions"
parent_id:
$ref: "#/definitions/Snowflake"
default: null
description: "Id of the new parent category for a channel"
rtc_region:
type: string
default: null
description: "Channel voice region id, automatic when set to null"
video_quality_mode:
type: integer
default: null
description: "The camera video quality mode of the voice channel"
default_auto_archive_duration:
type: integer
default: null
description: "The default duration for newly created threads in the channel, in minutes, to automatically archive the thread after recent activity"
- name: body (Thread)
in: body
description: "When setting archived to false, when locked is also false, only the SEND_MESSAGES permission is required.Otherwise, requires the MANAGE_THREADS permission. Fires a Thread Update Gateway event. Requires the thread to have archived set to false or be set to false in the request."
schema:
type: object
properties:
name:
type: string
description: "1-100 character channel name"
archived:
type: boolean
description: "Whether the channel is archived"
auto_archive_duration:
type: integer
description: "Duration in minutes to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080 (The 3 day and 7 day archive durations require the server to be boosted. The guild features will indicate if a server is able to use those settings)"
locked:
type: boolean
description: "When a thread is locked, only users with MANAGE_THREADS can unarchive it"
rate_limit_per_user:
type: integer
default: null
description: "Amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission manage_messages, manage_thread, or manage_channel, are unaffected"
responses:
'200':
description: "Channel Object"
schema:
$ref: "#/definitions/Channel"
'400':
description: "Bad Request due to invalid parameters"
delete:
summary: "Delete a channel, or close a private message. Requires the MANAGE_CHANNELS permission for the guild, or MANAGE_THREADS if the channel is a thread. Deleting a category does not delete its child channels; they will have their parent_id removed and a Channel Update Gateway event will fire for each of them. Returns a channel object on success. Fires a Channel Delete Gateway event (or Thread Delete if the channel was a thread)."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
responses:
'200':
description: "Channel deleted sucessfully"
/channels/{channelId}/messages:
get:
summary: "Returns the messages for a channel. If operating on a guild channel, this endpoint requires the VIEW_CHANNEL permission to be present on the current user. If the current user is missing the 'READ_MESSAGE_HISTORY' permission in the channel then this will return no messages (since they cannot read the message history). Returns an array of message objects on success."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- name: around
in: query
type: string
description: "Type of snowflake - Get messages around this message ID"
- name: before
in: query
type: string
description: "Type of snowflake - Get messages before this message ID"
- name: after
in: query
type: string
description: "Type of snowflake - Get messages after this message ID"
- name: limit
in: query
type: integer
description: "Max number of messages to return (1-100)"
default: 50
responses:
'200':
description: "Returns an array of message objects on success"
schema:
type: array
items:
$ref: "#/definitions/Message"
/channels/{channelId}/messages/{messageId}:
get:
summary: "Returns a specific message in the channel. If operating on a guild channel, this endpoint requires the 'READ_MESSAGE_HISTORY' permission to be present on the current user. Returns a message object on success."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
responses:
'200':
description: "Returns a message object on success"
schema:
$ref: "#/definitions/Message"
post:
summary: "Post a message to a guild text or DM channel. Returns a message object. Fires a Message Create Gateway event. See message formatting for more information on how to properly format messages."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- name: body
in: body
required: true
description: "Request body that contains the necessary data for creating messages"
schema:
type: object
properties:
content:
type: string
description: "The message contents (up to 2000 characters)"
tts:
type: boolean
description: "True if this is a TTS message"
default: null
file:
type: string
format: binary
description: "The contents of the file being sent"
embeds:
type: array
items:
$ref: "#/definitions/Embed"
description: "Embedded rich content (up to 6000 characters)"
payload_json:
type: string
description: "JSON encoded body of non-file params"
default: null
allowed_mentions:
$ref: "#/definitions/Allowed%20Mention"
description: "Allowed mentions for the message"
default: null
message_refrence:
$ref: "#/definitions/Message%20Refrence"
description: "Include to make your message a reply"
default: null
components:
type: array
items:
$ref: "#/definitions/Message%20Component"
default: null
responses:
'200':
description: "Returns a message object on success"
schema:
$ref: "#/definitions/Message"
patch:
summary: "Edit a previously sent message. The fields content, embeds, and flags can be edited by the original message author. Other users can only edit flags and only if they have the MANAGE_MESSAGES permission in the corresponding channel. When specifying flags, ensure to include all previously set flags/bits in addition to ones that you are modifying. Only flags documented in the table below may be modified by users (unsupported flag changes are currently ignored without error)."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- name: body
in: body
required: true
description: "Request body that contains the necessary data for editing messages"
schema:
type: object
properties:
content:
type: string
description: "The message contents (up to 2000 characters)"
embeds:
type: array
items:
$ref: "#/definitions/Embed"
description: "Embedded rich content (up to 6000 characters)"
flags:
type: integer
description: "Edit the flags of a message (only SUPPRESS_EMBEDS can currently be set/unset)"
file:
type: string
format: binary
description: "The contents of the file being sent/edited"
payload_json:
type: string
description: "JSON encoded body of non-file params (multipart/form-data only)"
default: null
allowed_mentions:
$ref: "#/definitions/Allowed%20Mention"
description: "Allowed mentions for the message"
default: null
message_refrence:
$ref: "#/definitions/Message%20Refrence"
description: "Include to make your message a reply"
default: null
components:
type: array
items:
$ref: "#/definitions/Message%20Component"
default: null
responses:
'200':
description: "Message edited"
delete:
summary: "Delete a message. If operating on a guild channel and trying to delete a message that was not sent by the current user, this endpoint requires the MANAGE_MESSAGES permission. Returns a 204 empty response on success. Fires a Message Delete Gateway event."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
responses:
'204':
description: "Returns a 204 empty response on success."
/channels/{channelId}/messages/{messageId}/crosspost:
post:
summary: "Crosspost a message in a News Channel to following channels. This endpoint requires the 'SEND_MESSAGES' permission, if the current user sent the message, or additionally the 'MANAGE_MESSAGES' permission, for all other messages, to be present for the current user."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
responses:
'200':
description: "Returns a message object on success"
schema:
$ref: "#/definitions/Message"
/channels/{channelId}/messages/{messageId}/reactions/{emoji}/@me:
put:
summary: "Create a reaction for the message. This endpoint requires the 'READ_MESSAGE_HISTORY' permission to be present on the current user. Additionally, if nobody else has reacted to the message using this emoji, this endpoint requires the 'ADD_REACTIONS' permission to be present on the current user. Returns a 204 empty response on success. The emoji must be URL Encoded or the request will fail with 10014: Unknown Emoji. To use custom emoji, you must encode it in the format name:id with the emoji name and emoji id."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- $ref: "#/definitionsParam/emoji"
responses:
'204':
description: "Returns a 204 empty response on success."
delete:
summary: "Delete a reaction the current user has made for the message. Returns a 204 empty response on success. The emoji must be URL Encoded or the request will fail with 10014: Unknown Emoji. To use custom emoji, you must encode it in the format name:id with the emoji name and emoji id."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- $ref: "#/definitionsParam/emoji"
responses:
'204':
description: "Returns a 204 empty response on success."
/channels/{channelId}/messages/{messageId}/reactions/{emoji}/{userId}:
delete:
summary: "Deletes another user's reaction. This endpoint requires the 'MANAGE_MESSAGES' permission to be present on the current user. Returns a 204 empty response on success. The emoji must be URL Encoded or the request will fail with 10014: Unknown Emoji. To use custom emoji, you must encode it in the format name:id with the emoji name and emoji id."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- $ref: "#/definitionsParam/emoji"
- $ref: "#/definitionsParam/userId"
responses:
'204':
description: "Returns a 204 empty response on success."
/channels/{channelId}/messages/{messageId}/reactions/{emoji}:
get:
summary: "Get a list of users that reacted with this emoji. Returns an array of user objects on success. The emoji must be URL Encoded or the request will fail with 10014: Unknown Emoji. To use custom emoji, you must encode it in the format name:id with the emoji name and emoji id."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- $ref: "#/definitionsParam/emoji"
- name: after
in: query
type: string
description: "Type of snowflake - Get users after this user ID"
- name: limit
in: query
type: integer
description: "Max number of users to return (1-100)"
default: 25
responses:
'200':
description: "Returns an array of user objects on success"
schema:
type: array
items:
$ref: "#/definitions/User"
delete:
summary: "Deletes all the reactions for a given emoji on a message. This endpoint requires the MANAGE_MESSAGES permission to be present on the current user. Fires a Message Reaction Remove Emoji Gateway event. The emoji must be URL Encoded or the request will fail with 10014: Unknown Emoji. To use custom emoji, you must encode it in the format name:id with the emoji name and emoji id."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
- $ref: "#/definitionsParam/emoji"
responses:
'204':
description: "Returns a 204 empty response on success."
/channels/{channelId}/messages/{messageId}/reactions:
delete:
summary: "Deletes all reactions on a message. This endpoint requires the 'MANAGE_MESSAGES' permission to be present on the current user. Fires a Message Reaction Remove All Gateway event."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
- $ref: "#/definitionsParam/messageId"
responses:
'204':
description: "Returns a 204 empty response on success."
/channels/{channelId}/messages/bulk-delete:
post:
summary: "Delete multiple messages in a single request. This endpoint can only be used on guild channels and requires the MANAGE_MESSAGES permission. Returns a 204 empty response on success. Fires a Message Delete Bulk Gateway event."
tags:
- Channel
parameters:
- $ref: "#/definitionsParam/channelId"
responses:
'204':
description: "Returns a 204 empty response on success."
definitions:
Snowflake:
type: string
pattern: "^\\d+$"
Audit Log:
type: object
properties:
webhooks:
type: array
items:
$ref: "#/definitions/Webhook"
description: "List of webhooks found in the audit log"
users:
type: array
items:
$ref: "#/definitions/User"
description: "List of users found in the audit log"
audit_log_entries:
type: array
items:
$ref: "#/definitions/Audit%20Log%20Entry"
description: "List of audit log entries"
integrations:
type: array
items:
$ref: "#/definitions/Integration"
description: "List of partial integration objects"
Audit Log Entry:
type: object
Webhook:
type: object
User:
type: object
Integration:
type: object
Channel:
type: object
Overwrite:
type: object
Message:
type: object
Embed:
type: object
Allowed Mention:
type: object
Message Refrence:
type: object
Message Component:
type: object
definitionsParam:
channelId:
name: channelId
in: path
required: true
type: string
description: "Type of snowflake - A channel Id"
messageId:
name: messageId
in: path
required: true
type: string
description: "Type of snowflake - A message ID"
guildId:
name: guildId
in: path
required: true
type: string
description: "Type of snowflake - A guild ID"
emoji:
name: emoji
in: path
required: true
type: string
format: url
description: "The emoji ID to use"
userId:
name: userId
in: path
required: true
type: string
description: "Type of snowflake - A user ID"
externalDocs:
description: "Discord API"
url: "https://discord.com/developers/docs/"

View File

@ -0,0 +1,14 @@
diff --git a/node_modules/typescript-json-schema/dist/typescript-json-schema.js b/node_modules/typescript-json-schema/dist/typescript-json-schema.js
index 47e1598..8397b9d 100644
--- a/node_modules/typescript-json-schema/dist/typescript-json-schema.js
+++ b/node_modules/typescript-json-schema/dist/typescript-json-schema.js
@@ -432,6 +432,9 @@ var JsonSchemaGenerator = (function () {
else if (flags & ts.TypeFlags.Boolean) {
definition.type = "boolean";
}
+ else if (flags & ts.TypeFlags.BigInt) {
+ definition.type = "bigint";
+ }
else if (flags & ts.TypeFlags.Null) {
definition.type = "null";
}

View File

@ -1,93 +0,0 @@
const { Snowflake } = require("@fosscord/server-util");
const crypto = require('crypto');
const fs = require('fs');
const defaultConfig = {
// TODO: Get the network interfaces dinamically
gateway: "ws://localhost",
general: {
instance_id: Snowflake.generate(),
},
permissions: {
user: {
createGuilds: true,
}
},
limits: {
user: {
maxGuilds: 100,
maxUsername: 32,
maxFriends: 1000,
},
guild: {
maxRoles: 250,
maxMembers: 250000,
maxChannels: 500,
maxChannelsInCategory: 50,
hideOfflineMember: 1000,
},
message: {
characters: 2000,
ttsCharacters: 200,
maxReactions: 20,
maxAttachmentSize: 8388608,
maxBulkDelete: 100,
},
channel: {
maxPins: 50,
maxTopic: 1024,
},
rate: {
ip: {
enabled: true,
count: 1000,
timespan: 1000 * 60 * 10,
},
routes: {},
},
},
security: {
jwtSecret: crypto.randomBytes(256).toString("base64"),
forwadedFor: null,
// forwadedFor: "X-Forwarded-For" // nginx/reverse proxy
// forwadedFor: "CF-Connecting-IP" // cloudflare:
captcha: {
enabled: false,
service: null,
sitekey: null,
secret: null,
},
},
login: {
requireCaptcha: false,
},
register: {
email: {
necessary: true,
allowlist: false,
blocklist: true,
domains: [], // TODO: efficiently save domain blocklist in database
// domains: fs.readFileSync(__dirname + "/blockedEmailDomains.txt", { encoding: "utf8" }).split("\n"),
},
dateOfBirth: {
necessary: true,
minimum: 13,
},
requireInvite: false,
requireCaptcha: true,
allowNewRegistration: true,
allowMultipleAccounts: true,
password: {
minLength: 8,
minNumbers: 2,
minUpperCase: 2,
minSymbols: 0,
blockInsecureCommonPasswords: false,
},
},
}
let data = JSON.stringify(defaultConfig);
fs.writeFileSync('./.docker/config/api.json', data);

View File

@ -0,0 +1,191 @@
// https://mermade.github.io/openapi-gui/#
// https://editor.swagger.io/
import path from "path";
import fs from "fs";
import * as TJS from "typescript-json-schema";
import "missing-native-js-functions";
const settings: TJS.PartialArgs = {
required: true,
ignoreErrors: true,
excludePrivate: true,
defaultNumberType: "integer",
noExtraProps: true,
defaultProps: false
};
const compilerOptions: TJS.CompilerOptions = {
strictNullChecks: false
};
const openapiPath = path.join(__dirname, "..", "assets", "openapi.json");
var specification = JSON.parse(fs.readFileSync(openapiPath, { encoding: "utf8" }));
async function generateSchemas() {
const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "..", "util", "src", "index.ts")], compilerOptions);
const generator = TJS.buildGenerator(program, settings);
const schemas = [
"Application",
"Attachment",
"Message",
"AuditLog",
"Ban",
"Channel",
"Emoji",
"Guild",
"Invite",
"ReadState",
"Recipient",
"Relationship",
"Role",
"Sticker",
"Team",
"TeamMember",
"Template",
"VoiceState",
"Webhook",
"User",
"UserPublic"
];
// @ts-ignore
const definitions = combineSchemas({ schemas, generator, program });
for (const key in definitions) {
specification.components.schemas[key] = definitions[key];
delete definitions[key].additionalProperties;
}
}
function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaGenerator; schemas: string[] }) {
var definitions: any = {};
for (const name of opts.schemas) {
const part = TJS.generateSchema(opts.program, name, settings, [], opts.generator as TJS.JsonSchemaGenerator);
if (!part) continue;
definitions = { ...definitions, ...part.definitions, [name]: { ...part, definitions: undefined, $schema: undefined } };
}
return definitions;
}
function generateBodies() {
const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "src", "schema", "index.ts")], compilerOptions);
const generator = TJS.buildGenerator(program, settings);
const schemas = [
"BanCreateSchema",
"DmChannelCreateSchema",
"ChannelModifySchema",
"ChannelGuildPositionUpdateSchema",
"ChannelGuildPositionUpdateSchema",
"EmojiCreateSchema",
"GuildCreateSchema",
"GuildUpdateSchema",
"GuildTemplateCreateSchema",
"GuildUpdateWelcomeScreenSchema",
"InviteCreateSchema",
"MemberCreateSchema",
"MemberNickChangeSchema",
"MemberChangeSchema",
"MessageCreateSchema",
"RoleModifySchema",
"TemplateCreateSchema",
"TemplateModifySchema",
"UserModifySchema",
"UserSettingsSchema",
"WidgetModifySchema"
];
// @ts-ignore
const definitions = combineSchemas({ schemas, generator, program });
for (const key in definitions) {
specification.components.requestBodies[key] = {
content: {
"application/json": { schema: definitions[key] }
},
description: ""
};
delete definitions[key].additionalProperties;
delete definitions[key].$schema;
}
}
function addDefaultResponses() {
Object.values(specification.paths).forEach((path: any) =>
Object.values(path).forEach((request: any) => {
if (!request.responses?.["401"]) {
request.responses["401"] = {
description: "Unauthorized",
content: { "application/json": { schema: { $ref: "#/components/schemas/Error" } } }
};
}
if (!request.responses?.["429"]) {
request.responses["429"] = {
description: "Rate limit exceeded",
content: { "application/json": { schema: { $ref: "#/components/schemas/Error" } } },
headers: {
"X-RateLimit-Bucket": {
description:
"A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path)",
schema: { type: "string" }
},
"X-Rate-Limit-Limit": {
description: "The number of allowed requests in the current period",
schema: {
type: "integer"
}
},
"X-Rate-Limit-Remaining": {
description: "The number of remaining requests in the current period",
schema: {
type: "integer"
}
},
"X-Rate-Limit-Reset": {
description: "Date when current period is over in seconds since the Unix epoch",
schema: {
type: "integer"
}
},
"X-Rate-Limit-Reset-After": {
description: "Number of seconds when current period will reset (can have decimal)",
schema: {
type: "number"
}
},
"Retry-After": {
description: "Same as X-Rate-Limit-Reset-After but an integer",
schema: {
type: "integer"
}
},
"X-RateLimit-Global": {
description: "Indicates whether or not all requests from your ip are rate limited",
schema: {
type: "boolean"
}
}
}
};
}
})
);
}
function main() {
addDefaultResponses();
generateSchemas();
specification = JSON.parse(JSON.stringify(specification).replaceAll("#/definitions", "#/components/schemas"));
generateBodies();
fs.writeFileSync(
openapiPath,
JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/requestBodies").replaceAll("bigint", "number")
);
}
main();

View File

@ -1,14 +1,13 @@
// https://discord.com/developers/docs/resources/emoji
export const EmojiCreateSchema = {
name: String, //name of the emoji
image: String, // image data the 128x128 emoji image uri
roles: Array //roles allowed to use this emoji
$roles: Array //roles allowed to use this emoji
};
export interface EmojiCreateSchema {
name: string; // name of the emoji
image: string; // image data the 128x128 emoji image uri
roles: []; //roles allowed to use this emoji
roles?: string[]; //roles allowed to use this emoji
}

View File

@ -48,7 +48,7 @@ export interface GuildUpdateSchema extends Omit<GuildCreateSchema, "channels"> {
banner?: string;
splash?: string;
description?: string;
features?: [string];
features?: string[];
verification_level?: number;
default_message_notifications?: number;
system_channel_flags?: number;

View File

@ -10,13 +10,13 @@ export const InviteCreateSchema = {
$target_user_type: Number
};
export interface InviteCreateSchema {
target_user_id?: String;
target_type?: String;
validate?: String; //? wtf is this
max_age?: Number;
max_uses?: Number;
temporary?: Boolean;
unique?: Boolean;
target_user?: String;
target_user_type?: Number;
target_user_id?: string;
target_type?: string;
validate?: string; //? wtf is this
max_age?: number;
max_uses?: number;
temporary?: boolean;
unique?: boolean;
target_user?: string;
target_user_type?: number;
}

11
api/src/schema/index.ts Normal file
View File

@ -0,0 +1,11 @@
export * from "./Ban";
export * from "./Channel";
export * from "./Emoji";
export * from "./Guild";
export * from "./Invite";
export * from "./Member";
export * from "./Message";
export * from "./Roles";
export * from "./Template";
export * from "./User";
export * from "./Widget";