diff options
Diffstat (limited to 'api')
-rw-r--r-- | api/assets/openapi.json | 881 | ||||
-rw-r--r-- | api/package-lock.json | 19 | ||||
-rw-r--r-- | api/package.json | 2 | ||||
-rw-r--r-- | api/scripts/generate_openapi_schema.ts | 128 |
4 files changed, 396 insertions, 634 deletions
diff --git a/api/assets/openapi.json b/api/assets/openapi.json index a49e4165..5244da36 100644 --- a/api/assets/openapi.json +++ b/api/assets/openapi.json @@ -25,46 +25,26 @@ "operationId": "", "responses": { "200": { - "description": "user found", + "description": "User found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } } }, - "401": { - "description": "Unauthorized", + "404": { + "description": "User not found", "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" } - } - } + } + } + } + }, + "/users/@me": { + "get": { + "summary": "", + "description": "", + "parameters": [], + "operationId": "", + "responses": { + "200": { + "description": "Authenticated user", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } } } } } @@ -542,6 +522,7 @@ "Member": { "type": "object", "properties": { + "user_id": { "type": "string" }, "user": { "$ref": "#/components/schemas/User" }, "guild_id": { "type": "string" }, "guild": { "$ref": "#/components/schemas/Guild" }, @@ -555,7 +536,7 @@ "settings": { "$ref": "#/components/schemas/UserGuildSettings" }, "id": { "type": "string" } }, - "required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user"] + "required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user", "user_id"] }, "Role": { "type": "object", @@ -1078,545 +1059,417 @@ "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" } } - } - } + }, + "UserPrivate": { + "type": "object", + "properties": { + "locale": { "type": "string" }, + "disabled": { "type": "boolean" }, + "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" }, + "flags": { "type": "string" }, + "mfa_enabled": { "type": "boolean" }, + "email": { "type": "string" }, + "phone": { "type": "string" }, + "verified": { "type": "boolean" }, + "nsfw_allowed": { "type": "boolean" }, + "premium": { "type": "boolean" }, + "premium_type": { "type": "integer" } }, - "description": "" + "required": [ + "bio", + "bot", + "disabled", + "discriminator", + "flags", + "id", + "locale", + "mfa_enabled", + "nsfw_allowed", + "premium", + "premium_type", + "public_flags", + "username", + "verified" + ] + }, + "BanCreateSchema": { + "type": "object", + "properties": { "delete_message_days": { "type": "string" }, "reason": { "type": "string" } } }, "DmChannelCreateSchema": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "recipients": { "type": "array", "items": { "type": "string" } } - }, - "required": ["recipients"] - } - } - }, - "description": "" + "type": "object", + "properties": { "name": { "type": "string" }, "recipients": { "type": "array", "items": { "type": "string" } } }, + "required": ["recipients"] }, "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": { - "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" } + "type": { "type": "integer" }, + "allow": { "type": "number" }, + "deny": { "type": "number" } }, - "required": ["name", "type"] + "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" } }, - "description": "" + "required": ["name", "type"] }, "ChannelGuildPositionUpdateSchema": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { "id": { "type": "string" }, "position": { "type": "integer" } }, - "additionalProperties": false, - "required": ["id"] - } - } - } - }, - "description": "" + "type": "array", + "items": { + "type": "object", + "properties": { "id": { "type": "string" }, "position": { "type": "integer" } }, + "additionalProperties": false, + "required": ["id"] + } }, "EmojiCreateSchema": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "image": { "type": "string" }, - "roles": { "type": "array", "items": { "type": "string" } } - }, - "required": ["image", "name"] - } - } + "type": "object", + "properties": { + "name": { "type": "string" }, + "image": { "type": "string" }, + "roles": { "type": "array", "items": { "type": "string" } } }, - "description": "" + "required": ["image", "name"] }, "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"] - } - } + "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" } }, - "description": "" + "required": ["name"] }, "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"] - } - } + "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" } }, - "description": "" + "required": ["name"] }, "GuildTemplateCreateSchema": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { "name": { "type": "string" }, "avatar": { "type": "string" } }, - "required": ["name"] - } - } - }, - "description": "" + "type": "object", + "properties": { "name": { "type": "string" }, "avatar": { "type": "string" } }, + "required": ["name"] }, "GuildUpdateWelcomeScreenSchema": { - "content": { - "application/json": { - "schema": { + "type": "object", + "properties": { + "welcome_channels": { + "type": "array", + "items": { "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" } - } + "channel_id": { "type": "string" }, + "description": { "type": "string" }, + "emoji_id": { "type": "string" }, + "emoji_name": { "type": "string" } + }, + "additionalProperties": false, + "required": ["channel_id", "description", "emoji_name"] } - } - }, - "description": "" + }, + "enabled": { "type": "boolean" }, + "description": { "type": "string" } + } }, - "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": "" + "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" } + } }, "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" } - } - } - } + "type": "object", + "properties": { + "id": { "type": "string" }, + "nick": { "type": "string" }, + "guild_id": { "type": "string" }, + "joined_at": { "type": "string", "format": "date-time" } }, - "description": "" + "required": ["guild_id", "id", "joined_at", "nick"] }, + "MemberNickChangeSchema": { "type": "object", "properties": { "nick": { "type": "string" } }, "required": ["nick"] }, + "MemberChangeSchema": { "type": "object", "properties": { "roles": { "type": "array", "items": { "type": "string" } } } }, "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"] - } - } - } + "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" } }, - "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 + "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" } }, - "message_reference": { + "additionalProperties": false + }, + "fields": { + "type": "array", + "items": { "type": "object", "properties": { - "message_id": { "type": "string" }, - "channel_id": { "type": "string" }, - "guild_id": { "type": "string" }, - "fail_if_not_exists": { "type": "boolean" } + "name": { "type": "string" }, + "value": { "type": "string" }, + "inline": { "type": "boolean" } }, "additionalProperties": false, - "required": ["channel_id", "message_id"] - }, - "payload_json": { "type": "string" }, - "file": {} + "required": ["name", "value"] + } } } - } - }, - "description": "" + }, + "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": {} + } }, "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": "" + "type": "object", + "properties": { + "name": { "type": "string" }, + "permissions": { "type": "number" }, + "color": { "type": "integer" }, + "hoist": { "type": "boolean" }, + "mentionable": { "type": "boolean" }, + "position": { "type": "integer" } + } }, "TemplateCreateSchema": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, - "required": ["name"] - } - } - }, - "description": "" + "type": "object", + "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, + "required": ["name"] }, "TemplateModifySchema": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, - "required": ["name"] - } - } - }, - "description": "" + "type": "object", + "properties": { "name": { "type": "string" }, "description": { "type": "string" } }, + "required": ["name"] }, "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": "" + "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" } + } }, "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": { - "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" } + "color": { "type": "integer" }, + "guild_ids": { "type": "array", "items": { "type": "string" } }, + "id": { "type": "integer" }, + "name": { "type": "string" } }, - "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" - ] + "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" } }, - "description": "" + "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" + ] }, "WidgetModifySchema": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } }, - "required": ["channel_id", "enabled"] - } - } - }, - "description": "" + "type": "object", + "properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } }, + "required": ["channel_id", "enabled"] } }, + "requestBodies": {}, "securitySchemes": {}, "links": {}, "callbacks": {} diff --git a/api/package-lock.json b/api/package-lock.json index 1242dc06..da41d26d 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "@fosscord/api", "version": "1.0.0", + "hasInstallScript": true, "license": "ISC", "dependencies": { "@fosscord/util": "file:../util", @@ -29,7 +30,7 @@ "i18next-node-fs-backend": "^2.1.3", "jsonwebtoken": "^8.5.1", "lambert-server": "^1.2.10", - "missing-native-js-functions": "^1.2.11", + "missing-native-js-functions": "^1.2.15", "mongoose": "^5.12.3", "mongoose-autopopulate": "^0.12.3", "mongoose-long": "^0.3.2", @@ -78,7 +79,7 @@ "env-paths": "^2.2.1", "jsonwebtoken": "^8.5.1", "lambert-server": "^1.2.10", - "missing-native-js-functions": "^1.2.13", + "missing-native-js-functions": "^1.2.14", "node-fetch": "^2.6.1", "patch-package": "^6.4.7", "pg": "^8.7.1", @@ -7421,9 +7422,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.15", + "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.15.tgz", + "integrity": "sha512-NNsxPSHnG22xellXsdGkzmF/SSzYNRgZcWQt2OKG+I3Wv8p37kTax13trTMthVkEOhvNv8M2l4A4JwK1p42ZHg==" }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -12976,7 +12977,7 @@ "jest": "^27.0.6", "jsonwebtoken": "^8.5.1", "lambert-server": "^1.2.10", - "missing-native-js-functions": "^1.2.13", + "missing-native-js-functions": "^1.2.14", "node-fetch": "^2.6.1", "patch-package": "^6.4.7", "pg": "^8.7.1", @@ -18555,9 +18556,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.15", + "resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.15.tgz", + "integrity": "sha512-NNsxPSHnG22xellXsdGkzmF/SSzYNRgZcWQt2OKG+I3Wv8p37kTax13trTMthVkEOhvNv8M2l4A4JwK1p42ZHg==" }, "mixin-deep": { "version": "1.3.2", diff --git a/api/package.json b/api/package.json index bff625b2..497065cb 100644 --- a/api/package.json +++ b/api/package.json @@ -78,7 +78,7 @@ "i18next-node-fs-backend": "^2.1.3", "jsonwebtoken": "^8.5.1", "lambert-server": "^1.2.10", - "missing-native-js-functions": "^1.2.11", + "missing-native-js-functions": "^1.2.15", "mongoose": "^5.12.3", "mongoose-autopopulate": "^0.12.3", "mongoose-long": "^0.3.2", diff --git a/api/scripts/generate_openapi_schema.ts b/api/scripts/generate_openapi_schema.ts index c45a43eb..329aeaf4 100644 --- a/api/scripts/generate_openapi_schema.ts +++ b/api/scripts/generate_openapi_schema.ts @@ -19,41 +19,14 @@ const compilerOptions: TJS.CompilerOptions = { const openapiPath = path.join(__dirname, "..", "assets", "openapi.json"); var specification = JSON.parse(fs.readFileSync(openapiPath, { encoding: "utf8" })); -async function generateSchemas() { +async function utilSchemas() { 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" - ]; + const schemas = ["UserPublic", "UserPrivate", "PublicConnectedAccount"]; // @ts-ignore - const definitions = combineSchemas({ schemas, generator, program }); - - for (const key in definitions) { - specification.components.schemas[key] = definitions[key]; - delete definitions[key].additionalProperties; - } + combineSchemas({ schemas, generator, program }); } function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaGenerator; schemas: string[] }) { @@ -63,13 +36,19 @@ function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaG 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 } }; + definitions = { ...definitions, [name]: { ...part, definitions: undefined, $schema: undefined } }; + } + + for (const key in definitions) { + specification.components.schemas[key] = definitions[key]; + delete definitions[key].additionalProperties; + delete definitions[key].$schema; } return definitions; } -function generateBodies() { +function apiSchemas() { const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "src", "schema", "index.ts")], compilerOptions); const generator = TJS.buildGenerator(program, settings); @@ -94,97 +73,26 @@ function generateBodies() { "TemplateModifySchema", "UserModifySchema", "UserSettingsSchema", - "WidgetModifySchema" + "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; - } + combineSchemas({ schemas, generator, program }); } 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" - } - } - } - }; - } - }) - ); + Object.values(specification.paths).forEach((path: any) => Object.values(path).forEach((request: any) => {})); } function main() { addDefaultResponses(); - generateSchemas(); - specification = JSON.parse(JSON.stringify(specification).replaceAll("#/definitions", "#/components/schemas")); - - generateBodies(); + utilSchemas(); + apiSchemas(); fs.writeFileSync( openapiPath, - JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/requestBodies").replaceAll("bigint", "number") + JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/schemas").replaceAll("bigint", "number") ); } |