diff --git a/api/assets/openapi.json b/api/assets/openapi.json
new file mode 100644
index 00000000..60a40c8a
--- /dev/null
+++ b/api/assets/openapi.json
@@ -0,0 +1,1625 @@
+{
+ "openapi": "3.0.0",
+ "servers": [
+ {
+ "url": "https://api.fosscord.com/v{version}",
+ "description": "Official fosscord instance",
+ "variables": { "version": { "description": "", "default": "9", "enum": ["8", "9"] } }
+ }
+ ],
+ "info": {
+ "description": "Fosscord is a free open source selfhostable chat, voice and video discord compatible platform",
+ "version": "1.0.0",
+ "title": "Swagger Petstore",
+ "termsOfService": "",
+ "contact": { "name": "Fosscord" },
+ "license": { "name": "AGPLV3", "url": "https://www.gnu.org/licenses/agpl-3.0.en.html" }
+ },
+ "tags": [],
+ "paths": {
+ "/users/{id}": {
+ "get": {
+ "summary": "",
+ "description": "",
+ "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" }, "description": "user id" }],
+ "operationId": "",
+ "responses": {
+ "200": {
+ "description": "user found",
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } }
+ },
+ "401": {
+ "description": "Unauthorized",
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
+ },
+ "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" }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "externalDocs": { "description": "", "url": "http://docs.fosscord.com/" },
+ "components": {
+ "schemas": {
+ "Error": {
+ "type": "object",
+ "properties": { "code": { "type": "integer" }, "message": { "type": "string" } },
+ "required": ["code", "message"]
+ },
+ "RateLimit": {
+ "type": "object",
+ "properties": { "retry_after": { "type": "integer" }, "message": { "type": "string" }, "global": { "type": "boolean" } },
+ "required": ["code", "message", "globa"]
+ },
+ "User": {
+ "type": "object",
+ "properties": {
+ "username": { "type": "string" },
+ "discriminator": { "type": "string" },
+ "avatar": { "type": "string" },
+ "accent_color": { "type": "integer" },
+ "banner": { "type": "string" },
+ "phone": { "type": "string" },
+ "desktop": { "type": "boolean" },
+ "mobile": { "type": "boolean" },
+ "premium": { "type": "boolean" },
+ "premium_type": { "type": "integer" },
+ "bot": { "type": "boolean" },
+ "bio": { "type": "string" },
+ "system": { "type": "boolean" },
+ "nsfw_allowed": { "type": "boolean" },
+ "mfa_enabled": { "type": "boolean" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "verified": { "type": "boolean" },
+ "disabled": { "type": "boolean" },
+ "deleted": { "type": "boolean" },
+ "email": { "type": "string" },
+ "flags": { "type": "string" },
+ "public_flags": { "type": "string" },
+ "relationships": { "type": "array", "items": { "$ref": "#/components/schemas/Relationship" } },
+ "connected_accounts": { "type": "array", "items": { "$ref": "#/components/schemas/ConnectedAccount" } },
+ "data": {
+ "type": "object",
+ "properties": { "valid_tokens_since": { "type": "string", "format": "date-time" }, "hash": { "type": "string" } },
+ "additionalProperties": false,
+ "required": ["valid_tokens_since"]
+ },
+ "fingerprints": { "type": "array", "items": { "type": "string" } },
+ "settings": { "$ref": "#/components/schemas/UserSettings" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "bio",
+ "bot",
+ "connected_accounts",
+ "created_at",
+ "data",
+ "deleted",
+ "desktop",
+ "disabled",
+ "discriminator",
+ "fingerprints",
+ "flags",
+ "id",
+ "mfa_enabled",
+ "mobile",
+ "nsfw_allowed",
+ "premium",
+ "premium_type",
+ "public_flags",
+ "relationships",
+ "settings",
+ "system",
+ "username",
+ "verified"
+ ]
+ },
+ "Relationship": {
+ "type": "object",
+ "properties": {
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "nickname": { "type": "string" },
+ "type": { "$ref": "#/components/schemas/RelationshipType" },
+ "id": { "type": "string" }
+ },
+ "required": ["id", "type", "user", "user_id"]
+ },
+ "RelationshipType": { "enum": [1, 2, 3, 4], "type": "number" },
+ "ConnectedAccount": {
+ "type": "object",
+ "properties": {
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "access_token": { "type": "string" },
+ "friend_sync": { "type": "boolean" },
+ "name": { "type": "string" },
+ "revoked": { "type": "boolean" },
+ "show_activity": { "type": "boolean" },
+ "type": { "type": "string" },
+ "verifie": { "type": "boolean" },
+ "visibility": { "type": "integer" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "access_token",
+ "friend_sync",
+ "id",
+ "name",
+ "revoked",
+ "show_activity",
+ "type",
+ "user",
+ "user_id",
+ "verifie",
+ "visibility"
+ ]
+ },
+ "UserSettings": {
+ "type": "object",
+ "properties": {
+ "afk_timeout": { "type": "integer" },
+ "allow_accessibility_detection": { "type": "boolean" },
+ "animate_emoji": { "type": "boolean" },
+ "animate_stickers": { "type": "integer" },
+ "contact_sync_enabled": { "type": "boolean" },
+ "convert_emoticons": { "type": "boolean" },
+ "custom_status": {
+ "type": "object",
+ "properties": {
+ "emoji_id": { "type": "string" },
+ "emoji_name": { "type": "string" },
+ "expires_at": { "type": "integer" },
+ "text": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "default_guilds_restricted": { "type": "boolean" },
+ "detect_platform_accounts": { "type": "boolean" },
+ "developer_mode": { "type": "boolean" },
+ "disable_games_tab": { "type": "boolean" },
+ "enable_tts_command": { "type": "boolean" },
+ "explicit_content_filter": { "type": "integer" },
+ "friend_source_flags": {
+ "type": "object",
+ "properties": { "all": { "type": "boolean" } },
+ "additionalProperties": false,
+ "required": ["all"]
+ },
+ "gateway_connected": { "type": "boolean" },
+ "gif_auto_play": { "type": "boolean" },
+ "guild_folders": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "color": { "type": "integer" },
+ "guild_ids": { "type": "array", "items": { "type": "string" } },
+ "id": { "type": "integer" },
+ "name": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["color", "guild_ids", "id", "name"]
+ }
+ },
+ "guild_positions": { "type": "array", "items": { "type": "string" } },
+ "inline_attachment_media": { "type": "boolean" },
+ "inline_embed_media": { "type": "boolean" },
+ "locale": { "type": "string" },
+ "message_display_compact": { "type": "boolean" },
+ "native_phone_integration_enabled": { "type": "boolean" },
+ "render_embeds": { "type": "boolean" },
+ "render_reactions": { "type": "boolean" },
+ "restricted_guilds": { "type": "array", "items": { "type": "string" } },
+ "show_current_game": { "type": "boolean" },
+ "status": { "enum": ["dnd", "idle", "offline", "online"], "type": "string" },
+ "stream_notifications_enabled": { "type": "boolean" },
+ "theme": { "enum": ["dark", "white"], "type": "string" },
+ "timezone_offset": { "type": "integer" }
+ },
+ "required": [
+ "afk_timeout",
+ "allow_accessibility_detection",
+ "animate_emoji",
+ "animate_stickers",
+ "contact_sync_enabled",
+ "convert_emoticons",
+ "custom_status",
+ "default_guilds_restricted",
+ "detect_platform_accounts",
+ "developer_mode",
+ "disable_games_tab",
+ "enable_tts_command",
+ "explicit_content_filter",
+ "friend_source_flags",
+ "gateway_connected",
+ "gif_auto_play",
+ "guild_folders",
+ "guild_positions",
+ "inline_attachment_media",
+ "inline_embed_media",
+ "locale",
+ "message_display_compact",
+ "native_phone_integration_enabled",
+ "render_embeds",
+ "render_reactions",
+ "restricted_guilds",
+ "show_current_game",
+ "status",
+ "stream_notifications_enabled",
+ "theme",
+ "timezone_offset"
+ ]
+ },
+ "Team": {
+ "type": "object",
+ "properties": {
+ "icon": { "type": "string" },
+ "members": { "type": "array", "items": { "$ref": "#/components/schemas/TeamMember" } },
+ "name": { "type": "string" },
+ "owner_user_id": { "type": "string" },
+ "owner_user": { "$ref": "#/components/schemas/User" },
+ "id": { "type": "string" }
+ },
+ "required": ["id", "members", "name", "owner_user", "owner_user_id"]
+ },
+ "TeamMember": {
+ "type": "object",
+ "properties": {
+ "membership_state": { "$ref": "#/components/schemas/TeamMemberState" },
+ "permissions": { "type": "array", "items": { "type": "string" } },
+ "team_id": { "type": "string" },
+ "team": { "$ref": "#/components/schemas/Team" },
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "id": { "type": "string" }
+ },
+ "required": ["id", "membership_state", "permissions", "team", "team_id", "user", "user_id"]
+ },
+ "TeamMemberState": { "enum": [1, 2], "type": "number" },
+ "Guild": {
+ "type": "object",
+ "properties": {
+ "afk_channel_id": { "type": "string" },
+ "afk_channel": { "$ref": "#/components/schemas/Channel" },
+ "afk_timeout": { "type": "integer" },
+ "bans": { "type": "array", "items": { "$ref": "#/components/schemas/Ban" } },
+ "banner": { "type": "string" },
+ "default_message_notifications": { "type": "integer" },
+ "description": { "type": "string" },
+ "discovery_splash": { "type": "string" },
+ "explicit_content_filter": { "type": "integer" },
+ "features": { "type": "array", "items": { "type": "string" } },
+ "icon": { "type": "string" },
+ "large": { "type": "boolean" },
+ "max_members": { "type": "integer" },
+ "max_presences": { "type": "integer" },
+ "max_video_channel_users": { "type": "integer" },
+ "member_count": { "type": "integer" },
+ "presence_count": { "type": "integer" },
+ "members": { "type": "array", "items": { "$ref": "#/components/schemas/Member" } },
+ "roles": { "type": "array", "items": { "$ref": "#/components/schemas/Role" } },
+ "channels": { "type": "array", "items": { "$ref": "#/components/schemas/Channel" } },
+ "template_id": { "type": "string" },
+ "template": { "$ref": "#/components/schemas/Template" },
+ "emojis": { "type": "array", "items": { "$ref": "#/components/schemas/Emoji" } },
+ "stickers": { "type": "array", "items": { "$ref": "#/components/schemas/Sticker" } },
+ "invites": { "type": "array", "items": { "$ref": "#/components/schemas/Invite" } },
+ "voice_states": { "type": "array", "items": { "$ref": "#/components/schemas/VoiceState" } },
+ "webhooks": { "type": "array", "items": { "$ref": "#/components/schemas/Webhook" } },
+ "mfa_level": { "type": "integer" },
+ "name": { "type": "string" },
+ "owner_id": { "type": "string" },
+ "owner": { "$ref": "#/components/schemas/User" },
+ "preferred_locale": { "type": "string" },
+ "premium_subscription_count": { "type": "integer" },
+ "premium_tier": { "type": "integer" },
+ "public_updates_channel_id": { "type": "string" },
+ "public_updates_channel": { "$ref": "#/components/schemas/Channel" },
+ "rules_channel_id": { "type": "string" },
+ "rules_channel": { "type": "string" },
+ "region": { "type": "string" },
+ "splash": { "type": "string" },
+ "system_channel_id": { "type": "string" },
+ "system_channel": { "$ref": "#/components/schemas/Channel" },
+ "system_channel_flags": { "type": "integer" },
+ "unavailable": { "type": "boolean" },
+ "vanity_url_code": { "type": "string" },
+ "vanity_url": { "$ref": "#/components/schemas/Invite" },
+ "verification_level": { "type": "integer" },
+ "welcome_screen": {
+ "type": "object",
+ "properties": {
+ "enabled": { "type": "boolean" },
+ "description": { "type": "string" },
+ "welcome_channels": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "description": { "type": "string" },
+ "emoji_id": { "type": "string" },
+ "emoji_name": { "type": "string" },
+ "channel_id": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["channel_id", "description", "emoji_name"]
+ }
+ }
+ },
+ "additionalProperties": false,
+ "required": ["description", "enabled", "welcome_channels"]
+ },
+ "widget_channel_id": { "type": "string" },
+ "widget_channel": { "$ref": "#/components/schemas/Channel" },
+ "widget_enabled": { "type": "boolean" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "bans",
+ "channels",
+ "emojis",
+ "features",
+ "id",
+ "invites",
+ "members",
+ "name",
+ "owner",
+ "owner_id",
+ "public_updates_channel_id",
+ "roles",
+ "stickers",
+ "template",
+ "template_id",
+ "voice_states",
+ "webhooks",
+ "welcome_screen"
+ ]
+ },
+ "Channel": {
+ "type": "object",
+ "properties": {
+ "created_at": { "type": "string", "format": "date-time" },
+ "name": { "type": "string" },
+ "type": { "$ref": "#/components/schemas/ChannelType" },
+ "recipients": { "type": "array", "items": { "$ref": "#/components/schemas/Recipient" } },
+ "last_message_id": { "type": "string" },
+ "last_message": { "$ref": "#/components/schemas/Message" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "parent_id": { "type": "string" },
+ "parent": { "$ref": "#/components/schemas/Channel" },
+ "owner_id": { "type": "string" },
+ "owner": { "$ref": "#/components/schemas/User" },
+ "last_pin_timestamp": { "type": "integer" },
+ "default_auto_archive_duration": { "type": "integer" },
+ "position": { "type": "integer" },
+ "permission_overwrites": { "type": "array", "items": { "$ref": "#/components/schemas/ChannelPermissionOverwrite" } },
+ "video_quality_mode": { "type": "integer" },
+ "bitrate": { "type": "integer" },
+ "user_limit": { "type": "integer" },
+ "nsfw": { "type": "boolean" },
+ "rate_limit_per_user": { "type": "integer" },
+ "topic": { "type": "string" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "created_at",
+ "guild",
+ "id",
+ "last_message_id",
+ "name",
+ "owner",
+ "owner_id",
+ "parent_id",
+ "permission_overwrites",
+ "position",
+ "type"
+ ]
+ },
+ "ChannelType": { "enum": [0, 1, 2, 3, 4, 5, 6], "type": "number" },
+ "Recipient": {
+ "type": "object",
+ "properties": {
+ "channel_id": { "type": "string" },
+ "channel": { "$ref": "#/components/schemas/Channel" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "id": { "type": "string" }
+ },
+ "required": ["channel", "channel_id", "id", "user"]
+ },
+ "Message": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "channel_id": { "type": "string" },
+ "channel": { "$ref": "#/components/schemas/Channel" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "author_id": { "type": "string" },
+ "author": { "$ref": "#/components/schemas/User" },
+ "member_id": { "type": "string" },
+ "member": { "$ref": "#/components/schemas/Member" },
+ "webhook_id": { "type": "string" },
+ "webhook": { "$ref": "#/components/schemas/Webhook" },
+ "application_id": { "type": "string" },
+ "application": { "$ref": "#/components/schemas/Application" },
+ "content": { "type": "string" },
+ "timestamp": { "type": "string", "format": "date-time" },
+ "edited_timestamp": { "type": "string", "format": "date-time" },
+ "tts": { "type": "boolean" },
+ "mention_everyone": { "type": "boolean" },
+ "mentions": { "type": "array", "items": { "$ref": "#/components/schemas/User" } },
+ "mention_roles": { "type": "array", "items": { "$ref": "#/components/schemas/Role" } },
+ "mention_channels": { "type": "array", "items": { "$ref": "#/components/schemas/Channel" } },
+ "sticker_items": { "type": "array", "items": { "$ref": "#/components/schemas/Sticker" } },
+ "attachments": { "type": "array", "items": { "$ref": "#/components/schemas/Attachment" } },
+ "embeds": { "type": "array", "items": { "$ref": "#/components/schemas/Embed" } },
+ "reactions": { "type": "array", "items": { "$ref": "#/components/schemas/Reaction" } },
+ "nonce": { "type": "string" },
+ "pinned": { "type": "boolean" },
+ "type": { "$ref": "#/components/schemas/MessageType" },
+ "activity": {
+ "type": "object",
+ "properties": { "type": { "type": "integer" }, "party_id": { "type": "string" } },
+ "additionalProperties": false,
+ "required": ["party_id", "type"]
+ },
+ "flags": { "type": "string" },
+ "message_reference": {
+ "type": "object",
+ "properties": {
+ "message_id": { "type": "string" },
+ "channel_id": { "type": "string" },
+ "guild_id": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["message_id"]
+ },
+ "referenced_message": { "$ref": "#/components/schemas/Message" },
+ "interaction": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "type": { "$ref": "#/components/schemas/InteractionType" },
+ "name": { "type": "string" },
+ "user_id": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["id", "name", "type", "user_id"]
+ },
+ "components": { "type": "array", "items": { "$ref": "#/components/schemas/MessageComponent" } }
+ },
+ "required": [
+ "application_id",
+ "author_id",
+ "channel",
+ "channel_id",
+ "embeds",
+ "id",
+ "member_id",
+ "mention_channels",
+ "mention_roles",
+ "mentions",
+ "reactions",
+ "timestamp",
+ "type",
+ "webhook_id"
+ ]
+ },
+ "Member": {
+ "type": "object",
+ "properties": {
+ "user": { "$ref": "#/components/schemas/User" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "nick": { "type": "string" },
+ "roles": { "type": "array", "items": { "$ref": "#/components/schemas/Role" } },
+ "joined_at": { "type": "string", "format": "date-time" },
+ "premium_since": { "type": "integer" },
+ "deaf": { "type": "boolean" },
+ "mute": { "type": "boolean" },
+ "pending": { "type": "boolean" },
+ "settings": { "$ref": "#/components/schemas/UserGuildSettings" },
+ "id": { "type": "string" }
+ },
+ "required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user"]
+ },
+ "Role": {
+ "type": "object",
+ "properties": {
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "color": { "type": "integer" },
+ "hoist": { "type": "boolean" },
+ "managed": { "type": "boolean" },
+ "mentionable": { "type": "boolean" },
+ "name": { "type": "string" },
+ "permissions": { "type": "string" },
+ "position": { "type": "integer" },
+ "tags": {
+ "type": "object",
+ "properties": {
+ "bot_id": { "type": "string" },
+ "integration_id": { "type": "string" },
+ "premium_subscriber": { "type": "boolean" }
+ },
+ "additionalProperties": false
+ },
+ "id": { "type": "string" }
+ },
+ "required": ["color", "guild", "guild_id", "hoist", "id", "managed", "mentionable", "name", "permissions", "position"]
+ },
+ "UserGuildSettings": {
+ "type": "object",
+ "properties": {
+ "channel_overrides": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "channel_id": { "type": "string" },
+ "message_notifications": { "type": "integer" },
+ "mute_config": { "$ref": "#/components/schemas/MuteConfig" },
+ "muted": { "type": "boolean" }
+ },
+ "additionalProperties": false,
+ "required": ["channel_id", "message_notifications", "mute_config", "muted"]
+ }
+ },
+ "message_notifications": { "type": "integer" },
+ "mobile_push": { "type": "boolean" },
+ "mute_config": { "$ref": "#/components/schemas/MuteConfig" },
+ "muted": { "type": "boolean" },
+ "suppress_everyone": { "type": "boolean" },
+ "suppress_roles": { "type": "boolean" },
+ "version": { "type": "integer" }
+ },
+ "required": [
+ "channel_overrides",
+ "message_notifications",
+ "mobile_push",
+ "mute_config",
+ "muted",
+ "suppress_everyone",
+ "suppress_roles",
+ "version"
+ ]
+ },
+ "MuteConfig": {
+ "type": "object",
+ "properties": { "end_time": { "type": "integer" }, "selected_time_window": { "type": "integer" } },
+ "required": ["end_time", "selected_time_window"]
+ },
+ "Webhook": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "type": { "$ref": "#/components/schemas/WebhookType" },
+ "name": { "type": "string" },
+ "avatar": { "type": "string" },
+ "token": { "type": "string" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "channel_id": { "type": "string" },
+ "channel": { "$ref": "#/components/schemas/Channel" },
+ "application_id": { "type": "string" },
+ "application": { "$ref": "#/components/schemas/Application" },
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "source_guild_id": { "type": "string" },
+ "source_guild": { "$ref": "#/components/schemas/Guild" }
+ },
+ "required": [
+ "application",
+ "application_id",
+ "channel",
+ "channel_id",
+ "guild",
+ "guild_id",
+ "id",
+ "source_guild",
+ "source_guild_id",
+ "type",
+ "user",
+ "user_id"
+ ]
+ },
+ "WebhookType": { "enum": [1, 2], "type": "number" },
+ "Application": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "icon": { "type": "string" },
+ "description": { "type": "string" },
+ "rpc_origins": { "type": "array", "items": { "type": "string" } },
+ "bot_public": { "type": "boolean" },
+ "bot_require_code_grant": { "type": "boolean" },
+ "terms_of_service_url": { "type": "string" },
+ "privacy_policy_url": { "type": "string" },
+ "owner": { "$ref": "#/components/schemas/User" },
+ "summary": { "type": "string" },
+ "verify_key": { "type": "string" },
+ "team": { "$ref": "#/components/schemas/Team" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "primary_sku_id": { "type": "string" },
+ "slug": { "type": "string" },
+ "cover_image": { "type": "string" },
+ "flags": { "type": "string" },
+ "id": { "type": "string" }
+ },
+ "required": ["bot_public", "bot_require_code_grant", "description", "flags", "guild", "id", "name", "verify_key"]
+ },
+ "Sticker": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "description": { "type": "string" },
+ "tags": { "type": "string" },
+ "pack_id": { "type": "string" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "type": { "$ref": "#/components/schemas/StickerType" },
+ "format_type": { "$ref": "#/components/schemas/StickerFormatType" },
+ "id": { "type": "string" }
+ },
+ "required": ["format_type", "id", "name", "pack_id", "tags", "type"]
+ },
+ "StickerType": { "enum": [1, 2], "type": "number" },
+ "StickerFormatType": { "enum": [1, 2, 3], "type": "number" },
+ "Attachment": {
+ "type": "object",
+ "properties": {
+ "filename": { "type": "string" },
+ "size": { "type": "integer" },
+ "url": { "type": "string" },
+ "proxy_url": { "type": "string" },
+ "height": { "type": "integer" },
+ "width": { "type": "integer" },
+ "content_type": { "type": "string" },
+ "message_id": { "type": "string" },
+ "message": { "$ref": "#/components/schemas/Message" },
+ "id": { "type": "string" }
+ },
+ "required": ["filename", "id", "message", "message_id", "proxy_url", "size", "url"]
+ },
+ "Embed": {
+ "type": "object",
+ "properties": {
+ "title": { "type": "string" },
+ "type": { "$ref": "#/components/schemas/EmbedType" },
+ "description": { "type": "string" },
+ "url": { "type": "string" },
+ "timestamp": { "type": "string", "format": "date-time" },
+ "color": { "type": "integer" },
+ "footer": {
+ "type": "object",
+ "properties": {
+ "text": { "type": "string" },
+ "icon_url": { "type": "string" },
+ "proxy_icon_url": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["text"]
+ },
+ "image": { "$ref": "#/components/schemas/EmbedImage" },
+ "thumbnail": { "$ref": "#/components/schemas/EmbedImage" },
+ "video": { "$ref": "#/components/schemas/EmbedImage" },
+ "provider": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "url": { "type": "string" } },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "url": { "type": "string" },
+ "icon_url": { "type": "string" },
+ "proxy_icon_url": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "value": { "type": "string" }, "inline": { "type": "boolean" } },
+ "additionalProperties": false,
+ "required": ["name", "value"]
+ }
+ }
+ }
+ },
+ "EmbedType": { "enum": ["article", "gifv", "image", "link", "rich", "video"], "type": "string" },
+ "EmbedImage": {
+ "type": "object",
+ "properties": {
+ "url": { "type": "string" },
+ "proxy_url": { "type": "string" },
+ "height": { "type": "integer" },
+ "width": { "type": "integer" }
+ }
+ },
+ "Reaction": {
+ "type": "object",
+ "properties": {
+ "count": { "type": "integer" },
+ "emoji": { "$ref": "#/components/schemas/PartialEmoji" },
+ "user_ids": { "type": "array", "items": { "type": "string" } }
+ },
+ "required": ["count", "emoji", "user_ids"]
+ },
+ "PartialEmoji": {
+ "type": "object",
+ "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "animated": { "type": "boolean" } },
+ "required": ["name"]
+ },
+ "MessageType": { "enum": [0, 1, 10, 11, 12, 14, 15, 19, 2, 20, 3, 4, 5, 6, 7, 8, 9], "type": "number" },
+ "InteractionType": { "enum": [1, 2], "type": "number" },
+ "MessageComponent": {
+ "type": "object",
+ "properties": {
+ "type": { "type": "integer" },
+ "style": { "type": "integer" },
+ "label": { "type": "string" },
+ "emoji": { "$ref": "#/components/schemas/PartialEmoji" },
+ "custom_id": { "type": "string" },
+ "url": { "type": "string" },
+ "disabled": { "type": "boolean" },
+ "components": { "type": "array", "items": { "$ref": "#/components/schemas/MessageComponent" } }
+ },
+ "required": ["components", "type"]
+ },
+ "ChannelPermissionOverwrite": {
+ "type": "object",
+ "properties": {
+ "allow": { "type": "number" },
+ "deny": { "type": "number" },
+ "id": { "type": "string" },
+ "type": { "$ref": "#/components/schemas/ChannelPermissionOverwriteType" }
+ },
+ "required": ["allow", "deny", "id", "type"]
+ },
+ "ChannelPermissionOverwriteType": { "enum": [0, 1], "type": "number" },
+ "Ban": {
+ "type": "object",
+ "properties": {
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "executor_id": { "type": "string" },
+ "executor": { "$ref": "#/components/schemas/User" },
+ "ip": { "type": "string" },
+ "reason": { "type": "string" },
+ "id": { "type": "string" }
+ },
+ "required": ["executor", "executor_id", "guild", "guild_id", "id", "ip", "user", "user_id"]
+ },
+ "Template": {
+ "type": "object",
+ "properties": {
+ "code": { "type": "string" },
+ "name": { "type": "string" },
+ "description": { "type": "string" },
+ "usage_count": { "type": "integer" },
+ "creator_id": { "type": "string" },
+ "creator": { "$ref": "#/components/schemas/User" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "updated_at": { "type": "string", "format": "date-time" },
+ "source_guild_id": { "type": "string" },
+ "source_guild": { "$ref": "#/components/schemas/Guild" },
+ "serialized_source_guild": { "$ref": "#/components/schemas/Guild" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "code",
+ "created_at",
+ "creator",
+ "creator_id",
+ "id",
+ "name",
+ "serialized_source_guild",
+ "source_guild",
+ "source_guild_id",
+ "updated_at"
+ ]
+ },
+ "Emoji": {
+ "type": "object",
+ "properties": {
+ "animated": { "type": "boolean" },
+ "available": { "type": "boolean" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "managed": { "type": "boolean" },
+ "name": { "type": "string" },
+ "require_colons": { "type": "boolean" },
+ "id": { "type": "string" }
+ },
+ "required": ["animated", "available", "guild", "guild_id", "id", "managed", "name", "require_colons"]
+ },
+ "Invite": {
+ "type": "object",
+ "properties": {
+ "code": { "type": "string" },
+ "temporary": { "type": "boolean" },
+ "uses": { "type": "integer" },
+ "max_uses": { "type": "integer" },
+ "max_age": { "type": "integer" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "expires_at": { "type": "string", "format": "date-time" },
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "channel_id": { "type": "string" },
+ "channel": { "$ref": "#/components/schemas/Channel" },
+ "inviter_id": { "type": "string" },
+ "inviter": { "$ref": "#/components/schemas/User" },
+ "target_user_id": { "type": "string" },
+ "target_user": { "type": "string" },
+ "target_user_type": { "type": "integer" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "channel",
+ "channel_id",
+ "code",
+ "created_at",
+ "expires_at",
+ "guild",
+ "guild_id",
+ "id",
+ "inviter",
+ "inviter_id",
+ "max_age",
+ "max_uses",
+ "target_user_id",
+ "temporary",
+ "uses"
+ ]
+ },
+ "VoiceState": {
+ "type": "object",
+ "properties": {
+ "guild_id": { "type": "string" },
+ "guild": { "$ref": "#/components/schemas/Guild" },
+ "channel_id": { "type": "string" },
+ "channel": { "$ref": "#/components/schemas/Channel" },
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "session_id": { "type": "string" },
+ "deaf": { "type": "boolean" },
+ "mute": { "type": "boolean" },
+ "self_deaf": { "type": "boolean" },
+ "self_mute": { "type": "boolean" },
+ "self_stream": { "type": "boolean" },
+ "self_video": { "type": "boolean" },
+ "suppress": { "type": "boolean" },
+ "id": { "type": "string" }
+ },
+ "required": [
+ "channel",
+ "channel_id",
+ "deaf",
+ "guild_id",
+ "id",
+ "mute",
+ "self_deaf",
+ "self_mute",
+ "self_video",
+ "session_id",
+ "suppress",
+ "user",
+ "user_id"
+ ]
+ },
+ "AuditLogEvents": {
+ "enum": [
+ 1, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 40, 41, 42, 50, 51, 52, 60, 61, 62, 72, 73,
+ 74, 75, 80, 81, 82
+ ],
+ "type": "number"
+ },
+ "AuditLogChange": {
+ "type": "object",
+ "properties": {
+ "new_value": { "$ref": "#/components/schemas/AuditLogChangeValue" },
+ "old_value": { "$ref": "#/components/schemas/AuditLogChangeValue" },
+ "key": { "type": "string" }
+ },
+ "required": ["key"]
+ },
+ "AuditLogChangeValue": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "description": { "type": "string" },
+ "icon_hash": { "type": "string" },
+ "splash_hash": { "type": "string" },
+ "discovery_splash_hash": { "type": "string" },
+ "banner_hash": { "type": "string" },
+ "owner_id": { "type": "string" },
+ "region": { "type": "string" },
+ "preferred_locale": { "type": "string" },
+ "afk_channel_id": { "type": "string" },
+ "afk_timeout": { "type": "integer" },
+ "rules_channel_id": { "type": "string" },
+ "public_updates_channel_id": { "type": "string" },
+ "mfa_level": { "type": "integer" },
+ "verification_level": { "type": "integer" },
+ "explicit_content_filter": { "type": "integer" },
+ "default_message_notifications": { "type": "integer" },
+ "vanity_url_code": { "type": "string" },
+ "$add": { "type": "array", "items": { "type": "object", "properties": {} } },
+ "$remove": { "type": "array", "items": { "type": "object", "properties": {} } },
+ "prune_delete_days": { "type": "integer" },
+ "widget_enabled": { "type": "boolean" },
+ "widget_channel_id": { "type": "string" },
+ "system_channel_id": { "type": "string" },
+ "position": { "type": "integer" },
+ "topic": { "type": "string" },
+ "bitrate": { "type": "integer" },
+ "permission_overwrites": { "type": "array", "items": { "$ref": "#/components/schemas/ChannelPermissionOverwrite" } },
+ "nsfw": { "type": "boolean" },
+ "application_id": { "type": "string" },
+ "rate_limit_per_user": { "type": "integer" },
+ "permissions": { "type": "string" },
+ "color": { "type": "integer" },
+ "hoist": { "type": "boolean" },
+ "mentionable": { "type": "boolean" },
+ "allow": { "type": "string" },
+ "deny": { "type": "string" },
+ "code": { "type": "string" },
+ "channel_id": { "type": "string" },
+ "inviter_id": { "type": "string" },
+ "max_uses": { "type": "integer" },
+ "uses": { "type": "integer" },
+ "max_age": { "type": "integer" },
+ "temporary": { "type": "boolean" },
+ "deaf": { "type": "boolean" },
+ "mute": { "type": "boolean" },
+ "nick": { "type": "string" },
+ "avatar_hash": { "type": "string" },
+ "id": { "type": "string" },
+ "type": { "type": "integer" },
+ "enable_emoticons": { "type": "boolean" },
+ "expire_behavior": { "type": "integer" },
+ "expire_grace_period": { "type": "integer" },
+ "user_limit": { "type": "integer" }
+ }
+ },
+ "AuditLog": {
+ "type": "object",
+ "properties": {
+ "target": { "$ref": "#/components/schemas/User" },
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "action_type": { "$ref": "#/components/schemas/AuditLogEvents" },
+ "options": {
+ "type": "object",
+ "properties": {
+ "delete_member_days": { "type": "string" },
+ "members_removed": { "type": "string" },
+ "channel_id": { "type": "string" },
+ "messaged_id": { "type": "string" },
+ "count": { "type": "string" },
+ "id": { "type": "string" },
+ "type": { "type": "string" },
+ "role_name": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "changes": { "type": "array", "items": { "$ref": "#/components/schemas/AuditLogChange" } },
+ "reason": { "type": "string" },
+ "id": { "type": "string" }
+ },
+ "required": ["action_type", "changes", "id", "user", "user_id"]
+ },
+ "ReadState": {
+ "type": "object",
+ "properties": {
+ "channel_id": { "type": "string" },
+ "channel": { "$ref": "#/components/schemas/Channel" },
+ "user_id": { "type": "string" },
+ "user": { "$ref": "#/components/schemas/User" },
+ "last_message_id": { "type": "string" },
+ "last_message": { "$ref": "#/components/schemas/Message" },
+ "last_pin_timestamp": { "type": "string", "format": "date-time" },
+ "mention_count": { "type": "integer" },
+ "manual": { "type": "boolean" },
+ "id": { "type": "string" }
+ },
+ "required": ["channel", "channel_id", "id", "last_message_id", "manual", "mention_count", "user", "user_id"]
+ },
+ "UserPublic": {
+ "type": "object",
+ "properties": {
+ "username": { "type": "string" },
+ "discriminator": { "type": "string" },
+ "id": { "type": "string" },
+ "public_flags": { "type": "string" },
+ "avatar": { "type": "string" },
+ "accent_color": { "type": "integer" },
+ "banner": { "type": "string" },
+ "bio": { "type": "string" },
+ "bot": { "type": "boolean" }
+ },
+ "required": ["bio", "bot", "discriminator", "id", "public_flags", "username"]
+ }
+ },
+ "requestBodies": {
+ "BanCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": { "delete_message_days": { "type": "string" }, "reason": { "type": "string" } }
+ }
+ }
+ },
+ "description": ""
+ },
+ "DmChannelCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "recipients": { "type": "array", "items": { "type": "string" } }
+ },
+ "required": ["recipients"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "ChannelModifySchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "type": { "type": "integer" },
+ "topic": { "type": "string" },
+ "bitrate": { "type": "integer" },
+ "user_limit": { "type": "integer" },
+ "rate_limit_per_user": { "type": "integer" },
+ "position": { "type": "integer" },
+ "permission_overwrites": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "type": { "type": "integer" },
+ "allow": { "type": "number" },
+ "deny": { "type": "number" }
+ },
+ "additionalProperties": false,
+ "required": ["allow", "deny", "id", "type"]
+ }
+ },
+ "parent_id": { "type": "string" },
+ "id": { "type": "string" },
+ "nsfw": { "type": "boolean" },
+ "rtc_region": { "type": "string" },
+ "default_auto_archive_duration": { "type": "integer" }
+ },
+ "required": ["name", "type"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "ChannelGuildPositionUpdateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": { "id": { "type": "string" }, "position": { "type": "integer" } },
+ "additionalProperties": false,
+ "required": ["id"]
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "EmojiCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "image": { "type": "string" },
+ "roles": { "type": "array", "items": { "type": "string" } }
+ },
+ "required": ["image", "name"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "GuildCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "region": { "type": "string" },
+ "icon": { "type": "string" },
+ "channels": { "type": "array", "items": { "$ref": "#/components/requestBodies/ChannelModifySchema" } },
+ "guild_template_code": { "type": "string" },
+ "system_channel_id": { "type": "string" },
+ "rules_channel_id": { "type": "string" }
+ },
+ "required": ["name"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "GuildUpdateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "banner": { "type": "string" },
+ "splash": { "type": "string" },
+ "description": { "type": "string" },
+ "features": { "type": "array", "items": { "type": "string" } },
+ "verification_level": { "type": "integer" },
+ "default_message_notifications": { "type": "integer" },
+ "system_channel_flags": { "type": "integer" },
+ "explicit_content_filter": { "type": "integer" },
+ "public_updates_channel_id": { "type": "string" },
+ "afk_timeout": { "type": "integer" },
+ "afk_channel_id": { "type": "string" },
+ "preferred_locale": { "type": "string" },
+ "name": { "type": "string" },
+ "region": { "type": "string" },
+ "icon": { "type": "string" },
+ "guild_template_code": { "type": "string" },
+ "system_channel_id": { "type": "string" },
+ "rules_channel_id": { "type": "string" }
+ },
+ "required": ["name"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "GuildTemplateCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "avatar": { "type": "string" } },
+ "required": ["name"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "GuildUpdateWelcomeScreenSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "welcome_channels": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "channel_id": { "type": "string" },
+ "description": { "type": "string" },
+ "emoji_id": { "type": "string" },
+ "emoji_name": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["channel_id", "description", "emoji_name"]
+ }
+ },
+ "enabled": { "type": "boolean" },
+ "description": { "type": "string" }
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "Number": { "content": { "application/json": { "schema": { "type": "object" } } }, "description": "" },
+ "Boolean": { "content": { "application/json": { "schema": { "type": "object" } } }, "description": "" },
+ "InviteCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "target_user_id": { "type": "string" },
+ "target_type": { "type": "string" },
+ "validate": { "type": "string" },
+ "max_age": { "type": "integer" },
+ "max_uses": { "type": "integer" },
+ "temporary": { "type": "boolean" },
+ "unique": { "type": "boolean" },
+ "target_user": { "type": "string" },
+ "target_user_type": { "type": "integer" }
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "MemberCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "nick": { "type": "string" },
+ "guild_id": { "type": "string" },
+ "joined_at": { "type": "string", "format": "date-time" }
+ },
+ "required": ["guild_id", "id", "joined_at", "nick"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "MemberNickChangeSchema": {
+ "content": {
+ "application/json": {
+ "schema": { "type": "object", "properties": { "nick": { "type": "string" } }, "required": ["nick"] }
+ }
+ },
+ "description": ""
+ },
+ "MemberChangeSchema": {
+ "content": {
+ "application/json": {
+ "schema": { "type": "object", "properties": { "roles": { "type": "array", "items": { "type": "string" } } } }
+ }
+ },
+ "description": ""
+ },
+ "EmbedType": {
+ "content": {
+ "application/json": { "schema": { "enum": ["article", "gifv", "image", "link", "rich", "video"], "type": "string" } }
+ },
+ "description": ""
+ },
+ "EmbedImage": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "url": { "type": "string" },
+ "proxy_url": { "type": "string" },
+ "height": { "type": "integer" },
+ "width": { "type": "integer" }
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "MessageCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "content": { "type": "string" },
+ "nonce": { "type": "string" },
+ "tts": { "type": "boolean" },
+ "flags": { "type": "string" },
+ "embed": {
+ "additionalProperties": false,
+ "type": "object",
+ "properties": {
+ "title": { "type": "string" },
+ "type": { "$ref": "#/components/requestBodies/EmbedType" },
+ "description": { "type": "string" },
+ "url": { "type": "string" },
+ "timestamp": { "type": "string" },
+ "color": { "type": "integer" },
+ "footer": {
+ "type": "object",
+ "properties": {
+ "text": { "type": "string" },
+ "icon_url": { "type": "string" },
+ "proxy_icon_url": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["text"]
+ },
+ "image": { "$ref": "#/components/requestBodies/EmbedImage" },
+ "thumbnail": { "$ref": "#/components/requestBodies/EmbedImage" },
+ "video": { "$ref": "#/components/requestBodies/EmbedImage" },
+ "provider": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "url": { "type": "string" } },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "url": { "type": "string" },
+ "icon_url": { "type": "string" },
+ "proxy_icon_url": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "value": { "type": "string" },
+ "inline": { "type": "boolean" }
+ },
+ "additionalProperties": false,
+ "required": ["name", "value"]
+ }
+ }
+ }
+ },
+ "allowed_mentions": {
+ "type": "object",
+ "properties": {
+ "parse": { "type": "array", "items": { "type": "string" } },
+ "roles": { "type": "array", "items": { "type": "string" } },
+ "users": { "type": "array", "items": { "type": "string" } },
+ "replied_user": { "type": "boolean" }
+ },
+ "additionalProperties": false
+ },
+ "message_reference": {
+ "type": "object",
+ "properties": {
+ "message_id": { "type": "string" },
+ "channel_id": { "type": "string" },
+ "guild_id": { "type": "string" },
+ "fail_if_not_exists": { "type": "boolean" }
+ },
+ "additionalProperties": false,
+ "required": ["channel_id", "message_id"]
+ },
+ "payload_json": { "type": "string" },
+ "file": {}
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "RoleModifySchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "permissions": { "type": "number" },
+ "color": { "type": "integer" },
+ "hoist": { "type": "boolean" },
+ "mentionable": { "type": "boolean" },
+ "position": { "type": "integer" }
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "TemplateCreateSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "description": { "type": "string" } },
+ "required": ["name"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "TemplateModifySchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": { "name": { "type": "string" }, "description": { "type": "string" } },
+ "required": ["name"]
+ }
+ }
+ },
+ "description": ""
+ },
+ "UserModifySchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "username": { "type": "string" },
+ "avatar": { "type": "string" },
+ "bio": { "type": "string" },
+ "accent_color": { "type": "integer" },
+ "banner": { "type": "string" },
+ "password": { "type": "string" },
+ "new_password": { "type": "string" },
+ "code": { "type": "string" }
+ }
+ }
+ }
+ },
+ "description": ""
+ },
+ "UserSettingsSchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "afk_timeout": { "type": "integer" },
+ "allow_accessibility_detection": { "type": "boolean" },
+ "animate_emoji": { "type": "boolean" },
+ "animate_stickers": { "type": "integer" },
+ "contact_sync_enabled": { "type": "boolean" },
+ "convert_emoticons": { "type": "boolean" },
+ "custom_status": {
+ "type": "object",
+ "properties": {
+ "emoji_id": { "type": "string" },
+ "emoji_name": { "type": "string" },
+ "expires_at": { "type": "integer" },
+ "text": { "type": "string" }
+ },
+ "additionalProperties": false
+ },
+ "default_guilds_restricted": { "type": "boolean" },
+ "detect_platform_accounts": { "type": "boolean" },
+ "developer_mode": { "type": "boolean" },
+ "disable_games_tab": { "type": "boolean" },
+ "enable_tts_command": { "type": "boolean" },
+ "explicit_content_filter": { "type": "integer" },
+ "friend_source_flags": {
+ "type": "object",
+ "properties": { "all": { "type": "boolean" } },
+ "additionalProperties": false,
+ "required": ["all"]
+ },
+ "gateway_connected": { "type": "boolean" },
+ "gif_auto_play": { "type": "boolean" },
+ "guild_folders": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "color": { "type": "integer" },
+ "guild_ids": { "type": "array", "items": { "type": "string" } },
+ "id": { "type": "integer" },
+ "name": { "type": "string" }
+ },
+ "additionalProperties": false,
+ "required": ["color", "guild_ids", "id", "name"]
+ }
+ },
+ "guild_positions": { "type": "array", "items": { "type": "string" } },
+ "inline_attachment_media": { "type": "boolean" },
+ "inline_embed_media": { "type": "boolean" },
+ "locale": { "type": "string" },
+ "message_display_compact": { "type": "boolean" },
+ "native_phone_integration_enabled": { "type": "boolean" },
+ "render_embeds": { "type": "boolean" },
+ "render_reactions": { "type": "boolean" },
+ "restricted_guilds": { "type": "array", "items": { "type": "string" } },
+ "show_current_game": { "type": "boolean" },
+ "status": { "enum": ["dnd", "idle", "offline", "online"], "type": "string" },
+ "stream_notifications_enabled": { "type": "boolean" },
+ "theme": { "enum": ["dark", "white"], "type": "string" },
+ "timezone_offset": { "type": "integer" }
+ },
+ "required": [
+ "afk_timeout",
+ "allow_accessibility_detection",
+ "animate_emoji",
+ "animate_stickers",
+ "contact_sync_enabled",
+ "convert_emoticons",
+ "custom_status",
+ "default_guilds_restricted",
+ "detect_platform_accounts",
+ "developer_mode",
+ "disable_games_tab",
+ "enable_tts_command",
+ "explicit_content_filter",
+ "friend_source_flags",
+ "gateway_connected",
+ "gif_auto_play",
+ "guild_folders",
+ "guild_positions",
+ "inline_attachment_media",
+ "inline_embed_media",
+ "locale",
+ "message_display_compact",
+ "native_phone_integration_enabled",
+ "render_embeds",
+ "render_reactions",
+ "restricted_guilds",
+ "show_current_game",
+ "status",
+ "stream_notifications_enabled",
+ "theme",
+ "timezone_offset"
+ ]
+ }
+ }
+ },
+ "description": ""
+ },
+ "WidgetModifySchema": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } },
+ "required": ["channel_id", "enabled"]
+ }
+ }
+ },
+ "description": ""
+ }
+ },
+ "securitySchemes": { "authorization": { "type": "oauth2" } },
+ "links": {},
+ "callbacks": {}
+ },
+ "security": [{ "authorization": [] }]
+}
diff --git a/api/assets/openapi.yaml b/api/assets/openapi.yaml
deleted file mode 100644
index 06a0b72d..00000000
--- a/api/assets/openapi.yaml
+++ /dev/null
@@ -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: []
diff --git a/api/assets/openapi.yml b/api/assets/openapi.yml
deleted file mode 100644
index 957b6d16..00000000
--- a/api/assets/openapi.yml
+++ /dev/null
@@ -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/"
diff --git a/api/package-lock.json b/api/package-lock.json
index 63724688..1242dc06 100644
--- a/api/package-lock.json
+++ b/api/package-lock.json
@@ -35,6 +35,7 @@
"mongoose-long": "^0.3.2",
"multer": "^1.4.2",
"node-fetch": "^2.6.1",
+ "patch-package": "^6.4.7",
"supertest": "^6.1.6",
"typeorm": "^0.2.37"
},
@@ -60,7 +61,8 @@
"saslprep": "^1.0.3",
"ts-node": "^9.1.1",
"ts-node-dev": "^1.1.6",
- "typescript": "^4.4.2"
+ "typescript": "^4.4.2",
+ "typescript-json-schema": "^0.50.1"
}
},
"../util": {
@@ -76,7 +78,7 @@
"env-paths": "^2.2.1",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.11",
+ "missing-native-js-functions": "^1.2.13",
"node-fetch": "^2.6.1",
"patch-package": "^6.4.7",
"pg": "^8.7.1",
@@ -1387,6 +1389,12 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/@types/json-schema": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+ "dev": true
+ },
"node_modules/@types/jsonwebtoken": {
"version": "8.5.4",
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz",
@@ -1535,6 +1543,11 @@
"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz",
"integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw=="
},
+ "node_modules/@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+ },
"node_modules/@zerollup/ts-helpers": {
"version": "1.7.18",
"resolved": "https://registry.npmjs.org/@zerollup/ts-helpers/-/ts-helpers-1.7.18.tgz",
@@ -2409,7 +2422,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
@@ -2943,8 +2955,7 @@
"node_modules/ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
},
"node_modules/cipher-base": {
"version": "1.0.4",
@@ -4943,7 +4954,6 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -4994,6 +5004,14 @@
"node": ">=8"
}
},
+ "node_modules/find-yarn-workspace-root": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
+ "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
+ "dependencies": {
+ "micromatch": "^4.0.2"
+ }
+ },
"node_modules/for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -5274,8 +5292,7 @@
"node_modules/graceful-fs": {
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
- "dev": true
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
},
"node_modules/growly": {
"version": "1.3.0",
@@ -5805,7 +5822,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
"dependencies": {
"ci-info": "^2.0.0"
},
@@ -5855,8 +5871,6 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "optional": true,
"bin": {
"is-docker": "cli.js"
},
@@ -5924,7 +5938,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
"engines": {
"node": ">=0.12.0"
}
@@ -5986,8 +5999,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "optional": true,
"dependencies": {
"is-docker": "^2.0.0"
},
@@ -6003,8 +6014,7 @@
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"node_modules/isobject": {
"version": "3.0.1",
@@ -6955,6 +6965,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "dependencies": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
"node_modules/kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -7285,7 +7303,6 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
"dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
@@ -7834,8 +7851,7 @@
"node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
"node_modules/no-case": {
"version": "2.3.2",
@@ -8187,6 +8203,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "dependencies": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/opn": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
@@ -8239,6 +8270,14 @@
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/p-each-series": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
@@ -8380,6 +8419,178 @@
"node": ">=0.10.0"
}
},
+ "node_modules/patch-package": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz",
+ "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==",
+ "dependencies": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^2.4.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^2.0.0",
+ "fs-extra": "^7.0.1",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.0",
+ "open": "^7.4.2",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33"
+ },
+ "bin": {
+ "patch-package": "index.js"
+ },
+ "engines": {
+ "npm": ">5"
+ }
+ },
+ "node_modules/patch-package/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/patch-package/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/patch-package/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/patch-package/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "node_modules/patch-package/node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/patch-package/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/patch-package/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/patch-package/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/patch-package/node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/patch-package/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/patch-package/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/patch-package/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/patch-package/node_modules/slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/patch-package/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/patch-package/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/path-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
@@ -8497,7 +8708,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true,
"engines": {
"node": ">=8.6"
},
@@ -10838,6 +11048,17 @@
"node": ">=0.6.0"
}
},
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/tmpl": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
@@ -10896,7 +11117,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
@@ -11442,6 +11662,133 @@
"node": ">=4.2.0"
}
},
+ "node_modules/typescript-json-schema": {
+ "version": "0.50.1",
+ "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.50.1.tgz",
+ "integrity": "sha512-GCof/SDoiTDl0qzPonNEV4CHyCsZEIIf+mZtlrjoD8vURCcEzEfa2deRuxYid8Znp/e27eDR7Cjg8jgGrimBCA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.7",
+ "@types/node": "^14.14.33",
+ "glob": "^7.1.6",
+ "json-stable-stringify": "^1.0.1",
+ "ts-node": "^9.1.1",
+ "typescript": "~4.2.3",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "typescript-json-schema": "bin/typescript-json-schema"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "dependencies": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/typescript": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
+ "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/typescript-json-schema/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/umd": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
@@ -11815,7 +12162,6 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
@@ -12630,7 +12976,7 @@
"jest": "^27.0.6",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.11",
+ "missing-native-js-functions": "^1.2.13",
"node-fetch": "^2.6.1",
"patch-package": "^6.4.7",
"pg": "^8.7.1",
@@ -13221,6 +13567,12 @@
}
}
},
+ "@types/json-schema": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+ "dev": true
+ },
"@types/jsonwebtoken": {
"version": "8.5.4",
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz",
@@ -13369,6 +13721,11 @@
"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz",
"integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw=="
},
+ "@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
+ },
"@zerollup/ts-helpers": {
"version": "1.7.18",
"resolved": "https://registry.npmjs.org/@zerollup/ts-helpers/-/ts-helpers-1.7.18.tgz",
@@ -14097,7 +14454,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
"requires": {
"fill-range": "^7.0.1"
}
@@ -14550,8 +14906,7 @@
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
},
"cipher-base": {
"version": "1.0.4",
@@ -16238,7 +16593,6 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
@@ -16282,6 +16636,14 @@
"path-exists": "^4.0.0"
}
},
+ "find-yarn-workspace-root": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
+ "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
+ "requires": {
+ "micromatch": "^4.0.2"
+ }
+ },
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -16488,8 +16850,7 @@
"graceful-fs": {
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
- "dev": true
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
},
"growly": {
"version": "1.3.0",
@@ -16911,7 +17272,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
"requires": {
"ci-info": "^2.0.0"
}
@@ -16948,9 +17308,7 @@
"is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "optional": true
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
},
"is-extendable": {
"version": "1.0.1",
@@ -16993,8 +17351,7 @@
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-obj": {
"version": "2.0.0",
@@ -17038,8 +17395,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "optional": true,
"requires": {
"is-docker": "^2.0.0"
}
@@ -17052,8 +17407,7 @@
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"isobject": {
"version": "3.0.1",
@@ -17807,6 +18161,14 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
+ "klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "requires": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
"kleur": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -18103,7 +18465,6 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
@@ -18547,8 +18908,7 @@
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
"no-case": {
"version": "2.3.2",
@@ -18822,6 +19182,15 @@
"mimic-fn": "^2.1.0"
}
},
+ "open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "requires": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ }
+ },
"opn": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
@@ -18864,6 +19233,11 @@
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
"p-each-series": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
@@ -18969,6 +19343,138 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "patch-package": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz",
+ "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==",
+ "requires": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^2.4.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^2.0.0",
+ "fs-extra": "^7.0.1",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.0",
+ "open": "^7.4.2",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ }
+ }
+ },
"path-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
@@ -19065,8 +19571,7 @@
"picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
},
"pify": {
"version": "3.0.0",
@@ -21000,6 +21505,14 @@
"process": "~0.11.0"
}
},
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
"tmpl": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
@@ -21048,7 +21561,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
"requires": {
"is-number": "^7.0.0"
}
@@ -21392,6 +21904,104 @@
"integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==",
"dev": true
},
+ "typescript-json-schema": {
+ "version": "0.50.1",
+ "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.50.1.tgz",
+ "integrity": "sha512-GCof/SDoiTDl0qzPonNEV4CHyCsZEIIf+mZtlrjoD8vURCcEzEfa2deRuxYid8Znp/e27eDR7Cjg8jgGrimBCA==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.7",
+ "@types/node": "^14.14.33",
+ "glob": "^7.1.6",
+ "json-stable-stringify": "^1.0.1",
+ "ts-node": "^9.1.1",
+ "typescript": "~4.2.3",
+ "yargs": "^16.2.0"
+ },
+ "dependencies": {
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "typescript": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
+ "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ }
+ }
+ },
"umd": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
@@ -21717,7 +22327,6 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
"requires": {
"isexe": "^2.0.0"
}
diff --git a/api/package.json b/api/package.json
index 66d94764..bff625b2 100644
--- a/api/package.json
+++ b/api/package.json
@@ -10,7 +10,9 @@
"start": "npm run build && node dist/start",
"build": "npx tsc -b .",
"build-docker": "tsc -p tsconfig-docker.json",
- "dev": "tsnd --respawn src/start.ts"
+ "dev": "tsnd --respawn src/start.ts",
+ "patch": "patch-package",
+ "postinstall": "npm run patch"
},
"repository": {
"type": "git",
@@ -52,7 +54,8 @@
"saslprep": "^1.0.3",
"ts-node": "^9.1.1",
"ts-node-dev": "^1.1.6",
- "typescript": "^4.4.2"
+ "typescript": "^4.4.2",
+ "typescript-json-schema": "^0.50.1"
},
"dependencies": {
"@fosscord/util": "file:../util",
@@ -81,6 +84,7 @@
"mongoose-long": "^0.3.2",
"multer": "^1.4.2",
"node-fetch": "^2.6.1",
+ "patch-package": "^6.4.7",
"supertest": "^6.1.6",
"typeorm": "^0.2.37"
},
diff --git a/api/patches/typescript-json-schema+0.50.1.patch b/api/patches/typescript-json-schema+0.50.1.patch
new file mode 100644
index 00000000..a0d479de
--- /dev/null
+++ b/api/patches/typescript-json-schema+0.50.1.patch
@@ -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";
+ }
diff --git a/api/scripts/config_generator.js b/api/scripts/config_generator.js
deleted file mode 100644
index 5b5c52d4..00000000
--- a/api/scripts/config_generator.js
+++ /dev/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);
-
diff --git a/api/scripts/generate_openapi_schema.ts b/api/scripts/generate_openapi_schema.ts
new file mode 100644
index 00000000..c45a43eb
--- /dev/null
+++ b/api/scripts/generate_openapi_schema.ts
@@ -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();
diff --git a/api/src/routes/channels/#channel_id/messages/#message_id/index.ts b/api/src/routes/channels/#channel_id/messages/#message_id/index.ts
index b9d46c4f..9c631a18 100644
--- a/api/src/routes/channels/#channel_id/messages/#message_id/index.ts
+++ b/api/src/routes/channels/#channel_id/messages/#message_id/index.ts
@@ -1,7 +1,6 @@
import { Channel, emitEvent, getPermission, MessageDeleteEvent, Message, MessageUpdateEvent } from "@fosscord/util";
import { Router, Response, Request } from "express";
import { MessageCreateSchema } from "../../../../../schema/Message";
-
import { check } from "../../../../../util/instanceOf";
import { handleMessage, postHandleMessage } from "../../../../../util/Message";
@@ -32,7 +31,7 @@ router.patch("/", check(MessageCreateSchema), async (req: Request, res: Response
});
await Promise.all([
- new_message.save(),
+ new_message!.save(),
await emitEvent({
event: "MESSAGE_UPDATE",
channel_id,
diff --git a/api/src/routes/users/@me/index.ts b/api/src/routes/users/@me/index.ts
index d5a5723c..68649215 100644
--- a/api/src/routes/users/@me/index.ts
+++ b/api/src/routes/users/@me/index.ts
@@ -1,5 +1,5 @@
import { Router, Request, Response } from "express";
-import { User } from "@fosscord/util";
+import { User, PrivateUserProjection } from "@fosscord/util";
import { UserModifySchema } from "../../../schema/User";
import { check } from "../../../util/instanceOf";
import { handleFile } from "../../../util/cdn";
@@ -7,30 +7,9 @@ import { handleFile } from "../../../util/cdn";
const router: Router = Router();
router.get("/", async (req: Request, res: Response) => {
- res.json(await User.getPublicUser(req.user_id));
+ res.json(await User.getPublicUser(req.user_id, { select: PrivateUserProjection }));
});
-const UserUpdateProjection = [
- "accent_color",
- "avatar",
- "banner",
- "bio",
- "bot",
- "discriminator",
- "email",
- "flags",
- "id",
- "locale",
- "mfa_enabled",
- "nsfw_alllowed",
- "phone",
- "public_flags",
- "purchased_flags",
- // "token", // this isn't saved in the db and needs to be set manually
- "username",
- "verified"
-];
-
router.patch("/", check(UserModifySchema), async (req: Request, res: Response) => {
const body = req.body as UserModifySchema;
diff --git a/api/src/schema/Emoji.ts b/api/src/schema/Emoji.ts
index deaccf5c..0406919c 100644
--- a/api/src/schema/Emoji.ts
+++ b/api/src/schema/Emoji.ts
@@ -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
}
diff --git a/api/src/schema/Guild.ts b/api/src/schema/Guild.ts
index 3e98fe76..0f9fd884 100644
--- a/api/src/schema/Guild.ts
+++ b/api/src/schema/Guild.ts
@@ -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;
diff --git a/api/src/schema/Invite.ts b/api/src/schema/Invite.ts
index a22449ba..da6192bc 100644
--- a/api/src/schema/Invite.ts
+++ b/api/src/schema/Invite.ts
@@ -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;
}
diff --git a/api/src/schema/index.ts b/api/src/schema/index.ts
new file mode 100644
index 00000000..b5f38a2f
--- /dev/null
+++ b/api/src/schema/index.ts
@@ -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";
diff --git a/bundle/database.db b/bundle/database.db
deleted file mode 100644
index 2d4abd49..00000000
--- a/bundle/database.db
+++ /dev/null
Binary files differdiff --git a/bundle/package.json b/bundle/package.json
index 63945135..29608663 100644
--- a/bundle/package.json
+++ b/bundle/package.json
@@ -52,7 +52,6 @@
"async-exit-hook": "^2.0.1",
"express": "^4.17.1",
"missing-native-js-functions": "^1.2.13",
- "mongodb-memory-server": "^7.3.6",
"node-os-utils": "^1.3.5"
}
}
diff --git a/util/package-lock.json b/util/package-lock.json
index 47aca2d1..571fffbe 100644
--- a/util/package-lock.json
+++ b/util/package-lock.json
@@ -17,7 +17,7 @@
"env-paths": "^2.2.1",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.11",
+ "missing-native-js-functions": "^1.2.13",
"node-fetch": "^2.6.1",
"patch-package": "^6.4.7",
"pg": "^8.7.1",
@@ -6338,9 +6338,9 @@
}
},
"node_modules/missing-native-js-functions": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.11.tgz",
- "integrity": "sha512-U97IscNBL4Wg9adYjEBT46Hb0Ld5dPT8vbdwFX+TNzGrFQCc4WqoGAZouaLNFwUqxzzHZ9DVg59unwnQyeIIQg=="
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.13.tgz",
+ "integrity": "sha512-1RAArfUkrGkj5N3xJVW251F2PvfP2ozAcxsLLDR6uiiAixTP5Abh8zzGMadepbqgiHC0FGlTSAUNbh9abN4Osg=="
},
"node_modules/mkdirp": {
"version": "1.0.4",
@@ -13735,9 +13735,9 @@
}
},
"missing-native-js-functions": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.11.tgz",
- "integrity": "sha512-U97IscNBL4Wg9adYjEBT46Hb0Ld5dPT8vbdwFX+TNzGrFQCc4WqoGAZouaLNFwUqxzzHZ9DVg59unwnQyeIIQg=="
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.13.tgz",
+ "integrity": "sha512-1RAArfUkrGkj5N3xJVW251F2PvfP2ozAcxsLLDR6uiiAixTP5Abh8zzGMadepbqgiHC0FGlTSAUNbh9abN4Osg=="
},
"mkdirp": {
"version": "1.0.4",
diff --git a/util/package.json b/util/package.json
index 39af7526..38cd8d35 100644
--- a/util/package.json
+++ b/util/package.json
@@ -44,7 +44,7 @@
"env-paths": "^2.2.1",
"jsonwebtoken": "^8.5.1",
"lambert-server": "^1.2.10",
- "missing-native-js-functions": "^1.2.11",
+ "missing-native-js-functions": "^1.2.13",
"node-fetch": "^2.6.1",
"patch-package": "^6.4.7",
"pg": "^8.7.1",
diff --git a/util/src/entities/AuditLog.ts b/util/src/entities/AuditLog.ts
index ceeb21fd..ae9feb76 100644
--- a/util/src/entities/AuditLog.ts
+++ b/util/src/entities/AuditLog.ts
@@ -42,17 +42,17 @@ export enum AuditLogEvents {
}
@Entity("audit_logs")
-export class AuditLogEntry extends BaseClass {
+export class AuditLog extends BaseClass {
@JoinColumn({ name: "target_id" })
@ManyToOne(() => User)
target?: User;
@Column({ nullable: true })
- @RelationId((auditlog: AuditLogEntry) => auditlog.user)
+ @RelationId((auditlog: AuditLog) => auditlog.user)
user_id: string;
@JoinColumn({ name: "user_id" })
- @ManyToOne(() => User)
+ @ManyToOne(() => User, (user: User) => user.id)
user: User;
@Column({
diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts
index 0856ccd1..403a6fc6 100644
--- a/util/src/entities/BaseClass.ts
+++ b/util/src/entities/BaseClass.ts
@@ -8,19 +8,19 @@ import "missing-native-js-functions";
export class BaseClass extends BaseEntity {
@PrimaryColumn()
- id: string = Snowflake.generate();
+ id: string;
// @ts-ignore
- constructor(public props?: any) {
+ constructor(private props?: any) {
super();
this.assign(props);
}
- get construct(): any {
+ private get construct(): any {
return this.constructor;
}
- get metadata() {
+ private get metadata() {
return this.construct.getRepository().metadata as EntityMetadata;
}
@@ -48,6 +48,8 @@ export class BaseClass extends BaseEntity {
this[key] = props[key];
}
}
+
+ if (!this.id) this.id = Snowflake.generate();
}
@BeforeUpdate()
diff --git a/util/src/entities/Member.ts b/util/src/entities/Member.ts
index d2d78bb9..e1773730 100644
--- a/util/src/entities/Member.ts
+++ b/util/src/entities/Member.ts
@@ -12,6 +12,7 @@ import {
} from "../interfaces";
import { HTTPError } from "lambert-server";
import { Role } from "./Role";
+import { ReadState } from "./ReadState";
@Entity("members")
export class Member extends BaseClass {
@@ -53,8 +54,8 @@ export class Member extends BaseClass {
settings: UserGuildSettings;
// TODO: update
- @Column({ type: "simple-json" })
- read_state: Record<string, string | null>;
+ // @Column({ type: "simple-json" })
+ // read_state: ReadState;
static async IsInGuildOrFail(user_id: string, guild_id: string) {
if (await Member.count({ id: user_id, guild: { id: guild_id } })) return true;
@@ -206,7 +207,7 @@ export class Member extends BaseClass {
Member.insert({
...member,
roles: undefined,
- read_state: {},
+ // read_state: {},
settings: {
channel_overrides: [],
message_notifications: 0,
diff --git a/util/src/entities/Message.ts b/util/src/entities/Message.ts
index 542b2b55..aacca526 100644
--- a/util/src/entities/Message.ts
+++ b/util/src/entities/Message.ts
@@ -139,7 +139,7 @@ export class Message extends BaseClass {
reactions: Reaction[];
@Column({ type: "text", nullable: true })
- nonce?: string | number;
+ nonce?: string;
@Column({ nullable: true })
pinned?: boolean;
diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts
index 39f654be..1b4ce351 100644
--- a/util/src/entities/User.ts
+++ b/util/src/entities/User.ts
@@ -4,33 +4,53 @@ import { BitField } from "../util/BitField";
import { Relationship } from "./Relationship";
import { ConnectedAccount } from "./ConnectedAccount";
import { HTTPError } from "lambert-server";
-import { Channel } from "./Channel";
-
-type PublicUserKeys =
- | "username"
- | "discriminator"
- | "id"
- | "public_flags"
- | "avatar"
- | "accent_color"
- | "banner"
- | "bio"
- | "bot";
-export const PublicUserProjection: PublicUserKeys[] = [
- "username",
- "discriminator",
- "id",
- "public_flags",
- "avatar",
- "accent_color",
- "banner",
- "bio",
- "bot",
-];
+
+export enum PublicUserEnum {
+ username,
+ discriminator,
+ id,
+ public_flags,
+ avatar,
+ accent_color,
+ banner,
+ bio,
+ bot,
+}
+export type PublicUserKeys = keyof typeof PublicUserEnum;
+
+export enum PrivateUserEnum {
+ flags,
+ mfa_enabled,
+ email,
+ phone,
+ verified,
+ nsfw_allowed,
+ premium,
+ premium_type,
+ disabled,
+ // locale
+}
+export type PrivateUserKeys = keyof typeof PrivateUserEnum | PublicUserKeys;
+
+export const PublicUserProjection = Object.values(PublicUserEnum).filter(
+ (x) => typeof x === "string"
+) as PublicUserKeys[];
+export const PrivateUserProjection = [
+ ...PublicUserProjection,
+ Object.values(PrivateUserEnum).filter((x) => typeof x === "string"),
+] as PrivateUserKeys[];
// Private user data that should never get sent to the client
export type PublicUser = Pick<User, PublicUserKeys>;
+export interface UserPublic extends Pick<User, PublicUserKeys> {}
+
+export interface UserPrivate extends Pick<User, PrivateUserKeys> {
+ locale: string;
+}
+
+// TODO: add purchased_flags, premium_usage_flags
+
@Entity("users")
export class User extends BaseClass {
@Column()
diff --git a/util/src/tes.ts b/util/src/tes.ts
deleted file mode 100644
index e326dee1..00000000
--- a/util/src/tes.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { performance } from "perf_hooks";
-import { Guild, Relationship, RelationshipType } from "./entities";
-import { User } from "./entities/User";
-import { initDatabase } from "./util";
-
-initDatabase().then(async (x) => {
- try {
- const user = await new User({
- guilds: [],
- discriminator: "1",
- username: "test",
- flags: "0",
- public_flags: "0",
- id: "0",
- }).save();
-
- user.relationships = [new Relationship({ type: RelationshipType.friends })];
-
- user.save();
- } catch (error) {
- console.error(error);
- }
-});
|