✨ generate open api schema based on body and db entities
This commit is contained in:
parent
b5456f10cc
commit
1a76c663d2
1625
api/assets/openapi.json
Normal file
1625
api/assets/openapi.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -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: []
|
|
@ -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/"
|
|
14
api/patches/typescript-json-schema+0.50.1.patch
Normal file
14
api/patches/typescript-json-schema+0.50.1.patch
Normal 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";
|
||||||
|
}
|
@ -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);
|
|
||||||
|
|
191
api/scripts/generate_openapi_schema.ts
Normal file
191
api/scripts/generate_openapi_schema.ts
Normal 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();
|
@ -1,14 +1,13 @@
|
|||||||
// https://discord.com/developers/docs/resources/emoji
|
// https://discord.com/developers/docs/resources/emoji
|
||||||
|
|
||||||
|
|
||||||
export const EmojiCreateSchema = {
|
export const EmojiCreateSchema = {
|
||||||
name: String, //name of the emoji
|
name: String, //name of the emoji
|
||||||
image: String, // image data the 128x128 emoji image uri
|
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 {
|
export interface EmojiCreateSchema {
|
||||||
name: string; // name of the emoji
|
name: string; // name of the emoji
|
||||||
image: string; // image data the 128x128 emoji image uri
|
image: string; // image data the 128x128 emoji image uri
|
||||||
roles: []; //roles allowed to use this emoji
|
roles?: string[]; //roles allowed to use this emoji
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ export interface GuildUpdateSchema extends Omit<GuildCreateSchema, "channels"> {
|
|||||||
banner?: string;
|
banner?: string;
|
||||||
splash?: string;
|
splash?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
features?: [string];
|
features?: string[];
|
||||||
verification_level?: number;
|
verification_level?: number;
|
||||||
default_message_notifications?: number;
|
default_message_notifications?: number;
|
||||||
system_channel_flags?: number;
|
system_channel_flags?: number;
|
||||||
|
@ -10,13 +10,13 @@ export const InviteCreateSchema = {
|
|||||||
$target_user_type: Number
|
$target_user_type: Number
|
||||||
};
|
};
|
||||||
export interface InviteCreateSchema {
|
export interface InviteCreateSchema {
|
||||||
target_user_id?: String;
|
target_user_id?: string;
|
||||||
target_type?: String;
|
target_type?: string;
|
||||||
validate?: String; //? wtf is this
|
validate?: string; //? wtf is this
|
||||||
max_age?: Number;
|
max_age?: number;
|
||||||
max_uses?: Number;
|
max_uses?: number;
|
||||||
temporary?: Boolean;
|
temporary?: boolean;
|
||||||
unique?: Boolean;
|
unique?: boolean;
|
||||||
target_user?: String;
|
target_user?: string;
|
||||||
target_user_type?: Number;
|
target_user_type?: number;
|
||||||
}
|
}
|
||||||
|
11
api/src/schema/index.ts
Normal file
11
api/src/schema/index.ts
Normal 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";
|
Loading…
x
Reference in New Issue
Block a user